botの運用時ときどき発生する不具合
絵師さんのTweetをRTするbotについて(6) - さらなる改良に向けて
botを稼働させてみて、いくつか追加したい機能、変更した方がいいなと思う仕様、やりたいことについて
- Twitter APIを叩いている処理のすべてに例外処理をつける
-> 7/30 Done. - 最新のTweet、同日中のTweetのRTを優先させる
-> 7/30 再評価/RT時にシャッフルする仕様を停止、現在は経過観察期間
-> 7/31 シャッフルを復活させて経過観察期間 - 新しいTweetをRTする場合にはAPI制限いっぱいまでRTする
-> 7/31 リミットの仕様が完全に把握できていないので頭の悪い仕様で実装 - RTしたTweetのIDは削除されていた仕様を別のログファイルに記録していくように変更する
-> 7/30 Done. - cronのログとして標準出力の内容がメールに保存されているものをgmailに転送する
- RTの判断を行なうロジックにユーザーのフォロワー数をパラメータとして取り込む
絵師さんのTweetをRTするbotについて(6) - ベータ版
ファイル構成
実行コード.py
既読履歴.json
フォロー一覧.json
絵付きTweetリスト.json
ログ.json
仕様
1.フォロー一覧の更新
- フォロー一覧.jsonを読込
- 現在の自分のフォローと対照して更新
- 上書保存
2.最新のTLから絵付きTweetリストを抽出
- 既読履歴.jsonを読込
- 最新既読のTweetまで最大1000件のRT以外のTweetを自分のタイムラインから取得しながら
- 絵付きTweetであり、かつ、自分がRT済でないもののリストを抽出
- IDの配列とIDに紐付いたRT数、ふぁぼ数、生起時間の辞書を作成
- 既読履歴.jsonを更新して上書保存
- 絵付きTweetリスト.jsonから古いIDの配列とその他の情報の辞書を読込
- たった今抽出した配列および辞書に追加、重複を除去
3.フォローしているユーザーのTLから絵付きTweetリストを抽出
- フォロー一覧.jsonを読込
- 既探索回数が少ないものから適当なユーザーを選択
- 最新既読のTweetまで最大3200件のRT以外のTweetを取得
- 生存期間が1日未満のものについては、絵付きTweetであり、かつ、自分がRT済でないものを抽出、生存期間が1日以上のものについては、さらに、RT数とふぁぼ数が閾値を超えたものについてリストを抽出
- IDの配列とIDに紐付いたRT数、ふぁぼ数、生起時間の辞書を作成
- 2.で更新した配列および辞書に追加、重複を除去
4.絵付きTweetリストから閾値を超えたものをRT
- 降順に並んだTweetの配列(最新のものから並んでいる)について条件分岐
- 既読履歴を参照し、今回自分のTLから新規で追加したTweetか否か
- 生存期間1時間未満か否か
- 生存期間1時間以上か否か
- それぞれに関して情報の更新と閾値と比較しての判定を行なう
- 判定を通過したものはRTし、配列および辞書から除去
- 3に関しては判定を通過しなかった場合、生存期間が1日を超えていれば除去
- RT回数が5回に達するか、情報の更新回数が44回に達した時点でループから離脱
- 当該Tweetが消えていた場合、既に自分がRT済だった場合、ユーザーからブロックされていた場合、ユーザーがプライベートになった場合、などはTweepyがエラーを吐くので例外として処理
- 例外発生時は当該IDを配列から除去し、紐付いている辞書要素も除去
- 1と2の間でTweetの配列をランダムにシャッフルすることで延々と同じ情報を更新する状態を回避
5.終了処理
API制限
- home_timeline 15 / 15min
- user_timeline 180 / 15min
- RT(update_status) 30 / 15min
- home_timeline および user_timeline はともに過去への遡及は最大3200Tweetまで
他のものもあるが、そちらはあまり問題にならない。
さくらVPSを借りてpython baseのTwitter botを起動するまで(2)
前回環境構築は完了したので、Twitter botを起動するところまでやってみる。
- 各種テストコードを試しさくらVPS上の環境でのpython等の動作を確認する
- botの絶対参照部分の修正を行いbotの動作を確認する
- cronのテストを行なってcronの動作を確認する
- 低頻度でcronおよびbotの動作を確認する
- サービス開始
テストコードを試す
Tweepyを利用してAPILimitのStatusを取得、それをファイルに書き込むというコードがすでにあったのでそれをテストコードとして利用する。動作が正常だったことを確認した。
が確認できた。
botの絶対参照部分の変更、および動作を確認する
botのコード中でファイル入出力を行なう部分で、Win機上で開発を行っているとき、ファイルパスを絶対参照で与えていた。それをサーバー上での動作用に変更する。本当はこういう変更はすべて排除した方がいいのでこれを機に同じフォルダに存在することを前提とした相対参照に変更した。
botの動作は確認できた。
cronの動作確認を行なう
$ crontab -e
でお手軽編集。
1 * * * * date > "hoge.txt"
でホームディレクトリから実行されていることを確認。
参考にしたのは以下のブログ
pythonが2.6で実行されてしまうので少しハマったが、要するにcronで実行する際にシンボリックリンクが適用されていないようだった。ここはやはり調べる必要があるかもしれない。とりあえず絶対参照でpythonを指定してやることで解決。apilimitを取得するpyを走らせて確認したのちにbotも動作することを確認。
参考にしたのは以下のブログ
cron上でのbotの動作の確認
RTする画像について飯画像やゲームのスクリーンショットなどが多く入っていて精度が低いので、現在はRTする箇所だけ止めた形で(TL中の画像付きTweetを拾うだけにして)cronで回してみる。
さくらVPSを借りてpython baseのTwitter botを起動するまで(1)
python3.5 + tweepy3.5.0 + cron 環境でbotを回したい…ということでサーバーを借りることにした。特にサーバーをいじった経験がないので、ちょこちょこぐぐってみて他の人のブログ記事が豊富なさくらインターネットにしてみることにした。無料期間が2週間ついてくるのでその間に少なくともbotを起動するまでは持っていけるだろうという魂胆もあった。
レンタルサーバーでも大丈夫なのではないか?という雰囲気もあったのだが、VPSの方がむしろ綺麗な環境なのではないかということもありVPSで挑戦してみた。別に後でレンタルサーバーでも大丈夫っぽいことを知ったが後の祭りだったというわけじゃないんだよ。ほんとだよ。
さくらインターネットのVPSを借りた
月額658円の512プランを借りる。登録は簡単、1時間もかからなかった。
初回起動時はさくらのコンソールから行った。
最初はなにやらパッケージをインストールしていたようでさくらのコンソールがしばらくうんともすんとも言わなくなったが、何度か再起動してみたら動いた。もしかしたら何かのインストールに失敗したのかもしれないが、今のところ特に問題は生じていない。
VPSの初期設定をした
上記のブログを参考にしながらおこなった。
ターミナルはPuTTYを使った。
公開鍵認証には以下のサイトも参考にした。
9以降は今のところ使う予定がないのでやっていない。
WinSCPを導入した
そういえばファイルをアップロードする必要があるな、と思ったので
上記のブログで一瞬だけ言及されていたWinSCPを導入した。とても簡単。
Python3.5.2を導入した
このブログを参考に3.5.2をインストールした。
基本的にはブログに書かれてあるとおりのことを行っている。
シンボリックリンクの貼り替えの部分だけ、python3.5を参照しないといけなかった。lsで確認しながら行なうとよい。
python3.5の起動を確認した。
シンボリックリンクでpython3.5にリダイレクトしているのだけれど、sudo後にrootから
$ python
するとバージョンが2.6.6のままだということを確認した。通常ユーザーからだと問題ない。rootユーザーにはシンボリックリンクが適用されないのだろうか?
tweepyを導入した
再びここを参考にする。
$ sudo -s
$ /usr/local/python/bin/pip3.5 install tweepy
でインストール完了。
cronはインストール済だった
まとめ
以上の作業で環境構築は終了したと思われる。
次は
- 各種テストコードを試しさくらVPS上の環境でのpython等の動作を確認する
- botの絶対参照部分の修正を行いbotの動作を確認する
- cronのテストを行なってcronの動作を確認する
- 低頻度でcronおよびbotの動作を確認する
- サービス開始
という順序で進めていきたいと思う。
絵師さんのTweetをRTするbotについて(4) - 6時間程度のテスト実行後の課題
RT対象となるTweetの数
自分のタイムラインにはフォローしているユーザーのTweetおよびそのユーザーがRTしたTweetが流れてくる。RTされたTweetを除去している現在の環境では、500名程度のフォローでは休日昼間の巡航運転時(画像付きTweetの投稿はかなり多めと思われる)画像付きTweetの流入数は流出数を下回る。フォロー数の増加、およびユーザーのタイムラインを掘ることで画像付きTweetの流入を増やすことが今後の課題。
ノイズ除去
ユーザー自らが投稿した画像付きTweetの中にもノイズがかなり見られる。多く見られるものでできれば除去したいものとしては以下のものがある。
- 食事や動物・風景などの写真
- ゲームなどのスクリーンショット
人によって多いもので、きわどいものには以下のものがある。
- 宣伝用の商品の写真やスクリーンショットのうち機械的に繰り返し投稿されているもの
これらを除去するために現在利用可能な指標を用いたスクリーニングが簡単に思いつく。たとえばファボ数やRT数を見て、閾値に達していない場合は即座にRT対象のTweetリストに追加するのではなく、スクリーニング落ちリストに追加する。後にスクリーニング落ちリストの再評価を行い、閾値を超えたものは改めてRT対象のTweetリストに追加する。