tweepyを使って特定ユーザーのtweetの情報を取得しよう！！

# 概要(こんな人におすすめ)
- tweepyを使用して、いろんなユーザーのtwitterの情報を取得したい
    - 特に画像や動画などのメディア情報
- 例として、最近気になっている著名な方の画像集めたいとか、過去にどんなツイートしているか知りたいなど
    - twitter japanさんのツイート情報を引用
    - 下記画像の本文だったり写真だったりを取得することを目的としています！！(実際はもっといろいろな情報を取得することができます)
    - ![スクリーンショット 2023-06-17 17.57.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701238/36bebd4e-9e70-efd1-6c43-f48cbbf71db8.png)


# 実際のソースコード
- 注意点
    - twitter APIを使用するには別途使用するための登録が必要になります([リンク](https://developer.twitter.com/ja/docs/twitter-ads-api/getting-started))

```key.env
consumer_key = ""
consumer_secret = ""
access_token = ""
access_token_secret = ""
```

```python:main.py
import tweepy
import os
from dotenv import load_dotenv
import re
import csv


# .envファイルの内容を読み込見込む
load_dotenv(
    "/<path to directory>/key.env"
)

# os.environを用いて環境変数を表示させます
API_Key = os.environ["consumer_key"]
API_Sec = os.environ["consumer_secret"]
Token = os.environ["access_token"]
Token_Sec = os.environ["access_token_secret"]


# Twitterオブジェクトの生成
auth = tweepy.OAuthHandler(API_Key, API_Sec)
auth.set_access_token(Token, Token_Sec)
api = tweepy.API(auth, wait_on_rate_limit=True)


def get_user_info_list(screen_name="TwitterJP"):
    """
    twitter上の表示名からユーザーのIDを取得する
    返却値のタイプはtweepy.models.Userで、整形してリストにする
    ※返却値の中にクラスのようなものがあり、「._json」で取得できる
    """
    user_info = api.get_user(screen_name=screen_name, include_entities=True)
    user_info_list = [
        user_info._json["name"],
        user_info._json["id"],
        user_info._json["location"]
        if user_info._json["location"]
        else "位置設定なし",
    ]
    return user_info_list


def get_user_timeline(user_id: str):
    """
    特定ユーザーのツイートの一覧を取得
    引数はユーザーID
    """
    data_list = []
    user_timeline_Cursor = tweepy.Cursor(
        api.user_timeline,
        user_id=user_id,
        trim_user=True,
        count=200,
        tweet_mode="extended",
        # include_rts=False,
    ).items()
    for tweet in user_timeline_Cursor:
        data = []
        try:
            data.append(tweet._json["id_str"])
            exclude_url = tweet._json["entities"]["media"][0]["url"]
            url_pattern = re.compile(r"{0}".format(exclude_url))
            data.append(url_pattern.sub("", tweet._json["full_text"]))
            data.append(
                [
                    {"media_type": tw["type"], "url": tw["media_url_https"]}
                    for tw in tweet._json["extended_entities"]["media"]
                ]
            )
            data_list.append(data)
        except KeyError:
            continue
    return data_list

screen_name = input("ユーザーのスクリーンネームを入力してください: ")
search_user_name = get_user_info_list(screen_name=screen_name)
csv_data = get_user_timeline(user_id=search_user_name[1])

with open("./{0}.csv".format(screen_name), "w") as f:
    writer = csv.writer(f)
    writer.writerow(["id", "description", "media"])
    writer.writerows(csv_data)
```

<details><summary>レスポンスのサンプル(jqで変換できなかったので雑ですみませんmm)</summary><div>

```json
{'created_at': 'Tue Nov 01 04:31:46 +0000 2022', 
'id': 1587301348604841987, 
'id_str': '1587301348604841987', 
'full_text': 'ジブリさん (@JP_GHIBLI) に書き下ろしていただいたヘッダーを、ジブリパークのオープンを記念して、みなさんにも使っていただけることになりました🤩\n\n常識の範囲内でつかって下さい。 https://t.co/HQ94KU3YAI', 
'truncated': False, 
'display_text_range': [0, 94], 
'entities': {'hashtags': [], 'symbols': [], 
'user_mentions': [{'screen_name': 'JP_GHIBLI', 
'name': 'スタジオジブリ STUDIO GHIBLI', 
'id': 1335850917258641409, 'id_str': '1335850917258641409', 
'indices': [7, 17]}], 'urls': [], 
'media': [{'id': 1587301346142822400, 'id_str': '1587301346142822400', 
'indices': [95, 118], 
'media_url': 'http://pbs.twimg.com/media/Fgc6KhhXoAAM92W.jpg', 
'media_url_https': 'https://pbs.twimg.com/media/Fgc6KhhXoAAM92W.jpg', 
'url': 'https://t.co/HQ94KU3YAI', 
'display_url': 'pic.twitter.com/HQ94KU3YAI', 
'expanded_url': 'https://twitter.com/TwitterJP/status/1587301348604841987/photo/1', 
'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 
'large': {'w': 1500, 'h': 500, 'resize': 'fit'}, 
'small': {'w': 680, 'h': 227, 'resize': 'fit'}, 
'medium': {'w': 1200, 'h': 400, 'resize': 'fit'}}}]}, 
'extended_entities': {'media': [{'id': 1587301346142822400, 
'id_str': '1587301346142822400', 'indices': [95, 118], 
'media_url': 'http://pbs.twimg.com/media/Fgc6KhhXoAAM92W.jpg', 
'media_url_https': 'https://pbs.twimg.com/media/Fgc6KhhXoAAM92W.jpg', 
'url': 'https://t.co/HQ94KU3YAI', 
'display_url': 'pic.twitter.com/HQ94KU3YAI', 
'expanded_url': 'https://twitter.com/TwitterJP/status/1587301348604841987/photo/1', 
'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 
'large': {'w': 1500, 'h': 500, 'resize': 'fit'}, 
'small': {'w': 680, 'h': 227, 'resize': 'fit'}, 
'medium': {'w': 1200, 'h': 400, 'resize': 'fit'}}}]}, 
'source': '<a href="https://www.sprinklr.com" rel="nofollow">Sprinklr</a>', 
'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 
'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 
'in_reply_to_screen_name': None, 'user': {'id': 7080152, 
'id_str': '7080152'}, 'geo': None, 'coordinates': None, 'place': None, 
'contributors': None, 'is_quote_status': False, 'retweet_count': 1149, 
'favorite_count': 5506, 'favorited': False, 'retweeted': False, 
'possibly_sensitive': False, 'lang': 'ja'}
```
</div></details>


## コードの解説
- 使い方・概要
  - key.envファイルはmain.pyと同じ階層に保存してください
  - 処理の流れとしては
    1. ツイートを取得したいユーザーの名前を入力する
    1. 1の情報で`get_user_info_list`関数を呼び出し、次のステップで必要になるユーザーIDを取得する
        - この時点で取得したい情報を変更したい場合はコードをいじることで抽出する内容を変更することができる
    1. 2の情報で`get_user_timeline`関数を呼び出しで特定のユーザーのツイートを取得する
        - この時点で取得したい情報を変更したい場合はコードをいじることで抽出する内容を変更することができる
        - csvのヘッダーも合わせて変更しないとズレるので注意
    1. 3で取得した内容をcsvに書き出す
- 気になった点
  - key.envファイルにkey情報を書き込んでいますが、自己利用の範疇などであれば特に切り出す必要なさそうかなと思いました

# 最後に
メモ程度になってしまいましたが、twitterのキー情報さえあれば今回記載したコードはそのまま動きますので、twitter api入門の方など良ければ使っていただければと思いますmm