いつも当ブログを見ていただいてる読者様からこんなリクエストがありました!!
実際に作っていこうと思います!!
@CoMPasS_blog
今日の晩飯bot作ってください!
ランダムにcookpadとかレシピサイト飛ばすやつ出来れば材料リプしたらその材料使ったページに飛んで欲しいですねー
鶏もも肉とかやったらから揚げとか照り焼きのページに飛ぶみたいな— のっち@nanoさん応援中 (@NOCCHi_ORiENT) June 18, 2017
Contents
作る機能
Twitterからのリクエストなので、Twitterのbotを作っていきます。
今回作る機能は
- 指定した時間にcookpadのレシピをランダムに投稿
- リプライが来たら、レシピをリプライ
の2つになります。
指定した時間にcookpadのレシピをランダムに投稿
cookpadにアクセスすると、親切な事におすすめのレシピがあります。
しかもこのおすすめレシピは毎日変わります。最高
って事で作っていきますー
作成したプログラム
今回のBOTはLINE_Botでも使ったGoogle Apps Script(GAS)を使います。
サーバーレスで開発したいので......最近はなるべくRaspberry Piは使わないように心がけてます。
//今日のおすすめを取得 function scraiping() { var response = UrlFetchApp.fetch("https://cookpad.com/"); var myRegexp = /<a class=\"track_ct\"([\s\S]*?)<\/a>/g; var url_and_title = response.getContentText().match(myRegexp); url_and_title = url_and_title[0]; // Logger.log(url_and_title) //タイトル取得 myRegexp = /alt=\"([\s\S]*?)\"/g; var title = url_and_title.match(myRegexp); title = title[0].substr(4); title = title.replace(/\"/g,""); //Logger.log(title); //url取得 myRegexp = /href=\"([\s\S]*?)\"/g; var url = url_and_title.match(myRegexp); url = url[0].substr(5); url = url.replace(/\"/g,""); url = 'https://cookpad.com' + url; //Logger.log(url); //Twitterに投稿 mes = '今日の晩飯にどうですか?' + '【' + title + '】' + url; var data = { "status": mes }; var res = Twitter.api("statuses/update", data); }
Twitterに投稿する部分はこちらの記事を参考にさせて頂きました
というかそのまま使っています。いつもお世話になっております。
結果
超簡単でした。
GASのトリガーを毎日午後6〜7時にセットしてありますので、
毎日午後6〜7時の間に1回ツイートしてくれます。
今日の晩飯にどうですか?【お肉ほろほろ~♡簡単☆手羽元の酢醤油煮♫】https://t.co/HJJPQ2oseN
— オーカワ (@okawa_compass) June 22, 2017
リプライが来たら、レシピをリプライ
指定した時間に投稿するのは簡単ですが、リプライするのは少し難しくなります。
GASでリプライする仕組み
GASでリプライするには、少し工夫が必要です。
皆さんは普通リプライが来たら、携帯(パソコン)に通知が来ますよね?
GASは通知が来ないです。というか通知を受け取れる仕組みが技術的に作れないです。(と思います)
Streaming Apiを使って、5分以内にプログラムを強制的に終了する機能にすれば出来るかもれない
出来ないなりに頑張るならこんな感じ
これを毎分やります。(1分以内だとTwitterのアクセス制限に引っかかる)
返信する料理
例えば「鶏肉」をクックパッドで調べた時、このような検索結果になります。(記事書いてる時点で)
ふむふむ、
ちなみにcookpadさん、月額280円払わないと、新着以外はほとんど見れないシステムでした。
毎日3食外食なオーカワがアカウントを持っているはずはなく......
新着の結果しかプログラムで扱えないですね(泣)
今回は一番簡単な新着レシピを返信したいと思います。
作成したプログラム
//自動返信 function Formular_bot(){ var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName("config");//configという名前のシートを取得 var last_id = sheet.getRange("A2").getValue();//最後に取得したリプライのIDをシートから取得 var retobj = {}; retobj = getNewReply(last_id); last_id = retobj.last_id; if (retobj['replies'] ==false) return;//gasの動作制限にかかった場合は強制終了 retobj['replies'].forEach(function(value,index,array){ if(value['in_reply_to_screen_name']!=value['user']['screen_name']){//リプライの送信者と受信者が違うことを確かめる var text = value['text']; //検索に不要な文章を殺す text = text.replace(/@okawa_compass/g,""); text = text.replace(/@cookpad_pr/g,""); text = text.replace(/ /g," "); //コンパスという単語が含まれていたら if ( text.indexOf('コンパス') != -1) { text = text.replace(/コンパス/g,""); //検索開始 var mes = search(text); //リプをする var option = { "status":"@"+value['user']['screen_name']+" " + mes, "in_reply_to_status_id":value.id_str } //Logger.log(option); Twitter.api("statuses/update",option); } } }); sheet.getRange("A2").setValue(last_id); } //idを記憶 function getNewReply(last_id){ resp = {} resp['replies'] = Twitter.api('statuses/mentions_timeline',{'since_id':last_id}) if(resp['replies'].length>0&&'id_str' in resp['replies'][0]){ last_id = resp['replies'][0]['id_str']//最新のIDを保存しておく } resp['last_id'] = last_id; return resp; } function search(mes){ //エラー処理 try{ var response = UrlFetchApp.fetch("https://cookpad.com/search/" + mes); } catch(e){//エラーが出たら return "検索エラー(コンパス 調べたい材料でお願いします。)"; } //cookpadのtrack_ctの中身を取得 var myRegexp = /<a class=\"recipe-title font13([\s\S]*?)<\/a>/gi; var url_and_title = response.getContentText().match(myRegexp); //検索結果 if (url_and_title != null){ url_and_title = url_and_title[0]; } else{//なかったら return "一致するレシピが見つかりませんでした。"; } //Logger.log(url_and_title); //url取得 myRegexp = /href=\"([\s\S]*?)\"/g; var url = url_and_title.match(myRegexp); url = url[0].substr(5); url = url.replace(/\"/g,""); url = 'https://cookpad.com' + url; //Logger.log(url); //タイトル取得 myRegexp = /\">([\s\S]*?)<\/a>/g; var title = url_and_title.match(myRegexp); title = title[0]; //文字列削除 title = title.substr(2); title = title.substr( 0, title.length-4 ); //作成したメッセージをFormular_botに返す var meseage = 'こんなのどうでしょう?' + '【' + title + '】' + url; return meseage; }
Formular_bot,getNewReply関数はこちらの記事を参考にさせて頂きました。

少し、アレンジをしましたが、ほぼ同じ内容です。いつもお世話になっております。
結果
自分以外のアカウントのリプしか受付ないので、コンパス公式アカウントでツイート(リプライ)したいと思います。
コンパス 「調べたい材料」で僕の垢宛にリプライを送れば、1分以内に返ってきます。
こんなのどうでしょう?【鶏胸肉と夏野菜の照り焼き風味】https://t.co/5ZJfwylrmZ
— オーカワ (@okawa_compass) June 30, 2017
cookpadさんにレシピがあれば、どんな材料でも返信する事ができます。
感想
それっぽいのが出来ました。改善の余地はありそうです。
LINE_BOTは自動返信する機能を作るのが簡単ですが、Twitterはそういう訳にはいきませんでした......
正直リプライに最大1分かかるのって、ゴミですよねww
僕だったらストレスで禿げちゃうもう禿げてる
ってな訳でPythonで作り直しますよ!!
家のラズピッピを馬車馬のように働かせます。
2017/07/11日に投稿予定です。
投稿されました。

Chatworkで実装してくれた方がいまししたので、紹介します!!

これからもよろしくお願いします。
余談
リクエストはいつでも受け付けてまーす。もしリクエストしたい場合は公式垢(@CoMPasS_blog)まで
技術的な物でも、なんでも大丈夫です。(リプライが来るとメンバーが喜びます)
そのリクエストをやるか、やらないかは僕の実力(気分)次第ですが......
リクエスト側は無料で作ってもらえるかもしれない
オーカワ側は記事のネタが増える
winwinの関係ですね(笑)
オーカワ
最新記事 by オーカワ (全て見る)
- AIで競馬を予想するサイトを構築します! - 2020年9月5日
- 【your-webtool】便利なツールを集めたサイトを作りました - 2020年8月8日
- 新型13インチMacbook Proを購入した - 2020年7月11日
コメント
オーカワさんお初お目にかかります。
こちらの記事を参考にさせていただきTwitterの方にて
@スクリーンネーム+特定の文字列+数値
とリプを受け取ると数値のみをスプレッドシートの特定のセルに入力し、スプレッドシート内の関連する数式で計算をしたあとその結果をリプライで送り返そうと考えているのですが、数値だけを抜き取って特定のセルに入力することができません…
どのようにすればよろしいでしょうか…
例えば @screen_name テスト 10
とリプライが来た場合、テストという文字列をトリガーとして10をスプレッドシートのa1に書き込む→a2でa1*20-15という計算をしてa2の値をmesとして@reply_name + mes として返信という感じのことがしたいです。
よろしければお力をお貸しください…
飛龍提督 様
コメントありがとうございます。
つまづいているのが、「数値だけを抜き取る」なのか、「特定のセルに入力する」のどっちかわかりませんが、
数値だけを抜き取る方だとやはり、正規表現で実装すればいいかと思います。
「GAS 正規表現」で調べると記事がいろいろ検索するかと思いますので、
いろいろ試してみてはいかがでしょうか?
ちなみに、GASはJavaScriptとほぼ同じ書き方なので、
「JavaScript 正規表現」でもいいかと思います。
こちらのほうで検索した方が沢山情報が出てくると思います。
返信ありがとうございます。
なるほど、正規表現というモノがあるのですか知りませんでした。
おかげさまで無事解決することができました。
ありがとうございましたm(__)m