Skip to content

Commit d3fdc6b

Browse files
authored
Merge pull request #100 from true-runes/development
v2.0.0
2 parents 7211133 + b9426a9 commit d3fdc6b

13 files changed

+144
-8
lines changed

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,16 @@
66

77
## データベースに格納してあるユーザーの公開状態を全チェックし、データの更新する
88

9+
- ユーザー数 1,450 件 で 約 2.5 分を要した
10+
911
```bash
1012
$ $(which bundle) exec rails runner "TwitterRestApi::CheckProtectedUsers.new.update_all_user_is_protected_statuses"
1113
```
1214

1315
## データベースに格納してあるツイートの公開状態を全チェックし、データの更新する
1416

17+
- ツイート 7,328 件 で 約 7 分を要した
18+
1519
```
1620
$(which bundle) exec rails runner "TwitterRestApi::CheckPublicTweets.new.update_all_tweet_is_public_statuses"
1721
```

app/lib/importer.rb

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ def tweet_records_from_tweet_storage(ts_target_tweets, _update: false)
1616
name: ts_target_tweet.user.name,
1717
screen_name: ts_target_tweet.user.screen_name,
1818
profile_image_url_https: ts_target_tweet.user.deserialize.profile_image_url_https.to_s,
19-
is_protected: false
19+
is_protected: false,
20+
born_at: ts_target_tweet.created_at
2021
}
2122

2223
user = User.find_by(id_number: user_attrs[:id_number])

app/lib/twitter_rest_api/check_protected_users.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ class CheckProtectedUsers
44

55
INTERVAL_SECONDS = 5
66

7-
def initialize(consumer_key=nil, consumer_secret=nil, access_token=nil, access_secret=nil)
7+
def initialize(consumer_key: nil, consumer_secret: nil, access_token: nil, access_secret: nil)
88
@client = Twitter::REST::Client.new do |config|
99
config.consumer_key = consumer_key || ENV['TWITTER_CONSUMER_KEY']
1010
config.consumer_secret = consumer_secret || ENV['TWITTER_CONSUMER_SECRET']

app/lib/twitter_rest_api/check_public_tweets.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ class CheckPublicTweets
44

55
INTERVAL_SECONDS = 5
66

7-
def initialize(consumer_key=nil, consumer_secret=nil, access_token=nil, access_secret=nil)
7+
def initialize(consumer_key: nil, consumer_secret: nil, access_token: nil, access_secret: nil)
88
@client = Twitter::REST::Client.new do |config|
99
config.consumer_key = consumer_key || ENV['TWITTER_CONSUMER_KEY']
1010
config.consumer_secret = consumer_secret || ENV['TWITTER_CONSUMER_SECRET']
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
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

app/models/direct_message.rb

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
class DirectMessage < ApplicationRecord
22
has_paper_trail
33

4+
serialize :api_response, JSON
45
belongs_to :user
56

67
validates :id_number, uniqueness: true
78

9+
# self.user と同義
810
def sender
9-
User.find_by(id: sender_id_number)
11+
User.find_by(id_number: sender_id_number)
1012
end
1113

1214
def recipient
13-
User.find_by(id: recipient_id_number)
15+
User.find_by(id_number: recipient_id_number)
1416
end
1517
end

app/models/tweet.rb

+8-1
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,20 @@ def self.not_by_gensosenkyo_sub
4747
where.not(user_id: target_user_ids)
4848
end
4949

50-
def self.valid_votes
50+
def self.valid_term_votes
5151
begin_datetime = Time.zone.parse('2021-06-11 21:00:00')
5252
end_datetime = Time.zone.parse('2021-06-13 11:59:59')
5353

5454
where(tweeted_at: begin_datetime..end_datetime)
5555
end
5656

57+
def valid_term_vote?
58+
begin_datetime = Time.zone.parse('2021-06-11 21:00:00')
59+
end_datetime = Time.zone.parse('2021-06-13 11:59:59')
60+
61+
tweeted_at >= begin_datetime && tweeted_at <= end_datetime
62+
end
63+
5764
def has_this_hashtag?(hashtag)
5865
hashtags.any? { |h| h.text == hashtag }
5966
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class RenameColumnFromSentAtToMessagedAt < ActiveRecord::Migration[6.1]
2+
def change
3+
rename_column :direct_messages, :sent_at, :messaged_at
4+
end
5+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class AddResponseColumnToDirectMessage < ActiveRecord::Migration[6.1]
2+
def change
3+
add_column :direct_messages, :api_response, :text
4+
end
5+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class AddBornAtColumnToUser < ActiveRecord::Migration[6.1]
2+
def change
3+
add_column :users, :born_at, :datetime
4+
end
5+
end

db/schema.rb

+4-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/tasks/.keep

Whitespace-only changes.
+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
namespace :insert_born_at_to_users do
2+
desc 'Insert "born_at" column data to User'
3+
task execute: :environment do
4+
ActiveRecord::Base.transaction do
5+
all_users = User.all
6+
7+
all_users.each do |user|
8+
next if user.born_at.present?
9+
10+
user_from_tweet_storage = UserFromTweetStorage.where(id_number: user.id_number).order(updated_at: :desc).first
11+
12+
next if user_from_tweet_storage.blank?
13+
14+
user.born_at = user_from_tweet_storage.created_at
15+
user.save!
16+
17+
Rails.logger.info("insert_born_at_to_users:execute: '#{user.screen_name}' insert OK!")
18+
end
19+
end
20+
end
21+
end

0 commit comments

Comments
 (0)