Heroku Twitter Botをつくりなおしてみる-Win編

先月、Twitter Botをがんばってました。

Twitter Botをつくってみる-Win編 - プログラミングお勉強記録
Twitter Botをつくってみる-Mac編 - プログラミングお勉強記録

Herokuのアドオンcronをつかって、
1日1回動くBotです。

3日ほど正常に動いていたようですが、
その後タイムラインに出てこない状態です。

Herokuのログ上では動いているようなので、
Twitter側でひっかかっているのかなぁ、、などとぼんやり思っていたのですが、
こういうときどういう手順でテストをしたらいいのかわからず、、

Twitterの認証(確認)

(数日動いていたわけで、それからなにもいじってないんだから認証のところが、、ってことはないと思ったんだけど)

Rubyでつぶやけたので、認証のところは大丈夫。


…もういっかい最初からやってみましょうか。
以前のエントリと重複するところもありますが、
修正したところなども交えてもう一度まとめます。
Winです。
1日1回「bonjour!」とつぶやくのでアプリ名は「bonjour」です。
なのでフォルダとかも「bonjour」になってます。

もちろんソースは
http://d.hatena.ne.jp/ruedap/20110209/ruby_heroku_twitter_bot
こちらをもとに、Winでbonjourな手順をメモしておきます。

準備

1.gemをインストール

$ gem install heroku sinatra bundler get-twitter-oauth-token --no-rdoc --no-ri


2.Git Bash
bonjourフォルダをつくって準備。

$ mkdir bonjour
$ cd bonjour
$ git init

※この時点で、bonjourフォルダのなかには「.git」というフォルダ1つ。かすれたアイコンの。


3.Twitter認証の確認
こちらであれこれ確認します。
Twitter Developer Platform — Twitter Developers

Read and writeになってるかとか。
Consumer key
Consumer secret
Access token
Access token secret


4.トークン取得
Winだと文字化けするけど、コピペできなくてつらいけど、がんばる。

$ get-twitter-oauth-token

こんなふうに文字化けします。(Consumer keyなどは塗りつぶしています)

[0mというところのあとに、必要なキー(Consumer keyとConsumer secret)を貼りつけていくと、
URLが表示されます。
Macとかだと勝手にこのURLがひらくそうですが、Winでは開きません。
しかもプロンプトからコピーできないので、手入力…
と思ったら、コピーする方法を知らないだけでしたorz
コマンドプロンプト内のコピーはできないのでしょうか? - winXPを... - Yahoo!知恵袋

で、「許可する」を選ぶとPINを教えてくれるので、それをプロンプトに貼りつけると、
TokenとSecretを教えてくれるので、これをコピーしておきます。


5.ファイルを4つつくる。
全部UTF-8で書くこと。

・ひとつめ Bundler用「Gemfile」

source :rubygems
gem 'sinatra'
gem 'twitter'

拡張子ないので注意。
Winでは保存したフォルダをひらいて、
「ツール」>「フォルダオプション」>「表示」>「登録されている拡張子は表示しない」のチェックマークをはずして、
拡張子を消します。

・ふたつめ Rack用「config.ru」
おなじディレクトリ内にあるファイルをrequireするときは、ファイル名の前に「./」をいれる。(Ruby1.9以降)

require './app.rb'
run Sinatra::Application

・みっつめ Sinatra用「app.rb」
おなじディレクトリ内にあるファイルをrequireするときは、ファイル名の前に(ry

require 'rubygems'
require 'sinatra'
require './tweet.rb'

get '/' do
  'under construction'
end

get '/random_tweet' do
  Tweet.new.random_tweet  # 動作チェックが終わったらコメントアウトすること
end

・よっつめ 実際につぶやく内容や認証用「tweet.rb」
ソースファイルに日本語を含む時にいれる宣言が1行目。
あと実際につぶやく言葉を単純な配列で書きなおしています。

# -*- coding: utf-8 -*-

require 'rubygems'
require 'twitter'

class Tweet

  def initialize
    @text = [
    "bonjour!",  #ここで31個作成すること!!
    "いまなんじ?",
    "おやつはなにかな?",
    "ぽえーん",
    "さば?"
    ]


    Twitter.configure do |config|
      config.consumer_key       = 'Consumer keyを挿入する'
      config.consumer_secret    = 'Consumer secretを挿入する'
      config.oauth_token        = 'Tokenを挿入する'
      config.oauth_token_secret = 'Secretを挿入する'
    end
  end

  def random_tweet
    tweet = @text[rand(@text.length)]
    update(tweet)
  end

  def daily_tweet
    tweet = @text[Time.now.day - 1]
    update(tweet)
  end

  private
  def update(tweet)
    return nil unless tweet

    begin
      Twitter.update(tweet.chomp)
    rescue => ex
      nil # todo
    end
  end

end


6.最後にもういっこインストール

$ bundle install

これをすると、フォルダのなかに「Gemfile.lock」というのがつくられます。

フォルダのなかは、「1フォルダ、5ファイル」

公開(テスト)

Heroku上にWebアプリを作成、、はすでに済んでいます。

Git Bashをひらいて、

$ git add .
$ git commit -m 'first commit!'

あの、、「git」のなとにはひとつスペース空いてます!
あと、そのあとは

$ git push heroku master

てやるとエラーになります。

fatal: 'heroku' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

て。下記に書き換えればOK

$git remote add heroku git@heroku.com:bonjour.git
$git push heroku master

エラーメッセージ。

Permission denied (publickey).
fatal: The remote end hung up unexpectedly

SSHてやつですか。そういえば前回もここで苦戦した記憶。

$heroku keys:add

これでSSH鍵がアップロードされたみたい。

あらためてpushしてみましたが、エラー。。

$ git push heroku master

 !  Invalid path.
 !  Syntax is: git@heroku.com:<app>.git where <app> is your app's name.

fatal: The remote end hung up unexpectedly


もういっかいプッシュしてみようと思ったら、今度はこんなエラーメッセージ

$ git push heroku master
To git@heroku.com:bonjour.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@heroku.com:bonjour.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

むむむ…

http://d.hatena.ne.jp/nayuko22/20120120
こちらにあったコマンドを試してみたら、
プッシュできた!!!!

$ git push heroku master --force

確認(テスト)

http://アプリ名.heroku.com/random_tweet
にアクセスして、「英数字がいっぱい表示」されると成功らしいのだけど、、、表示されない(´・ω・`)

けどタイムラインをみるとつぶやけています!
(やたー!)

公開(自動化)

テスト用に書いていたところをコメントアウトします。
「app.rb」ファイルのこの部分です。

get '/random_tweet' do
#  Tweet.new.random_tweet  # 動作チェックが終わったらコメントアウトすること
end

そしたら自動ツイート機能を追加しましょう。
Rakefile」をつくります。
拡張子ないので注意。
requireするとき気をつける。

require './tweet.rb'

task :cron do
  Tweet.new.daily_tweet
end

※これで、1フォルダ、6ファイルになりました。

$ git add .
$ git commit -m 'complete!'
$ git remote add heroku git@heroku.com:bonjour.git
$ git push heroku master


ふぅ…
これで明日、動くといいなー!!


メモ

Procfileてなんだ…?
作業メモ - /var/log/messages

くやしい…わからない…
今日のところはここで終了。。