忍者ブログ
MASTER →  ADMIN / NEW ENTRY / COMMENT
現代魔法(nearly equal 情報技術)を勉強中な人のメモ(チラシの裏)
/ 2024/11/22 (Fri) / 編集
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

/ 2010/06/12 (Sat) / 編集
というわけで、まったく進まずイライラする研究の合間にちょこちょこ作り続けてたbot用のクラスの作成メモ。while(true){実験用プログラム;bot;}て感じだったのであちこち記述がひどいがまぁ多めに見てほしいです。
ちなみにソースコードというよりもノウハウのメモがメイン
[メモ]OAuth認証でTwitterにアクセスを試してみたで取得した情報(「Consumer key」「Consumer secret」「Access token」「Access token secret」)を使うのでまだ持ってない人はそちらを先にどうぞ。
「普通に配布されてるの使えよw」という突っ込みには「趣味です(キリッ」と答えます。

クラスのひな形

とりあえずクラスのひな形、今回はOAuth認証を使って接続するので(もう少しするとBASIC認証は使えなくなる)gemで入れたoauthライブラリを使います。また、取得するデータの形式は(現状では)jsonとxmlとrssが選べるが選べるのでとりあえずJSON、これは単に好みの問題、とりあえずgemでjson用のライブラリもね。
後述しますが、プロフィール画像のアップロードもbotからやりたいときは3つほど追加で読み込んでおく必要があります。 ここで注意すべきは、「access_token」はAPIにアクセスするたびに使うのでインスタンス変数にしてクラス内のどこからでも使えるようにする事。「consumer」は初期化以外ではプロフィール画像の投稿にしか使いません。

APIへのアクセス

関数の引数で送信する

というわけで、post関数の引数でアクセスする例。
アクセストークン.post("APIのURL","APIのパラメータ"=>"内容")
以下はツィートを投稿するための関数。注意しないといけないのが「タイムアウトはrescueしないとキャッチできない」らしいということ。どこかのサイトでみたんだけどねw updateのAPIは成功すると送信したメッセージの内容を返してくれるので、返事の中に送信したメッセージが含まれているかどうかで成否を判定しています。

もう一つ注意、「Twitterの制限があるので全く同じ文章を半日以内に送る事は出来ない」らしいので、この関数を試すときは試すたびに文章を変えてね!

「メソッド/パラメータ.format」な方法

たとえばidというメッセージIDをもつツィートをリツィートするには「http://api.twitter.com/1/statuses/retweet/id.format」をPOSTする。 この方法ではURLを変更しないといけないのでちょっとめんどい、でもこれでしかアクセスできないAPIもあるっぽい。

「URL?パラメータ=内容」で渡す例

3つめとして、「URL?パラメータ=内容」でできるAPIもある。ここではタイムラインの取得を行う例。”取得”なのでPOSTではなくGETなとこに注意。
以下のようにすると”メッセージID”以降最新20件のツィートを持ってくる関数です。
statuses = twitter.get_timeline("since_id=メッセージID")
エラー処理はテンプレと化しているなw statuses.bodyにstatusesの中身が入っているのでdoでまわす、JSONでパースしたので中身は連想配列(ハッシュ)になってます。
ここでも一応エラーチェック「JSON::ParserError」、うっかりstatusesの中身が空だったりするとエラーになるので念のため。

プロフィール画像の変更

botに実装できてると楽しいプロフィール画像の変更の方法。とりあえずjpegとpngとgifがアップロード可能、容量制限は700KB以下、どんなに大きな画像を送っても500x500pix以下に縮小されるそうな。

以下はcurlコマンドでやる例、system関数とかで実行すればおけ。
curl -u user:password -H 'Expect:' -F image=@'ファイル名;type=MIMEタイプ' http://api.twitter.com/1/account/update_profile_image.xml
だが待ってほしい、せっかくOAuth認証を使えるようにしてユーザIDやパスワードを不要にしたのにここで直書きとかうざくね?

というわけで@hayesdavisさん作のこのスクリプトを改変してOAuthでやるよ!

ここで俺が勘違いしてたのが、「全部URLで飛ばせば出来る!」と思ってた事、どうやら画像のアップロードはHTTPでヘッダをごにょごにょしつつがんばらないといけないらしい。。。
まずは補助関数の実装。MIMEタイプの識別をする mime_typeとリクエストヘッダをごにょごにょする関数add_multipart_dataは@hayesdavisさんのをコピペ ここからは書き換えが必要、add_oauthはすでにOAuth認証をすましているので産業でおけ、引数もreqだけでいい。ここで使うために「@consumer」にしてあったのです。
def add_oauth(req)
  @consumer.sign!(req,@access_token)
end
あとは実際のアップロード関数。失敗したらnilを、成功するとAPIからの返り値を返します。”ヘッダをごにょごにょ”部分は調べ中なのでまた後日。

おまけ:いいかんじの設定ファイル。

$config[:CONSUMER_KEY]について、[m-birdとFreeBSDの同棲日記]rubyで設定ファイルを書くときで学んだほんのり便利な設定ファイルの書き方。 みたいに書いておくと「@xxx」がハッシュに登録されるので便利だねって話。
load 'config.rb',true
p $config
みたいに書いたときにつかえるよ。
{:CONSUMER_SECRET=>"コンシューマシークレット", :ACCESS_TOKEN_SECRET=>"アクセストークンシークレット", :CONSUMER_KEY=>"コンシューマキー",  :ACCESS_TOKEN=>"アクセストークン"}

拍手[0回]

PR
忍者ブログ [PR]