twitter bot開発で詰まったところメモ

最近@bell_repeat というtwitter botをつくったときに
やったことや躓いたところを簡単にメモ。

Rubyのインストールし直し

さくらのレンタルサーバに入れてるRubyが2.0.0だかそこらの古めのバージョンだったので
2.1.6までアップデート。
最新の安定版は2.2.2だったのだけれど すこし開発に急いでいたので
「最新版だと動かないよ〜」とかあると嫌だなあとおもって1つ前の安定版にしてみた。
参考:

さくらインターネットのスタンダードプランにRuby 2.1.5を自前でインストールしてみた | 極上の人生
http://kawairi.jp/weblog/vita/2014123118992

デフォルトのシェルをbashにした

上の記事で書いてるとおりにbashに変えた。
特にこだわりは無いのだけれど手元もたぶんbashだし
学校とかで触ったことあるのもbashだったはずだし。

SSHログインするたびに一回 $ source $HOME/.bashrc ってやらないと
環境変数とかの設定を読んでくれないっぽい?ので忘れないようにしたい・・・

botを動かそうとしたら「SSLがなんとか」みたいなエラーでコケた

書いたコードをサーバーに移して動かそうとしたら、SSLの認証ができなかったぜみたいな
エラーが出てしまった。
参考にしたのは以下の記事

RubyHTTPS 接続するときの証明書で悩んだ話 - てっく煮ブログ
http://tech.nitoyon.com/ja/blog/2014/05/30/ruby-https-cert/

SSL証明書はここにあるはずだ〜っていう位置に何もないせいで、証明書がみつからなくてコケたらしい。
記事を参考に証明書をサーバーに置いて、それからその証明書の位置を知らせるために

export SSL_CERT_FILE=(証明書のファイルまでのパス)

を .bashrc に追記した。

csvが読めなかった

UTF-8で保存したのにASCIIなんとかで読もうとして、読めないよ〜っていうエラーが出て困った。
参考:

Japanese user list of the Ruby programming language ()
http://comments.gmane.org/gmane.comp.lang.ruby.japanese/7079

encodingを明示的に書かないといけないとのこと。

cronの環境変数

cronとかcrontabというやつ、定期的にコマンドを実行してくれるあれは、
.bashrcとかに書いた環境変数を読み込んでくれないみたい。
なのでcrontabの冒頭に、必要な環境変数は書いておいてあげる必要がある。

cron力をつけよう!全てのcrontab入門者に贈る9個のテクニック · DQNEO起業日記
http://dqn.sakusakutto.jp/2012/06/cron_crontab9.html

ここに書かれているように、
"※ LOG_DIR="$HOME/logs" のように右辺で変数を使うことは残念ながらできません"ので、.bashrcから書き写すときに $HOME になってるところはもとの値で書き起こす必要がある。
たぶん本当は必要な環境変数だけ書くべきなのだろうけど、ぶっちゃけどれが必要か判ってないため .bashrcに書いてるものは全部書き写してある。
今回はそんなに数がないからまるごと移せたけど、すごくたくさん設定してあるような環境でそれをやるわけにもいかないだろうなー

cronの実行結果

もともとさくらサーバでは別のbotを動かしている状態だったのだけど、そのコードがあんまり良くなかったせいか、実行すると警告が出る状態だった。
cronの実行結果、エラーなどの出力はメールで飛んでくるようになっていたのだけど、放置していたせいでメールボックスが87万件とかになっていてメールボックスが開けない状態になってしまっていた。
このままでは新たに今回作成したbotのログが見られないので、上の記事をまた参考にして、テキストファイルにログが吐かれるようにしてある。

cron実行時のカレントディレクト

cronで実行されるとき、カレントディレクトリがどこになってるかってよくわからない。
昔書いた記事ではフルパスを取得して作って・・・みたいなことをやっているのだけど、そんなことしなくても
crontabのほうに

cd (カレントディレクトリにしたいところの絶対パス) ; (実行するコマンド)

って書いてしまえば済む話だった。早い。

macSSHログイン

昔書いた記事windowsで開発してたときだったし、バージョンが古くてあまり参考にならない。
macではSSHログインしたいときは、ターミナルで

$ ssh [さくらサーバのユーザー名]@[さくらサーバのユーザー名].sakura.ne.jp

って打って、パスワード入れれば、それだけでオッケー。便利。

gemのnokogiriをインストールするときに困った

botで、webページを読んで投稿日時や記事タイトル等を取得する必要があり、
nokogiriというgemを利用した。
インストールのために

$ gem install nokogiri

をサーバー上で実行したら、

Fetching: mini_portile-0.6.2.gem (100%)
Fetching: nokogiri-1.6.6.2.gem (100%)
Building native extensions. This could take a while...
ERROR: Error installing nokogiri:
ERROR: Failed to build gem native extension.

/(パス)/ruby extconf.rb
checking if the C compiler accepts ... yes
Building nokogiri using packaged libraries.
checking for gzdopen() in -lz... yes
checking for iconv using --with-opt-* flags... no
checking for iconv... no

        • -

libiconv is missing. Please locate mkmf.log to investigate how it is failing.

(以下省略)

のようなエラーがでてインストールできなかった。

代わりにこんなコマンドを使って入れました。

$ NOKOGIRI_USE_SYSTEM_LIBRARIES=1 gem install nokogiri --no-rdoc --no-ri

参考にしたのは以下の記事。

さくらインターネットのスタンダードプランにRails をインストールしようとしたらnokogiri が使うライブラリのチェックで怒られた件 | 極上の人生
http://kawairi.jp/weblog/vita/2015010319009

twitterのメモ

・client.retweetはツイートのidをわたすだけでよいんだって、便利
・user_timelineであるアカウントの投稿を全部取得するというのをやったのだけど、
そのアカウントのツイート数より、取得できたツイートが10個少ないということが起こった。
RTも含めて取得したのだけど・・・いまのところ原因不明。


おわり。たくさん躓いた。