【GAS】Google Apps ScriptでTwitter API v2.0を使ってみた【Twitter】

おはようございます。Roccaです。
前回、TwitterAPIの登録方法について説明しましたが
今回はGoogleAppsScript(通称、GAS)でTwitterAPIを使って

  • いいね
  • フォロー
  • ツイート
  • リツイート

する方法を紹介していきます。
※APIを使用するためにTwitterAPIへの登録が必要になりますので、まだの場合は以下を参考に登録してください。

Google Apps Scriptとは?

Google Apps Sciprt(ぐーぐるあっぷすすくりぷと)はGoogleが提供するプログラミング言語です。Googleアカウントさえあれば無料で使うことができ、HTML、CSS、Javascriptを使って開発することができるため、学習コストは高くありません。とはいえ、プログラミングをしたことが無い人にとっては敷居が高いですよね…。今回は極力コピペだけで動作することを目的として説明しますので、興味のある方はぜひチャレンジしてみてください。以下、Google Apps ScriptをGASと省略します。

Googleスプレッドシートを作成する

Googleのスプレッドシートのホーム(https://docs.google.com/spreadsheets/u/0/)を開き、スプレッドシートを作成します。作成したらスプレッドシートの名前を変更しましょう。今回は「TwitterGAS」にしました。

スプレッドシートからもGASを使用できます。GASを使うとスプレッドシートに自動入力したり、スプレッドシートからメール送信・カレンダー登録など様々なことができます。Web上のデータを手入力していたり、入力したデータを別のセルにコピーしたり手動で行っているもののほとんどがGASにより自動化可能です。「こんなことはできる?」「日々の入力業務を自動化したい」など相談があればコメント欄に書いてください。答えれる限り答えようと思います。

GASを利用するには上部のメニューから「拡張機能」→「App Script」を選択してください。

クリックするとApps Scriptが開きますので、プロジェクト名を変更します。今回は「Twitter API Test」としました。

左サイドバーの歯車アイコンをクリックし、スクリプトIDを控えておいてください。後ほど使います。

Twitter側の設定・準備

Twitter Developer Platform(https://developer.twitter.com/en)にアクセスし、アプリの設定を行っていきます。

プロジェクトを開き、「+Add App」をクリックします。(既にアプリがある場合はスキップしてください。)

アプリ名を入力します。今回は「CampanistaTestApp01」としています。

APIキー、シークレットキー、トークンは必ずメモすること

APIキー、̪シークレットキー、トークンが表示されますのでメモ帳などにコピペしてください。(コピペしないと後で再発行することになります)

あと、共同開発しない限りは他人にキーは教えないようにしましょう。(TwitterのAPIは悪用されても実行回数に制限があるので問題ありませんが、従量課金のAPIだった場合は

アプリを設定したら、User authentication settings

認証設定

以下のように設定してください。また、Call back URLには先ほどGASでコピーしたIDを使用します。
「https://script.google.com/macros/d/スクリプトID/usercallback」となるようにしてください。Website、Terms of service、Privacy policyのURLは適当に入れてください。

設定が完了するとチェックマークが付きます。

Twitter側の設定はこれで完了です。次はGAS側の設定をしていきます。

GAS側の認証処理を行う

以下のサイトの情報が非常に有益でしたので、認証周りはこちらのコードを参考にします。

コード.gsに書いていきます。

GASにコードを貼り付ける

//メニューを構築する
function onOpen(e) {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Twitter認証')
      .addItem('認証の実行', 'startoauth')
      .addItem('ログアウト', 'reset')
      .addToUi();
}
 
//認証用の各種変数
var apikey = 'APIキー';
var apisecret= 'APIシークレットキー';
var tokenurl = "https://api.twitter.com/oauth/access_token";
var reqtoken = "https://api.twitter.com/oauth/request_token";
var authurl = "https://api.twitter.com/oauth/authorize";
var endpoint = "https://api.twitter.com/1.1/statuses/update.json";  //ツイートをするエンドポイント
var endpoint2 = "https://api.twitter.com/2/tweets";  //v2のツイートするエンドポイント
var appname = "CampanistaTestApp01";  //アプリの名称

//認証実行
function startoauth(){

  //UIを取得する
  var ui = SpreadsheetApp.getUi();
  
  //認証済みかチェックする
  var service = checkOAuth(appname);
  if (!service.hasAccess()) {
    //認証画面を出力
    var output = HtmlService.createHtmlOutputFromFile('template').setHeight(450).setWidth(500).setSandboxMode(HtmlService.SandboxMode.IFRAME);
    ui.showModalDialog(output, 'OAuth1.0認証');
  } else {
    //認証済みなので終了する
    ui.alert("すでに認証済みです。");
  }
  Logger.log(apisecret)
}
 
//認証チェック用関数
function checkOAuth(serviceName) {
  return OAuth1.createService(serviceName)
    .setAccessTokenUrl(tokenurl)
    .setRequestTokenUrl(reqtoken)
    .setAuthorizationUrl(authurl)
    .setConsumerKey(apikey)
    .setConsumerSecret(apisecret)
    .setCallbackFunction('authCallback')
    .setPropertyStore(PropertiesService.getUserProperties());
}
 
//認証コールバック
function authCallback(request) {
  var service = checkOAuth(request.parameter.serviceName);
  var isAuthorized = service.handleCallback(request);
  if (isAuthorized) {
    return HtmlService.createHtmlOutput('認証が正常に終了しました');
  } else {
    return HtmlService.createHtmlOutput('認証がキャンセルされました');
  }
}
 
//アクセストークンURLを含んだHTMLを返す関数
function authpage(){
  var service = checkOAuth(appname);
  var authorizationUrl = service.authorize();
  var html = "<center><b><a href='" + authorizationUrl + "' target='_blank' onclick='closeMe();'>アクセス承認</a></b></center>"
  return html;
}
 
//ログアウト
function reset() {
  OAuth1.createService(appname)
      .setPropertyStore(PropertiesService.getUserProperties())
      .reset();
  SpreadsheetApp.getUi().alert("ログアウトしました。")
}
 

次はtemplate.htmlを作成します。

ファイル右横の「+」をクリックして「HTML」を選んだらtemplateと入力してください。(template.htmlと入力するとtemplate.html.htmlになってしまいます)

<link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons.css">
<script>
    //認証用URLを取得する
    google.script.run.withSuccessHandler(onSuccess).authpage();
 
    function onSuccess(data){
        document.getElementById("ctext").innerHTML = data;
    }
</script>
 
<style type="text/css">
    /* --- ボックス --- */
    div.section {
        width: 480px; /* ボックスの幅 */
        background-color: #ffffff; /* ボックスの背景色 */
        border: 1px #c0c0c0 solid; /* ボックスの境界線 */
        font-size: 100%; /* ボックスの文字サイズ */
    }
 
    /* --- 見出し --- */
    div.section h3 {
        margin: 0; /* 見出しのマージン */
        padding: 6px 10px; /* 見出しのパディング(上下、左右) */
        background-color: #f5f5f5; /* 見出しの背景色 */
        border-bottom: 1px #c0c0c0 solid; /* 見出しの下境界線 */
        font-size: 120%; /* 見出しの文字サイズ */
    }
 
    /* --- ボックス内の段落 --- */
    div.section p {
        margin: 1em 10px; /* 段落のマージン(上下、左右) */
    }
</style>
 
<div class='section'>
    <h3 id='header'>OAuth認証の許可が必要です。</h3>
    <hr>
    <div id="info">
        <p>
        このスクリプトは、Twitter API V2にアクセスするために、特別なログイン処理を利用しています。<br>
        既に特別なログインに関する設定はなされており、承認がされるとプログラムを実行することが出来ます。この承認がなされない場合、プログラムの実行に制限が掛かり、
        処理が続行できません。<br><br>
 
        <div id="ctext"></div>
    </div>
    <p>
    <script>
        function closeMe(){
            if(google && google.script && google.script.host){
                google.script.host.close();
            } else if(window && window.close){
                window.close();
            } 
        }
    </script>
</div>

ライブラリを追加する

次にライブラリを追加します。ライブラリの右横の「+」をクリックし、スクリプトIDに「1CXDCY5sqT9ph64fFwSzVtXnbjpSfWdRymafDrtIZ7Z_hwysTY7IIhi7s」と入力し、検索します。IDに「OAuth1」と表示されていればOKです。最新バージョン選んで追加します。(この時は18が最新版)

Twitter認証する

ここまで入力したら、最初に開いたスプレッドシートを開きます。
メニューの一番右に「Twitter認証」の項目が増えていますので、認証の実行をクリックしてください。

アクセス承認画面出るので、「アクセス承認」を押し、twitterページでアプリを承認します。

認証が完了すると、このように表示されます。

TwitterAPIの機能を実装する

ツイートする

ツイートの内容を変える場合は「’GASからツイートを実行してみた #Campanista’」のアポストロフィ内を書き換えてください。

function tweet(){
  //トークン確認
  var service = checkOAuth(appname);
  date_now = new Date().getTime();
  //message本文
  var message = {
    //テキストメッセージ本文
    text: date_now + 'GASからツイートを実行してみた #Campanista'
  }
 
  //リクエストオプション
  var options = {
    "method": "post",
    "muteHttpExceptions" : true,
    'contentType': 'application/json',
    'payload': JSON.stringify(message)
  }
 
  //リクエスト実行
  var response = JSON.parse(service.fetch("https://api.twitter.com/2/tweets", options));
 
  //リクエスト結果
  console.log(response)
}

リツイートする

tweet_idにはリツイートしたいIDを入力してください。IDはURLから確認できます。

この場合のIDは「1507966489747496964」
var tweet_id = "リツイートしたいIDを入れる";
function retweet(tweet_id){
  //トークン確認
  var service = checkOAuth(appname);
  var retweet_ep = `https://api.twitter.com/2/users/${id}/retweets`;

  var data = {
    "tweet_id" : tweet_id
  }

  var options = {
    "method": "post",
    'contentType': 'application/json',
    'accept': "application/json",
    'payload': JSON.stringify(data)
  }

  //リクエスト実行
  var response = JSON.parse(service.fetch(retweet_ep,options));

  console.log(response)
}

リツイートする

IDの確認方法はリツイートのときと同様です。

var tweet_id = "いいねしたいツイートIDを入れる";
function likes(tweet_id){
  //トークン確認
  var service = checkOAuth(appname);
  var likes_ep = `https://api.twitter.com/2/users/${id}/likes`;
  Logger.log(likes_ep)

   var data = {
    "tweet_id" : tweet_id
  }

  var options = {
    "method": "post",
    'contentType': 'application/json',
    'accept': "application/json",
    'payload': JSON.stringify(data)
  }

  //リクエスト実行
  var response = JSON.parse(service.fetch(likes_ep,options));

  console.log(response)
}

フォローする

IDの確認方法はTweeterIDを利用します。(https://tweeterid.com/

var target_id = "フォローしたいユーザーIDを入れる";
function following(target_id){
  //トークン確認
  var service = checkOAuth(appname);
  var following_ep = `https://api.twitter.com/2/users/${id}/following`;
  Logger.log(following_ep)

   var data = {
    "target_user_id" : target_id
  }

  var options = {
    "method": "post",
    'contentType': 'application/json',
    'accept': "application/json",
    'payload': JSON.stringify(data)
  }

  //リクエスト実行
  var response = JSON.parse(service.fetch(following_ep,options));

  console.log(response)
}

最後に

TwitterAPIをGASで使ってみました。APIのバージョンが1.1から2.0に昨年変わったのですが、詳細に書かれているサイトがほとんどありませんでした(ツイートを取得するぐらいしか書かれていない…)。
公式のGithubのサンプルコードにもフォローするコードが無かったり、APIは用意されているのにリファレンスが1.1のものだったりで、皆さんどうしているのか気になりました。
GASは定期実行させることが可能です。これがかなり便利で、Twitterの機能にはない予約投稿も実現可能です。また、特定の単語を含むツイートをしているユーザーのIDを取得すれば一律でいいねやフォローが可能です(やりすぎるとアカウントが凍結されるので気をつけてください)。
動かない場合はコメントにてお知らせください。可能な限り対応します。

今回はここまで!次回をお楽しみに!