抽選botにリツイート、引用リツイートの判定をさせる

リプライにしか反応しなかった抽選botに、リツイート、引用リツイートも対応した話。

今までの流れはこちら

対象リツイートを取得

あるツイートに対してのリツイートを一覧として取得することはできません。

なので、他の方法で取得します。

テストツイートメッセージというツイートを@abcってアカウントがした時、このツイートヘのリプライのtextの内容は、

RT @abc テストツイートメッセージとなります。

なので、普通にテキスト検索をします。

元の募集ツイートには必ず#抽選botというタグが入っているので、まず#抽選botのタグで検索をかけます。

1
2
3
4
5
search = '%23抽選bot'
response = requests.get(
    f'https://api.twitter.com/1.1/search/tweets.json?q={search}&count=10&lang=ja&result_type=mixed&tweet_mode=extended',
    auth=getOauth()
).json()

で、その中からリツイートを絞り込む。

リツイートには、retweeted_statusというステータスがあります。

だから、retweeted_statusが入っているツイートのみに絞り込む

retweetedList = list(filter(lambda x:"retweeted_status" in x,statusList))

retweeted_statusの中にツイート元のツイートidが入ってます。

そのツイートidが、欲しい元ツイートのidと同じか確認する。

if rep_status['retweeted_status']["id_str"] != tweet_id:
    continue

これで、欲しいリツイートがとれました!

対象引用リツイートを取得

引用リツイートも一覧を取得することができません。

テストツイートメッセージというツイートを@abcってアカウントがした時、このツイートヘのリプライのtextの内容は、

引用リツイートメッセージ https://twitter.com/ユーザー名/status/ツイートidとなります。

元のツイートへ繋がるのはこのメッセージ中のリンクのみになります。

なので、また、text検索します。

このリンクの中には、ツイートidが含まれているので、ツイートidで検索します。

1
2
3
4
5
search = tweet_id
response = requests.get(
    f'https://api.twitter.com/1.1/search/tweets.json?q={search}&count=10&lang=ja&result_type=mixed&tweet_mode=extended',
    auth=getOauth()
).json()

で、その中から正しい引用リツイートを絞り込む。

引用リツイートには、quoted_status_id_strに元ツイートのツイートidが入っています。

そのツイートidが、欲しい元ツイートのidと同じか確認する。

if rep_status['quoted_status_id_str'] != tweet_id:
    continue

元ツイートと引用ツイートが同じ人のツイートだったらスルーする。

if rep_status['user']['id_str'] == status["user_id"]:
    continue

これで、欲しい引用リツイートがとれました!

独り言

やっと抽選botの最低機能が完成しました。

まだまだやりたい事はたくさん…。

そのうちちょこちょこ対応していきます!

完成は7000人企画の時かな…。

全文はこちら


るな
るな
エンジニア