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仕様
次に、本稿で解説する自動ツイートBotの仕様について述べる。
- Twitter認証およびツイート投稿はTwitterOAuth v3.1.0をベースとする(Composerは利用しない)
- API v2では画像のアップロード部分が未リリース(本稿執筆時点)のため、API v1.1で画像付きのツイートを可能とする
- Botbirdの従来仕様どおり、1ツイートに添付できる画像は1ファイルとする
- Cronを利用することで定期的な自動ツイートを実現する
- 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.0(2023/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からコピペしたツイートファイル)
- twitter_bot(自動ツイートBotフォルダ)
上記フォルダとPHPファイルのパーミッションは700、それ以外のテキストファイルや画像ファイルのパーミッションは644に設定しておけば良いだろう。
twitter_botフォルダ配下とUtilフォルダ配下にあるPHPプログラムは、TwitterOAuthから持ってきて適宜namespaceとuseを変更して保存することで、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にログインし、表示モードを図赤枠「一括編集モード」に変更する。
「一括編集モード」に表示が切り替わったら、画面を下にスクロールして図のように「メッセージ一括更新」へ移動し、図赤枠のテキストボックス内を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を設定して自動ツイートをさせよう。
なお、本稿ではエックスサーバー での設定方法を解説するが、他のレンタルサーバの場合でも応用は利くハズだ。
まず、図のようにエックスサーバー のサーバーパネルにログインする。
エックスサーバー のCronではPHPのバージョンを指定するため、図赤枠「PHP Ver 切替」リンクをクリックする。
今回開発した自動ツイートBotは「dajya-ranger.com」ドメインのため、図赤枠「選択する」リンクをクリックする。
図赤下線にある通り、現在のPHPバージョンが「PHP7.4.33」であることが分かる(WordPressの推奨バージョンがPHP8系になれば良いのだが・・・)。
再びサーバーパネル画面に戻り、図赤枠「Cron設定」リンクをクリックしてCronの設定を行う。
図のような画面に遷移するので、図赤枠「Cron設定追加」タブをクリックする。
図は日・月・曜日に関係なく1時間ごとに0分になったら自動ツイートする設定だ。
詳しくは次の通り(例えば30分ごとに自動ツイートしたい場合は、「分」の欄に「*/30」と指定する)。
分 | 0 |
時間 | * |
日 | * |
月 | * |
曜日 | * |
コマンド | /usr/bin/php7.4 /home/ユーザID/dajya-ranger.com/public_html/twitter_bot/leiji_museum/bot.php |
コメント | 私設松本零士博物館TweetBot |
入力をしたら、図赤枠「確認画面へ進む」ボタンをクリックする。
図のような画面に遷移するので、図赤枠「追加する」ボタンをクリックする。
すると、図のように私設松本零士博物館TiwtterBotが毎時0分に自動ツイートする設定が追加された。
時間になっても自動ツイートしない場合は、
上記の可能性が高いので、もう一度見直してみよう。
特に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実行が成功していることになる。
自分が運用しているTwitterで無事ツイートされているかを確認すればOKだ。
おわりに
ともかく急いで自動ツイートBotを開発して本稼働させることを優先させたため、自動ツイートのシャッフルのロジックが甘く、「ツイートを重複なくシャッフルしてツイートを投稿し、全出力後に初期化する」といったところまで手が回らなかった。 Twitter自動ツイートBot作成キット Ver1.2.0(2023/05/30リリース)で対応。
この辺に関しては実装のアイデアはあるので、時間をみてプログラムを修正し、テストしてみようと思っている(自動ツイートBot作成キットもバージョンアップ予定)
ツイートデータを単にシャッフルして自動でツイートする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 498
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