ぼっちでも寂しくない。
前回はGASでA3RTを触りました
折角なので何か作ろうと思い、TwitterのBOTを作ってみました。具体的には、自分がつぶやいた内容に関して、しつこく合いの手を入れてくれるBOTです(笑)
いざ実装
とはいえ、ウェッブなエンジニアリングが苦手なので、今回もIFTTT様に頼って行きていこうと決めました。
- つぶやく
- IFTTT経由でTwitterをトリガーにGASで作ったWebAPIを叩く
- GASからA3RTのTalk APIを叩いて、リプライ文言を作成
- IFTTT経由でリプライ専用アカウントからつぶやく
GASからTwetterを直接叩けばいいじゃんっていうツッコミはなしで。最初はこんな感じで実装してたのですが、IFTTTからGASにWebhookをなげるところが上手く行かなかったので、Google DriveのSpreadsheetを介して、Twetter⇒GASにツイート情報を渡しています・・・。
うん、これは酷い。とりあえず動くことを確認したかったので、お許し下さい。
どんな感じに動くのか
クソコードは長くなるので、後ほど。
「会社行きたくないな」ってつぶやくと、数分後に心配してくれるリプライをくれます(笑)
たまに会話が噛み合わないこともありますが、ネットストーキングの如く、必ずリプライをくれます。
気づくとこんな感じに。
クソコードはこちら
IFTTTでTwitter⇒Driveに情報を渡すと、リツイートやメンションも渡してしまうので、GASでそれらのツイートは無視するようにしています。下記のloop()を定期実行しています。
var url = "https://api.a3rt.recruit-tech.co.jp/talk/v1/smalltalk"; var apikey = "xxxxx"; var iftttUrl = "https://maker.ifttt.com/trigger/xxx/with/key/xxx"; var sheetId = "xxx"; var sheetName = "xxx"; function loop(){ if(!isSheetDataAvailable()){ Logger.log("no data"); return; } var lastTweet = getSheetData(); Logger.log(lastTweet); clearSheetData(); if(lastTweet.lastIndexOf('RT', 0) == 0){ Logger.log("ignoring retweet"); return; } if(lastTweet.lastIndexOf('@', 0) == 0){ Logger.log("ignoring mention"); return; } var message = ask(lastTweet); Logger.log(message); triggerIfttt("@pokiiio " + message); } function ask(message){ var payload = { "apikey" : apikey, "query" : message }; var options = { "method" : "post", "payload" : payload }; var response = UrlFetchApp.fetch(url, options); var result = JSON.parse(response.getContentText())["results"][0]["reply"]; return result; } function isSheetDataAvailable(){ var spreadsheet = SpreadsheetApp.openById(sheetId); var sheet = spreadsheet.getSheetByName(sheetName); var maxRow = sheet.getLastRow(); return maxRow > 0; } function getSheetData(){ var spreadsheet = SpreadsheetApp.openById(sheetId); var sheet = spreadsheet.getSheetByName(sheetName); var data = sheet.getSheetValues(1, 1, 1, sheet.getLastColumn()); return data[0][0]; } function clearSheetData(){ var spreadsheet = SpreadsheetApp.openById(sheetId); var sheet = spreadsheet.getSheetByName(sheetName); sheet.clear(); } function triggerIfttt(message){ var payload = { "value1" : message }; var options = { "method" : "post", "payload" : payload }; UrlFetchApp.fetch(iftttUrl, options); }