さくらのレンタルサーバをつかってRubyで書いたtwitterのbotを動かす

自分のマシンは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)

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

Rubyでgem 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押すといいそうです