GAS(Google Apps Script)でお手軽にbotを作る方法。


0)事前準備

・Googleアカウントを取得しておく。
・bot用のTwitterアカウントも取得しておく。
・自動配信したいコンテンツも用意しておく。


1)twitter側の設定。

http://dev.twitter.com/apps/new へ接続して、twitterアプリを作る。

Create Twitter App

Application Name: すきななまえ(既存とかぶらないようにする
Description: なんか書かないとたしか怒られる
Application Website: すきななまえ
Organization: すきななまえ
Application Type: Browser
Callback URL: https://spreadsheets.google.com/macros
DefaultAccess type: Read & Write
・「Register application」ボタンを押して、できあがったらコンシューマー・キーとコンシューマー・シークレットが出てくるので、控えるなりページを放置しておくなりする。


2)GASとTwitterを接続する。

・Googleドキュメント→新規作成→スプレッドシート→すきな名前で保存しておく。
・ツール→スクリプトエディタで別窓が立ち上がる。これもテキトーな名前で保存しておく。日本語ではないほうがよいと思う。
(余談:関数名に日本語使えるっぽいのですが、使える文字と使えない文字があるっぽい。「。」とかダメだった。)
・TwitterにOAuth接続する関数(tweetInitialize())と、Twitter投稿関数(twitterPost(text))をスクリプトエディタに作成(先人の知恵をありがたくコピペ)。

※2013.11.10 OAuth1.1になってたので、ちょっと修正。

===========================================================================================
function tweetInitialize() {
  // Setup OAuthServiceConfig
  var oAuthConfig = UrlFetchApp.addOAuthService("twitter");
  oAuthConfig.setAccessTokenUrl("https://api.twitter.com/oauth/access_token");
  oAuthConfig.setRequestTokenUrl("https://api.twitter.com/oauth/request_token");
  oAuthConfig.setAuthorizationUrl("https://api.twitter.com/oauth/authorize");
  oAuthConfig.setConsumerKey(ScriptProperties.getProperty("twitterConsumerKey"));
  oAuthConfig.setConsumerSecret(ScriptProperties.getProperty("twitterConsumerSecret"));

}

function twitterPost(text) {
  // Setup optional parameters to point request at OAuthConfigService.  The "twitter"
  // value matches the argument to "addOAuthService" above.
  var options =
  {
    "oAuthServiceName" : "twitter",
    "oAuthUseToken" : "always",
    "method" : "POST"
  };
  var encodedTweet = encodeURIComponent(text);
  var result = UrlFetchApp.fetch("https://api.twitter.com/1.1/statuses/update.json?status=" + encodedTweet, options);
  var o  = Utilities.jsonParse(result.getContentText());
  Logger.log(o);
  Logger.log(result.getResponseCode());
}
===========================================================================================
・スクリプトエディタ→ファイル→プロパティを開き、スクリプトのプロパティタグを選択。以下の2つを追加
 

twitterConsumerKey →(twitterアプリのコンシューマー・キー)
twitterConsumerSecret →(twitterアプリのコンシューマー・シークレット)

※ここまでできたら、動くかなーと試してみる。↓こんな関数を作って保存する。

===========================================================================================
function botTweet(){
  tweetInitialize();
  twitterPost("ついったーてすと");
}
===========================================================================================

・「実行する関数を選択」でbotTweetを選択肢、その左の→ボタンを押す。
・認証系のメッセージにOKを押して、数秒待ち(実行するのに多少の動きもっさり感あり)、bot用のTwitterIDにつぶやいていればOK。



3)Spread Sheetの内容から、配信内容をランダムで取得する。

・配信したい内容をスプレッドシートに貼り付ける。シート名もお好みで。
(そもそもExcelとかで作ってあるファイルをインポートしてスタートすればOK)
・データの先頭になるセルを選択した状態で、編集→新しい範囲を定義。
・今回はクイズの問題と回答を合体させて140文字になるように調整したので、↓こんな感じ。

===========================================================================================
function createTwitText() {
  // シート名と範囲を指定。
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var rangePlayers = ss.getRangeByName('Mondai');
  var sheetControl = ss.getSheetByName('quizData');

  // Get the players from column A.  We assume the entire column is filled here.
  // 問題と回答のセルをRange指定して範囲を取得する。
  // OFFSET(参照, 行数, 列数, height, width)
  rangePlayers = rangePlayers.offset(0, 0, sheetControl.getMaxRows() -
      rangePlayers.getRowIndex() + 1, 2);
  var players = rangePlayers.getValues();

  // Now figure out how many players there are(ie don't count the empty cells)
  // 空白セルを詰めている?
  var numPlayers = 0;
  for (var i = 0; i < players.length; i++) {
    if (!players[i][0] || players[i][0].length == 0) {
      break;
    }
    numPlayers++;
  }
  players = players.slice(0, numPlayers);
  
  //ランダム関数で取得。
  var rand = Math.ceil(Math.random() * players.length);
  
  //問題
  var qText = players[rand][0];
  //var aText = Range.getValue(qText);
  //答え
  var aText = players[rand][1];
   
  // Twitterだから、問題と答えをあわせて140文字で切る。
  var forTwit = "";
  
  if ((qText.length + aText.length + 3)> 140) {
    qLength = 140 - 3 - aText.length;
    forTwit = qText.slice(0, qLength) + "/【" + aText + "】";
  }else{
    forTwit = qText + "/【" + aText + "】";;
  }
  
  //  Browser.msgBox(forTwit);

  return forTwit;

}
===========================================================================================

・ちゃんとできてるかな?とメッセージボックスに表示させている名残があるのが自信のなさのあらわれ。
・さっきのbotTweet関数に、いまのを足してみる。
===========================================================================================
function botTweet(){
  forTwit = createTwitText();
  tweetInitialize();
  twitterPost(forTwit);
}
===========================================================================================


4)指定した時間毎につぶやく。

・スクリプトエディタ→トリガー→現在のスクリプトのトリガーに追加する。
実行:動かす関数
イベント:時間主導型(タイマーとかはお好みで)
・このcronぽい機能が簡単すぎて感動。



(参考にさせてもらったありがたいサイト)

■Google Apps Script Tutorial: Twitter Approval Manager

■GAS/Twitterへの自動投稿

(動いてるbotはこちら)

◆お問い合わせ
usakoyama@じーめーる.com




Comments