YU2TA7KA's BLOG ~take one step at a time~

派生開発、組み込み開発周りのこと。

Twythonでmentionのデータを取得する方法

はじめに

Twitterボット向けにリプライが送られたら、それに反応できるようにするために、Twythonでmentionのデータを取得する方法をまとめます。

前提知識

リプライとメンションの違い

リプライ:ツイートの先頭に「@ユーザー名」がついているもののこと。
メンション:ツイートに「@ユーザー名」がついているもののこと。
つまり、リプライはメンションの特別な一種です。そのためリプライデータを取得するためには、まずメンションデータを収集する必要があります。*1

JSONとは

JSONとは(JavaScript Object Notation)は、軽量のデータ交換フォーマットです。人間にとって読み書きが容易で、マシンにとっても簡単にパースや生成を行なえる形式です。
https://www.json.org/json-ja.html

Twitter APIの返り値の形式が基本的にはJSON形式となっています。そのため、JSONデータの扱い方を知っておく必要があります。*2



mentionのデータの取得の流れ

1. ボットのスクリーンネームを取得する

#ボットのユーザー情報取得
bot_credentials = twitter.verify_credentials()
#スクリーンネームを表示する
print(bot_credentials['screen_name'])

ツイッターアカウントごと固有の名前をscreen_nameと呼びます。verify_credentialsから得られるJSONデータにscreen_nameが含まれるので、これを利用します。

2. ボットのタイムラインから最新のツイートを取得する

bot_name = bot_credentials['screen_name']
bot_timeline = twitter.get_user_timeline(screen_name = bot_name,count = 5)
print(bot_timeline[0]) #JSONデータそのままなのでごちゃごちゃデータ
print(bot_timeline[0]['id']) #ツイートごとのユニークid表示
print(bot_timeline[0]['text']) #ツイート文の表示

screen_nameとcount(取得するツイート数)を指定して、タイムライン情報を取得します。これもJSONデータです。最新は先頭の要素へアクセスすることで取得できます。

3. ボットの最新ツイート以降のメンションを取得する

bot_mentions = twitter.get_mentions_timeline(count=10, since_id=bot_timeline[0]['id'])
print (bot_mentions[0]['text'])
print (bot_mentions[0]['text'].find(bot_name))

countとsince_id(メンションの取得起点となるid)を指定して、メンション情報を取得します。このtextの先頭にボットのスクリーンネームがあればリプライと判定できます。

twython仕様書

適宜下記のtwython仕様書を確認すると良いです。
Developer Interface — Twython 3.8.0 documentation

実装ソースコード

ファイル構成

ファイル名 役割 備考
get_mention.py mentionのデータを取得する
auth.py キー情報を記載する

get_mention.py

#!/usr/bin/env python
# coding: utf-8
import twython

import json
import pprint
from collections import OrderedDict

# twitter configuration
from twython import Twython
from auth import (
    consumer_key,
    consumer_secret,
    access_token,
    access_token_secret
)

twitter = Twython(
    consumer_key,
    consumer_secret,
    access_token,
    access_token_secret
)

def main():
    #pprint.pprint(twitter.verify_credentials())
    bot_credentials = twitter.verify_credentials()
    bot_name = bot_credentials['screen_name']
    bot_timeline = twitter.get_user_timeline(screen_name = bot_name,count = 5)
    print (bot_timeline[0]['id'])
    print (bot_timeline[0]['text'])
    bot_mentions = twitter.get_mentions_timeline(count=10, since_id=bot_timeline[0]['id'])
    print (bot_mentions[0]['text'])
    print (bot_mentions[0]['text'].find(bot_name))


if __name__ == '__main__':
    main()

if __name__ == '__main__':について

auth.py

ツイッターへアクセスするため、下記のような認証コードファイルも必要です。詳細はこちら

#*には各種キーを入れる
consumer_key  = '********'
consumer_secret = '********'
access_token = '********'
access_token_secret = '********'

実行結果例

pi@raspberrypi:~/holy_ground_bot $ python get_mention.py
1053859760078905344
サマーウォーズの聖地は長野県の上田市ですっ!
@Holy_Ground_ こんにちは
1




*1:なお、ネットで検索すると別の定義が出てきますが、APIデータの扱い上は本記事の理解になります。そもそもAPIだとリプライという概念がなさそう。

*2:私は初めて知ったのでJSONデータへのアクセス方法が解らず数時間奮闘しました。