こちらのサイトを見て、勉強もかねて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~



コメント
晩飯ボット(Twitter)の作者です。今回は記事を紹介していただきありがとうございました。
勝手ながら、当ブログ記事にもこちらの記事のリンクを紹介させて頂きます。
今後ともよろしくお願いします^^
オーカワさん、コメントありがとうございます。
コンパスのブログもちょくちょく拝見させていただいています。
今後も楽しい記事、楽しみにしています。