質問編集履歴

4

回答を受け修正

2021/07/14 06:55

投稿

12356
12356

スコア6

test CHANGED
File without changes
test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  'user_id':tweetinfo[j]['user']['id'],
26
26
 
27
- "user_name":tweetinfo["screen_name"]}
27
+ "screen_name":tweetinfo[j]["screen_name"]}
28
28
 
29
29
  with open(output_csv_file_name, 'a') as f:
30
30
 

3

回答を受け、修正

2021/07/14 06:54

投稿

12356
12356

スコア6

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,42 @@
1
+ ### 修正後のソースコード
2
+
3
+
4
+
5
+ ```ここに
6
+
7
+ user_info = ["user.screen_name", "user.name",]
8
+
9
+ request_result = request_authorization(request_url=request_url, ck=CK, cs=CS, at=AT, ats=AS, params=params, user_info=user_info)
10
+
11
+ if request_result.status_code == 200:
12
+
13
+ tweetinfo = json.loads(request_result.text)
14
+
15
+
16
+
17
+ for j in range(0,len(tweetinfo)):
18
+
19
+ print(str(i)+":"+str(j)+":"+"リツイートID" + str(tweetinfo[j]['id']) + str(twitter_info[j]["screen_name"]))
20
+
21
+ user = api.get_user(j)
22
+
23
+ followerdata = {'retweet_id':tweetinfo[j]['id'],
24
+
25
+ 'user_id':tweetinfo[j]['user']['id'],
26
+
27
+ "user_name":tweetinfo["screen_name"]}
28
+
29
+ with open(output_csv_file_name, 'a') as f:
30
+
31
+ writer = csv.writer(f, lineterminator='\n')
32
+
33
+ writer.writerow(followerdata.values())
34
+
35
+
36
+
37
+
38
+
1
- ### 前提・実現したいこと
39
+ ```### 前提・実現したいこと
2
40
 
3
41
 
4
42
 
@@ -14,17 +52,17 @@
14
52
 
15
53
  エラーメッセージ
16
54
 
17
- line59
55
+ line 63, in <module>
18
-
56
+
19
- print(str(i)+":"+str(j)+":"+"リツイートID" + str(tweetinfo[j]['id']) + user_info[j]["screen_name"])
57
+ print(str(i)+":"+str(j)+":"+"リツイートID" + str(tweetinfo[j]['id']) + str(tweetinfo[j]["screen_name"]))
20
-
58
+
21
- TypeError: string indices must be integers
59
+ KeyError: 'screen_name'
22
-
60
+
23
- ```
61
+ ```
24
-
25
-
26
-
62
+
63
+
64
+
27
- ### 該当のソースコード
65
+ ### 全体のソースコード
28
66
 
29
67
 
30
68
 

2

idのところにuser等をいれてみた

2021/07/14 06:51

投稿

12356
12356

スコア6

test CHANGED
File without changes
test CHANGED
@@ -14,11 +14,11 @@
14
14
 
15
15
  エラーメッセージ
16
16
 
17
- line54
17
+ line59
18
-
18
+
19
- request_result = request_authorization(request_url=request_url, ck=CK, cs=CS, at=AT, ats=AS, params=params, user_name=screen_name)
19
+ print(str(i)+":"+str(j)+":"+"リツイートID" + str(tweetinfo[j]['id']) + user_info[j]["screen_name"])
20
-
20
+
21
- NameError: name 'screen_name' is not defined
21
+ TypeError: string indices must be integers
22
22
 
23
23
  ```
24
24
 
@@ -78,7 +78,7 @@
78
78
 
79
79
  request_status_url = "https://api.twitter.com/1.1/statuses/retweets/:id.json"
80
80
 
81
- tweet_id = [""] #リツイート情報を取得したい TweetID
81
+ tweet_id = ["1414972474261786636"] #リツイート情報を取得したい TweetID
82
82
 
83
83
 
84
84
 
@@ -138,7 +138,9 @@
138
138
 
139
139
  params = {'tweet_id':tweet_id[i]}
140
140
 
141
+ user_info = ["user.screen_name", "user.name",]
142
+
141
- request_result = request_authorization(request_url=request_url, ck=CK, cs=CS, at=AT, ats=AS, params=params, user_name=screen_name)
143
+ request_result = request_authorization(request_url=request_url, ck=CK, cs=CS, at=AT, ats=AS, params=params, user_info=user_info)
142
144
 
143
145
  if request_result.status_code == 200:
144
146
 
@@ -146,11 +148,13 @@
146
148
 
147
149
  for j in range(0,len(tweetinfo)):
148
150
 
149
- print(str(i)+":"+str(j)+":"+"リツイートID" + str(tweetinfo[j]['id']))
151
+ print(str(i)+":"+str(j)+":"+"リツイートID" + str(tweetinfo[j]['id']) + user_info[j]["screen_name"])
150
152
 
151
153
  followerdata = {'retweet_id':tweetinfo[j]['id'],
152
154
 
153
- 'user_id':tweetinfo[j]['user']['id'],}
155
+ 'user_id':tweetinfo[j]['user']['id'],
156
+
157
+ "user_name":user_info["screen_name"]}
154
158
 
155
159
  with open(output_csv_file_name, 'a') as f:
156
160
 
@@ -186,10 +190,14 @@
186
190
 
187
191
  ```
188
192
 
193
+ ```
194
+
189
195
 
190
196
 
191
197
  ### 試したこと
192
198
 
199
+ コードが読みにくくて申し訳ございません。
200
+
193
201
  webで掲載されていたコード使用しました。
194
202
 
195
203
  取得情報を「ID」ではなく「screen_name」に変えて情報を取得したかったのですがエラーが出てしまいます。

1

修正

2021/07/14 04:49

投稿

12356
12356

スコア6

test CHANGED
File without changes
test CHANGED
@@ -14,6 +14,12 @@
14
14
 
15
15
  エラーメッセージ
16
16
 
17
+ line54
18
+
19
+ request_result = request_authorization(request_url=request_url, ck=CK, cs=CS, at=AT, ats=AS, params=params, user_name=screen_name)
20
+
21
+ NameError: name 'screen_name' is not defined
22
+
17
23
  ```
18
24
 
19
25
 
@@ -26,21 +32,17 @@
26
32
 
27
33
  ソースコード
28
34
 
29
- ``````from requests_oauthlib import OAuth1Session
35
+ ```from requests_oauthlib import OAuth1Session
30
36
 
31
37
  import json
32
38
 
33
39
  import csv
34
40
 
41
+ import tweepy
42
+
35
- import collections as cl
43
+ import configparser
36
-
37
- import datetime,sys,time
44
+
38
-
39
- '''
45
+
40
-
41
- OAuth認証
42
-
43
- '''
44
46
 
45
47
  def request_authorization (**url_and_params):
46
48
 
@@ -56,168 +58,134 @@
56
58
 
57
59
  return request_result
58
60
 
59
- '''
61
+
60
-
61
- API制限をチェックし、制限解除までスリープ
62
+
62
-
63
- '''
64
-
65
- def sleep_until_api_limit(api_response):
63
+ config_ini = configparser.ConfigParser()
66
-
64
+
67
- sec = int(api_response.headers['X-Rate-Limit-Reset']) - time.mktime(datetime.datetime.now().timetuple()) #UTCを秒数に変換
65
+ config_ini.read('config.ini', encoding='utf-8')
68
-
69
- sec += 60.0#念のため1分追加
66
+
70
-
71
- print(str(sec)+"秒待機")
72
-
73
- time.sleep(sec)
74
-
75
- #取得した4つのkeyをここに差し込みます。
76
-
77
- CK = "XXXXXXXXXXXXXXXXXXXXXX" #Consumer key
67
+ CK = config_ini["key"]["consumer_key"]
78
-
68
+
79
- CS = "XXXXXXXXXXXXXXXXXXXXXX" #Consumer secret
69
+ CS = config_ini["key"]["consumer_secret"]
80
-
81
- AT = "XXXXXXXXXXXXXXXXXXXXXX" #Access token
70
+
82
-
83
- AS = "XXXXXXXXXXXXXXXXXXXXXX" #Access token secret
71
+ AT = config_ini["key"]["access_token"]
72
+
84
-
73
+ AS = config_ini["key"]["access_secret"]
74
+
85
- global twitter#メソッド内で再認証を行うため
75
+ global twitter
86
-
76
+
87
- twitter = OAuth1Session(CK, CS, AT, AS)#認証処理。数時間すると認証が切れる。
77
+ twitter = OAuth1Session(CK, CS, AT, AS)
88
-
89
- # ツイート情報取得用エンドポイントURL
90
78
 
91
79
  request_status_url = "https://api.twitter.com/1.1/statuses/retweets/:id.json"
92
80
 
93
- '''
94
-
95
- 情報を取得したいTweetIDをリストに格納
96
-
97
- '''
98
-
99
- tweet_id_list = ["XXXXX","XXXXX","XXXXX"] #リツイート情報を取得したい TweetID をここに差し込みます。
81
+ tweet_id = [""] #リツイート情報を取得したい TweetID
100
-
101
- tweet_id_list.sort()
82
+
102
-
83
+
84
+
103
- total_requests_number = len(tweet_id_list)
85
+ total_requests_number = len(tweet_id)
104
86
 
105
87
  print("--------"+"送信するリクエスト数合計:" + str(total_requests_number)+"-------------")
106
88
 
107
- '''
108
-
109
- TwitterからUserID情報の取得開始
110
-
111
- '''
112
-
113
- sched_requests_number = 0 #リクエストしたtweet_idの数
89
+ sched_requests_number = 0
114
-
90
+
115
- should_get_requests_limit = True #API上限数を取得するためのスイッチ
91
+ should_get_requests_limit = True
116
-
92
+
117
- i_plus = 1 #API上限数を取得するためのスイッチ
93
+ i_plus = 1
118
-
94
+
119
- requests_count = 0 #「API上限までリクエストを送る」を実行するのは何回目かカウントする用
95
+ requests_count = 0
120
-
96
+
121
- error_count = 0 #エラーを返された回数をカウントする用
97
+ error_count = 0
122
-
98
+
123
- output_csv_file_name = 'retweet_info.csv' #取得した値を格納ファイル名
99
+ output_csv_file_name = 'retweet_info.csv'
124
-
125
- '''
100
+
126
-
127
- ループ開始前にカラムへ書き込み
101
+
128
-
129
- '''
130
102
 
131
103
  with open(output_csv_file_name,'a') as f:
132
104
 
133
105
  writer = csv.writer(f, lineterminator='\n')
134
106
 
135
- header = ['tweet_id', 'retweet_id', 'user_id', 'created_at']
107
+ header = ['retweet_id', 'user_id']
136
108
 
137
109
  writer.writerow(header)
138
110
 
139
- '''
111
+
140
-
141
- ループ開始。retweet_idの書き込み。
142
-
143
- '''
144
112
 
145
113
  for i in range(0,total_requests_number,i_plus):
146
114
 
147
- if(should_get_requests_limit == True):
148
-
149
- api_response = request_authorization(request_url=request_status_url, ck=CK, cs=CS, at=AT, ats=AS)
150
-
151
- requests_limit = api_response.headers['x-rate-limit-remaining']#リクエスト可能残数の取得
152
-
153
- requests_limit = int(requests_limit)#limitが文字列なのでキャスト
154
-
155
- requests_count += 1
156
-
157
- print("--------"+str(requests_count)+"回目。今回送信するリクエスト数:" + str(requests_limit)+"--------------------")
158
-
159
- sched_requests_number += requests_limit
160
-
161
- should_get_requests_limit = False
162
-
163
- if(requests_limit != 0):
164
-
165
- i_plus = 1
166
-
167
- print(str(i) + ":リクエストしたtweetID:" + str(tweet_id_list[i])+"---------")
168
-
169
- request_url = "https://api.twitter.com/1.1/statuses/retweets/"+str(tweet_id_list[i])+".json?count=10&trim_user=false"
170
-
171
- params = {'tweet_id':tweet_id_list[i]}
172
-
173
- request_result = request_authorization(request_url=request_url, ck=CK, cs=CS, at=AT, ats=AS, params=params)
174
-
175
- if request_result.status_code == 200:
176
-
177
- tweetinfo = json.loads(request_result.text)#JSON形式で読み込む
178
-
179
- for j in range(0,len(tweetinfo)):
180
-
181
- print(str(i)+":"+str(j)+":"+"リツイートID" + str(tweetinfo[j]['id']))
182
-
183
- followerdata = {'tweet_id':tweet_id_list[i],
184
-
185
- 'retweet_id':tweetinfo[j]['id'],
186
-
187
- 'user_id':tweetinfo[j]['user']['id'],
188
-
189
- 'created_at':tweetinfo[j]['created_at']}
190
-
191
- with open(output_csv_file_name, 'a') as f:
192
-
193
- writer = csv.writer(f, lineterminator='\n')
194
-
195
- writer.writerow(followerdata.values())
196
-
197
- else:
198
-
199
- print ("Error: %d" % request_result.status_code)
200
-
201
- error_count += 1
202
-
203
- print("Error数:"+str(error_count))
204
-
205
- else:
206
-
207
- i_plus = 0 #limitが0のままiが1増えてしまうと実行されないTweeetIDが発生するので、0入れて増やさない。
208
-
209
- if(i == sched_requests_number):
210
-
211
- print("--------"+"残りリクエスト数" + str(total_requests_number-requests_limit) + "-------------")
212
-
213
- sleep_until_api_limit(api_response)
214
-
215
- should_get_requests_limit = True
115
+ if(should_get_requests_limit == True):
116
+
117
+ api_response = request_authorization(request_url=request_status_url, ck=CK, cs=CS, at=AT, ats=AS)
118
+
119
+ requests_limit = api_response.headers['x-rate-limit-remaining']
120
+
121
+ requests_limit = int(requests_limit)
122
+
123
+ requests_count += 1
124
+
125
+ print("--------"+str(requests_count)+"回目。今回送信するリクエスト数:" + str(requests_limit)+"--------------------")
126
+
127
+ sched_requests_number += requests_limit
128
+
129
+ should_get_requests_limit = False
130
+
131
+ if(requests_limit != 0):
132
+
133
+ i_plus = 1
134
+
135
+ print(str(i) + ":リクエストしたtweetID:" + str(tweet_id[i])+"---------")
136
+
137
+ request_url = "https://api.twitter.com/1.1/statuses/retweets/"+str(tweet_id[i])+".json?count=100&trim_user=false"
138
+
139
+ params = {'tweet_id':tweet_id[i]}
140
+
141
+ request_result = request_authorization(request_url=request_url, ck=CK, cs=CS, at=AT, ats=AS, params=params, user_name=screen_name)
142
+
143
+ if request_result.status_code == 200:
144
+
145
+ tweetinfo = json.loads(request_result.text)
146
+
147
+ for j in range(0,len(tweetinfo)):
148
+
149
+ print(str(i)+":"+str(j)+":"+"リツイートID" + str(tweetinfo[j]['id']))
150
+
151
+ followerdata = {'retweet_id':tweetinfo[j]['id'],
152
+
153
+ 'user_id':tweetinfo[j]['user']['id'],}
154
+
155
+ with open(output_csv_file_name, 'a') as f:
156
+
157
+ writer = csv.writer(f, lineterminator='\n')
158
+
159
+ writer.writerow(followerdata.values())
160
+
161
+ else:
162
+
163
+ print ("Error: %d" % request_result.status_code)
164
+
165
+ error_count += 1
166
+
167
+ print("Error:"+str(error_count))
168
+
169
+ else:
170
+
171
+ i_plus = 0
172
+
173
+ if(i == sched_requests_number):
174
+
175
+ print("--------"+"残りリクエスト数" + str(total_requests_number-requests_limit) + "-------------")
176
+
177
+ sleep_until_api_limit(api_response)
178
+
179
+ should_get_requests_limit = True
180
+
181
+
216
182
 
217
183
  コード
218
184
 
219
185
  ```
220
186
 
187
+ ```
188
+
221
189
 
222
190
 
223
191
  ### 試したこと