【2022年最新】Googleスプレッドシート&GAS x Twitter API version 2.0で、BOTを自作してみた!

8 min

Twitterを自動時に投稿してくれるBOTサービスが有りますが、Googleスプレッドシート&GASなら無料でBOTを作成出来ちゃいます!

今回は実際にTwitter BOTを作成したのでその方法をお伝えします!

関連記事

Google Apps Script(GAS)についての記事

TwitterBOT作成⇗WordPressの記事作成補助⇗エラー対処⇗

created by Rinker
¥1,287 (2022/06/26 23:54:02時点 Amazon調べ-詳細)
スポンサーリンク

過去に投稿しTwitter共有した記事について

当ブログも開設して1ヶ月以上が経ち、ブログ記事数も20記事を超えました。Googleなどで検索して読んでもらうのをメインに考えていますが、せっかくなのでTwitterからもこのブログに訪れて欲しいです。
記事を投稿した際にはTwitterに共有していますが、もしかしたら過去の記事の中に新しくフォロワーになってくれた方に有益な記事があるかもしれません。

という事で過去に投稿した記事を再度、Twitterへの投稿を考えていました。
そんな時に活躍するのがTwitter BOTです。

Twitter BOTについて

Twitter BOTはツイートやいいね、リプなどを自動的に行なってくれます。
色々方法はありますが、1番手軽なのはtwittbot(ツイボット)などのBOTサービスを使う事です。

あめつゆもメインブログで有る、猫ブログ「猫雨露霜雪!」ではtwittbot(ツイボット)を使っていました。

簡単な設定で、ツイートだけでなく、簡単な自動返信なども行う事が出来て、1年以上使用していました。

一度設定をしてしまえば、後は放っておいても定期的に過去記事の紹介ツイートをして、それを見てたまにブログに来てくれる人がいたので、やらないよりはやって良かったと感じています!

基本無料ですし、とりあえずTwitterをBOT運用したいって人にオススメです!

twittbot(ツイボット)への不満

自動投稿するツイートの管理画面の操作性の悪さとランダムの偏りの多さ。

この2点が大きな不満でした。管理画面の操作性の悪さは最初は我慢出来たのですが……ランダムの偏りの多さは気になり過ぎました。

途中からはランダム投稿をやめて、登録する順番を適当にし、登録順に投稿するとランダムっぽくなるようにしました。そうすると……操作性の悪さが非常に気になってしまいます。

スプレッドシートでの自作BOTに切り替える。

そんな頃、Googleスプレッドシートをよく使うようになり、GASも触るようになると、Twitter BOTを作れるんじゃないかと、ネットを調べ、苦労はしましたが思ったより簡単に作成出来たので、twittbot(ツイボット)から切り替えました。

スプレッドシートでTwitter BOTを自作する

私のプログラミングスキルでは、自作するのは完全に無理なので、作成方法をネットで調べまくりました!

メインで参考にしたのがこちら!

アカウントの取り方から詳細に記載された上、Twitterに投稿するコードもシンプルでわかりやすくて、めちゃくちゃ参考にしました!

当ブログじゃなくて、もりさんのブログを見たら簡単にTwitter BOTを作成する事が出来ます!

もりさんありがとうございますっ!

Twitter BOT作成での苦労した点

簡単に出来る!

と、言いたいところですが、実際にやってみるとそう上手くはいかないです。
2021年7月11日に猫ブログのTwitter BOTを作成した際にはもりさんのブログを見て、その通りにやれば英語サイトでの登録には手間取りましたが、基本的には簡単にTwitter BOTを作成する事が出来ました。

今回も同じように苦戦するのは英語サイトのところだと思っていたのですが……違いました!

英語サイトについて

英語が苦手ならGoogle翻訳を駆使して登録するしか有りません。

実は今回、英語サイトのスクショを取って、もりさんのブログで使われているスクショとは違う画面の登録の手順をメインで紹介しようと考えていました。

しかし、もっと大きな問題にぶつかってしまったので、それは別の機会にします。

第一の難関:Twitter認証

これからの説明はもりさんの「Google Apps ScriptでTwitterに投稿するスクリプト(GAS×TwitterBot④)」を見ながらTwitter BOTを作成しようとしている事が前提となります。

多少の画面が違えど、もりさんのブログ通りにやれば「アプリに「コールバックURL」を登録する」までは大きな問題なく、作業出来るかと思います。

問題は次の「アプリの連携認証をする」です。ここでは……

連携認証のスクリプトを実行し、そのログに表示される本人確認のURLをブラウザで開いて連携承認する

という作業を行うのですが…どうやってもログに本人確認のURLが表示されない!

ここで相当の足踏みをしました。色々試したのですが、私のスキルではどうやって無理!

自分で調整するのは諦め、GASでTwitter連携認証する方法を探して……ようやく見つけました!

足踏みをし始めた時にもこちらのサイトは見つけていたのですが、Twitter連携認証部分だけを見てもHTMLで画面を作ってるし、GASのコードももりさんの方がスッキリしているのでスルーしていたのですが、他に方法が見つからず、Officeの杜さんのを参考にしてみたら・・・無事、認証出来ました!

Officeの杜さんありがとうございますっ!

第二の難関:ツイート

Twitter認証さえしちゃえば後は、簡単に……はいきませんでした。

どうやってもコードのツイートする部分でエラーとなってしまう。いくつか出たエラーから推察するに、どうやらTwitter API v1はなんらかの理由でダメらしいです。

そして、「なんらかの理由」の特定と対処が全くわかりませんでした。ネットで検索してもv1やv2に触れているサイトがまだまだ少なくて全くわからないまま。

そこで見つけた同じようにTwitterAPI ではまっている方がいて、

どうやらその方は、先ほど紹介した

を参考にすれば上手くいったとの事。

こうなったら……とツイート周りのロジックもOfficeの杜さんに合わせうまくいきました!

Officeの杜さんありがとうございますっ!

後は、ツイートの情報作成部分はもりさんの

を参考にすれば大丈夫で、想定よりかなり苦労をしましたが、無事……

GASからツイートする事が出来ました!

ほとんど、参考にしたサイトのコードを集めただけです。

//認証用インスタンスの生成
var twitter = TwitterWebService.getInstance(
  'xxxxxxxxxxxxxxxx',//API Key
  'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'//API secret key
);

//メニューを構築する
function onOpen(e) {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('▶OAuth認証')
      .addItem('認証の実行', 'startoauth')
      .addItem('テストツイート', 'testtweet')
      .addSeparator()
      .addItem('ログアウト', 'reset')
      .addItem('スクリプトプロパティ', 'openCheck')
      .addToUi();
}
 
//認証用の各種変数
var apikey = 'xxxxxxxxxxxxxxxx';
var apisecret='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
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 = "ametsuyu_blog_bot";  //アプリの名称
 
//認証実行
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("すでに認証済みです。");
  }
}
 
//認証チェック用関数
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("ログアウトしました。")
}

//Twitterに投稿するメッセージを作成する
function CreatePostMessage() {
  
  var spreadsheet = SpreadsheetApp.openById("スプレッドシートID");
  var sheet = spreadsheet.getSheetByName('スプレッドシートシート名');
  
  var lastRow = sheet.getLastRow();

  var sheet_sum = sheet.getRange(1, 3).getValue();
  var sheet_avg = sheet_sum / (lastRow - 1);
  
  //2行目~最終行の間で、ランダムな行番号を算出する
  var row = Math.ceil(Math.random() * (lastRow-1)) + 1;
  
  //ランダムに算出した行番号のタイトルとURLを取得
  var title = sheet.getRange(row, 1).getValue();
  var url = sheet.getRange(row, 2).getValue();

  sheet.getRange(row, 3).setValue(sheet.getRange(row, 3).getValue() +1); //ツイート回数をカウント
  
  var header = '過去に投稿した記事をランダムでご紹介!';

  //変数strに代入した文字列に「/youtu.be/」が含まれている場合
if ( url.match(/youtu.be/)) {
  var tagu = '#過去動画 #bot投稿 #ブログ #ブログ初心者 #ブロガー #youtube';
}else{
  var tagu = '#過去記事 #bot投稿 #ブログ #ブログ初心者 #ブロガー ';
}  

  var postMessage = header + '\n\n'  + tagu + '\n\n' + url;
  return postMessage;
  
}

//テストツイートする
function postTweet(){
  //トークン確認
  var service = checkOAuth(appname);
 
  //message本文
  var message = {
    //テキストメッセージ本文
    text: CreatePostMessage()
  }
 
  //リクエストオプション
  var options = {
    "method": "post",
    "muteHttpExceptions" : true,
    'contentType': 'application/json',
    'payload': JSON.stringify(message)
  }
 
  //リクエスト実行
  var response = JSON.parse(service.fetch(endpoint2, options));
 
  //リクエスト結果
 console.log(response)
}

つぎはぎなので、無駄が有ったりもするかも知れません。

ホントはツイート内容をもう少し色々といじりたかったけど、今回は余裕がなくなってしまったので、それも余力が有れば対応していきます!

まとめ

今回、途中から私のスキルを超えてしまって理解が追いつかなかったけど、ハイレベルな人たちが投稿してくれている内容を上手く使うことによってなんとか目的を達成しました!

  1. STEP

    作業のベース

    もりさんの「Google Apps ScriptでTwitterBotを作ろう!」シリーズに沿って作業。

  2. STEP

    Twitter Developer

    画面は全然違うし、登録内容も若干違うが、Google翻訳を駆使すればなんとか登録出来るはず。

  3. STEP

    Twitter連携認証からツイートのテストまで

    Twitter API v2で構築する必要が有るので、officeの杜さん「Google Apps ScriptからTwitter API v2を使ってツイートする」を参考にする。

  4. STEP

    ツイートする内容について

私のスキルでは解説も難しい箇所が有りますが、上記2サイトを参考にすれば出来るはずです!

頑張ってみて下さい!

そして、無理そうなら諦めてtwittbot(ツイボット)使いましょう!

関連記事

1 件のコメント

コメントを残す

メールアドレスが公開されることはありません。