朝、とりあえず適当な自分のツイートにリプライするまでできた。
でも自動リプライしたいのはこれじゃないんだよね…。
今回は、本命のツイートにリプライするまで!
指定ツイートのリプライのstatus_idを取得
users/show.jsonでは、最新の1ツイートしか取得できないから、他の方法で、前のツイートまで取得する!
指定ツイートのstatus_idを取得
https://syncer.jp/Web/API/Twitter/REST_API/GET/statuses/user_timeline/
https://api.twitter.com/1.1/statuses/user_timeline.json
このへんでとれるかな…?
1
2
3
4
5
6
7
8
9
|
def main():
response = requests.get(
f'https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name={SCREEN_NAME}',
auth=getOauth()
).json()
print(json.dumps(response, ensure_ascii=False, indent=4))
|
うん、取れた
さっきのstatusの中身が配列でかえってくるっぼい。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
[
{
"created_at": "Wed Feb 19 21:12:03 +0000 2020",
"id": 1230238643068xxxxxx,
"id_str": "1230238643068xxxxxx",
"text": "test \n ※このツイートはbotからの自動ツイートです",
"truncated": false,
},
{
"created_at": "Wed Feb 19 20:54:10 +0000 2020",
"id": 1230234142802xxxxxx,
"id_str": "1230234142802xxxxxx",
"text": "test \n ※このツイートはbotからの自動ツイートです",
"truncated": false,
},
{
"created_at": "Wed Feb 19 20:48:53 +0000 2020",
"id": 1230232810620xxxxxx,
"id_str": "1230232810620xxxxxx",
"text": "テスト",
},
~略~
|
指定ツイートのリプライのstatus_idを取得
で、私がしたかったのは、私のツイートに対してのリプライに対しての、リプライwww
なので、指定ツイートのリプライのstatus_idを取得する。
GET statuses/show/:id - ツイートを個別に取得する
この辺かなー?
https://api.twitter.com/1.1/statuses/show.json
1
2
3
4
|
response = requests.get(
f'https://api.twitter.com/1.1/statuses/show.json?id=1230223693969707008',
auth=getOauth()
).json()
|
だめだな
さっきのstatusの中身が返ってくるだけだ。
こっちか?
GET statuses/mentions_timeline - メンションタイムラインを取得する
https://api.twitter.com/1.1/statuses/mentions_timeline.json
1
2
3
4
|
response = requests.get(
f'https://api.twitter.com/1.1/statuses/mentions_timeline.json?count=20',
auth=getOauth()
).json()
|
きた!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
[
{
~略~
"id": 1230233631869xxxxxx,
"id_str": "1230233631869xxxxxx",
"text": "@xx おはようございます",
~略~
"user": {
~略~
"name": "twitter太郎",
"screen_name": "twitter111",
~略~
},
~略~
},
{
~略~
"id": 1230233631869xxxxxx,
"id_str": "1230233631869xxxxxx",
"text": "@xx おはようございます",
~略~
"user": {
~略~
~略~
|
対象ツイート向けのリプライのみにfillter
でも、自分宛のリプライが問答無用で取得されるみたい。
だから、ここで取得したリストから、対象のツイートへのリプライだけに絞り込まないといけない
そしてどうやら自分あてのリプライは取得できないようだ…
しょうがない。テスト用にサブ垢からリプライしておくか…。
どのツイートに対してのリプライかは、in_reply_to_status_idで分かるみたいなので、in_reply_to_status_idが対象なもので絞る
1
2
3
4
5
6
|
in_reply_to_status_id=1230223693969707008
response = requests.get(
f'https://api.twitter.com/1.1/statuses/mentions_timeline.json?count=20',
auth=getOauth()
).json()
response = list(filter(lambda x:x["in_reply_to_status_id"] == in_reply_to_status_id,response))
|
リプライメッセージを作成
○○さん、おはようございます!
※このツイートはbotからの自動送信です
とりあえず、こんなところだろうか?
名前はさっきのresponseのuserのnameから取得できそうなので、やってみる。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#自分宛のリプライを全て取得
response = requests.get(
f'https://api.twitter.com/1.1/statuses/mentions_timeline.json?count=20',
auth=getOauth()
).json()
#その中から、指定した元ツイートに対してのリプライのみに絞り込む
in_reply_to_status_id=1230223693969xxxxxx
response = list(filter(lambda x:x["in_reply_to_status_id"] == in_reply_to_status_id,response))
#一件ずつ、リプライメッセージを作成していく
for r in response:
message = f'{r["user"]["name"]}さん、おはようございます!\n※このツイートはbotからの自動送信です'
print(f'replyMessage:{message}')
|
replyMessage:twitter太郎さん、おはようございます!
※このツイートはbotからの自動送信です
replyMessage:twitter花子さん、おはようございます!
※このツイートはbotからの自動送信です
うん、よさげ。
リプライする。
今までのを組み合わせる。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#自分宛のリプライを全て取得
response = requests.get(
f'https://api.twitter.com/1.1/statuses/mentions_timeline.json?count=20',
auth=getOauth()
).json()
#その中から、指定した元ツイートに対してのリプライのみに絞り込む
in_reply_to_status_id=1230223693969xxxxxx
response = list(filter(lambda x:x["in_reply_to_status_id"] == in_reply_to_status_id,response))
#リプライする
for r in response:
status = f'{r["user"]["name"]}さん、おはようございます!\n※このツイートはbotからの自動送信です'
in_reply_to_status_id=r["id"]
response = requests.post(
f'https://api.twitter.com/1.1/statuses/update.json',
data={"status":status,"in_reply_to_status_id":in_reply_to_status_id},
auth=getOauth()
).json()
|
{
~略~
"text": "xxxxさん、おはようございます\n※このツイートはbotからの自動送信です",
~略~
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
え?
どうして?
リプライが出来ない…。
なんどやっても、ただのツイートになってしまう…。
リプライが上手くいくと、in_reply_to_status_idに元ツイートのidが入るはず…。
試しに、朝の記事のidで試すと上手くリプライできる。
なんで?権限?
自分へのリプライはできるけど、他人へのリプライはできないってこと…!?
ググったり、公式ドキュメントを読んだり…。
ここで1時間くらいかかった…。
つらい戦いだった…。
解決編は、また夜に。