「いいね」や「リツイート」を行うTwitterBotの作り方

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

リクエスト企画第2弾です!

先日、TwitterBotに関して以下のリクエストを頂きました。

リクエストがあるのですが、タイムラインのツイートにいいねやリツイートをしたり、フォローしているアカウントのツイートを取得して自動でツイートするなどのようなリアルタイムで動くbotをつくってみたいと考えています。

今回は前半としてタイムラインのツイートにいいねリツイートを行うTwitterBotを作っていきたいと思います。

今回もGoogleスプレッドシートを使ったGASでの開発になるので、これまでの記事も参考にしていただけると幸いです。

今回作るもの

↑のように検索ワードといいね or RTの内容を書くと、「ツイートを検索」→「いいね or RTを付与」するTwitterBotを作っていきます。

コード公開(ConsumerKey以外コピペでOK)

認証周りに関しては過去記事を参考にしてください。

今回は main という関数をスタートとして処理を行っていきます。

そのため処理を実行する時は関数をmainに設定して実行してください。

細かい処理については全部説明してしまうと大変なのでコメント多めに残しています。

コードを読みつつ、こういう処理を行っているんだなぁと解釈していただければと思います(どうしても分からない・気になるということがあれば追記しますのでコメント or DMください〜)

TwitterAPI

TwitterAPIとは

前回までは「Twitterに投稿するAPI」だけを使用してきましたが、今回はいろいろなAPIを使いました。

この記事を読んでいる人はプログラミングに慣れていない人も多いと思うので基礎的なところから説明していきます。

TwitterAPIとはTwitter社が「プログラムからでも実行してもいいよ」という意図で提供しているインターフェース(起動スイッチのようなもの)です。

例えば

https://api.twitter.com/1.1/favorites/create.json

というURLにアクセスすると「ツイートにいいねを付ける」という処理が始まります。

TwitterAPIの使い方

TwitterAPIの使い方は↓のような公式ドキュメントを読んで確認しましょう。

https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/post-favorites-create

よく分からないと思うので軽く解説します。

Resource URL

処理の起点になります。

https://api.twitter.com/1.1/favorites/create.json

このURLにアクセスをすると今回であれば「いいね」が付与されます。

Resource Information

Response formatsJSON
Requires authentication?Yes (user context only)
Rate limited?Yes
Requests / 24-hour window1000 per user; 1000 per app

Response formatsは処理が終わって返ってくる結果(Response)の形式(formats)がJSONになるということです。

var response = service.fetch('https://api.twitter.com/1.1/search/tweets.json?' + queryStr);
var result = JSON.parse(response)

APIは違いますが↑のようにJSON.parseを行うとデータを使えるようになります。

Requires authentication は認証が必要かどうかです。「いいね」はその人自身の権限がないと使えないので Yes となっています。
認証自体はTwitterWebServiceライブラリで認証しているのでOKです。

Rate limited? は使用制限です。無限にいいねを使われるとサーバーに負担が掛かってしまうので制限が設けられています。

Requests / 24-hour window は制限の内容です。この場合は24時間に1000回いいねを使えます。

Parameters

実行する際に必要なパラメータになります。今回のコードを参考にすると、他のAPIでも同じようにパラメータを設定して実行することが出来るかと思います。

GETの場合は、URLの最後に 「?id=*****&name=*****」 というクエリを追加します。

POSTの場合も、Example Request を見ると 「?id=*****&name=*****」のように行っていますが、個人的にはpayloadに入れてしまう書き方をおすすめします(TwitterではあまりないけどPOSTのパラメータに秘匿情報を入れることがあるのでアクセスログに残るURLに付けないほうが無難

ちょっとわからなかった事

Could not authenticate you. というエラー

https://api.twitter.com のリクエストに失敗しました(エラー: 401)。
サーバー応答の一部: {"errors":[{"code":32,"message":"Could not authenticate you."}]}
(応答の全文を見るには muteHttpExceptions オプションを使用してください)
(行 443、ファイル「Service」、プロジェクト「OAuth1」)

以下のエラーですが、翻訳すると「認証できませんでした」なんですが、どうもおかしい

認証は通っています

発現する条件を調べるために色々試していると「正しいデータが送れてなかったとき」に起きるようです。

パラメータが不足していた時、検索文字列に特定の記号が入っていた時、などなど。

他のサイトで「Twitterのサーバーの調子が〜」「しばらく待ってみれば〜」と書いてたりしますが、少なくとも400系のエラーはこちらのミスです(こういう時は400エラーが返るのが普通なんだけど…)

とりあえず Could not authenticate you.というエラーが出た場合は、パラメータに記号が含まれていないか、requireとなっているパラメータが抜けていたりしないか、などを確認してみると改善が見込めると思います!

検索可能な記号がわからない

これもよくわからなかった。

Twitterの検索では「from:@belltreeSzk あああああ」で特定のアカウントの投稿だけを検索できるのですが、@ が検索文字列に入ってしまうと Could not authenticate you. が出てしまうことが判明しています。

同じく「( ´ー`)y-~~」のような記号が入った顔文字もNGです。

ただしハッシュタグ # はOKでした。

調査しきれない部分だったので色々試してみてほしいです。

今回のTwitterBotを通して伝えたいこと

公式ドキュメントはしっかり読み込もう

今回は以下のAPIを使用しました。

【ツイートを検索】
Standard search API
【ツイートの状態の検索】
GET statuses/lookup
【いいねを付ける】
POST favorites/create
【RTを付ける】
POST statuses/retweet/:id

「GETなのかPOSTなのか」「必要なパラメータはなにか」など動かすために必要なパラメータを確認することは大事ですが「何回実行できるのか」「オプションでどんなパラメータを設定出来るか」なども正しく動かす上でとても必要です。

仕事としてAPIを扱う場合は、ブログだけで判断せずにちゃんと公式ドキュメントを確認しましょう。

様々なAPIを組み合わせてオリジナルBotを作ろう

今回のサンプルコードで大体のTwitterAPIを実行する方法がなんとなく把握出来たと思います。

今回はコピペで「いいね」や「RT」が出来るBotを作ることが出来ますが、いいねしてくれた人をフォローするBotや、いいねやRTが多いツイートをスプレッドシートにまとめる機能なんかも作れるかも…?

自分の作りたい機能を作ることは楽になることだけでなく自身のプログラミングの勉強にもなるので、ぜひ挑戦してみてください!

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

コメント

  1. このような記事をありがとうございます。プログラミングをしたことがない私でもBotを作成することができました。
    質問があるのですが、『スプレッドシートの順番通りにツイートするTwitterBotの作り方』のように順番にいいねやRTをするにはどのようにすればいいのでしょうか。また、いいねやRTの回数を検索ワードごとに指定することはできないのでしょうか。
    「ぜひ挑戦してみてください!」と書いてありましたので自分で作ってみよう調べてみましたが珍紛漢紛でうまく動作せず。
    どのようにすればよいかご教授いただけないでしょうか。どうかよろしくお願いいたします。

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

      プログラミングをしたことがない私でもBotを作成することができました

      そのようなご報告を頂けて大変うれしいです!

      順番にいいねやRTをするにはどのようにすればいいのでしょうか。また、いいねやRTの回数を検索ワードごとに指定することはできないのでしょうか。

      出来ます!ただしプログラミングが必要です。
      手が空いたタイミングでサンプルコードや解説を追記しておきます〜

      自分で作ってみよう調べてみましたが珍紛漢紛でうまく動作せず。

      なるほど。。あまり参考にならず申し訳ないのですが、この辺は慣れの部分も大きいと思います。
      「目的をプログラムに変換する考え方」というテーマで今度記事作ってみようかな。。(´・ω・`)

      お手数ですがもうしばらくお待ち頂けると幸いです〜よろしくおねがいします〜

  2. 回答ありがとうございます。順番にいいねやRTをすることは可能なのですね。記事を心待ちにしております。

  3. 参考にしていますありがとうございます。
    authorize認証はなんとか通っているのですが
    mainで実行すると以下のエラーが出てしまいます。

    ↓エラーメッセージ
    Service not authorized.(行 292、ファイル「Service」、プロジェクト「OAuth1」)

    ↓ログではこう表示されてます
    エラー Service not authorized.
    at [unknown function](Service:292)
    at findTweets(コード:113)
    at main(コード:46)

    何かわかれば考察をお願いします。

    • 参考にして頂きありがとうございます。
      一度 reset を実行して再度 authorize をしてみていただけますか?

  4. お返事ありがとうございます
    上部の質問者さんの参考にしてreset も数回やりましたがダメでした
    reset  authorize はどちらもサクッと完了します

    • なるほど…承知しました。
      念の為の確認ですが、authorizeを実行するとログにURLが表示されると思いますが、そちらにアクセスしてTwitter上での認証は出来ていますか?

  5. 完了 となっていますがURLはどこにも見えないです
    何も表示もなくて ただ完了となります

    • んー状況がわからないですね…
      差し支えなければ suzuki@belltree.life にスクリーンショットを送っていただけますか?

  6. 初めまして!初心者向けの記事でとても読みやすく参考になります。
    ・「いいね」や「リツイート」を行うTwitterBotの作り方
    ・【爆速】自作のTwitterBotを簡単に作るライブラリを作った話【初心者向け】
    こちらの2つの記事を拝見しながら作成を試みようと思ったのですが
    いずれも同一のエラーで制作が止まってしまい、
    何か解消方法があればお聞かせいただけたらとても嬉しいです。

    【エラー内容】
    https://api.twitter.com のリクエストに失敗しました(エラー: 403)。サーバー応答の一部: {“errors”:[{“message”:”You currently have Essential access which includes access to Twitter API v2 endpoints only. If you need access to this endpo…(応答の全文を見るには muteHttpExceptions オプションを使用してください)

    また、既にご存知かもしれませんが
    コメントが長文になりますとコメントのiframeの高さが足りず、
    スクロールもできなかったため送信ボタンが隠れてしまっておりました。

    • 質問ありがとうございます。エラー内容もありがとうございます。おかげさまでスムーズに調査できました。
      原因ですがエラーの内容を見るからに『APIのv2だけ』が使える『Essential access』のアプリを使っているためのようです。

      Twitterの仕様変更でアプリの権限に段階が出来たようで、当ブログで紹介している方法はもう1つの『Elevated access』のアプリだと使えます。

      お手数ですが以下のページからelevatedの申請を行ってアップグレードして頂きたいです。
      https://developer.twitter.com/en/portal/products/elevated

      細かい説明は以下のページに書いていましたのでご確認ください!
      https://blog.twitter.com/developer/ja_jp/topics/community/2021/build-whats-next-with-the-new-twitter-developer-platform

      またコメントの件もありがとうございます。修正しました。

      • 早速ご返信ありがとうございました!
        デベロッパーの登録が昔に比べてしやすくなったと喜んでいましたが
        やはり英語での申請からは逃れられないのですね。

        いただいたアドバイスをもとに挑戦してみたいと思います。
        コメントの件もご対応ありがとうございました。

        • 先日はご返信ありがとうございました。
          申請してみたところ、許可されなかったため
          コードを見直し叩くAPIを2の方に変えてみましたら
          Essentialのままでも使えるようになりました。

          ご報告まで。
          また新たなbotの記事を楽しみにしております。

  7. はじめまして
    こちらの記事を参考にさせていただき、RTbotを運用させていただいております。

    botを作成し数週間は問題なく運用できていたのですが、
    ここ数日下記のエラーが発生するようになりました。

    “TypeError: undefined からプロパティ「retweeted」を読み取れません。”

    色々調べたのですがはっきりとした原因が分からず、今回質問させていただいた次第です。
    なにかご助言をいただければ幸いでございます。

    • エラーを見た限りだと、retweetedを使う部分は以下の部分しかないので原因はgetTweetStatusの結果がundefinedになっていることのようです。

      var status = getTweetStatus(tweet);
      ︙
      if (!status.retweeted) { 
          putRetweet (tweet);
      }
      

      getTweetStatusを詳しく調べる必要があるので、以下のようにLogger.logを書き加えて、responseがどんなデータになっているか見てみると良いと思います!

      // いいね/RTの状態を確認
      function getTweetStatus (tweet) {
        var service  = twitter.getService();
        var response = service.fetch('https://api.twitter.com/1.1/statuses/lookup.json?id=' + tweet.id_str);
        Logger.log(response); // この結果に [{"created_at"~~~ から始まるデータが入っていないとおかしい
        var result = JSON.parse(response)
        return result[0];
      }
      
      • お返事いただきありがとうございます。

        ご教授いただいた通りLogger.logを書き加えたのですが、
        お恥ずかしながらどこでresponseのデータが見れるのが分かりません……。

  8. おせわになってますm(__)m
    authorizeは完了できてますがmaingが以下のエラーで止まります
    何か参考記事はありますか
    よろしくお願いします!

    Exception: https://api.twitter.com のリクエストに失敗しました(エラー: 401)。サーバー応答の一部: {“errors”:[{“code”:32,”message”:”Could not authenticate you.”}]}(応答の全文を見るには muteHttpExceptions オプションを使用してください)(行 443、ファイル「Service」)

    • 検索で一番上に出てきた記事載せておきます

      https://blog.dalt.me/200

      コードに書いているconsumer_keyとconsumer_secretが正しいか見て頂ければと思います!

  9. ありがとうございます!
    進めました!

  10. すずき様
    おせわになってます!
    いつもありがとうございます、また相談です

    (いいね)について15分間隔で実行、1時間、2時間など
    1日1000件超えないように、15分で50件超えないようにと色々工夫して試しますが

    2-3日でシャドウバン食らいます、2日くらい放置してまた回復したら挑戦してるのですが
    結局のところGASを一切動かさない という結論にたどり着いてしまいます。

    何かよいアドバイスがあれば頂きたいです、よろしくお願いします

    • いいねの自動化はTwitterのルール上NGなので裏技のようなアドバイスはないです。
      https://help.twitter.com/ja/rules-and-policies/twitter-automation
       
      唯一言えるのは閾値などが設定されていると思うので、頻度を下げてみるくらいですかね。。
      あまりお力になれず申し訳ないです。。

  11. ありがとうございます
    頻度を下げると一回の量が増加するので
    頻度を上げた方が逆に良いのかと思いましたが それも違った感じです
    また研究してみます!

  12. すずき様 おせわになっておりますこんにちは、
    POSTとLIKE&RTのプログラムをEssentialで動かす方法は難しいでしょうか?

    • Essentialトークンに対応したTwitterClient2をまもなくリリース予定です…
      (毎回同じ回答になるの申し訳なくて返答できませんでした…)

  13. […] 「いいね」や「リツイート」を行うTwitterBotの作り方 […]

  14. こんにちは。こちらを参考に自力でGASのBotを作成しているのですが、
    authorizeは認証URLが出てきて認証できるのですが、mainを実行すると
    「エラー Service not authorized. Service_.fetch @ Service.gs:292」
    となってしまいます。
    何が悪いのでしょうか?

    • 昔似たような問題を解決したことがあるのですが、一度resetを行って認証を外してからもう一度authrizeをしてみてもらえますか?

      ↓関連する部分を解説していた記事があったので共有しておきます。
      https://belltree.life/multi-account-twitter-bot

  15. 自分のツイートだけいいねをつけるにはどうしたらいいでしょうか?このやり方だと自分宛てのリプライなども入ってしまいます。

    • 自分のツイートを取得する時に 『from:@[アカウント名]』 のような検索をしてもリプライなど入ってしまいますかね…?

      • それもやってみたんですけどなぜか反応されないんですよね…

  16. 自分のアカウントだけ出来ないんですよね…シャドウバンでもされているんですかね

    • シャドウバンの可能性はあるかもしれないです
      私このシャドウバンチェッカーの開発者でもあるので是非ご利用ください!
      https://shadowban.elrincondelantropologo.com

      また自分自身の投稿のみでよければ検索でなくユーザー投稿を取得するAPIを使う方法もあります
      https://gist.github.com/belltreeSzk/b1cad3d9eacb79298d53080775614030
      ↑のコードを使う場合はシートの検索ワードをユーザー名のみにすればうまく取得できるはずです

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