【Twitter API v2】Botbirdが実質有料化?自動ツイートBot作成方法

2023年05月06日付のBotbirdのstaff blogに「テスト運用フェーズを終了し本番運用開始とさせて頂きます」とあったので、ヤレヤレと思った。
ところが、その4日前である05月02日付の同ブログに、次の記述があって驚いた。

2023年5月15日より、下記の投稿につきましてSMALLBIZプラン以上のプランにて可能となりましたのでご連絡いたします。

■SMALLBIZプラン以上のプランで投稿可能な対象コンテンツ
  ・アフィリエイト関連の投稿
  ・金融商品、FX、ポイント、紹介コード関連の投稿
  ・短縮URL関連の投稿
  ・動画URL関連の投稿

SMALLBIZプラン月額3,300円)に入らなければ、アフィリエイトURLを含む自動ツイートが出来ないとは!!
恐らくTwitter API v2(以下、「API」と略)の有料化と、それに伴う開発・保守費用を回収する必要があるのだろう。
だが、高単価なアフィリエイト商材の自動ツイートをしてコンスタントに成果が上げられているのならともかく、私のような低単価のアフィリエイト商材(文庫やマンガ)を自動ツイートしているような弱小アカウントでは、とてもペイしない金額だ
そこで本稿では、ツイートデータの追加・修正・削除は従来どおりBotbird(ボットバード)を利用しつつ、自動ツイートBotの作り方を解説する。

前提条件

本稿の解説には、次の前提条件がある。

  • APIの無料プラン以上が利用できること
  • Botbirdアカウント(無料プランまたは有料プラン)が取得済みであること
  • PHPが動作するサーバ(レンタルサーバもしくは自宅サーバ)が用意できること

本稿で解説する自動ツイートBotではAPIを利用するため、APIの無料もしくはBASICプランが利用できなければ実現できない
APIを無料プランで使えるようにするには、次の記事を参照のこと。

冒頭でも述べたが、自動ツイートするツイート内容は従来のようにBotbirdで管理することを想定しているため、実際にBotbirdで自動ツイートはしないが、Botbirdのアカウントが必要だ。
最後に、本稿で解説する自動ツイートBotはPHPで動作するため、PHPが動作するサーバが必要だ。
無料のレンタルサーバでPHPが使えるモノもあるので、サーバを持っていない人は独自で調べて契約して欲しい。ただし、Cronが使えないと意味がないので要注意

自動ツイートBot仕様

Twitter API v2とBotbirdを利用して自動ツイートBotを作成する

次に、本稿で解説する自動ツイートBotの仕様について述べる。

  1. Twitter認証およびツイート投稿はTwitterOAuth v3.1.0をベースとする(Composerは利用しない)
  2. API v2では画像のアップロード部分が未リリース(本稿執筆時点)のため、API v1.1で画像付きのツイートを可能とする
  3. Botbirdの従来仕様どおり、1ツイートに添付できる画像は1ファイルとする
  4. Cronを利用することで定期的な自動ツイートを実現する
  5. Twitterを複数アカウントで運用している場合でも、フォルダとファイルをコピーすることで利用可能にする

まず上記 1. だが、TwitterOAuthの最新はv5.0.0(本稿執筆時点)であるものの、v3.2.0以降PHP7.3がサポートから外されており、最新バージョンはPHP8系しかサポートしていないのが、その理由だ。
また、通常TwitterOAuthを導入するにはComposerを使うのが常識だが、サーバの知識がなく、プログラミングが出来ない人でも自動ツイートBotの作成を可能にするため、Composerを利用せずに実現する。
上記 2. に関しては、API v2を利用した画像付きツイートがまだサポートされていないため(画像アップロード部分が未リリース)、API v1.1で実現することになるが、API v1.1でもアクセスレベルがEssentialだと画像付きのツイートは出来ない
つまり、EssentialからElevatedしていなければ画像付きツイートは不可なのだが、現在のTwitter Developer PortalではElevatedが出来ないので、すでにElevatedしている人以外は、現在のところ画像付きツイートは出来ない状況だ。

※2023/07/01 追記
Twitter自動ツイートBot作成キット Ver1.3.02023/07/01リリース)では、ElevatedしていないTwitterアカウントでも画像を添付した自動ツイートに対応した(本稿で提示しているソースプログラムでは、Twitter API v1.1で画像添付ツイートが不可になったため、プログラムを修正しないと画像添付ツイートは出来ない)

上記 3. は、1ツイートにつき最大4ファイルの画像または2分までの動画を添付可能だが、ツイートデータの管理が煩雑になってしまうため、ツイートデータとその画像はBotbirdで管理する。ゆえに、1ツイート最大1画像を仕様とする。
上記 4. だが、Cronを利用することで定期的な自動ツイートを実現するため、Cronの設定によっては30分ごとに自動ツイートすることや、Botbirdの無料プランのように1時間ごとに自動ツイートすることを可能とする。
最後に上記 5. だが、私のようにTwitterで複数アカウントを運用していても自動ツイートBotが利用可能なように、アカウントごとにフォルダを作成することで実現可能とする。
本稿で解説する自動ツイートBotは、太宰治真理教(dazai_wiki)私設松本零士博物館(leiji_museum)で本番稼働しているので、「どんなモンじゃろか?」を思う人はぜひ参照して欲しい。

ファイル構成と自動ツイートBotプログラム内容

私設松本零士博物館(leiji_museum)を例に、自動ツイートBotを解説する。
フォルダとプログラム、ファイル構成は次の通り。

  • public_html(ドキュメントルート)
    • twitter_bot(自動ツイートBotフォルダ)
      • autoload.php
      • Cabundle.php
      • Consumer.php
      • HmacSha1.php
      • Request.php
      • Response.php
      • SignatureMethid.php
      • Token.php
      • TwitterOAuth.php
      • Util.php
      • Util(TwitterOAuthのユーティリティフォルダ)
        • JsonDecoder.php
      • leiji_museum(私設松本零士博物館Twitterアカウントフォルダ)
        • image(ツイート添付画像用フォルダ)
        • bot.php(本稿で解説する自動ツイートBot本体プログラム)
        • tweet.txt(Botbirdからコピペしたツイートファイル)

上記フォルダとPHPファイルのパーミッションは700、それ以外のテキストファイルや画像ファイルのパーミッションは644に設定しておけば良いだろう。
twitter_botフォルダ配下とUtilフォルダ配下にあるPHPプログラムは、TwitterOAuthから持ってきて適宜namespaceuseを変更して保存することで、Composerを使わないで済むようにしている(無論、TwitterOAuthだけでは足りないPHPプログラムもある)。
なお、PHPプログラムの修正が分からない人は、自動ツイートBot作成キットを購入できるようにしてあるので、こちらを利用するのも手だ。

楽天ペイ、銀行・コンビニ決済を利用したい場合は、BOOTHからの購入が便利だろう。

leiji_museum」フォルダはTwitterアカウント別のフォルダで、上記では私設松本零士博物館(leiji_museum)アカウントを例にしているが、「leiji_museum」フォルダ配下のフォルダやファイル構成は、別のアカウントでも同一だ。
早速、私が開発した自動ツイートBotプログラムを解説しよう。

leiji_museum\bot.php

<?php

require_once(str_replace(strrchr(__DIR__ , '/'), '', __DIR__) . '/autoload.php');

use twitter_bot\TwitterOAuth;

                                        // Twitter API v2設定
// API Key
define('CONSUMER_KEY', 'APIキー');
// API Key Secret
define('CONSUMER_SECRET', 'APIキーシークレット'); 
// Access Token
define('ACCESS_TOKEN', 'アクセストークン');
// Access Token Secret
define('ACCESS_TOKEN_SECRET', 'アクセストークンシークレット');
                                        // Twitter用自動ツイートBot設定
// ツイートファイル
define('TWEET_FILE', __DIR__ . '/tweet.txt');
// ツイート添付画像ディレクトリ
define('ATTACH_IMAGE_DIR', __DIR__ . '/image/');
                                        // ツイートをランダムに抽出
$tweet = file(TWEET_FILE);
shuffle($tweet);
$text = $tweet[0];
$text = explode(',', $text, 2);
// 添付画像ファイル
$image = preg_match('/\.gif$|\.png$|\.jpg$|\.jpeg$|\.bmp$/i', $text[0]) ? $text[0] : '';
// ツイートメッセージ
$message = str_replace("\\r\\n", PHP_EOL, $text[1]);
                                        // ツイート投稿
PostTweet($message, $image);

function PostTweet($message, $image) {
    // Twitter OAuthオブジェクト生成
    $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
    // TwitterへPOST
    if ($image == '') {
        // ツイートに添付画像がない場合
        // Twitter API v2指定
        $connection->setApiVersion('2');
        $response = $connection->post('tweets', ['text' => $message], true);
    } else {
        // ツイートに添付画像がある場合
        // 現段階でAPI v2で画像のアップロードがリリースされていない
        // API v1.1での画像付き投稿は可能だが、Elevatedしていないと投稿できない
        $media = $connection->upload('media/upload', ['media' => ATTACH_IMAGE_DIR . $image]);
        $parameters = [
            'status' => $message,
            'media_ids' => $media->media_id_string
        ];
        $response = $connection->post('statuses/update', $parameters);
    }
}

具体的には、上記API Key、API Key Secret、Access Token、Access Token SecretをTwitterアカウントのAPIから転記して保存し、FTPすればそのまま使えるようになっている。
Twitterアカウントの接続(認証)とツイート投稿はTwitterOAuth側プログラムで良きに計らってくれるため、上記プログラムではツイートファイルを読み込んでランダムにツイートメッセージと添付画像ファイルを抽出し、Twitterに投稿しているに過ぎない。
なお、上記のrequire_onceや、ツイートファイルツイート添付画像ディレクトリ指定では、Cronで自動実行する際に絶対パスでないとエラーになるため、PHPのマジック定数「__DIR__」を使って指定している。
では、ツイートファイル(tweet.txt)はどう作るのか?

Botbirdを一括編集モードにする

図のようにBotbirdにログインし、表示モードを図赤枠一括編集モード」に変更する。

メッセージ一括更新の内容をすべてコピーする

「一括編集モード」に表示が切り替わったら、画面を下にスクロールして図のように「メッセージ一括更新」へ移動し、図赤枠のテキストボックス内をCtrl+Aで全選択状態にしてCtrl+Cでコピーし、テキストエディタ等にCtrl+Pでペーストして「tweet.txt」のファイル名で保存すればOKだ(保存の際の文字コードはUTF-8にしておくと吉)。
実際、ツイート内容は何行になるかワカランし、だったら改行文字(Botbirdの場合は\r\n=CR+LF)で一行にして管理する方がプログラム的に楽だ。
プログラム的には管理が楽だが、人間的にはいちいち改行文字を追加しながらツイート内容を編集するのは大変だし、ともかく面倒くさい
よって、ツイート内容の追加・修正・削除はBotbirdで管理した方が楽だし、一括編集モードで一気にコピペしてツイートファイル(tweet.txt)を作成・更新する方が簡単・便利なのは言うまでもない。
そこでツイートの添付画像はどうするか?だが、こればっかりは手動で編集するしかない。
次のテキストは実際の自動ツイート内容の一部だが、これを例に説明しよう。

leiji_museum\tweet.txt(Botbirdからコピペした一部)

13560926,友だちは\r\nお互いしゃべりたくないことを\r\nしゃべらなくても\r\n根掘り葉掘り聞かなくても\r\n友だちだよ\r\n信じられる友だちには\r\n何も聞かなくてもいいんだ\r\n\r\n『大純情くん』物野けじめ\r\nhttps://amzn.to/30OIDHu
23107524,倅が死んだことについては\r\n気にせんでくれ\r\nあいつは あいつの信念でやって\r\nそれで死んだ\r\n\r\nわしは倅をそういう男に育てたのだ\r\n間違ったとは思っとらん\r\n倅は心配はしても\r\nお前を恨んだりはせん\r\n男とはそういうもんだ\r\n\r\nじゃから\r\nお前も早く一人前の男になれ\r\n\r\n『大純情くん』現場監督の父
23017671,名前はミーじゃぞ\r\n先祖代々わが家のネコは\r\nミーに決まっとる\r\n\r\n『トラジマのミーめ』お父さん\r\nhttps://amzn.to/2sT3Pzw

上記テキスト内の2行目に添付画像「daijyunjyo-kun_vol2_p94.jpg」をBotbirdで指定している。
この場合、次のようにテキストを編集し、「leiji_museum」フォルダ配下の「image」フォルダに「daijyunjyo-kun_vol2_p94.jpg」を追加してFTPしておく。

leiji_museum\tweet.txt(2行目に添付画像ファイルを指定)

13560926,友だちは\r\nお互いしゃべりたくないことを\r\nしゃべらなくても\r\n根掘り葉掘り聞かなくても\r\n友だちだよ\r\n信じられる友だちには\r\n何も聞かなくてもいいんだ\r\n\r\n『大純情くん』物野けじめ\r\nhttps://amzn.to/30OIDHu
daijyunjyo-kun_vol2_p94.jpg,倅が死んだことについては\r\n気にせんでくれ\r\nあいつは あいつの信念でやって\r\nそれで死んだ\r\n\r\nわしは倅をそういう男に育てたのだ\r\n間違ったとは思っとらん\r\n倅は心配はしても\r\nお前を恨んだりはせん\r\n男とはそういうもんだ\r\n\r\nじゃから\r\nお前も早く一人前の男になれ\r\n\r\n『大純情くん』現場監督の父
23017671,名前はミーじゃぞ\r\n先祖代々わが家のネコは\r\nミーに決まっとる\r\n\r\n『トラジマのミーめ』お父さん\r\nhttps://amzn.to/2sT3Pzw

上記のようにツイートファイル(tweet.txt)を手動で編集すれば、画像を添付した形で自動ツイートすることが可能だ。
とは言え、私設松本零士博物館(leiji_museum)アカウントのAPIはElevatedしていないため、実際には画像を添付したツイートは出来ない(一応、デバッグ情報からElevatedしていれば画像添付ツイートが可能なのは確認している)。

Cronを設定する

自動ツイートBot本体(bot.php)の設定とツイートファイル(tweet.txt)を作成(必要な場合はツイート添付画像を用意)し、サーバに一式をFTPしてパーミッションを設定したら、次はCronを設定して自動ツイートをさせよう。
なお、本稿ではエックスサーバー での設定方法を解説するが、他のレンタルサーバの場合でも応用は利くハズだ。

Xserverサーバーパネル

まず、図のようにエックスサーバー のサーバーパネルにログインする。
エックスサーバー CronではPHPのバージョンを指定するため、図赤枠PHP Ver 切替」リンクをクリックする。

XServer「PHP Ver 切替」でドメインを指定する

今回開発した自動ツイートBotは「dajya-ranger.com」ドメインのため、図赤枠選択する」リンクをクリックする。

Xserverで利用しているPHPのバージョンを確認

赤下線にある通り、現在のPHPバージョンが「PHP7.4.33」であることが分かる(WordPressの推奨バージョンがPHP8系になれば良いのだが・・・)。

Xserverサーバーパネル

再びサーバーパネル画面に戻り、図赤枠Cron設定」リンクをクリックしてCronの設定を行う。

Xserver「Cron設定」画面

図のような画面に遷移するので、図赤枠Cron設定追加」タブをクリックする。

Cron設定で1時間ごとに自動ツイートBotを起動する設定

図は日・月・曜日に関係なく1時間ごとに0分になったら自動ツイートする設定だ。
詳しくは次の通り(例えば30分ごとに自動ツイートしたい場合は、「分」の欄に「*/30」と指定する)。

時間*
*
*
曜日*
コマンド/usr/bin/php7.4 /home/ユーザID/dajya-ranger.com/public_html/twitter_bot/leiji_museum/bot.php
コメント私設松本零士博物館TweetBot

入力をしたら、図赤枠確認画面へ進む」ボタンをクリックする。

Cron設定確認画面

図のような画面に遷移するので、図赤枠追加する」ボタンをクリックする。

Cron設定一覧画面に設定したCronが反映されている

すると、図のように私設松本零士博物館TiwtterBotが毎時0分に自動ツイートする設定が追加された。
時間になっても自動ツイートしない場合は、

  • ファイルのFTP漏れがある
  • ファイルやフォルダのパーミッションが間違っている
  • Cronのコマンド指定が間違っている

上記の可能性が高いので、もう一度見直してみよう。
特にCronのコマンド指定では、PHPのバージョンが「PHP7.4.33」だからといって「/usr/bin/php7.4.33」と指定するのは間違いで、「/usr/bin/php7.4」とするのが正しい。
同様に「/usr/bin/php7.4」と「/home/ユーザID/~」の間には、半角スペースが1つ入るので要注意

Cron通知メールアドレスの設定

それでもよくワカラン場合は図のように、「Cron結果の通知アドレス」の図に自分のメールアドレスを入力し、図赤枠②通知アドレス設定」ボタンをクリックしておく。
Cronを実行した時に失敗した内容(エラー内容)がメールで届くので、それを手掛かりに修正するしかない。
逆に言えば、Cronを実行してエラーがなければメールが届かないため、それを以てCron実行が成功していることになる。
自分が運用しているTwitterで無事ツイートされているかを確認すればOKだ。

おわりに

ともかく急いで自動ツイートBotを開発して本稼働させることを優先させたため、自動ツイートのシャッフルのロジックが甘く、「ツイートを重複なくシャッフルしてツイートを投稿し、全出力後に初期化する」といったところまで手が回らなかった。
この辺に関しては実装のアイデアはあるので、時間をみてプログラムを修正し、テストしてみようと思っている(自動ツイートBot作成キットもバージョンアップ予定)
 Twitter自動ツイートBot作成キット Ver1.2.02023/05/30リリース)で対応。
ツイートデータを単にシャッフルして自動でツイートするBot自体の構造は簡単で、かねてより最悪は自作するかと思っていたが、複数のTitterアカウントでツイートデータを管理して自動ツイートするとなると、仕組みと運用面で考えることが多く、ツイートに画像を添付する仕様を含めると容易ではない
しかもキモはTwitterアカウントの認証とそのツイート方法なので、Composerを使わずお手軽に実装するのは骨が折れた。
結局のところ、自動ツイートデータの管理を従来のBotbird上でやることにして、ツイートの添付画像は手動でツイートファイルを編集することにし、フォルダを分けることでTwitterの複数アカウントに対応することにしたので、実運用上の問題はクリアした。
私のように、従来よりBotbirdを利用して来た人は簡単に乗り換えることが出来るし、ツイートの追加・修正・削除がなければ、放置しておけば良いので運用も楽だ(念のため、Botbirdは「停止中」にしておけば良い)。
ともあれ、PHPでプログラミングが可能な人なら、本稿を読んで自力で自動ツイートBotを作成できるだろう。
そうではない人は、次の自動ツイートBot作成キットを購入してチャレンジして欲しい。

楽天ペイ、銀行・コンビニ決済を利用したい場合は、BOOTHからの購入が便利だ。

自動ツイートBot作成キットを購入してみたものの、やっぱワカランという人は、次のオンラインサロンに入会し、私に質問していただければ対応する(オンラインサロン会員は最新の自動ツイートBot作成キットもダウンロード可能)。

読者のスキルレベルはワカランが、自動ツイートBotを利用してTwitterやYouTube、運営しているサイト等で、ぜひ収益を上げて欲しい

関連記事


Warning: strpos() expects parameter 1 to be string, array given in /home/eware/dajya-ranger.com/public_html/wp-includes/compat.php on line 473

Warning: preg_match_all() expects parameter 2 to be string, array given in /home/eware/dajya-ranger.com/public_html/wp-includes/shortcodes.php on line 155
Array

この記事が気に入ったら
いいね ! をお願いします


ITで何かお手伝い出来ることはありませんか?

CTA-IMAGE

本サイトでは、外部サービスと連携して「ITの困った」を解決します!

ソフトウェアカテゴリの最新記事