TwitPicはTwitterのツィートに画像を使いたいときにとても役立つサービス。Twitterのアカウントでログインできる。
というのは普通にブラウザでアクセスするときの話。ボットからアクセスするにはBASIC認証かOAuth Echo認証を使わないといけない!そしてBASICは将来的になくなるかもしんない。。。
というわけで、OAuth Echo認証に挑戦するお!
参考文献:
[ふと思う--ちょっと考える (いたずら編)]TwitPic API v2で画像のアップロード
[しばそんノート]OAuthコンシューマの仕組みと実装 ~ Ruby編
というのは普通にブラウザでアクセスするときの話。ボットからアクセスするにはBASIC認証かOAuth Echo認証を使わないといけない!そしてBASICは将来的になくなるかもしんない。。。
というわけで、OAuth Echo認証に挑戦するお!
参考文献:
[ふと思う--ちょっと考える (いたずら編)]TwitPic API v2で画像のアップロード
[しばそんノート]OAuthコンシューマの仕組みと実装 ~ Ruby編
OAuth Echoには「コンシューマキー等OAuthに使うもの」と「TwitPicのAPIキー」が必要です。TwitPicのAPIキーは「http://dev.twitpic.com/」で取得しませう。
*今回は開発中のbot用なので、以前作成したTwitterClass.rbに追加する感じで作ります。なのでグローバルな変数が2つ使われてますが。適宜書き換えてください。
でもって”ふと思う”さんのサイトを参考に次の関数を追加します。追加するときは「private」とある行よりも上に書くようにしましょう。
というわけで、まずはヘッダを作る関数を作ります。
次に、APIキーやmessageはヘッダではなくBodyに書くそうなので、そのための関数を作ります。
あとは画像ファイルを追加するための関数を作ります。
さて、以上をつかってTwitPicに画像をアップロードする関数を作ります。
ここで、まだ書いてないのが2つ。そう、「@twitpic_api_key」と「@access_token」です。
「@twitpic_api_key」は普通にTwitPic APIキーが入っています。「@access_token」は「SimpleOAuth」のインスタンスです。
まぁ関係ない関数も書いてありますがスルーしてください。
「$configなんたら」にはコンシューマキーなどが入ってると思ってください。
*今回は開発中のbot用なので、以前作成したTwitterClass.rbに追加する感じで作ります。なのでグローバルな変数が2つ使われてますが。適宜書き換えてください。
OAuthに使うヘッダを取得しよう
まず始めに、普通のOAuthに使うヘッダを作ります。このためにしばそんさんのrb-simple-oauthからsimple-oauth.rbをダウンロードしてきます。でもって”ふと思う”さんのサイトを参考に次の関数を追加します。追加するときは「private」とある行よりも上に書くようにしましょう。
def make_auth_header(method, url, body = nil) method = method.to_s uri = URI.parse(url) request_body = body.is_a?(Hash) ? encode_parameters(body) : body.to_s return auth_header(method, uri, request_body) endするとこんな感じになります。
リクエストを作る準備
上のライブラリを使ってHTTPでリクエストするためのヘッダとかを作る訳ですが、そのためには以下のような機能を実装した関数が必要です。- OAuth Echo用のヘッダを作る
- リクエストに画像ファイルを追加
- メッセージやAPIキーの情報を追加する
というわけで、まずはヘッダを作る関数を作ります。
def add_oauth_echo_heder(request,realm_url,auth_provider_url) auth = @access_token.make_auth_header(:GET, auth_provider_url) request["X-Auth-Service-Provider"] = auth_provider_url request["X-Verify-Credentials-Authorization"] = auth + ", realm=\"#{realm_url}\"" end
次に、APIキーやmessageはヘッダではなくBodyに書くそうなので、そのための関数を作ります。
def add_form_body(body_array,boundary,key,value) body_array << "--#{boundary}" body_array << "Content-Disposition: form-data; name=\"#{key}\"" body_array << "" value.split(/\n/).each{|line| body_array << "#{line}" } end
あとは画像ファイルを追加するための関数を作ります。
#MIMEタイプを調べる def mime_type(file) case when file =~ /\.jpg/ then 'image/jpg' when file =~ /\.gif$/ then 'image/gif' when file =~ /\.png$/ then 'image/png' else 'application/octet-stream' end end #配列に画像追加用の情報を詰め込む def add_file_body(body_array,boundary,key,file_path) file_name = File.basename(file_path) mime_type = mime_type(file_name) body_array << "--#{boundary}" body_array << "Content-Disposition: form-data; name=\"#{key}\"; filename=\"#{file_name}\"" body_array << "Content-Type: #{mime_type}" body_array << "" #バイナリデータを押し込む open(file_path){|io| body_array << io.read } end
さて、以上をつかってTwitPicに画像をアップロードする関数を作ります。
def twitpic_upload(image_file_path, message = "") twitpic_api_url = "http://api.twitpic.com/2/upload.json" realm_url = "http://api.twitter.com/" auth_provider_url = "https://api.twitter.com/1/account/verify_credentials.json" url_token = URI.parse(twitpic_api_url) request = Net::HTTP::Post.new(url_token.request_uri) # # construct HTTP request #バウンダリ文字列を生成(なんでもいい) boundary = Time.now.strftime("%Y%m%d_%H%M%S_#{$$}") #OAuth Echoヘッダを追加 add_oauth_echo_heder(request,realm_url,auth_provider_url) #Content-Typeヘッダでバウンダリの指定 request["Content-Type"] = "multipart/form-data; boundary=#{boundary}" body_part = [] #APIキーの情報を押し込む add_form_body(body_part,boundary,'key',@twitpic_api_key) #メセージの情報を押し込む add_form_body(body_part,boundary,'message',message) if(message!="") #画像の情報を押し込む add_file_body(body_part,boundary,'media',image_file_path) #おわり body_part << "--#{boundary}--" body_part << "" #区切り文字「\r\n」で配列を結合する request.body = body_part.join("\r\n") #Content-Lengthにリクエストボディのサイズを設定 request["Content-Length"] = request.body.size #送りつける begin http = Net::HTTP.new(url_token.host, url_token.port).start response = http.request(request) #ちゃんと送れたか確認 retrun_message=JSON.parse(response.body) return nil if (retrun_message['text'] != message) return retrun_message rescue => err time = Time.now.strftime("%Y/%m/%d %H:%M:%S") STDERR.print "#{time}\t[Error:upload_twitpic]\t #{err}\n" end end
ここで、まだ書いてないのが2つ。そう、「@twitpic_api_key」と「@access_token」です。
「@twitpic_api_key」は普通にTwitPic APIキーが入っています。「@access_token」は「SimpleOAuth」のインスタンスです。
def initialize(con_key,con_secret,ac_token,ac_token_secret,twitpic_api_key='') @access_token = SimpleOAuth.new(con_key,con_secret,ac_token,ac_token_secret) @twitpic_api_key = twitpic_api_key end以上をつめこんだクラスがこちらになります。
まぁ関係ない関数も書いてありますがスルーしてください。
使い方
完成した TwitterClass.rbをダウンロード用意したら、次は使い方です。「$configなんたら」にはコンシューマキーなどが入ってると思ってください。
twitter = TwitterClass.new($config[:CONSUMER_KEY],$config[:CONSUMER_SECRET],$config[:ACCESS_TOKEN],$config[:ACCESS_TOKEN_SECRET],$config[:TWITPIC_API_KEY]) p twitter.twitpic_upload('image/test.jpg','関数に分割したい!')
PR
トラックバック
URL :
コメント