Androidのメモとか

ポキオの日記です。今日も遅延してない。

リクルートのAIを無料で使えるA3RTをつかってツイートにしつこくリプライしてくれるBOTを作ってみた

ぼっちでも寂しくない。

前回はGASでA3RTを触りました

relativelayout.hatenablog.com

折角なので何か作ろうと思い、TwitterBOTを作ってみました。具体的には、自分がつぶやいた内容に関して、しつこく合いの手を入れてくれるBOTです(笑)

いざ実装

とはいえ、ウェッブなエンジニアリングが苦手なので、今回もIFTTT様に頼って行きていこうと決めました。

A3RT GAS IFTTT

  1. つぶやく
  2. IFTTT経由でTwitterをトリガーにGASで作ったWebAPIを叩く
  3. GASからA3RTのTalk APIを叩いて、リプライ文言を作成
  4. IFTTT経由でリプライ専用アカウントからつぶやく

GASからTwetterを直接叩けばいいじゃんっていうツッコミはなしで。最初はこんな感じで実装してたのですが、IFTTTからGASにWebhookをなげるところが上手く行かなかったので、Google DriveのSpreadsheetを介して、Twetter⇒GASにツイート情報を渡しています・・・。

A3RT GAS IFTTT

うん、これは酷い。とりあえず動くことを確認したかったので、お許し下さい。

どんな感じに動くのか

クソコードは長くなるので、後ほど。

A3RT GAS IFTTT

「会社行きたくないな」ってつぶやくと、数分後に心配してくれるリプライをくれます(笑)

A3RT GAS IFTTT

たまに会話が噛み合わないこともありますが、ネットストーキングの如く、必ずリプライをくれます。

A3RT GAS IFTTT

気づくとこんな感じに。

クソコードはこちら

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);
}
「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。