// 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); }
/// <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"); }