【GAS】Twitter APIでスプレッドシートから投稿する

gasBackEnd

今回はGASを使ってスプレッドシートの内容をツイッターに投稿する機能を紹介します。
定時で同じ内容を投稿したい、少し文言変えて状況によって出し分けしたいなどなど自動化の第一歩として踏み出せるはずです。
また、認証やツイート投稿のメソッドは汎用性があるので応用して独自の機能に挑戦してみるのも理解の近道です。

GASでスプレッドシートの内容をツイートする

スポンサーリンク

目標

スポンサーリンク

目標は「スプレッドシート内のセルから投稿したい内容をツイートする」です。

今回は簡単に「勝ち、負け、引き分け」をツイートできるようにします。

スプレッドシートから内容を投稿する

作成手順

スポンサーリンク
  1. Twitterデベロッパー登録
  2. GASプロジェクト作成
  3. Twitter APP作成
  4. GASコード記述

Twitterデベロッパー登録

まずは投稿したいツイッターアカウントを用意します。既存のアカウントを使用するのであればそれでもOKですが既にフォロワーさんがいる場合テスト投稿などが見られてしまうかもしれないので注意したほうが良いです。
個人的におすすめとして、テスト用のアカウントでまずは動作確認を取ったほうが安心して開発できます。

  1. https://developer.twitter.com/ にアクセスします。
  2. 右上の「sign in」をクリックして進み、用意したツイッターアカウントでログインしましょう。
  3. ログインできたら「apply」をクリックして進み[Apply for a developer account]をクリックします。
  4. どのような目的のアプリケーションなのか等、審査のための質問に答えていきます。
    4-1. このときすべて英文で入力することになりますが、まずはテキストエディタなどに日本語で書いてからgoogle翻訳する手順で問題ないです。(たぶん)
    4-2. ここは少し長いですが一問一答のような形式なので迷うことはほぼほぼないと思います。英語で何が書いてあるか分からないとかはあると思うので随時翻訳したりして質問に答えていきましょう。
    4-3. 途中で認証コードを受け取ることになるので受信可能なメールアドレスでの登録が必須です。
    4-4. すべての質問を送信したら最後に同意のチェックを入れ、「 Submit Application 」をクリックしたらメールが届きます。
  5. 受信したメールを開き、「 Confirm your email 」をクリックするとデベロッパー画面に遷移します。これでデベロッパー登録されました。おめでとう!

すぐにapp createしたいところですが先にGASプロジェクトを作っておきましょう。

GASプロジェクト作成

  1. googleにログインします。
  2. https://script.google.com/home にアクセスします。
  3. 新規プロジェクト作成します。
  4. [リソース]→[ウェブアプリケーションとして公開]を選択します。
  5. デプロイの設定をしてデプロイボタンをクリックします。※1
  6. Current web app URL:の枠内のURLが当アプリケーションのURLになりますので保存しておきましょう。Twitter APIさんがここにアクセスしに来ます。

こんな感じのURLです。これがサイトURLです

https://script.google.com/macros/s/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/exec

※1
デプロイ設定値は下記を参考にしてください。

項目設定値
project versionわかればなんでもいいです。devとかtestとか、真面目につけてもOK
execute the app asMe
who has acces to the appsAnyone, even anonymous

Twitter APP作成

  1. https://developer.twitter.com/ にアクセスしてログインします。先ほどデベロッパー登録した状態のままならログイン状態かと思います。
  2. ユーザー名をクリックしてでてくる「 apps 」をクリックします。
  3. 「 create an apps 」をクリックします。
  4. アプリケーションの設定を入力していきます。またまた英文での入力になる項目がありますがgoogle翻訳でOK!
  5. アプリケーション名はクライアント名としてツイートに表示されることになるので不快感を与えるような名前や個人名など知られたくない名前は控えましょう。
  6. 「 Website URL (required)」の項目にはGASプロジェクトで発行したサイトURLを入力します。
  7. 「 Callback URL 」リダイレクトURLは※2参照
  8. 「 Enable Sign in with Twitter 」の項目にチェックしないでおきましょう。
  9. 必須項目を埋めたら「 Create 」をクリックしたらアプリケーションが作成されます。
  10. 「 Keys and Tokens 」タブの「 Consumer API keys 」をコピーしておきます。これは大切なので取り扱いに要注意です。あとで使います※3
  11. 「 Permissions 」タブで「 Access permission 」が「 Read and write 」になっていることを確認しましょう。もしなっていなければ変更して保存します。

※2リダイレクトURL
GASプロジェクトの[ファイル]→[プロジェクトのプロパティ]を開く
スクリプト ID欄の文字列をコピーして下記の xxxxx に代入すればリダイレクトURLの完成

https://script.google.com/macros/d/xxxxx/usercallback

GASコード記述

  1. 認証
  2. 投稿テスト
  3. スプレッドシート作成
  4. スプレッドシート内容をGASで読み取る
  5. 読み取った内容を投稿する

認証

ライブラリ導入

ますはGASプロジェクトににOauth1ライブラリ導入します。
[リソース] → [ライブラリ] と進み
「 Add a library 」に下記コードを入れて追加ボタンをクリックします。

1CXDCY5sqT9ph64fFwSzVtXnbjpSfWdRymafDrtIZ7Z_hwysTY7IIhi7s

最新のバージョンを選択して保存ボタンをクリックします。

認証コードの記述と実行
  1. auth.gsというファイルを新規作成して下記コードを記述します。※3でコピーした文字列を定数に代入します
  2. コードを保存したら「 logAuthorizeUri 」を選択して実行します。googleの認証が求められた場合は※4を参考にしてください
  3. [表示] → [ログ]を選択してログを表示します。ここで表示されたURLをコピーして新規タブで開きます
  4. 「連携アプリを承認」ボタンをクリックする
  5. 成功したら新しく開いたタブは閉じてOKです
const CONSUMER_KEY = 'xxxxxxxxxxxxxxxxxxxx';
const CONSUMER_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

// 認証URLを取得しログに出力する
function logAuthorizeUri() {
  var twitterService = getTwitterService();
  Logger.log(twitterService.authorize());
}

function getTwitterService() {
  return OAuth1.createService('Twitter')
      .setAccessTokenUrl('https://api.twitter.com/oauth/access_token')
      .setRequestTokenUrl('https://api.twitter.com/oauth/request_token')
      .setAuthorizationUrl('https://api.twitter.com/oauth/authenticate')
      .setConsumerKey(CONSUMER_KEY)
      .setConsumerSecret(CONSUMER_SECRET)
      .setCallbackFunction('authCallback')
      .setPropertyStore(PropertiesService.getUserProperties());
}

function authCallback(request) {
  var twitterService = getTwitterService();
  var isAuthorized = twitterService.handleCallback(request);
  if (isAuthorized) {
    return HtmlService.createHtmlOutput('かんたん!');
  } else {
    return HtmlService.createHtmlOutput('失敗しちゃったかも!');
  }
}
※4 googleに安全ではないよってゅゎれた。まぢしんどぃ
  1. 認証ユーザーを選択する。自身でOK
  2. 詳細リンクをクリック
  3. 下のほうにある「{プロジェクト名}(安全ではないページ)に移動」リンクをクリックする
  4. 許可ボタンクリックでOK

投稿テスト

ようやくここまできました。楽な道のりじゃなかったのはわかってる、いまこそ漢の魂もやしくせやぃ!
というわけでまもなく最高の瞬間が訪れますのでもう少し頑張ります。

tweet.gsというファイルを作成し下記コードを記述します。
保存したら、tweet関数を選択して実行します。APIが成功すれば投稿されてしまうので内容には十分注意しましょう。
実際に投稿されていれば成功です。超うれしいですね!

/* リクエスト */
function requestTweet(text) {
  var service = getTwitterService();
  if (service.hasAccess()) {
    var url = 'https://api.twitter.com/1.1/statuses/update.json';
    var payload = {
      status: text
    };
    var options = {
      method: 'post',
      payload: payload,
      escaping: false
    };
    var response = service.fetch(url, options);
    var result = JSON.parse(response.getContentText());
    Logger.log(JSON.stringify(result, null, 2));
    return result;
  }
}

function tweet(){
  requestTweet("お空はこんなに青いのにどうしてこんなに眠いの?");
}

スプレッドシート作成

それでは投稿する内容が記載されているスプレッドシートを作成していきます。

  1. [ファイル] → [New] → [スプレッドシート] を選択して新規スプレッドシートを作成します。
  2. 作成したスプレッドシート名はGASプロジェクト名と同じにするか関連していることが分かる名前にしておきます。
  3. シート名を「 result 」に変更し「勝ち、負け、引き分け」をA列に1行ずつ入力します。
spredsheet

スプレッドシート内容をGASで読み取る

今回はスプレッドシートを指定するのにIDを使用します。
スプレッドシート開いたURLの xxxxxx がスプレッドシートのIDです。このID部分だけをコピーします。

https://docs.google.com/spreadsheets/d/xxxxxx/edit#gid=0

下記コードをtweet.gsに追記します。

/*------------------------------------------*/
/*シートを取得*/
/*------------------------------------------*/
function getSheet(){
  var spreadsheet = SpreadsheetApp.openById('XXXXXXXXXX');
  var sheetName = 'result';
  var sheet = spreadsheet.getSheetByName(sheetName);
  return sheet;
}

実際にスプレッドシートの内容が取得できているか確認してみます。
下記コードをさらに追記してresTweetを実行します。

function resTweet(){
  var sheet = getSheet();
  var data = sheet.getRange(1,1,3).getValues();
Logger.log(data);
}

ログを表示してスプレッドシートの内容が表示されていれば成功です。

こんなかんじで表示されます。

[[勝ち], [負け], [引き分け]]

読み取った内容を投稿する

それでは前項で記述したresTweet関数を改良します。
下記コードのようにresTweet関数に引数を与えることで投稿内容を変更できるようにしました。
プログラムを組んで、条件次第で投稿内容を変化させられると用途が広がります。

function execTweet(){
  // 0:勝ち,1:負け,2;ひきわけ
  resTweet(0);
}
function resTweet(resultType){
  var sheet = getSheet();
  var data = sheet.getRange(1,1,3).getValues();
  if(resultType === null){
    return false;
  }
  var res = data[resultType];
//Logger.log(res);
  requestTweet(res);

}

このあたりはお好みですね、というかコードはすべてお好みですw正解は無いけど不正解はある。そんな世界なのでいろいろ試してみると理解が深まるかと思います。
コードテスト時の注意点を一つあげるとすると「連続して同じ内容の投稿はエラー」として処理されてしまいます。

リファレンスにはいいこと書いてあったりするので一度頑張って読んでみることをおすすめします。

POST statuses/update

Twitter APIでは連続して同じ内容を投稿できない

参考サイト

下記サイトを参考にさせていただきました。

[GAS] GoogleAppsScriptでTwitterbotを作る - Qiita
動機 毎日自動でTwitterの名前を変えたかった。 要件 ある1ユーザーのTwitterの名前を毎日0時に自動で変更したい 前提知識 TwitterAPIはOAuth認証を用いる OAuthは現在主に用いられ...
Google Apps Script で Twitter を使ってみる - Qiita
ディープラーニングでチャットボットを作るためのデータをTwitterからツイートとリプライの組で集めてこようと思たのですが、どうしようかと考えていました。そんな時、Google Apps Script (GAS)を使えばサーバなしでで...

現場からは以上です

コメント

タイトルとURLをコピーしました