|
| 1 | +module TwitterRestApi |
| 2 | + class DirectMessageImporter |
| 3 | + include LoggerMethods |
| 4 | + |
| 5 | + INTERVAL_SECONDS = 65 |
| 6 | + |
| 7 | + def initialize(consumer_key: nil, consumer_secret: nil, access_token: nil, access_secret: nil) |
| 8 | + @client = Twitter::REST::Client.new do |config| |
| 9 | + config.consumer_key = consumer_key || ENV['TWITTER_CONSUMER_KEY'] |
| 10 | + config.consumer_secret = consumer_secret || ENV['TWITTER_CONSUMER_SECRET'] |
| 11 | + config.access_token = access_token || ENV['TWITTER_ACCESS_TOKEN'] |
| 12 | + config.access_token_secret = access_secret || ENV['TWITTER_ACCESS_SECRET'] |
| 13 | + end |
| 14 | + end |
| 15 | + |
| 16 | + # Ruby っぽくない |
| 17 | + def execute(get_all_messages: false) |
| 18 | + next_cursor = nil |
| 19 | + end_of_while = false |
| 20 | + |
| 21 | + # rubocop:disable Style/InfiniteLoop |
| 22 | + while true |
| 23 | + # rubocop:disable Style/ConditionalAssignment |
| 24 | + if next_cursor.nil? |
| 25 | + dm_events = @client.direct_messages_events(count: 1) |
| 26 | + else |
| 27 | + dm_events = @client.direct_messages_events(count: 1, cursor: next_cursor) |
| 28 | + end |
| 29 | + # rubocop:enable Style/ConditionalAssignment |
| 30 | + |
| 31 | + dm_events = dm_events.to_h |
| 32 | + next_cursor = dm_events[:next_cursor] |
| 33 | + events = dm_events[:events] |
| 34 | + |
| 35 | + ActiveRecord::Base.transaction do |
| 36 | + events.each do |event| |
| 37 | + # events という配列が常に新しい順から並んでいることを前提としている |
| 38 | + if DirectMessage.find_by(id_number: event[:direct_message][:id]).present? && get_all_messages != true |
| 39 | + end_of_while = true |
| 40 | + |
| 41 | + break |
| 42 | + end |
| 43 | + |
| 44 | + [event[:direct_message][:sender_id], event[:direct_message][:recipient_id]].each do |user_id_number| |
| 45 | + if User.find_by(id_number: user_id_number).blank? |
| 46 | + target_user = @client.user(user_id_number) |
| 47 | + |
| 48 | + user = User.new( |
| 49 | + id_number: user_id_number, |
| 50 | + name: target_user.name, |
| 51 | + screen_name: target_user.screen_name, |
| 52 | + profile_image_url_https: target_user.profile_image_url_https.to_s, |
| 53 | + is_protected: target_user.protected?, |
| 54 | + born_at: target_user.created_at |
| 55 | + ) |
| 56 | + user.save! |
| 57 | + end |
| 58 | + end |
| 59 | + |
| 60 | + direct_message = DirectMessage.new( |
| 61 | + id_number: event[:direct_message][:id], |
| 62 | + messaged_at: event[:direct_message][:created_at], |
| 63 | + text: event[:direct_message][:text], |
| 64 | + sender_id_number: event[:direct_message][:sender_id], |
| 65 | + recipient_id_number: event[:direct_message][:recipient_id], |
| 66 | + is_visible: true, |
| 67 | + user_id: User.find_by(id_number: event[:direct_message][:sender_id]).id, |
| 68 | + api_response: event |
| 69 | + ) |
| 70 | + direct_message.save! if DirectMessage.find_by(id_number: event[:direct_message][:id]).blank? |
| 71 | + end |
| 72 | + end |
| 73 | + # rubocop:enable Style/InfiniteLoop |
| 74 | + |
| 75 | + break if next_cursor.nil? |
| 76 | + break if end_of_while == true |
| 77 | + |
| 78 | + Rails.logger.info("TwitterRestApi::DirectMessageImporter#execute: next_cursor (#{next_cursor}), events.count (#{events.count})") |
| 79 | + |
| 80 | + sleep INTERVAL_SECONDS |
| 81 | + end |
| 82 | + end |
| 83 | + end |
| 84 | +end |
0 commit comments