Пример #1
0
        // TODO 取得できない
        /// <summary>
        /// チャンネルアクセストークンの発行
        /// </summary>
        /// <returns>レスポンス</returns>
        public static async Task <IssueChannelAccessTokenResponse> IssueChannelAccessToken()
        {
            Trace.TraceInformation("Start");

            IssueChannelAccessTokenRequest request = new IssueChannelAccessTokenRequest()
            {
                grant_type    = "client_credentials",
                client_id     = ConfigurationManager.AppSettings["ChannelId"],
                client_secret = ConfigurationManager.AppSettings["SecretChannelToken"]
            };
            string requestUrl =
                ConfigurationManager.AppSettings["BaseUrl"] +
                ConfigurationManager.AppSettings["IssueChannelAccessTokenUrl"];

            IssueChannelAccessTokenResponse response = await MessagingApiSender.SendMessagingApi <IssueChannelAccessTokenRequest, IssueChannelAccessTokenResponse>(
                null,
                requestUrl,
                request,
                "post",
                "application/x-www-form-urlencoded"
                ).ConfigureAwait(false);

            Trace.TraceInformation("End");

            return(response);
        }
Пример #2
0
        /// <summary>
        /// サービス実行
        /// </summary>
        /// <param name="config">設定項目</param>
        public static async Task Execute(WebhookServiceConfig config)
        {
            Trace.TraceInformation("Start");

            // 引数のnullチェック
            if (config == null)
            {
                Trace.TraceInformation("Config is Null");
                return;
            }

            // 署名の検証を行う場合
            if (config.IsExecuteVerifySign)
            {
                // 署名の検証
                bool verifySignResult = await AuthenticationService.VerifySign(GetSignature( config.RequestHeaders ), config.RequestContent).ConfigureAwait(false);

                // NGなら以下の処理を行わない
                if (!verifySignResult)
                {
                    Trace.TraceInformation("Verify Sign Result is NG");
                    return;
                }
            }

            // リクエストトークンをデータモデルに変換
            WebhookRequest request = JTokenConverter.ConvertJTokenToWebhookRequest(config.RequestJToken) ?? new WebhookRequest();

            // チャンネルアクセストークンの取得
            string channelAccessToken;

            // ロングタームチャンネルアクセストークンを使用する場合
            if (config.IsUseLongTermChannelAccessToken)
            {
                channelAccessToken = ConfigurationManager.AppSettings["LongTermChannelAccessToken"];
            }

            // ロングタームチャンネルアクセストークンを使用しない場合はチャンネルアクセストークンを発行する
            else
            {
                IssueChannelAccessTokenResponse channelAccessTokenResponse = await AuthenticationService.IssueChannelAccessToken().ConfigureAwait(false);

                channelAccessToken = channelAccessTokenResponse?.access_token;
            }

            // イベント毎に分岐
            foreach (EventBase webhookEvent in request.events)
            {
                // 友達追加時イベント
                if (webhookEvent is FollowEvent)
                {
                    config.FollowEventHandler?.Invoke(channelAccessToken, (webhookEvent as FollowEvent)?.replyToken);
                }

                // ブロック時イベント
                else if (webhookEvent is UnfollowEvent)
                {
                    config.UnfollowEventHandler?.Invoke();
                }

                // グループ追加時イベント
                else if (webhookEvent is JoinEvent)
                {
                    config.JoinEventHandler?.Invoke(channelAccessToken, (webhookEvent as JoinEvent)?.replyToken);
                }

                // グループ退会時イベント
                else if (webhookEvent is LeaveEvent)
                {
                    config.LeaveEventHandler?.Invoke();
                }

                // メッセージイベント
                else if (webhookEvent is MessageEvent)
                {
                    MessageEvent messageEvent = webhookEvent as MessageEvent;

                    // 音声
                    if (messageEvent?.message is AudioMessage)
                    {
                        config.AudioMessageEventHandler?.Invoke();
                    }

                    // ファイル
                    else if (messageEvent?.message is FileMessage)
                    {
                        config.FileMessageEventHandler?.Invoke();
                    }

                    // 画像
                    else if (messageEvent?.message is ImageMessage)
                    {
                        config.ImageMessageEventHandler?.Invoke();
                    }

                    // 位置情報
                    else if (messageEvent?.message is LocationMessage)
                    {
                        config.LocationMessageEventHandler?.Invoke();
                    }

                    // スタンプ
                    else if (messageEvent?.message is StickerMessage)
                    {
                        config.StickerMessageEventHandler?.Invoke();
                    }

                    // テキスト
                    else if (messageEvent?.message is TextMessage)
                    {
                        TextMessage textMessage = messageEvent?.message as TextMessage;
                        config.TextMessageEventHandler?.Invoke(channelAccessToken, messageEvent?.source, messageEvent?.replyToken, textMessage?.text);
                    }

                    // 動画
                    else if (messageEvent?.message is VideoMessage)
                    {
                        config.VideoMessageEventHandler?.Invoke();
                    }

                    // 想定外のイベントの時は何もしない
                    else
                    {
                        Trace.TraceError("Unexpected Type");
                    }
                }

                // ポストバックイベント
                else if (webhookEvent is PostbackEvent)
                {
                    config.PostbackMessageEventHandler?.Invoke();
                }

                // ビーコンイベント
                else if (webhookEvent is BeaconEvent)
                {
                    // バナータップ時イベント
                    if (((BeaconEvent)webhookEvent)?.beacon is BannerBeacon)
                    {
                        config.BannerBeaconEventHandler?.Invoke();
                    }

                    // バナー受信圏内に入った時のイベント
                    else if (((BeaconEvent)webhookEvent)?.beacon is EnterBeacon)
                    {
                        config.EnterBeaconEventHandler?.Invoke();
                    }

                    // バナー受信圏外に出た時のイベント
                    else if (((BeaconEvent)webhookEvent)?.beacon is LeaveBeacon)
                    {
                        config.LeaveBeaconEventHandler?.Invoke();
                    }

                    // 想定外のイベントの時は何もしない
                    else
                    {
                        Trace.TraceError("Unexpected Beacon Type");
                    }
                }

                else
                {
                    Trace.TraceError("Unexpected Message Type");
                }
            }

            Trace.TraceInformation("End");
        }