GASを使ってLINEからChatworkへ投稿

Chatwork
スポンサーリンク

IT関係初心者が、LINEのグループにメッセージが来ると、それをChatworkへ飛ばして見せます!

先日、ChatworkからLINEへメッセージを送信したので、今度は逆にLINEからChatWorkへ投稿してみます。

LINE DevelopersでBotの作成

これは前回のBotを使用します。

新しく作成するときはこちらを参考にして下さい。

LINE Botの作成

GASでプログラム

実際は1つのプログラムですが、それぞれのパートに分けて説明していきます。

LINEにメッセージがあったときの処理

Botがいるグループにメッセージがあると、登録しているWebhookをたたいてくれます。まずは、その部分です。

今回もですが、こちらのサイトを参考にしています。ありがとうございます。

[GAS]全米が泣いた親不孝 LINE Botを作ってみた

 

var Chatwork_API = '*******************************';
var CW_room_id = '********'; //ルームID
var LINE_CHANNEL_ACCESS_TOKEN = '************************************';

function doPost(e){
 var reply_token= JSON.parse(e.postData.contents).events[0].replyToken;

 //メッセージが無かったら殺す
 if (typeof reply_token === 'undefined') {
 return;
 }

 //きたメッセージを取得
 var GroupID = json.events[0].source.groupId;
 var UserID = json.events[0].source.userId;
 var text = json.events[0].message.text;
 var UserName = getUserName(UserID);// 表示名を確認
 if (UserName == 0){
  var body = '[info][title]「LINEのグループ」にメッセージきたけど、名前がわかりません。[/title]' + text + '[/info]';
 }else{
  var body = '[info][title] ' + UserName + 'さんから「LINEのグループ」にメッセージだよ。[/title]' + text + '[/info]';
 }
}

Chatwork側ではChatworkに作成したアカウントがメッセージを送ります。1対1だったら、いいのですが、グループだと誰から送られてきたか知る必要があります。

幸いLINEから送られてくるJSONの中にはUserIDが入っていますが、これではだれだかわかりません。

そこで、下で表示名を取得します。

UserIDを利用して、LINEの表示名を取得する

//Userの表示名取得
function getUserName(UID){
 var url = 'https://api.line.me/v2/bot/profile/' + UID;
 try {//エラー処理
  var response = UrlFetchApp.fetch(url,{
     'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + LINE_CHANNEL_ACCESS_TOKEN,
      }
  })
 }catch(e){//表示名を取得できなかったら
  return 0;
 }
 var json = JSON.parse(response.getContentText());
 return json["displayName"]
 }

これで、LINE Developersでプロフィールの表示名を取得できます。

つまずきポイント

自分のアカウントでテストしていて、表示名も取得しているし、うまくいっていると思ってました。

ところが、他の人がグループに送信したメッセージがChatworkにこないんです。

??テストで送ってみよう!→成功。

他の人が送る→失敗(;・∀・)ハッ?

????悩みました。

そうして、出た解がLINEで友達追加していないと取得できないんじゃない?→正解でした。

友達として登録すると、表示名を取得できました。

そこで、表示名を取得できなかったら「0」を返して、分岐条件としました。

テスト環境が自分ひとりだと、意外な落とし穴がありますね。(意外じゃないかな?)

Chatworkにメッセージ送信

こちらのサイトを参考にさせていただきました。

Google Apps Scriptでチャットワーク上におみくじチャットを作る

/* チャットワークにメッセージを送る */
function sendMessage(token,room_id,Body){
  var params = {
    headers:{"X-ChatWorkToken":token},method:"post",payload:{"body":Body}
  };
  var url = "https://api.chatwork.com/v2/rooms/" + room_id + "/messages";
  UrlFetchApp.fetch(url,params);
}

ウェブアプリケーションとして導入

上記プログラムをまとめて、ウェブアプリケーションとして導入します。

LINEのBotのWebhookにプログラムのURLを登録

LINEにメッセージがあったら上のプログラムをたたいてほしいので、LINEのBotでWebhookの設定をします。

ウェブアプリケーションとして導入したときのアドレスを記入します。

 

完成です!

うまくいきましたかね?

自分としてはLINEの表示名を取得するのにてこずりました。

 

コメント

タイトルとURLをコピーしました