【初心者でも簡単】フォロー管理を自動化する自作TwitterBotの作り方

GAS/TwitterBot
two 3d humans give their hand for handshake
この記事は約5分で読めます。

Twitterの仕様変更により、elevated以上のトークンしかこちらのライブラリは使用できません。

Exception: Request failed for https://api.twitter.com returned code 403. Truncated server response: {“errors”:[{“message”:”You currently have Essential access which includes access to Twitter API v2 endpoints only.

というエラーが出た際は、
https://developer.twitter.com/en/portal/products/elevated
こちらより申請を行なってください

フォローしたりリフォローしたり、フォローされてない人のフォローを解除したりするにはどのようにすればよいのでしょうか?
【鬼ったー】というサイトを利用してみようとしてみたのですがうまくいかず…

今回はフォロー状態を管理するTwitterBotの解説していきます。

ちなみに私はフォロー状態の管理は普段 SocialDog を利用しています。

フォロー状況だけでなく、◯日以上ツイートしていない人をリストアップしてくれたり、ワンタッチでフォロー/アンフォロー出来るのでおすすめです👀

ただ、今回は勉強を兼ねて作っていくんですけどね!

ちなみに『鬼ったー』のようなサービスは規約違反です。詳しくはこちらをご確認ください。

フォローとフォロー解除の自動化: Twitterアカウントを大量または無差別にフォローしたり、フォロー解除したりしないでください。過剰なフォローはTwitterルールで禁止されています。詳しいルールについては、「フォローのルールと成功事例」をご覧ください。また、利用者がフォロワーを増やせると謳うアプリケーションも、Twitterルールで禁止されています。

https://help.twitter.com/ja/rules-and-policies/twitter-automation

規約違反のものの作り方を教えるわけにはいかないので、今回は要望にはお応えしますが、無作為にフォローを増やすツールではなく、自分のフォローを整理するBotを作りたいと思います。

今回の記事を利用すればフォローされたら自動的にフォローを返すTwitterBotを作ることが出来ます。

ちなみに、このブログで紹介している自作Botはユーザーが増えてアクセスが出来ないということはほぼないです。理由は簡単で各自でGASとTwitterアプリを用意してもらって処理を実行しているので膨大なアカウントが1つのサービスに集中することがないためです。

便利なツールを頑張って探す時代ではなく、簡単に作れる時代になりつつあります。

この記事を読んで少しでも挑戦してくれる人が増えてほしいです\(^o^)/

今回作っていくもの

改めてになりますが、自分のフォロー/フォロワーを一覧取得して、相互でない人を整理する機能を作っていきます。

ざっくりと以下の機能を作っていきます。

  • ① 自分のアカウント情報を取得して相互じゃない人をスプレッドシートに記録する機能
  • ② スプレッドシートにまとめたアカウントをフォローする機能
  • ③ スプレッドシートにまとめたアカウントをフォロー解除する機能

今回もライブラリに機能追加し、実装は簡単に出来るようにしておくので安心してください。

作り方

細かい導入方法は 【爆速】自作のTwitterBotを簡単に作るライブラリを作った話【初心者向け】 にて紹介しているのでざっくり紹介していきます。

Twitterアプリを用意

https://developer.twitter.com/ja で自分用のTwitterアプリを用意します。

スプレッドシート&GASを用意して、ライブラリを登録

スプレッドシートを作って以下のライブラリを登録します。

1fHCjI78BV3o7nGx2l0lJ7WXM49VFbobGDNdFGqAoVFZyRJ2kepQYzVLd

スプレッドシートは TwitterBotシート_サンプル を用意しているのでこちらをコピペしてもらえればと思います。

コードを書く

認証を行う

getCallbackUrl() で取得したCallbackURLを自分のTwitterアプリに登録して、authorizeで認証を行います。

プログラム実行

今回のサンプルコードで用意したコードは4つあります。

  • updateFollowOnlyUser
    • フォローのみ(片思い)のユーザーをリストアップ
  • updateFollowedOnlyUser
    • フォロワーのみ(ファン)のユーザーをリストアップ
  • followFromSheet
    • リストアップされたシートに記載されたユーザーをフォローする
  • unFollowFromSheet
    • リストアップされたシートに記載されたユーザーをアンフォローする

コメントに機能は書いていますが、フォロー状態を取得してスプレッドシートに書き込む関数とスプレッドシートの状態を読み込んでフォロー/アンフォローを行う機能になります。

コピペだけでフォロワーを整理する機能は使えますが、フォロワー一覧取得メソッドなど他の用途に使える機能を用意しているの是非ご活用ください。

また、規約違反ではあるのですが、ツイート検索と連携すれば鬼ったーのような機能も作れます。
というかGASの定期実行を利用すれば例えば『フォローを返してくれなかった人を定期的にフォロー解除する』なんかはすぐに出来ますね…

※記事のリクエストは基本受け付けていますが規約違反に触れるものを作るとアドセンス広告に響くため記事化する予定はありません。ご了承ください(´・ω・`)

内部処理について

Google Drive: Sign-in
Access Google Drive with a Google account (for personal use) or Google Workspace account (for business use).

これまでのコードは上記のリンクから見ることが出来ます。

気になる方はぜひご覧ください。

単純なフォロワー整理なら既にあるサービスを使うがおすすめ

正直今回フォロー/アンフォロー周りの学習と自作ライブラリの拡張のために、リクエストにお応えしましたが、普通に外部サービスを利用したほうが効率が良いと思います。

SocialDogえごったー などは最初から機能は整っているので一度利用してみて、不足している機能があれば自作をご検討するのが良いと思います(相談乗ります👌)

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

コメント

  1. 突然すみません
    updateFollowOnlyUserを実行すると
    Exception: Request failed for https://api.twitter.com returned code 401. Truncated server response: {“errors”:[{“code”:89,”message”:”Invalid or expired token.”}]} (use muteHttpExceptions option to examine full response)
    と 表示され実行できません。どうすればいいのでしょうか?

    • エラーの内容ですが、Twitterアプリで発行したConsumerKeyが使えなくなったことを示しています。

      TwitterAPIのセキュリティが強化されて、ConsumerKeysは一度しか表示されなくなりました。
      同じTwitterアプリで何度かTwitterBot作ったりした時に、『Regenerate』を押していたりしませんか?
      『Regenerate』を押すと、これまでのトークンは使えなくなった上で新しいトークンが発行されます。

      対応ですが、再度新しいトークンを作って、そのTwitterアプリを使っている全てのトークンの場所に差し替えてもらうと直るかと思います!
      (もし既に使用出来ているトークンがあればそれを使ってもOKです)

  2. ん~、1度 発行し直して差し替えましたが、(同じトークンで)
    “【爆速】自作のTwitterBotを簡単に作るライブラリを作った話【初心者向け】”
    の方は動くんですよね…

    • あ、認証情報が残っている影響かもしれないです。
      一度resetを実行して、authorizeしてもらえますか?

  3. 2回の処理に成功の後、
    Exception: Request failed for https://api.twitter.com returned code 404. Truncated server response: {“errors”:[{“code”:17,”message”:”No user matches for specified terms.”}]} (use muteHttpExceptions option to examine full response)
    って出てきました…

    もしかして、FF比100%だと絶対にエラーで返されるんですかね?

    • >FF比100%だと絶対にエラーで返されるんですかね?
      新しくアカウントを作り、フォロー/フォロワーが0人の時に試したのですが同じエラーが出ました。
      該当のユーザーがいないとエラーになるようだったので、エラーが出ないように修正したバージョン13を公開しました。
      エラーが気になるようであればバージョンを更新して試してみてください!

  4. わざわざありがとうございます!

  5. 参考になる記事をありがとうございます。初心者ですが、わかりやすくとても参考になっています。
    質問があります。「リストに書いてある人はフォローをしない、解除をしない」といったような機能を追加したいのですが具体的な方法がわかりません。いったいどのようにすれば良いのでしょうか?
    調べてみたところ、取得されたユーザーIDからリストに書いてある人をspliceメソッドとindexOf()メソッドを使って削除すれば良いのではないかと思ったのですがあまり理解できませんでした。。。

    • > spliceメソッドとindexOf()メソッドを使って削除すれば良いのではないかと思ったのですが
      はい、あってます!
      具体的な方法としてサンプルのコードを書いてみたので参考にしてみてください。
      https://gist.github.com/belltreeSzk/f08a34332e0855d38487d7f128002271

      結構色々な方法で出来るので自分にあった方法を探してみてください!
      (私は配列を作ってpushするサンプルの2番目の方法をよく書きますね〜)

  6. 返信ありがとうございます。
    また質問なのですがignoreUserIdsをリストから取得するには具体的にどのようなコードにすればよいでしょうか? 『GASでこれはどう作る?〜実装サンプル集〜【プログラミング初心者向け】』の記事をを参考にして[ ‘ユーザーID’, ‘ユーザーネーム’,’ユーザー名’]というリストからユーザーIDを取得するコードを書こうとしたのですがよくわかりません。
    getUserIdsFromSheet関数を使用してみたけれどうまくいかず、2次元配列というものだからではないかと考え1次元配列に直してみたのですが、うまくいきませんでした。。。

    • あ、認識が違っていたかもしれません。

      ignoreUserIds は特にコードを書く想定ではありませんでした。
      `updateFollowOnlyUser` や `updateFollowedOnlyUser` を実行すると以下の画像のようにスプレッドシートにアカウント情報が書き込まれるので、そこからユーザーIDをコピペしてくるのを想定していました。
      やりたいことがもし違っていたらまたコメントください!

  7. すみません、説明不足でした。ブラックリストやホワイトリストのようにフォローをしない、解除をしない人をまとめたスプレッドシートを作成してシートに載っている人を候補から外すようにしたいです。その場合にはどのようなコードにすれば良いでしょうか?

    • > シートに載っている人を候補から外すようにしたい
      なるほど、わかりました!

      `TwitterClient.getUserIdsFromSheet` という関数はシートの名前を変えることで別のシートからデータを取ってこれるのでそれを利用すると簡単に出来ます。
      『シート1』からシートをコピーして『ホワイトリスト』というシートを作って、処理で除外したい人だけをまとめたら、以下のコードを参考にしてみてください。
      https://gist.github.com/belltreeSzk/bbc07a51dc81d5f71e79b5768ad12768

  8. ありがとうございます。おかげさまで機能を追加することができました!!

  9. すみません、フォローをするときに,承認を送ったものの承認をしていない鍵アカウントを飛ばすことは可能でしょうか?

    • 承認を送ったものの承認をしていない鍵アカウントは本来飛ばされるべきアカウントなのでライブラリ側を修正しました。
      ver15が新しく作られていると思いますので、そちらに切り替えると『承認待ち』のアカウントは飛ばすようになります。

      ご指摘ありがとうございます!

  10. 素早い対応、ありがとうございます!

  11. コメント失礼します。
    フォローしている方を全員をまとめたリストを作成したいのですがうまくいきません。
    フォローしている方をまとめ,新しくフォローした方をリストに反映できるようにしたいと思い
    getFollowUserIdsを使えば良いと思い,ほかの記事等も読んだのですがあまり理解することができませんでした。
    どのようにすれば良いのでしょうか?よろしくお願いいたします。

    • 返信遅くなりまして、申し訳ありません!(最近仕事が忙しくて…)

      「フォローしている方を全員をまとめたリストを作成したい」ということで、こちらのAPIを使うと良さそうです。
      https://developer.twitter.com/en/docs/twitter-api/v1/accounts-and-users/create-manage-lists/api-reference/post-lists-members-create_all

      getFollowUserIdsは使えるのは合っています。
      その後に上記のAPIを実行するといいのですが、カンマ区切りでユーザーIDを送らないと行けなかったりコツが必要でした。

      サンプルコードとしてプログラム書いてみたのでご参考にしてみてください。
      https://gist.github.com/belltreeSzk/8646e46833074f26be383e6af756a9d6
      注) Elevated Access の権限が必要なので、もし持っていなければTwitterに申請が必要です。

      何かわからないことがありましたらご連絡ください!

  12. 質問失礼します。
    この記事に書いているコードをそのままコピーしたのですか、getCallbackUrlを実行すると
    エラー ステートメントの前に ; がありません。
    (匿名) @ TwitterClient.gs:5

    と上記のエラーを吐きます。この場合どのようにコードを修正すれば良いのでしょうか?

    • JavaScirptのランタイムが正しくないとそのようなエラーになります。
      添付画像を参考にv8ランタイムを有効にしてみて頂けますか?

      もし過去のversionのエディタを使っている場合は以下の画像を参考にしてください。

  13. ご返信ありがとうございます。
    書かれた内容で実行するとちゃんと動いてくれました。

    このコードをgoogleフォームから入力されたTwitter IDでフォローするようにしているのですがうまく動きません。

    Exception: Request failed for https://api.twitter.com returned code 403. Truncated server response: {“errors”:[{“code”:108,”message”:”Cannot find specified user.”}]} (use muteHttpExceptions option to examine full response)

    このエラーはどのようなものなのでしょうか?

    • エラーに出ている「Cannot find specified user.」を翻訳すると、「指定されたユーザーが見つかりません。」という意味なので、入力されたTwitterIDがおかしい気はします。
      鍵垢だったり、空白が入っていたりしていないか https://twitter.com/入力されたUserID で検索してみては?

  14. 追記します。

    GoogleフォームはTwitter IDを2行目に吐くようになっているので、別のスプレットシートを作成して別のスプレットシーをからIMPORTRANGE関数を使用しTwitter IDを1行目に持っていき実行しましたが同じエラーを吐きます。

    記述していませんでしたがScriptで実行したのは”followFromSheet”です。
    所々分かり難い説明かもしれませんがご回答いただけると幸いです。よろしくお願いします。

  15. ユーザーIDが1行目じゃなくても認識するのでしょうか?

    • あ、すみません。ようやくやろうとしていること理解しました。
      @以下を入力してもらって、フォローさせようとしてるんですね。

      当記事で紹介している方法だと、createFollow は userId(ユーザー固有の数字のみの番号) を使っているのでそのまま使えないです。
      この辺が参考になるかも?→ https://followcheck.itby.net/twittertips/p/4

      @以下のScreenNameでもフォロー/フォロー解除できるようにライブラリをカスタマイズしたので、versionを18以上にした上でコードを書き換えてみて頂けますか?

      /**
       * シートに記載された人をフォロー
       */
      function followFromSheet () {
        // 1列目に書かれたIDからユーザー情報を取得する
        const screenNames = TwitterClient.getUserIdsFromSheet('シート1')
        console.log(screenNames) // ここでどんなIDが取れているか確認できる(一応)
        client.createFollowByScreenName(screenNames)
      }
  16. TwitterClient is not defined (line 6, file “Code”)
    というエラーが出るのですがどうしてでしょうか?

    • おそらくTwitterClientのライブラリをGASに登録していないためです。

      ↓の記事を参考にTwitterClientの登録を行ってみてください!
      https://belltree.life/twitterbot-library/

  17. 失礼します。
    Exception: The number of rows in the range must be at least 1.
    at writeFollowInfo(Utility:360:30)
    とエラーが出るのですが、何が原因なのでしょうか?

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