GASでTwitter Bot (ワンパンマン更新Bot)作りました

2018年6月30日

GASでTwitter Botを作りました。今回はそれのメモです。(コードは下に有り)

まずは前回の記事の通り、GASのプロジェクトを作ります。

次にTwitter AppsにBot機能を取り込みたいアカウントでログインします。別でBotアカウントを作りたいときは、新しくアカウントを作っておく必要があります。その際、電話番号認証が後から必要になるので、最初から電話番号で登録するのが良いです。

自分が管理しやすい名前でTwitter Apps名を決め、その説明を簡単に書きます。(アカウントの説明ではない。下の画像の説明は間違えている。)GASでファイル>>…プロパティ>>スクリプトIDを取得。そしてCallBackIDにこんな感じ↓で登録。

https://script.google.com/macros/d/ここにスクリプトID/usercallback

完了したら、Keys and Access Tokensにある、Consumer Key と Consumer Secretをメモしておきます。

次にGASにTwitterライブラリを導入します。リリース>>ライブラリです。その後このid(1rgo8rXsxi1DxI_5Xgo_t3irTw1Y5cxl2mGSkbozKsSXf2E_KBBPC3xTF)で検索します。そいで導入します。

次にGASのスクリプトに以下のコードを導入します。

// OAuth1認証用インスタンス
var twitter = TwitterWebService.getInstance(
  'Consumer Key (API Key)',
  'Consumer Secret (API Secret)'
);
// 認証を行う(必須)
function authorize() {
  twitter.authorize();
}

// 認証をリセット
function reset() {
  twitter.reset();
}

// 認証後のコールバック(必須)
function authCallback(request) {
  return twitter.authCallback(request);
}

// タイムラインを取得
function getUserTimeline() {
  var service  = twitter.getService();
  var response = service.fetch('https://api.twitter.com/1.1/statuses/user_timeline.json');
  Logger.log(JSON.parse(response));
}

// ツイートを投稿
function postUpdateStatus(volumes) {
  var service  = twitter.getService();
  var response = service.fetch('https://api.twitter.com/1.1/statuses/update.json', {
    method: 'post',
    payload: { status: targetName + "[第" + volumes + "話]の更新がありました! "+ targetUrl }
  });
  Logger.log(JSON.parse(response));
}

その後authorize()で認証します

エラーなく実行されたら表示>>ログからurlを取得します。その後、そのurlを開いて認証完了です。(successという文字が出ます。)

あとは頑張れ!GASの標準機能の関数の定期実行を設定すればおk。

参考サイトはこちら

全体のコード

var targetName="ワンパンマン";
var targetUrl="http://tonarinoyj.jp/episode/13932016480028985383";
var mailAddress="example@gmail.com";     

// OAuth1認証用インスタンス
var twitter = TwitterWebService.getInstance(
  'Consumer Key (API Key)',
  'Consumer Secret (API Secret)'
);

//メイン関数
function detectChange(){ 

  //スプレッドシートの取得&アクティブ化
  var spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadSheet.getActiveSheet();                

  //使用セル指定
  var cellA1 = sheet.getRange("A1");
  var cellA2 = sheet.getRange("A2");

  //過去の情報取得
  var before = cellA1.getValue();
  var volumes = cellA2.getValue();

  //urlの先の情報
  var response = UrlFetchApp.fetch(targetUrl);             //httpレスポンス
  var now = response.getContentText("UTF-8");  //現在のテキスト
  now = now.substring(now.indexOf("xxx"),now.indexOf("xxx"));

  //更新処理
  if(before !== now){
    //セルの値を更新
    cellA1.setValue(now);   

    volumes++;
    cellA2.setValue(volumes);

    postUpdateStatus(volumes);
    mailMe(volumes);

    Logger.log("更新有り");
  }

  else{
    //mailMeElse(volumes);
    Logger.log("更新無し");
  }

}

//更新通知メール
function mailMe(volumes){
  MailApp.sendEmail(
    mailAddress,                     //宛先
    targetName+"[第"+ volumes +"話]の更新通知",     //タイトル
    targetName + "(" + targetUrl + ")が更新されたよ!"
  );
}

//更新無し通知メール
function mailMeElse(volumes){
  MailApp.sendEmail(
    mailAddress,
    "更新無し",
    "更新無しだよ!" + targetName + "[第" + volumes + "話]の更新がありました! "+ targetUrl
  );
}

//以下Twitter用

// 認証を行う(必須)
function authorize() {
  twitter.authorize();
}

// 認証をリセット
function reset() {
  twitter.reset();
}

// 認証後のコールバック(必須)
function authCallback(request) {
  return twitter.authCallback(request);
}

// タイムラインを取得
function getUserTimeline() {
  var service  = twitter.getService();
  var response = service.fetch('https://api.twitter.com/1.1/statuses/user_timeline.json');
  Logger.log(JSON.parse(response));
}

// ツイートを投稿
function postUpdateStatus(volumes) {
  var service  = twitter.getService();
  var response = service.fetch('https://api.twitter.com/1.1/statuses/update.json', {
    method: 'post',
    payload: { status: targetName + "[第" + volumes + "話]の更新がありました! "+ targetUrl }
  });
  Logger.log(JSON.parse(response));
}

ITGAS, Javascript

Posted by shu