読者です 読者をやめる 読者になる 読者になる

3連休だし,RubyでTwitterBot作ってみる【1日目】

Rubyでまともにコードを書いたことがないので,試しに何か作ってみようと思いTwitterBotを試しに作ってみることにした.その過程をメモ.

1.Twitterの設定
Twitterの設定は10分でできるTwitter Bot @ Rubyを参考にさせて頂いた.

まずは開発者ページにアクセス

Twitterの提供するAPIを使うために,Developer登録を行う.

f:id:alice345:20130713102624j:plain

 

 

My applicationsをクリック

f:id:alice345:20130713105433j:plain

 

Create a new applicationをクリック

f:id:alice345:20130713105653j:plain

 

アプリの情報を入力して,Create your Twitter applicationのボタンを押す

f:id:alice345:20130713110435j:plain

 

これでアプリケーションが作成される.
そしたらConsumer keyとConsumer secretをメモ.

f:id:alice345:20130713111624j:plain

 

アプリ画面のsettingからAplication TypeをRead onlyからRead and Writeに変更

f:id:alice345:20130713113113j:plain

 

2.プロジェクトの準備
では次にプロフェクトの準備.以下はHerokuを使って1日1回名言をツイートするTwitter Botの作り方を参考にさせて頂いた.

必要なGemのインストール.以下のgem installコマンドを実行.

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

Bot用フォルダを作成.
$ mkdir konatu345_bot
$ cd konatu345_bot

またリポジトリの作成
$ git init

TwitterのOAuth認証に必要なトークン取得
get-twitter-oauth-tokenライブラリ使って認証に必要なトークンを取得.ターミナルから以下のコマンドを実行
$ get-twitter-oauth-token
すると先ほどのConsumer keyとConsumer secretを聞かれるのでコピペする
ブラウザが自動で開いて,認証画面が出てくるので認証する.
いつも使っているメインのアカウントで認証しないように気をつける.

f:id:alice345:20130713132438j:plain

 

認証すると,PINが表示されるのでメモる.
ターミナル側ではPIN:となっているので先ほどのコードをコピペ.

f:id:alice345:20130713133709j:plain

 

3.プログラミング
konatu345_botフォルダの中に4つのファイルを作成する
Gemfile,app.rb,config.ru,tweet.rb

まずは一つ目のGemfileを作成.ファイルの中身は以下.

source :rubygems
gem 'sinatra'
gem 'twitter'

二つ目のconfig.ruファイルを作成.ファイルの中身は以下.

require 'app.rb'
run Sinatra::Application

三つ目のapp.rbファイルを作成.ファイルの中身は以下.

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

get '/' do
  'under construction'
end

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

4つ目,Twitterに登校する言葉やロジックを記述するtweet.rbファイルを作成.ファイルの中身は以下.

require 'rubygems'
require 'twitter'

class Tweet

  def initialize
    @text = <<-EOF.split("\n")
私の最高傑作は次回作だ。
映画の目的は笑わせることだ。しかし、そのなかには、二十世紀の世界に通じるシリアスな内容が含まれている。
いつも大人のなかにまぎれこんでしまった子供のような気がする。
孤児院にいたときでも、食べ物を求めて通りをうろつきまわっていたときでも、自分は世界一の俳優だと信じていた。自分自身にたいする揺るぎない自信に身をひたしている必要があった。それがなければ人生に押しつぶされていただろう。
母のパントマイムは私の見たかぎりにおいて、もっともすばらしいものであった。母の所作を見ているうちに、私は感情を手や顔で表現する技術ばかりでなく、人間というものを学びとることができた。
私は悲劇を愛する。悲劇の底にはなにかしら美しいものがあるからこそ悲劇を愛するのだ。
人生は恐れなければ、とても素晴らしいものなんだよ。
世の中には貪欲に知識を求める人間がいる。私もその一人だった。ただし動機から言うと、私のはそれほど純粋ではなかった。知識愛から求めたのではなく、ただ無知な人間にたいする世間の侮蔑から身を護るためにそうしたのだった。そんなわけで、暇さえあれば、古本屋漁りをしていた。
もし虹を探すのなら、下を見ては見つからない。
人生はクローズアップで見れば悲劇。ロングショットで見れば喜劇。
時は偉大な作家だ。つねに完璧な結末を書く。
笑いのない一日は無駄な一日である。
死と同じように避けられないものがある。それは生きることだ。
人生に必要なものは、勇気と想像力とほんの少しのお金だ。
幸福を手にするための戦いは美しいものです。
長い間の経験から、アイデアというものは、それを一心に求めてさえいれば必ずくるということを発見した。たえず求めているうちに、いわば心が想像力を刺激するような出来事を見張る一種の物見やぐらになってしまうのである。
私たちはみんなおたがいに助けあいたいと望んでいます。人間とはそういうものです。私たちは他人の不幸によってではなく、他人の幸福によって生きたいのです。
一人を殺せば殺人者だが、百万人を殺せば英雄だ。殺人は数によって神聖化させられる。
あなた方は機械ではない、人間です。人間を愛する心を持った人間です。憎んではいけません。愛を知らぬ人間、愛されたこともない人間だけが憎むのです。隷属のために戦ってはいけません。自由のために戦ってください。あなた方はこの人生をすばらしいものにする力を持っているのです。
人間には憎悪や不快を忘れさせてしまう性質がある。
大量殺人については、世界はそれを奨励しているのではありませんか。大量殺人という唯一の目的のために、破壊兵器を製造しているのではありませんか。
愛国心というものは、かつて世界に存在した最大の狂気である。愛国心がもてはやされた結果は、また新たな戦争である。
生きて行くことは美しく素晴らしい。クラゲにとってもね。
人生は願望だ、意味じゃない。
僅かな人間が決めた賞なんて、そうたいした名誉ではない。私のほしいものは大衆の喝采だ。大衆が私の仕事を賞賛してくれたならば、それで十分だ。
私は支配したくない。私は人の幸福を願いながら生きたい。貪欲が人類に憎悪をもたらし悲劇と流血をもたらした。思想だけがあって感情がなければ人間性は失われてしまう。
最初から多くのことを成し遂げようとして極端な努力をすると、たちまちのうちに全てを放棄することになる。
失敗は重要ではない。自分自身を馬鹿にするのは勇気がいる。
どうやってアイデアをつかむか? それには、ほとんど発狂一歩手前というほどの忍耐力がいる。苦痛に耐え、長期間にわたって熱中できる能力を身につけねばならぬ。
そうだ人生はすばらしい。何より大切なのは勇気だ、想像力だ。
"You?" "You can see now?" "Yes, I can see now."
EOF

    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

とりあえず参考にさせて頂いているサイトにあるコードをそのままコピペさせてもらった.
ツイートする言葉は31個あり1行あたりが1ツイートに相当する.1日には1行目,2日には2行目がツイートされるようなプログラムになっているとのこと.細かなことは後々書き換えていこうと思うので,現段階ではこのまま使用させて頂く.

次にTwitter認証に必要なキーを挿入する.tweet.rbの41〜46行目に先ほどメモしたキーを入力するところがあるので間違えずに記入する.

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

 

4.Herokuへの登録
これまで制作したものをHerokuに送信して公開する.しかし私はまだHerokuへの登録がまだなので先にそちらから行うことにする.
まずはHerokuのWebページにいって,Sign Upボタンを押す.

f:id:alice345:20130713141114j:plain

 

するとE-mailアドレスフォームがあるので入力.メールが届いたら中のURLをクリック.するとPasswordの設定画面になるのでPasswordを設定してSave.

f:id:alice345:20130713142031j:plain

登録自体はすぐ終わった.

5.公開

Heroku上にWebアプリを新規作成
herokuコマンドを使ってHeroku上にWebアプリを新規作成する.
$ heroku create konatu345_bot
E-mailアドレスとパスワードを求められるので入力.するとこんなエラーが

 !    Heroku client internal error.

 !    Search for help at: https://help.heroku.com

 !    Or report a bug at: https://github.com/heroku/heroku/issues/new

 

    Error:       Unable to verify certificate, please set `Excon.defaults[:ssl_ca_path] = path_to_certs`, `Excon.defaults[:ssl_ca_file] = path_to_file`, or `Excon.defaults[:ssl_verify_peer] = false` (less secure). (Excon::Errors::SocketError)

なんとか解決しようとしてたけど,他にも色んなエラーが出て2時間ほどハマる.
でもなんやかんや最終的に出来たのでその間にやったことをメモ.
結局何がいけなかったのかよくわかってない.

1.Heroku Toolbeltのページからインストーラーをダウンロードして,インストール

2.コマンドを
$ heroku create konatu345_bot から
$ heroku create konatu345bot
に変更.(_はダメってエラーが出たため)

3.SSH鍵の生成.以下のコマンドでGitのGUIを起動後,ヘルプメニューから「SSHキーを表示」を選び,「鍵の生成」ボタンを教えてパスワードを入力.
$ git gui
その後
$heroku keys:add
SSH公開鍵をherokuに登録 

上記のことをやって,再度herokuコマンドを実行すると
$Git remote heroku added
と表示され,正常にWebアプリを作成できた.

続いて,gemの仕様書を整える.konatu345_botフォルダで
$ bundle install
「Your bundle is complete!」と表示されて,同じフォルダ内にGemfile.lockが生成される.

次にGitを使ってHerokuに送信する.その前にローカルのGitリポジトリにコミット
$ git add .
$ git commit -m 'first commit'
そして,Herokuにプッシュ
$ git push heroku master 
Herokuのほうで動作を確認
$ heroku open 

f:id:alice345:20130713211820j:plainだめでした...
連休初日はここで終了.