GASでChatworkに晩飯ボット

Chatwork
スポンサーリンク

 

こちらのサイトを見て、勉強もかねてChatworkでやりたいな~と思い、まねさせていただきました。

【GAS】Google Apps Scriptで作るTwitter Bot(晩飯 Bot)

ほとんどそのままコピーです。いつも参考になり勉強させていただいています。

GASでプログラム

Chatworkからのメッセージを受ける部分から。

doPostを使います。ChatworkのWebhookに対応するアクションがあると、このdoPostが動いてくれます。

function doPost(e){
 var json = JSON.parse(e.postData.contents);
 var roomID = json.webhook_event.room_id;//記入したルームID取得
 var UID =  json.webhook_event.from_account_id;//記入した人のID取得
 var Text = json.webhook_event.body;//記入内容取得
 var body
 
 if (Text.indexOf('今日のおすすめ') != -1){
  body = scraiping();
 }
 else if (Text.indexOf('レシピ') != -1){
  var myRegexp = /([\s\S]*?)レシピ/g;
  Text = Text.match(myRegexp);
  Text = Text[0].replace('[To:0000000] ○○○○さん\n',"");
  Text = Text.replace('レシピ',"");
  body = serch(Text);
 }
 sendCW(body,UID,roomID);
}

飛んでくる内容はJSON形式なので、2~5行でルームIDや内容にそれぞれ分けてます。

本家さんと同じように、今日のおすすめ料理とキーワードを指定しての検索できるようにしています。

([\s\S]*?)は、空白か空白でない文字を0回以上繰り返す。ということのようです。

正規表現もわからないので、1回1回調べました。初心者はつらい。

もとの文章から、レシピがつく所までを検索した結果は配列で返されるようで(あってるかな)、12~14行のmatch後のTextはText[0]となっています。

今日のおすすめを取得します。

はいこれは、本家さんマンマですね。ありがとうございます。

function scraiping(){
  //今日のお勧めを取得
  var response = UrlFetchApp.fetch("https://cookpad.com/");
  var myRegexp = /<a class=\"track_ct\"([\s\S]*?)<\/a>/g;
  var pickup_recipe = response.getContentText().match(myRegexp)
  //タイトル取得
  myRegexp = /alt=\"([\s\S]*?)\"/g;
  var title = pickup_recipe[0].match(myRegexp);
  title = title[0].substr(4);
  title = title.replace(/\"/g,"");
  //URL取得
  myRegexp = /href=\"([\s\S]*?)\"/g;
  var url = pickup_recipe[0].match(myRegexp);
  url = url[0].substr(5);
  url = url.replace(/\"/g,"");
  url = 'https://cookpad.com' + url;
  
  return '本日のお勧めです。\n【' + title + '】\n' + url;
}

「食材」+レシピで検索する

ここも、本件さんマンマです(^_^;) エラー処理など勉強になります。

一点だけ、追加しました。

複数検索されるので、一番上の料理を返すのではなく、ランダムで返すように乱数を入れました。(15~17行)

function serch(mes){
 try{//エラー処理
  var response = UrlFetchApp.fetch("https://cookpad.com/search/" + mes);
 }
 catch(e){//エラーが出たら
  return "検索エラー";
 }
 
 //cookpadのrecipe-titeleの中身を取得
 var myRegexp = /<a class=\"recipe-title font13([\s\S]*?)<\/a>/g;
 var menu = response.getContentText().match(myRegexp);
 
 //検索結果
 if (menu != null){
  var l =menu.length;
  l = Math.floor(Math.random()*l); 
  menu = menu[l];
 }else{
  return "一致するレシピが見つかりませんでした。";
 }
 //タイトル取得
 myRegexp = /\">([\s\S]*?)<\/a>/g;
 var title = menu.match(myRegexp);
 title = title[0];
 title = title.substr(2);
 title = title.substr(0, title.length-4);
 //URL取得
 myRegexp = /href=\"([\s\S]*?)\"/g;
 var url = menu.match(myRegexp);
 url = url[0].substr(5);
 url = url.replace(/\"/g,"");
 url = "https://cookpad.com" + url;
 
 return 'こんなのどうですか?\n【' + title + '】\n' + url;
}

 

Chatworkに送信

これに関しては以下のサイトにお世話になりました。

【GAS】チャットワークのメッセージを取り出す関数とメッセージを送る関数

こちらのサイトでも、色々と勉強させていただいています。ありがとうございます。

function sendCW(Body,UID,roomID){
  var token = '*******************:'; //チャットワークAPIトークン
  var body = '[To:'+ UID +']' + Body + '\n';
  var url = "https://api.chatwork.com/v2/rooms/" + roomID + "/messages";
  var params = {
    headers:{"X-ChatWorkToken":token},method:"post",payload:{"body":body}
   };
  
  UrlFetchApp.fetch(url,params);
}

最初のJSON形式のデータが飛んできたときに、ルームIDを取得しているので、同じルームに返信されるようにしています。

また、ユーザーIDもわかるので、Toも付けられます。

 

はい、これをまとめればO.K.ですね。

あとはウェブアプリケーションとして導入します。

ChatworkでWebhook設定

特に問題ないですよね?

GASをウェブアプリケーションとして導入したときのURLを貼り付けて、アカウントイベントで自分へのメンションにチェックを入れればO~K~

できたかな?

コメント

  1. オーカワ より:

    晩飯ボット(Twitter)の作者です。今回は記事を紹介していただきありがとうございました。

    勝手ながら、当ブログ記事にもこちらの記事のリンクを紹介させて頂きます。

    今後ともよろしくお願いします^^

    • UEHARA より:

      オーカワさん、コメントありがとうございます。

      コンパスのブログもちょくちょく拝見させていただいています。

      今後も楽しい記事、楽しみにしています。