【爆速】自作のTwitterBotを簡単に作るライブラリを作った話【初心者向け】

GAS/TwitterBot
この記事は約9分で読めます。

これまでTwitterBotの記事を書いてきましたが、コピペだけで済むとはいえ、少し難易度が高い&処理を書こうとするとコードが冗長になってしまう問題がありました。

今回、よく使われる諸々の処理をまとめたライブラリを公開したのでその紹介と使い方の解説を行います。

慣れてる人向けの情報(TL;DR)

以下のものを見ればたぶん分かると思います(おい

ライブラリID

MtWJFxCibKiP9SvrKBk8a0_EqweE_tvXn

ライブラリのソースコード

belltreeSzk/TwitterClient
GASを使ってTwitterBotを作る際に便利なライブラリ. Contribute to belltreeSzk/TwitterClient development by creating an account on GitHub.

実行サンプルコード

main.gs
GitHub Gist: instantly share code, notes, and snippets.

TwitterClientライブラリとは(超初心者向け)

ライブラリとは

簡単に言うと便利な関数のセットです。

「jQueryはライブラリなのか、フレームワークなのか」という話をたまに聞きますが、ライブラリは関数群、フレームワークはアプリケーションの枠組みです。

だからjQueryはライブラリです。

まぁそれは置いておいて、そういった便利な関数群を作りました。

ライブラリがあると何が便利なのか

こちらも簡単に言うと大きなところは実装負担が減る点です。

本来100行のコードを書く必要がある処理をライブラリの関数を呼び出す1行で実装完了となってしまうこともあります。

実装が減るということは、コードが短くなります

コードが短くなるということは、コードがシンプルになります

コードがシンプルになるということは、不具合が減ります

加えて、仕様変更や不具合が起きて本当は修正しなければならない実装があっても、ライブラリ側で直してくれる場合もあります(つまり俺が、、)

ライブラリを使えば、簡単にやりたいことが出来る…かもしれませんね!

TwitterClientライブラリで出来ること

TwitterClientでは、これまで何度か紹介してきたTwitterBotを作る上で用意してきた関数をパッケージしました。

  • authorize() で認証する処理がシート毎に認証できるように対応
  • Twitterに投稿する postUpdateStatus の処理を postTweet() に集約
  • getRequest,postRequestでAPIを簡単実行
  • スプレッドシートから投稿文を取得する処理

などが集約されています。

TwitterClientの使い方

今回は完全初心者にも分かるようにゼロからの作り方で説明していきます。

スプレッドシートを用意する

まずはベースとなるスプレッドシートを用意します。参考例

余談ですが https://sheet.new から新しいシート作れること知ってましたかー?

GASを用意する

『ツール』から『スクリプトエディア』を選択します。

ライブラリを追加する

表示されたエディタページが開かれると思います。

図のようにファイル名を付けておき、『リソース』→『ライブラリ…』を選択してライブラリを追加していきます。

MtWJFxCibKiP9SvrKBk8a0_EqweE_tvXn

『TwitterClient』が追加されたら保存して完了です。

コードを書く(コピペでOK)

これをコピペしてください!以上!コメントを除くと30行以下だと思います。

「TwitterBotでスプレッドシートの内容を投稿する」であれば最低限これだけでOKです。

CallBack URLを取得する

次にTwitterアプリの用意をするのですが、用意する前にTwitterアプリに登録するために必要なCallbackURLを取得します。

画像の手順で getCallbackUrl を実行するとログに

https://script.google.com/macros/d/[SCRIPT_ID]/usercallback

という形式のURLが取得されるのでメモを取っておきます。

Authorization required が出た場合

初回実行時、私が作ったライブラリにアクセスするために認証が必要です。

上記のポップアップが出た場合、『許可を確認』を選択してください。

ここまで来たら後は諸々許可してください。

ステートメントの前に:がありません が出た場合

今回のコードは新しいApps Scriptランタイムを使用しています(constやclassを使える機能)

そのため、新しいランタイムが無効になっていると「class?なにそれ?エラーだ!」となってしまいます。

「ステートメントの前に:がありません」というエラーが出た場合、『実行』→『新しい Apps Script ランタイムを有効にする』を選択して、改めて実行してみてください。

Twitterアプリを用意する

Twitterの開発者ページからTwitterアプリを作ります。

Use Cases, Tutorials, & Documentation
Publish & analyze Tweets, optimize ads, & create unique customer experiences with the Twitter API, Twitter Ads API, & Twitter for Websites. Let's start building...

Twitterのアカウントを持っているのであれば右上のSign Inからサインインしてください(既にサインインされているかも?)

右上のAppsからアプリ画面を表示してアプリを作ります。

こちらの記事でTwitterアプリを作っているので参考にどうぞ。

↑の記事ではcallbackURLがブログのURLになっていますが、そこには先程取得したcallbackUrlを登録するようにしてください。

※ Twitterアプリ開発者登録が済んでいない場合

以下の記事を参考にアカウント登録を行ってみてください(手抜き)

Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ ※2019年8月時点の情報 - Qiita
本投稿の背景 ※申請画面が初投稿時(2018年9月)と変わってましたので、内容を更新しました ※2019年8月時点の情報となります Python Twitterからツイートを取得してテキスト分析(wordcloudで見える化)...

Consumer Key をGASに登録する

GASの方に戻って、作ったTwitterアプリのConsumerKeyを登録します。

const consumerKey = 'CONSUMER_KEY'
const consumerSecret = 'CONSUMER_SECRET'

Twitter認証を行う

authorize を選択してTwitterの認証を行います。

authorizeを実行→『表示』→『ログ』で表示されたURLで認証を行ってください。

APIを実行する(投稿の動作確認)

postTweetで投稿するAPIを実行します。

/**
 * ③ APIを実行する(この辺はアレンジしてください)
 * ※この処理では「シート1」から投稿内容を取得してツイートしてます
 */
function postTweet () {
  // pickUpTweetInOrderは用意しました
  let message = TwitterClient.pickUpTweetInOrder('シート1');
  client.postTweet(message);
}

順番に投稿するBotを作りたい場合、 順番用参考例 を参考にしてシートを作りこちらの処理をそのままご利用ください。

ランダムに投稿するBotを作りたい場合、pickUpRandomを用意しましたので、ランダム用参考例 を参考にシートを作り、

TwitterClient.pickUpTweetRandom('シート1');

をご利用ください。

繰り返し実行を設定する

ここまででTwitterBotが完成しました。

最後に繰り返し実行の設定を行います。

以前同じ設定を紹介しているのでこちらを参考にどうぞ!

TwitterBotの機能を拡張する

別のTwiiterAPIを実行する

このライブラリの目的は簡単にTwitterBotを作るだけではなく、やりたいことを直感的に出来るようになることです。

そのため、TwitterAPIを実行しやすいようなメソッドを用意しました。

client.getRequest(url, param);
client.postRequest(url, param);
Overview

↑のようにTwitterのAPIを実行するためには Resource URLParameters が必要です。

このメソッドがGETであれば client.getRequest を利用してください。

例として自分のツイートをいいねする処理を書いてみました。

function favorite () {
  // ユーザーのタイムラインを取得
  let getTweetUrl = 'https://api.twitter.com/1.1/statuses/user_timeline.json';
  let getTweetParam = {
    screen_name: 'belltreeszk',
    count: 1
  }
  // GETリクエストを実行
  let getTweetResult = client.getRequest(getTweetUrl, getTweetParam);
  
  // いいねを付ける
  let favoriteUrl = 'https://api.twitter.com/1.1/favorites/create.json';
  let favoriteParam = {
    id: getTweetResult[0]['id_str']
  }
  // POSTリクエストを実行
  let favoriteResult = client.postRequest(favoriteUrl, favoriteParam);
  Logger.log(favoriteResult);
}

① URLをセット
② パラメータをセット
③ getRequestかpostRequestを実行
④ 受け取った結果を次の処理の ①〜③ に利用する

という流れの繰り返しでメソッドを作ることが出来ます。

GETやPOSTの処理を書いていたり、実行したいAPIによってパラメータの形式を悩まないために形式が共通になるようになっています。

便利だと思ったメソッドはTwitterClientに入れてもらってもOK

ソースコードは下記にまとめています。

belltreeSzk/TwitterClient
GASを使ってTwitterBotを作る際に便利なライブラリ. Contribute to belltreeSzk/TwitterClient development by creating an account on GitHub.

GitHubで管理しているのでプルリクしてくれれば適当にライブラリも更新します(おい

TwitterのAPIに関係するものは TwitterClient.gs
スプレッドシートに関係するものは Utility.gs

に変更を加えてください。

ベースは作った。あとは任せた。

これまで TwitterWebService を利用してきましたが、微妙に使いにくい部分もあったので、自分の中ではより良いものを作ったつもりです。

場合によっては使いにくいこともあると思います。

その時はいい感じに直すなり、TwitterWebService を使うなり、上手くバランスを取ってほしいなぁと思います。

もちろん引き続き連絡してもらえれば回答・相談には乗りますのでお気軽にご連絡ください。

ここまで読んで頂きありがとうございました!

コメント

  1. K より:

    詳しく分かりやすい解説で、初心者でも無事投稿まで行うことができました。ありがとうございます!
    ただ、1回目の投稿は成功するものの、2回目にpostTweetを実行すると「TypeError: Assignment to constant variable.at pickUpTweetInOrder(Utility:36:16)」とエラーが表示されて投稿が成功しません。
    調べてみましたが、原因が全然分かりませんでした。
    お手数ですが、何が原因かアドバイス頂けると大変嬉しいです。

    • 𝔹𝕖𝕝𝕥𝕫 より:

      すみません、これ、こちらのライブラリの不具合です。。。
      修正を行って、新しく 『順番投稿の不具合修正』 というバージョンをリリースしたのでこちらでお試しください。

      補足になりますが、

      TypeError: Assignment to constant variable.at pickUpTweetInOrder(Utility:36:16)

      こちらの不具合は、 const という宣言を使って定義している定数に対して再代入を行っていることが原因です(ライブラリの中でバグっていました)
      また何か問題がありましたらご連絡ください〜〜

  2. K より:

    とても早く対応していただきありがとうございます!無事2回目以降のツイートも成功しました!
    なるほど、constという定数の部分の問題だったんですね。
    これからも有り難く使わせていただきます!

  3. 伊藤義彦 より:

    大変貴著な資料を公開いただき、ありがとうございます。
    質問です。
    「自分専用のTwitterBotを作り方を完全公開します」にそって作業しました。
    「postUpdateStatus」関数は「完了」となりますが、ツイッターに投稿されません。
    原因として考えられることは何でしょうか。
    ご教授いただきたく、よろしくお願いいたします。

    • 𝔹𝕖𝕝𝕥𝕫 より:

      コメントありがとうございます!
      「関数はエラーが出ずに終了しているが、投稿されない」という状況ですかね。
      考えられる原因としては、messageにデータが入っておらず投稿処理の前で完了してしまうことが1つ考えられます。

      // ツイートを投稿
      function postUpdateStatus() {
      var message = pickUpTweet();
      if (message == "") {
      Logger.log("投稿しませんでした") // ←ここで終了していると完了になるが、投稿はされない。
      return;
      }
      var service = twitter.getService();
      Logger.log(message)
      var response = service.fetch('https://api.twitter.com/1.1/statuses/update.json', {
      method: 'post',
      payload: { status: message }
      });
      Logger.log("投稿しました")
      Logger.log(message)
      }

      Logger.log() を使って message に投稿文が入っているかを見て頂けると原因がわかるかもしれません。
      また躓くことがあればコメントください!

  4. なゆと より:

    こういうのを探していたんです!!ありがとうございます!!

    あとリクエストなのですがフォローしたりリフォローしたり、フォローされてない人のフォローを解除したりするにはどのようにすればよいのでしょうか?
    【鬼ったー】というサイトを利用してみようとしてみたのですがうまくいかず…
    自分でbotを作ろうと検索してみても古い情報だったりして、よくわからなかったので…
    どうか、よろしくお願いいたしますm(_ _)m

    • 𝔹𝕖𝕝𝕥𝕫 より:

      コメントありがとうございます!

      ・フォローしたり、リフォローしたり
      ・フォローされてない人のフォローを解除したり

      どんなサイトでもほぼ確実にTwitterのAPIを連携してそのような機能を作っているので、理論上は作れるはずです。
      フォロー/フォロー解除あたりはまだこのブログであまり言及してなかったので近日書こうと思います〜

  5. なゆと より:

    ありがとうございます!! あと、ランダムツイートする際に1回ツイートしたら次はそれ以外を選ぶようにするにはどうすれば良いのでしょうか?2回、同じツイートができないので….

    • 𝔹𝕖𝕝𝕥𝕫 より:

      あー・・・確かに今の実装良くなかったですね。。
      何個か方法が考えられます
      ①投稿文を選ぶ前に、直前のツイートを取得して同じ文章のものがあれば選択肢から外しておく
      ②シートに1列増やし、投稿を行ったら前回実行のフラグを立てて、ランダムの選択肢から外しておく
      などですかね・・・

      早速ですが、②の対応、ライブラリに修正入れました!
      ランダム用参考例 を更新したので、参考例を参考に1列追加して、ライブラリを最新のものに更新すると連続した投稿ができないようになっているかと思います。
      うまく動かないようでしたらご連絡ください!

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