[bot]TwitterBotが動かなくなったので原因を探った
Twitter で「OZ/オズ」の語り部だったオーガスタス・ヒルの言葉をbot化して運営しています。
『ヒルのお言葉』と囚人たちの歌をリスト化したものを時間指定してランダムに呟くようにしています。
最初は、PHPで作ったTwitter Botスクリプト「EasyBotter」を使用していました。
その時はフォロワーがフォローすると自動フォローする、などの設定はされていました(現在は行っていません)。
レンタルサーバーをヘテムル→ロリポップ!と移動し、現在のエックスサーバーへ移動した際、別のプログラムを参考にして再スタートしました。
PHPとTwitterOAuth でTwitter のbotを動かす方法です。
参考記事(実際使用したプログラム)
botがいきなり4月末から動かなくなった
ところが、今年の4月末からヒルbotが動いていないことに最近気づきました。
3か月放置しっぱなし…WordPress とか声チェックの更新とか体調不良とか……ええい!自分のせいだよ。申し訳ございません。
フォローしてくれている方からも「再起動させてください」、というお言葉をいただき、急ぎ原因を探りました。
広告
PHPのバージョンを5.6から7.0に変更した
以前、データベースをうっかり消してしまった記事を書きました。
実は、サーバ移動した時とともにPHPのバージョンも5.6から7.0に変更していたのです(WordPress の高速化を目論んでですが、現状WordPress 本体はともかくプラグインはようやくPHP7.0対応が増えてきた感じで現在も完全対応ではありません)。
参考記事の頃はPHPのバージョン5.6の時期で、何もエラーは起こらなかったのですがPHP7.0にしたところエラーが出始めた、というのが対応後での見解です。
まず出たエラーは3点。
PHP Warning: file(list.txt): failed to open stream: No such file or directory in /home/ユーザ名/ドメイン名/public_html/twitterbot/twitter_bot.php on line 7 PHP Warning: shuffle() expects parameter 1 to be array, boolean given in /home/ユーザ名/ドメイン名/public_html/twitterbot/twitter_bot.php on line 8 PHP Notice: Undefined variable: message in /home/ユーザ名/ドメイン名/public_html/twitterbot/twitter_bot.php on line 13
修正前(twitter_bot.php)
<!--?php require_once('twitteroauth/autoload.php'); require_once('twitteroauth/src/TwitterOAuth.php'); require_once(dirname(__FILE__) . '/config.php'); use Abraham\TwitterOAuth\TwitterOAuth; // ファイルの行をランダムに抽出 $filelist = file('list.txt'); if( shuffle($filelist) ){ $message = $filelist[0]; } // つぶやく $connection = new TwitterOAuth(consumer_key, consumer_secret, access_token, access_token_secret); $request = $connection--->post("statuses/update", array("status"=> $message )); ?>
修正後(twitter_bot.php)
<!--?php require_once('twitteroauth/autoload.php'); require_once('twitteroauth/src/TwitterOAuth.php'); require_once(dirname(__FILE__) . '/config.php'); use Abraham\TwitterOAuth\TwitterOAuth; // ファイルの行をランダムに抽出 $filelist = file(dirname(__FILE__) . '/list.txt'); if( shuffle($filelist) ){ $message = $filelist[0]; } // つぶやく $connection = new TwitterOAuth(consumer_key, consumer_secret, access_token, access_token_secret); $request = $connection--->post("statuses/update", array("status"=> $message )); ?>
修正点は、7行目のヒルのお言葉リストであるlist.txt への絶対パスの追加です。
list.txt がオープンできない、どこにあるかディレクトリがわからない、さらにそのlist.txt 内のデータ(ここではmassage)を受け取れない状態になっていたようです。
アプリを動かす場合は、Twitter App を登録してアクセストークンを取得する必要があります。
Twitter App の登録とアクセストークンの取得については上記の参考記事をご確認ください。
取得したアクセストークンを、用意したPHPファイル(config.php)に入力してください。
<!--?php define("consumer_key", "コピーした consumer_key"); define('consumer_secret', 'コピーした consumer_secret'); define('access_token', 'コピーした access_token'); define('access_token_secret', 'コピーした access_token_secret'); ?-->
きちんと呟けているかローカルホストでtwitter_bot.php にアクセスします。
Twitterアカウント(ヒルbot)のツイートに反映されているか確認してみてください。
ちなみにローカルホストのアドレス内には何も表示がで出ません。
Cron設定がPHP5.6バージョンのままだった
PHPのバージョンが7.0なのにCron設定ではPHP5.6になったままになっていたため、自動でツイートするためのCron設定をPHP5.6からPHP7.0に変更しました。
サーバーパネルにユーザIDとパスワードを入力してログインします。
サーバーパネルにアクセスしたら「Cron設定」をクリックします。
すでにCron設定済みなので、CRONの一覧から設定済1から「変更」ボタンをクリックします。
『コマンド』を見ると以下のようになっています。
/usr/bin/php5.6 /home/ユーザ名/ドメイン名/public_html/twitterbot/twitter_bot.php
これをphp7.0 に変更します。
/usr/bin/php7.0 /home/ユーザ名/ドメイン名/public_html/twitterbot/twitter_bot.php
コマンドパスは、「サーバー情報」>「コマンドパス一覧」で確認することができます。
またコマンドの書き方については、エックスサーバーのマニュアル「サーバープログラムについて」>「Cron設定」を参照してください。
修正が終わったら、編集を終了するか聞いてきます。良かったら「CRONの編集」をクリックします。
「Cron設定」の「CRONの一覧」で修正されていることを確認しましょう。
広告
まとめ
実は、昨日(正確には今日の深夜)まで原因がわからなく、もうbotサービスを借りようかな…と病院へ通院中でも買い物中でも帰宅中でも考えていました。
別のbotライブラリを発見したのですが起動させるbot.php 部分、つまりPHPのプログラムができる人間向けでノンプログラマーの自分にとっては敷居が高い。
実はエックスサーバーのCron設定には、常にプログラムがエラーを発見すると報告するように設定されています。
デフォルトのままだとFTPのMaildirフォルダにMaildir3フォルダまで蓄積されて、いっぱいになると古いファイルから消去されていきます。
newフォルダの中を見てみると、昨日の2017/07/21 22:10:01 でエラー情報がストップしていました。
これは…もしや…と思い、ヒルbotアカウントを見ると無事更新されているのを確認できました。
いろいろ検索をかけて原因を探ってたどり着いたのが絶対パスへの追加、でした。盲点と言えば盲点なのかもしれません。
最初から書いていれば…という気持ちは否めませんが、オリジナルソースを作った方々がそう設定せずとも動くと想定してプログラムしていたのだと判断しました。
急場しのぎの修正で今後これで稼働し続けるのかわからないのですが、本格的にプログラムを勉強しないといけないなぁと思いました。
2020年05月01日追記:PHP7.3でも現状問題なくbotは稼働しています。併せてCron設定も7.3に変更しています。
広告