【Ruby】【Twitter API】Twitter APIを使ってツイートする
Ruby バージョン 2.5.0
こんにちは。かくすけです。
夜も遅くて眠いので簡単に。ちょっとだけでも情報はその日のうちに残さないとね!
(もし通知とか飛んでいたら夜遅くにすみません。。。)
こちらの記事の続きです。
今回はTwitter API を使ってツイートする部分を構築します。
Twitter API リファレンスページ
API reference index — Twitter Developers
その中のツイート用メソッドリファレンスページ
POST statuses/update — Twitter Developers
実際にツイートするコードを書く
今回のツイートを行うRubyコードを書くにあたって
次のページを参考にさせていただきました。
OAuth gemだけでTwitter APIを使ってみる - Qiita
前回の記事↓で取得した以下の情報を環境変数に格納しています
・CONSUMER_KEY: API key
・CONSUMER_SECRET: API secret key
・ACCESS_TOKEN: Access token
・ACCESS_TOKEN_SECRET: Access token secret
上の参考ページでは'oauth'のみを使って Twitter API を使用していますが
私は動画取得の部分と統一したいので'oauth'と'rest-client'の合わせ技で実現しました。
以下のページにのっている方法をそのまま使わせていただいています。
そして作成したメソッドがこちら!
ほぼ参考にした2つのページのままなので細かい説明は無しです。
require 'json' require 'rest-client' require 'oauth' #-------------------------------------------- # ツイートする(Gem:'oauth'を使用) # 引数: # video: ツイートする動画情報を持ったハッシュ配列 # 戻り値: # status: true(成功)またはfalse(失敗) # message: エラーメッセージ #-------------------------------------------- def tweet_video(video) begin # gem'oauth'を使った認証 consumer = OAuth::Consumer.new( ENV['CONSUMER_KEY'], ENV['CONSUMER_SECRET'], site:'https://api.twitter.com/' ) endpoint = OAuth::AccessToken.new(consumer, ENV['ACCESS_TOKEN'], ENV['ACCESS_TOKEN_SECRET']) # RestClient使用直前に'oauth'で取得したaccess_tokenを持たせる RestClient.add_before_execution_proc do |req, params| endpoint.sign! req end # Twitter APIを使ったツイート status_param = "(#{video[:publish_date]})#{video[:title]}https://www.youtube.com/watch?v=#{video[:video_id]}" p status_param url = "https://api.twitter.com/1.1/statuses/update.json?status=#{URI.encode_www_form_component(status_param)}" RestClient.post(url, {}) { |response, request, result| case response.code when 200 return { status: true, message: '' } else return { status: false, statusCode: response.code, message: "ツイートに失敗しました。レスポンス:#{response}" } end } rescue => e return { status: false, message: "メソッド'get_list_contents'でシステムエラーが発生しました。エラー:#{e}" } end end
ツイート内容は「(投稿日)動画タイトル URL」です。
今回のパターンではツイート内容にURLを含めたかったのでURI.encode_www_form_component
をかませています。