twitter apiで特定ツイートの情報を取得 twitterBot②

· ☕ 4
🏷️
  • #Python
  • #twitter
  • 朝、とりあえず適当な自分のツイートにリプライするまでできた。

    でも自動リプライしたいのはこれじゃないんだよね…。

    今回は、本命のツイートにリプライするまで!

    指定ツイートのリプライの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時間くらいかかった…。

    つらい戦いだった…。

    解決編は、また夜に。


    るな
    るな
    エンジニア