botの運用時ときどき発生する不具合

さくらのvpsではサーバ情報が/var/spool/mail/rootに送信されるように初期設定されているので定期的に肥大したメールを削除する必要がある。

cloudpack.media

 

 今までに発生した不具合の原因

  • rtedTweets.jsonやtargetTweets.jsonなどが壊れてしまい、読み込み時エラーを起こして停止してしまう
  • authトークンがexpireした?
    tweepy.error.TweepError: [{'code': 89, 'message': 'Invalid or expired token.'}]
    新規にトークンを作り直し置き換えることで解決した(本来は同じアプリケーションで再生成するべきだったかもしれない)

絵師さんの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の配列(最新のものから並んでいる)について条件分岐
  1. 既読履歴を参照し、今回自分のTLから新規で追加したTweetか否か
  2. 生存期間1時間未満か否か
  3. 生存期間1時間以上か否か
  • それぞれに関して情報の更新と閾値と比較しての判定を行なう
  1. 情報の更新はなし、甘めの閾値で判定
  2. 甘めの閾値を超えているか判定、超えていない場合は情報を更新し再び判定
  3. 閾値超えているか判定、超えていない場合は情報を更新し再び判定。
  • 判定を通過したものはRTし、配列および辞書から除去
  • 3に関しては判定を通過しなかった場合、生存期間が1日を超えていれば除去
  • RT回数が5回に達するか、情報の更新回数が44回に達した時点でループから離脱
  • 当該Tweetが消えていた場合、既に自分がRT済だった場合、ユーザーからブロックされていた場合、ユーザーがプライベートになった場合、などはTweepyがエラーを吐くので例外として処理
  • 例外発生時は当該IDを配列から除去し、紐付いている辞書要素も除去
  • 1と2の間でTweetの配列をランダムにシャッフルすることで延々と同じ情報を更新する状態を回避

5.終了処理

  • シャッフルした絵付きTweetの配列をソート
  • 4で情報の更新および一部の除去が完了した配列および辞書を絵付きTweetリスト.jsonに保存
  • APIリミットを取得
  • ログファイルの書込

 

API制限

  • home_timeline 15 / 15min
  • user_timeline 180 / 15min
  • RT(update_status)  30 / 15min
  • home_timeline および user_timeline はともに過去への遡及は最大3200Tweetまで

 

他のものもあるが、そちらはあまり問題にならない。

 

 

絵師さんのTweetをRTするbotについて(5) - フィルタリングと個別TL掘削

ノイズ除去の方法

実装済の機能は以下のとおり。

  • フォローしているユーザーがRTしたものは除去する
  • RT数とふぁぼ数で閾値を設け、閾値に達しないものは保留扱いとする。保留扱いのTweetは次のbot実行時にシャッフルして再度評価し直す。

これでずいぶんノイズは除去されたと思われる。

 

ユーザー個別のTLの掘削

実装済の機能は以下のとおり。

  • フォローしているユーザーそれぞれについて最新既読Tweetと探索回数を割り振る(デフォルトはどちらも0)
  •  探索回数の少ないユーザーからTLを最新既読Tweetまで取得可能なだけ取得する(最大3200件)
  • 通常通りのアルゴリズムで画像付きTweetをRT候補リストに追加する

この機能はAPI制限の関係で一度のループでかなり人数をしぼる必要がある。

 

さくらVPSを借りてpython baseのTwitter botを起動するまで(2)

前回環境構築は完了したので、Twitter botを起動するところまでやってみる。

  • 各種テストコードを試しさくらVPS上の環境でのpython等の動作を確認する
  • botの絶対参照部分の修正を行いbotの動作を確認する
  • cronのテストを行なってcronの動作を確認する
  • 低頻度でcronおよびbotの動作を確認する
  • サービス開始

 

テストコードを試す

Tweepyを利用してAPILimitのStatusを取得、それをファイルに書き込むというコードがすでにあったのでそれをテストコードとして利用する。動作が正常だったことを確認した。

  • pythonそれ自体の動作の確認
  • tweepyでのTwitterAPIの操作の確認
  • ファイル入出力時の参照の確認
  • 出力したファイルの文字コードの確認

が確認できた。

 

botの絶対参照部分の変更、および動作を確認する

botのコード中でファイル入出力を行なう部分で、Win機上で開発を行っているとき、ファイルパスを絶対参照で与えていた。それをサーバー上での動作用に変更する。本当はこういう変更はすべて排除した方がいいのでこれを機に同じフォルダに存在することを前提とした相対参照に変更した。

botの動作は確認できた。

 

cronの動作確認を行なう

$ crontab -e

でお手軽編集。

1 * * * * date > "hoge.txt"

でホームディレクトリから実行されていることを確認。

参考にしたのは以下のブログ

qiita.com

 

pythonが2.6で実行されてしまうので少しハマったが、要するにcronで実行する際にシンボリックリンクが適用されていないようだった。ここはやはり調べる必要があるかもしれない。とりあえず絶対参照でpythonを指定してやることで解決。apilimitを取得するpyを走らせて確認したのちにbotも動作することを確認。

参考にしたのは以下のブログ

qiita.com

www.server-memo.net

 

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を借りた

vps.sakura.ad.jp

月額658円の512プランを借りる。登録は簡単、1時間もかからなかった。

初回起動時はさくらのコンソールから行った。

最初はなにやらパッケージをインストールしていたようでさくらのコンソールがしばらくうんともすんとも言わなくなったが、何度か再起動してみたら動いた。もしかしたら何かのインストールに失敗したのかもしれないが、今のところ特に問題は生じていない。

 

VPSの初期設定をした

plusblog.jp

上記のブログを参考にしながらおこなった。

ターミナルはPuTTYを使った。

公開鍵認証には以下のサイトも参考にした。

PuTTY で鍵交換方式による SSH 接続

9以降は今のところ使う予定がないのでやっていない。

 

WinSCPを導入した

plusblog.jp

そういえばファイルをアップロードする必要があるな、と思ったので

上記のブログで一瞬だけ言及されていたWinSCPを導入した。とても簡単。

 

Python3.5.2を導入した

hqac.hatenadiary.com

このブログを参考に3.5.2をインストールした。

 

www.python.org

基本的にはブログに書かれてあるとおりのことを行っている。

シンボリックリンクの貼り替えの部分だけ、python3.5を参照しないといけなかった。lsで確認しながら行なうとよい。

python3.5の起動を確認した。

シンボリックリンクでpython3.5にリダイレクトしているのだけれど、sudo後にrootから

$ python

するとバージョンが2.6.6のままだということを確認した。通常ユーザーからだと問題ない。rootユーザーにはシンボリックリンクが適用されないのだろうか?

 

tweepyを導入した

再びここを参考にする。

statsbeginner.hatenablog.com

$ 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リストに追加する。