かくすけのいろいろ作るブログ

かくすけの開発者ブログです。開発の他いろいろなモノづくりについて書きます。

【Ruby】【Twitter API】Twitter APIを使ってツイートする

Ruby バージョン 2.5.0

こんにちは。かくすけです。
夜も遅くて眠いので簡単に。ちょっとだけでも情報はその日のうちに残さないとね!
(もし通知とか飛んでいたら夜遅くにすみません。。。)
こちらの記事の続きです。

kakusuke98.hatenablog.com

今回はTwitter API を使ってツイートする部分を構築します。
Twitter API リファレンスページ

API reference index — Twitter Developers

その中のツイート用メソッドリファレンスページ

POST statuses/update — Twitter Developers

実際にツイートするコードを書く

今回のツイートを行うRubyコードを書くにあたって
次のページを参考にさせていただきました。

OAuth gemだけでTwitter APIを使ってみる - Qiita

前回の記事↓で取得した以下の情報を環境変数に格納しています

kakusuke98.hatenablog.com

・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'の合わせ技で実現しました。
以下のページにのっている方法をそのまま使わせていただいています。

GitHub - rest-client/rest-client: Simple HTTP and REST client for Ruby, inspired by microframework syntax for specifying actions.

そして作成したメソッドがこちら!
ほぼ参考にした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 をかませています。