Hatena::ブログ(Diary)

aranagy RSSフィード

2015-08-02

[] 3D小説『bell』再放送botの説明書

概要

3D小説『bell』再放送bot(@bell_repeat) は、
bellの物語を再体験することを目的としてつくられた、非公式のtwitter botです。
2014年の第1部・第2部連載時と、同じ日付・同じ時刻に動作します。

作成: aranagi (@arng_sol)
問題や要望等は@arng_sol宛にお問い合わせください。

くわしい機能

1. 3D小説『bell』本編URLツイートします

ブロマガ(http://ch.nicovideo.jp/3d_bell/blomaga)の各記事の投稿日時を参照し、同じ日時になると記事URLを投稿します。

2. 少年(@3d_bell)のツイートRTします

少年ことベルくんのアカウントツイートを、投稿されたときと同じ日時になるとRTします。
RT対象には、「このアカウントRTした他の方のツイート」も含みます。
ただし、ベルくんによる本編URLツイート、正確には
「投稿のsourceがIFTTTになっているツイート」はRTしません。

3.「愛媛の愛情100%」の記事URLツイートします

第1部の途中で登場するブログ愛媛の愛情100%」の各記事の投稿日時を参照し、同じ日時になると記事URLを投稿します。

4.たすけて!(@4koma_memories)のツイートRTします

第1部の途中で登場するtwitterアカウント @4koma_memories のツイートを、投稿されたときと同じ日時になるとRTします。
RT対象には、「このアカウントRTした他の方のツイート」も含みます。

その他

"ゲブラーの力"こと Rubyで作ってます。
動作中に第3部が始まった場合は、ハッシュタグ検索の邪魔にならないよう、
動作を停止させるつもりです。
まだ勉強中な部分もあるため、意図しない動作をする可能性がありますがご了承ください。

[] 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も含めて取得したのだけど・・・いまのところ原因不明。


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

2013-03-22

[] さくらレンタルサーバをつかってRubyで書いたtwitterbotを動かす

自分のマシンはwindows7

1.ローカルにRubyの環境を作る

RailsInstallerにおまかせ。

2.ローカルにライブラリインストールする

Rubyではgemというかたちでライブラリが用意されているらしい。

RubyでTwitterBotを作ってみた(5 STEP) - himajin315の記録
http://d.hatena.ne.jp/himajin315/20120616/1339849875

こちらのSTEP4に従った。

gem install twitter
gem install userstream

を実行して待ってただけ。

3.レンタルサーバにもライブラリインストールする

さくらレンタルサーバにはRubyがもともとインストールされているが、必要なgemは自分で入れないといけない。

さくらレンタルサーバーRubyGemsインストールする手順 - Google App Engine+Pythonで脱プログラミング初心者を目指す日記
http://d.hatena.ne.jp/ishimarum/20080929/1222689905

こちらに従った。

SSHログインにはTeraTermを使った。
自分がログインしたときの設定は

ホスト: [ユーザ名].sakura.ne.jp
サービス: SSH
TCPポート: 22
SSHバージョン:SSH2
プロトコル:UNSPEC

ログイン押したあとユーザ名とパスワードを聞かれるので入力。

インストール時に権限がないとかで怒られたときはこちらを参考にした。

さくらインターネットのcronでRubyで書いたTwitterBotを動かす - やぶろぐ
http://d.hatena.ne.jp/hellon999/20100807

要は

setenv RB_USER_INSTALL true

を実行してからgem installやるとうまくいく。

4.bot用のtwitterアカウントを作って、そのアカウントで外部アプリの登録をする。

Twitter Developersからbot用のアカウントログインして登録する。
こうすることで認証部分をプログラムでつくらなくてもtokenを得ることができる!

5.コードを書く

こちらのSTEP4の1にある定期post用のコードを引用して編集した。

RubyでTwitterBotを作ってみた(5 STEP) - himajin315の記録
http://d.hatena.ne.jp/himajin315/20120616/1339849875

実行されたら発言をまとめたdatファイルを読み込み、そのなかの1行をランダムに選び1回postする。
ほげほげの部分は4.の登録で得たものを入力しておく。

#coding:utf-8

require 'rubygems'
require 'user_stream'
require 'twitter'

consumer_key = 'ほげほげ'
consumer_secret = 'ほげほげ'
oauth_token = 'ほげほげ'
oauth_token_secret = 'ほげほげ'

UserStream.configure do |config|
 config.consumer_key = consumer_key
 config.consumer_secret = consumer_secret
 config.oauth_token = oauth_token
 config.oauth_token_secret = oauth_token_secret
end

Twitter.configure do |config|
 config.consumer_key = consumer_key
 config.consumer_secret = consumer_secret
 config.oauth_token = oauth_token
 config.oauth_token_secret = oauth_token_secret
end

client = UserStream.client
max = 0

# 発言集post.datを読み込み、行数を調べる
open("/home/[ユーザ名]/www/post.dat",'r:utf-8') {|file|
 while file.gets
  max += 1
 end
}

#発言集からランダムに1行選んでツイートする
rand = rand(max)
open("/home/[ユーザ名]/www/post.dat",'r:utf-8'){ |file|
 Twitter.update(file.readlines[rand])
}


注意点:
・require 'rubygems' が無いと、

in 'require': no such file to load -- user_stream (LoadError)

とか言われて止まる(ローカルではうごいたのに・・・)。
こちらを参考にした。

Rubygem install したのにrequireできない - Coding Edge会議室
http://ap.atmarkit.co.jp/bbs/core/fcoding/24814

・openは、ファイルを読み込んだあとうしろの{}で囲った部分が終わると自動でファイルを閉じてくれる。

・読み込むdatファイルはフルパスで書かないとあとでcronで実行するときファイルがないって言われる。
(cronで実行するときは実行場所がスクリプトのある場所ではないからだと思う)
ここの、「ロードパスにカレントディレクトリを追加する」が参考になりそうだけど今の自分にはわからない。

blogaomu2.1:さくらインターネットレンタルサーバーでcronからRubyプログラムを実行するときに躓いたのでメモ
http://blogaomu21.blog91.fc2.com/blog-entry-175.html

・openに渡している'r:utf-8'は、

invalid byte sequence in Windows-31J (ArgumentError)

とかいう、utf8のファイルをWindows-31Jで開こうとしちゃったエラー(?)を吐かれたのでその対応。
こちらを参考にした。

Rubyエンコーディング - @tmtms のメモ
http://tmtms.hatenablog.com/entry/20120812/ruby_encoding


6.サーバアップロードし、cronで定期的に実行されるようにする

書いたコードをサーバアップロードしたらスクリプトの権限を755に変更(実行権限を与える)。
サーバの管理画面にログインし、「CRONの設定」に進む。
「新規項目の追加」から以下を追加

実行コマンド:/usr/local/bin/ruby /home/[ユーザ名]/www/[うごかしたいスクリプト].rb
実行間隔はお好みで(自分は動作確認がしたかったので5分おきに設定した)

追加した後、下にある環境変数の設定もする。

さくらインターネットのcronでRubyで書いたTwitterBotを動かす - やぶろぐ
http://d.hatena.ne.jp/hellon999/20100807

こちらを参考にした。
つまり

環境変数:
GEM_HOME /home/[ユーザ名]/local/lib/ruby/gem
RUBYLIB /home/[ユーザ名]/local/lib



以上で設定終了。
cronで実行した時のエラーなどは、サーバの管理画面の「メールアドレス毎の設定」からpostmasterのメールボックスを見るとそこに届いている。
現状のコードだとgemのせいで(?)毎回warningを吐かれる。
こちら(http://d.hatena.ne.jp/yoshidaa/20130218/1361152275)と同じ状態なので、もうすこし勉強して、この記事が言っている意味がわかったら対応したい。

あと、環境変数の設定がなぜこうなのか理解できていないので勉強したい。
(なかなか動かなくていろんな記事の設定を試して動いたのがこれだった)
他にもコードをおもいっきり引用しているから理解してない部分があるので勉強する。

ご指摘などありましたらよろしくおねがいします。


おまけ: viでbackspace使っても文字が消せないときはescで入力抜けてからx押すといいそうです