TwitterAPIを使って特定のワードを検索し、ブログ埋め込み用のHTML形式で出力するプログラム【Python】

 コンピュータ  718

はじめに

 前回は、OpenAIのAPIを使用して、要約記事を生成し、WordPressに自動投稿するPythonプログラムを作成した。 今回は、TwitterのAPIを使用して、特定のワードのツイートを検索し、HTML形式に整形するPythonプログラムを作成した。

プログラムの内容

 このプログラムは、Twitter APIを使用し、特定のワードにマッチするツイートを検索し、WordPressなどのブログに掲載するためのHTML形式でデータを出力するものである。

 まず、リストから検索ワードを順番に取り出し、それぞれに対してTwitter APIにアクセスする。APIにアクセスするためにはクエリパラメーターが必要なので、query_params変数を設定する。

 APIから取得したデータは、filterd_tweets関数に渡して、ブログに掲載するために必要な情報を抽出する。そして、取得したデータはjson_dataに追加され、最終的にツイートデータやHTMLなどを含んだjson形式のデータが出力される。

例えば、上記のような埋め込み用のHTMLを出力するためのプログラムである。

filterd_tweets関数

 今回のプログラムでキーとなる関数である。Twitter APIから取得したツイートデータから、HTML形式にするために必要な情報を抽出する。引数として受け取ったデータには、検索にマッチした複数のツイートが含まれているので、それらのツイートから、投稿者のusername、ツイートのURL、oEmbed形式のHTMLを抽出し、返り値として辞書型でまとめて返す。

def filterd_tweets(data):
    """
    ツイートから必要な情報を抽出する関数
    Args:
        data (dict): ツイートを含むデータ
    Returns:
        filtered_tweets (dict): 抽出した情報を格納した辞書
    """
    filtered_tweets = {}
    if not 'data' in data: return
    for tweet in data['data']:
        try:
            if 'public_metrics' in tweet:
                # ツイートを投稿したユーザーの情報を取得
                search_user_url = "https://api.twitter.com/2/users/{}".format(tweet['author_id'])
                user_data = connect_to_endpoint(search_user_url,'')
                username = user_data['data']['username']
                tweet_url = "https://twitter.com/{}/status/{}".format(username,tweet['id'])
                # oEmbed形式のHTMLを取得
                oembed = requests.get('https://publish.twitter.com/oembed?url{}'.format(tweet_url)).json()
                tweet['html'] = oembed['html']
                filtered_tweets = tweet
        except ValueError:
            continue

    return filtered_tweets

プログラム全体のソースコード

# coding: utf-8
import requests

# Twitter APIのBearer Token
bearer_token = "<your_bearer_token>"

# 検索用のURL
search_url = "https://api.twitter.com/2/tweets/search/recent"

# 検索したいキーワードのリスト
keyword_list = ['Keyword1', 'Keyword2','Keyword3']

def filterd_tweets(data):
    """
    ツイートから必要な情報を抽出する関数
    Args:
        data (dict): ツイートを含むデータ
    Returns:
        filtered_tweets (dict): 抽出した情報を格納した辞書
    """
    filtered_tweets = {}
    if not 'data' in data: return
    for tweet in data['data']:
        try:
            if 'public_metrics' in tweet:
                # ツイートを投稿したユーザーの情報を取得
                search_user_url = "https://api.twitter.com/2/users/{}".format(tweet['author_id'])
                user_data = connect_to_endpoint(search_user_url,'')
                username = user_data['data']['username']
                tweet_url = "https://twitter.com/{}/status/{}".format(username,tweet['id'])
                # oEmbed形式のHTMLを取得
                oembed = requests.get('https://publish.twitter.com/oembed?url{}'.format(tweet_url)).json()
                tweet['html'] = oembed['html']
                filtered_tweets = tweet
        except ValueError:
            continue

    return filtered_tweets

def bearer_oauth(r):
    """
    Twitter APIの認証に必要なヘッダーを追加する関数
    Args:
        r (requests.PreparedRequest): APIに送信するリクエスト
    Returns:
        r (requests.PreparedRequest): APIに送信するリクエスト(ヘッダーを追加した)
    """
    r.headers["Authorization"] = f"Bearer {bearer_token}" # Bearerトークンを追加
    r.headers["User-Agent"] = "v2RecentSearchPython" # User-Agentを追加
    return r

def connect_to_endpoint(url, params):
    """
    Twitter APIに接続し、データを取得する関数
    Args:
        url (str): アクセスするAPIのURL
        params (dict): クエリパラメーター
    Returns:
        json: APIから取得したデータ
    """
    # APIにアクセスし、データを取得
    response = requests.get(url, auth=bearer_oauth, params=params)
    # HTTPステータスが200でなかった場合は例外を発生
    if response.status_code != 200:
        raise Exception(response.status_code, response.text)
    # JSON形式でデータを返す
    return response.json()

def main():
    """
    main関数
    """
    json_data = []
    # キーワードリストから検索を実行
    for keyword in keyword_list:
        # クエリパラメーターを設定
        query_params = {'query': keyword,'tweet.fields': 'author_id,public_metrics','user.fields':'username','max_results':100}
        # APIにアクセスし、データを取得
        data = filterd_tweets(connect_to_endpoint(search_url, query_params))
        # 取得したデータをjson_dataに追加
        if data:
            json_data.append(data)
    # 取得したデータを出力
    print(json_data)
    
if __name__ == "__main__":
    main()

おわりに

 TwitterのAPIの仕様は複雑であり、こんな短いプログラムではあるが作成には時間がかかった。今回のプログラムの作成にもChatGPTを使用したが、ChatGPTがTwitterのAPIの仕様を理解していなかったので、プログラムの作成には特に役立つ答えが得られなかった。しかし、ソースコードを公開するためにライブラリの説明や関数の説明を追加する作業には非常に役立った。

参考

Twitter公式 Developper Platform
https://developer.twitter.com/en/docs/twitter-api/tweets/search/api-reference/get-tweets-search-recent



関連記事