gas(Google Action Script)でtwitter botの作り方!自動投稿する

プログラミング学習

かなり高額でバランスが悪いTwitterAPIの有料化が行われて、いろいろなサービスが終了していきます。使っていたWordPressのプラグインもサービスが終了の模様。

そのためTwitter APIのfree版でGASで運用する簡単なコードを休憩時間に書いています。覚書のめもという感じでツラツラとまとめていきます。

twitter botの作り方!【非エンジニア用と外注化】

プログラム抜きでTwitter Botを作りたい人の検索流入があるようなのでこちら追記しておきます(追記)。ココナラならある程度好きなように要望を聞いてもらえますよ。

Gas(Google Action Script)を使うと、ココナラで結構安価に外注化できるのですね!忙しい人はこちらでもいいかもしれませんね。

GASでTwitterの自動投稿のbotを作ってくれそうな人

うまくキーワードを絞りこむとそれっぽい人がでてきます。

GAS Twitter API スプレッドシート

その他は、TwitterAPIのenterpriseを導入したソーシャルドックなどですかね。こちらはノンプログラマー向けの記事なので非エンジニアの方はこちらの記事をみてください。

Twitter API Freeでは読み込みができませんので、フォロワーの管理をしたいのならソーシャルドックという選択肢があります。

実はIFTTT PROでも予約投稿はできます。WordPressからTwitterも新規投稿でよければできるはず。

スポンサーリンク

GAS(Google Action Script)でtwitter botの作り方!ツイートする【プログラマ向け】

Twitterの自動投稿にGasを選んだ理由

Pythonなどでも作れます。ただ、Gasの方が手軽そうだったので。Gasを選んだ理由は次のとおりです。

  • サーバーを用意する必要がない
  • Googleのサービスなのでスプレットシートとの安定的な連携
  • 無料
  • 言語がJavaScript(個人的にJavaScriptは多少書いていたので)
  • プログラミングで書くと自分の好きなようにカスタマイズできる

Free APIの移行方法とOAuth

APIの設定やfree版で提供されている機能、OAuthについては、こちらの記事をみてください。

GAS(Google Action Script)のTwitter BOTの本・動画

GASをはじめて触る人は参考書を検討するかもしれません。

Udemyの「独学で身につけるGAS(Google Apps Script)〜基礎編〜【業務効率化・自動化で残業を無くそう!】」の番外編にTwitterの解説がありましたよ。初心者向けの教材です。

Udemy

個人的に初心者向きの講座な気がして未購入なので中身はわかりません。Udemyのヘビーユーザーのためいろいろと記事を書いています。

GAS(Google Action Script)からTwitterにアクセスするスクリプトIDはどこ?

githubにのっていました。OAuth1は外部サイトにアクセスするためのライブラリです。Googleが公開しています。Twitterアクセスのサンプルソースがあります。

In the “Find a Library” text box, enter the script ID 1CXDCY5sqT9ph64fFwSzVtXnbjpSfWdRymafDrtIZ7Z_hwysTY7IIhi7s and click the “Select” button.

https://github.com/googleworkspace/apps-script-oauth1

ライブラリ + > スクリプトIDをいれて検索 > OAuth1とでればOK > [追加]をおします。

OAuth2はこちらです。

In the “Find a Library” text box, enter the script ID 1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF and click the “Select” button.

https://github.com/googleworkspace/apps-script-oauth2

GAS(Google Action Script)にTwitterのキーを設定する

直接ソースに書くのは微妙なので、こちらにかきます。

歯車アイコンのプロジェクト設定 > スクリプトプロパティを追加

次の4つです。v1の場合。

  • CONSUMER_API_KEY
  • CONSUMER_API_SECRET
  • ACCESS_TOKEN
  • ACCESS_TOKEN_SECRET

v2の場合はこちら!

  • CLINET_ID
  • CLIENT_SECRET

こんな感じで呼び出します。

const scriptProps = PropertiesService.getScriptProperties();
const clientId = scriptProps.getProperty('CLIENT_ID');
const clientSecret = scriptProps.getProperty('CLIENT_SECRET');
console.log('clientId', clientId)
console.log('clientSecret', clientSecret)

Twiitterの管理画面にcallbackurlを指定

コールバックとは呼び出し後、コールバックしてその結果が受け皿に戻ってきます。GASからTwitterを呼び出し、TwitterがコールバックしてGASに戻るわけです。そのurlの指定を管理画面に行います。

v2は必要です。GASのアドレスでIDをみます。

https://script.google.com/home/projects/[ID]/edit

callback用のアドレスに書き換えます。

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

Twitterの管理画面に張り付けます。

半角スペースなどが入っていると無効になるため要注意です。

サイドバーの[アプリ名] > User authentication settingsの[Edit] > App info>Callback URI

デバッグ時に権限の確認

はじめてgasを[実行]すると外部のアクセスは権限の許可が必要なようです。許可します。

デバッグ > 権限の確認 > 該当メールアドレスでログイン > 詳細 > プロジェクト名(安全ではないページ)に移動) > 許可

gasの関数の実行

デバッグの右に関数を選ぶ箇所があります。動かない凡ミスとして選び間違えがあります。

スポンサーリンク

GAS(Google Action Script)でtwitter botの作り方!サンプルコード(v2)

こちらのやり方で簡単にできました。ありがとうございます。

ほぼ一緒なのでコードは割愛しますが、多少補足しておくとこんな感じです。

  1. logRedirectUriを実行してurlが正しいのか確認
  2. mainを実行してauthorizationUrlのurlが表示されるため、そのurlにアクセス(urlをドラックして右クリックから移動できます)。ここが成功すると、Twitter側にアプリが追加されています。
  3. 最後にpostTwitterのコードを追加して実行します。

ただ、ここからカスタマイズしていかないといけませんからはじまりの一歩ですかね。

GASの日付繰り返し定期実行、その他のノウハウ

長くなったため記事をわけました。

スポンサーリンク

GAS(Google Action Script)でtwitter botの作り方!サンプルコード(v1)

OAuth認証

  // OAuth認証
  const getTwitterService = function() {
    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/authorize" )
    .setConsumerKey( CONSUMER_API_KEY )
    .setConsumerSecret( CONSUMER_API_SECRET )
    .setAccessToken( ACCESS_TOKEN, ACCESS_TOKEN_SECRET );
  }

GASからツイートする

function tweet() {
  const twitter = getTwitterService()

  if(twitter.hasAccess()) {
    const url = "https://api.twitter.com/1.1/statuses/update.json"
    const text = "つぶやき"
    const payload = {status : text}

    const response = twitter.fetch(url, {
      method: "post",
      payload: payload 
    })
  } else {
    console.log(service.getLastError())
  }

ここまでで固定文のツイートはできます。

GASからスプレットシートのデータを取得

初回、スプレットシートにアクセスするため権限の許可が求められます。

const spreadsheet = SpreadsheetApp.openById('SPREADSHEET_ID'); 
const sheetName = spreadsheet.getSheetByName("シート名");

function getTweetFromSheet() {
  const count = sheetName.getLastRow() -1; //1行目がタイトルのため
  const tweetRange = sheetName.getRange(2, 2, count, 1); //開始行,開始列,範囲行,範囲列
  const tweetList = tweetRange.getValues();
  console.log("tweetList:", tweetList);
}

SPREADSHEET_IDはurlに記載されています。urlのdの後です。

function tweet()をスプレットシートを呼び出すように変更します。

// const text = "つぶやき"
const text = getTweetFromSheet()

もちろん配列なので、そのままやると問題があり、このあたりは作り方を検討していきます。

本当に初歩の初歩でしたが、参考になれば幸いです。個人的にもこれから設計していきます。

スポンサーリンク

GAS(Google Action Script)のエラー

アプリにアクセスを許可できません。 前に戻ってもう一度ログインしてください

Twitterで認証する際にでるエラーです。

アプリにアクセスを許可できません。 前に戻ってもう一度ログインしてください

CLINET_IDとCLIENT_SECRETのいずれか、あるいは両方が間違っているため修正するととおります。

unauthorized_client, Missing valid authorization header

この問題もCLIENT_SECRETを再生成で通りました。

unauthorized_client, Missing valid authorization header

I was able to resolve by resetting my environment variables for the Twitter Client ID and Secret and then restarting the dev server.

https://stackoverflow.com/questions/74498352/getting-unauthorized-client-missing-valid-authorization-header-in-return-on-tw

Exceeded maximum execution time

Exceeded maximum execution time

最大実行時間は6分のようです。Gasにデータを読み込んで実行する場合、作りが悪いとひっかりそうです。このルールも基本のようなので覚えておきます。

SyntaxError: Identifier ‘spreadsheet’ has already been declared

SyntaxError: Identifier 'spreadsheet' has already been declared

重複しているようです。コピペで移植すると起こりやすい!別の.gsファイルをコメントアウトしたら改善されました。

Exception: Already setting up a recurring clock trigger.

Exception: Already setting up a recurring clock trigger.

トリガーがまだ設定されているようです。

既存のトリガーを削除してから新しいトリガーを設定する必要がありそうです。下記のようなコードを書いたら解決しました。

  // 既存のトリガーを削除
  const triggers = ScriptApp.getProjectTriggers();
  for (let i = 0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() === "post") {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }

削除したのちに新しいトリガーを設定します。

You are not allowed to create a tweet with duplicate content

Twitterは重複投稿はダメですね。

You are not allowed to create a tweet with duplicate content
  • 日付を追加する
  • 前の投稿を削除する
  • かなり間隔をあける
  • 自分のツイートをリツイートにする(月額100ドルの有料プランになります)

ほか、何らかの工夫が必要です。

/

GAS(Google Action Script)でtwitter botの作り方!ツイートする(参考動画)

こちらの動画がわかりやすいのではないでしょうか。

最初のとっかかりとして参考にさせてもらいました。ありがとうございます。

コメント