🎁

(X)Twitter v2 APIを使ってRubyでのポストをする

2024/06/06に公開

memo

v2になってからは対応していたgemがサポートを終了しました。

けど、実はx-rubyというgemが出てきたみたいです。
https://sferik.github.io/x-ruby/

僕はこれに気づかずに自分で設定しました。
けど、正直gemにするほどでもない短さなのでここに置いておきますね。
(僕が探したところだとあまり欲しい記事が出てこなかった)

# frozen_string_literal: true

require 'oauth'
require 'json'

class Twitter
  def initialize
    twitter_credentials = Rails.application.credentials[:twitter_bot]
    @consumer = OAuth::Consumer.new(
      twitter_credentials[:consumer_key],
      twitter_credentials[:consumer_secret],
      site: 'https://api.twitter.com',
      debug_output: true
    )
    @token = OAuth::Token.new(twitter_credentials[:access_token], twitter_credentials[:access_token_secret])
  end

  def post(object, url)
    twitter_user = "@#{object.user.twitter_id} " : ''
    hashtags = object.tags.map { |tag| "##{tag}" }.join(' ')
    // 改行は /n で行う
    tweet_text = "【タイトル】\n#{object.name}\n#{twitter_user}#{hashtags}\n#{url}"

    @consumer.request(
      :post,
      'https://api.twitter.com/2/tweets',
      @token,
      {},
      { text: tweet_text }.to_json,
      'Content-Type' => 'application/json'
    )
  end
end

あとは
Sidekiqとか使って非同期でポストするようにしてあげるとか

# frozen_string_literal: true

module TwitterJob
  class Tweet < ApplicationJob
    queue_as :default

    def perform(object, url)
      return unless Rails.env.production?

      Twitter.new.tweet(object, url)
    end
  end
end

Discussion