【Python×Twitter】TwikitでらくらくSNS運用

TwitterをPythonで運用したい人向けの記事です。
Python初心者の方でもコードをコピペして実行できるような記事を心がけます。



:::note
この記事では、Python3.12.2での動作確認のみ行なっています。
Twikitのアップデートで動作しなくなる場合もありますのでご注意ください。
:::

# Twikitの導入
まず、今回メインで使用するTwikitについて説明します。
Twikitは、TwitterのAPIを簡単に操作できるようにするライブラリです。
Pythonで有名なtweepyと違うのは、APIキーなどの発行が不要なことです。
tweepyだと開発者ポータルから申請する必要がありますが、
twikitなら必要なのはユーザー名とパスワードだけです。

https://github.com/d60/twikit

twikitはpipを使ってインストールできます。
```:Terminal
pip install twikit
```

# Twikitの使い方
簡単な英語とPythonの文法が理解できればすぐに使えます。

## ログイン
Twikitでは検索をするにしてもログインが必須です。
入力するべきパラメータは以下を参考にしてください。
| パラメータ | 入力するべき値 | 必須
|:-:|:-:|:-:|
| auth_info_1  | ユーザー名, メールアドレス, 電話番号  | はい
| auth_info_2*  | ユーザー名, メールアドレス, 電話番号  | いいえ
| password  | パスワード  | はい

```python:main.py
from twikit import Client

client = Client("ja-JP")

client.login(auth_info_1="メールアドレス",
             password="パスワード")
```
`client.login` を使ってログインできます。
ただし、ログインするたびにアカウントに通知がいくので注意です。
![スクリーンショット 2024-03-26 17.30.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756376/5adad036-e303-270e-8fd6-6c713411eb54.png)
これの対策方法は、ログイン後に*クッキー*を保存しておくことです。
twikit ではクッキーの書き込みと読み込みができます。
```python:main.py 初回保存
# with文で書き込む方法もあるが、今回は省略
from twikit import Client

client = Client("ja-JP")

client.login(auth_info_1="メールアドレス",
             password="パスワード")

# ログイン情報を cookies.json に保存する
client.save_cookies("cookies.json")
```
上記コードでは、通常通りログイン後、`cookies.json`への保存を行なっています。

```python:main.py クッキーからログイン
from twikit import Client

client = Client("ja-JP")

# ログイン情報を cookies.json から読み込む
client.load_cookies("cookies.json")

# 処理
# ...
```
*クッキー*を読み込むことでログインの処理が省けるので色々メリットがあります。

1. アカウントが凍結されづらくなる
2. ログイン処理を省くので新規ログイン通知が来なくなる
2. ログイン処理を省くのでちょっとだけ速くなる

## ツイート
Twikitを使ってPythonからツイートしてみましょう。
Twikitでは画像や投票も追加できます。

![anatomy-of-poll---before-voting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756376/b67ecc00-ae95-d754-8d5c-5a2143cf6d3a.png)

試しに、「テストツイート」とツイートするコードを書いてみましょう。
```python:main.py
from twikit import Client

client = Client("ja-JP")
client.load_cookies("cookies.json")

# ツイートを作成
client.create_tweet("テストツイート")
```
`client.create_tweet` を使うことでツイートを行うことができます。
次は、画像や動画付きでツイートしてみましょう。

```python:main.py
from twikit import Client

client = Client("ja-JP")
client.load_cookies("cookies.json")

# ローカルの画像をツイート
media_list = [
    client.upload_media("media1.png"),
    client.upload_media("media2.mp4", wait_for_completion=True)
]

client.create_tweet("テストツイート", media_list)
```
ローカルから画像を投稿するには `client.upload_media` を使う必要があります。
また、動画などのサイズの大きいファイルは`wait_for_completion`をTrueにするのがおすすめです。(ファイルが完全にアップロードされるまで待機してくれます)

## ツイート検索
Twikitではアプリのように話題、最新、メディアからツイートを検索できます。

試しに、「大谷翔平」というキーワードを含んだツイートを検索してみましょう。
```python:main.py
from twikit import Client

client = Client("ja-JP")
client.load_cookies("cookies.json")

tweets = client.search_tweet("大谷翔平", "Latest")
for tweet in tweets:
    print("-------------------------------")
    print(tweet.text)
```
`client.search_tweet`でツイートを検索することができます。
今回は最新のツイートを検索したいので`"Latest"`ですが`"Topic"`にすることで話題のツイートも検索できます。また、`for tweet in tweets`のようにしてTweetオブジェクトを取り出し、必要な要素を出力するのが通常の使い方です。
今回のコードでは、Tweetオブジェクトから本文をプリントしています。
実行結果は以下の画像をご確認ください。
![スクリーンショット 2024-03-26 18.02.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756376/7a88aad6-20bb-c888-17c0-a40484653dcb.png)

また、特に指定しない場合は20個のツイートを取得するのでご注意ください。
パラメータ`count`で1〜20ツイートまで取得できます。

:::note warn
パラメータcountは「返ってくる値の数」を制限するだけです。
実際はAPIから20個のツイートを取得しているので、API制限の回避には有効的ではありません。
:::

「おはよう」というツイートを検索して、5個のツイートをいいねしてみましょう。
```python:main.py
from twikit import Client

client = Client("ja-JP")
client.load_cookies("cookies.json")

tweets = client.search_tweet("おはよう", "Latest", 5)
for tweet in tweets:
    tweet.favorite()
```
3つ目のパラメータ`count`に5を指定することで、ツイート数を5個までに制限しています。また、`tweet.favorite()`でツイートをいいねできます。
リツイートは `tweet.retweet()` など直感でわかりやすい関数名になっています。

## ユーザー検索
Twikitでのユーザー検索を解説します。

試しに、「田中」というクエリ(キーワード)を含んだユーザーを検索してみましょう。
```python:main.py
from twikit import Client

client = Client()
client.load_cookies("cookies.json")

users = client.search_user("田中")
for user in users:
    # ユーザーネームとスクリーンネームをプリント
    print(user.name, user.screen_name)
```
`client.search_user`でユーザーを検索できます。検索したユーザーネームとスクリーンネームをプリントしています。
![スクリーンショット 2024-03-27 18.29.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756376/b6767334-8e25-adf7-5b41-a6d56714611f.png)

次に、スクリーンネームから検索してみましょう。
スクリーンネームは、`@`から始まるやつです。
```python:main.py
from twikit import Client

client = Client()
client.load_cookies("cookies.json")

user = client.get_user_by_screen_name("reqeeee")
print(user.name)
```
`client.get_user_by_screen_name`でスクリーンネームからUserオブジェクトを取得できます。
パラメータ`screen_name`には`@`を抜いた値を入れてください。

<details>
<summary>@ を入れてしまったら</summary>

```python:main.py
from twikit import Client

client = Client()
client.load_cookies("cookies.json")

user = client.get_user_by_screen_name("@reqeeee")
print(user.name)

# ---------------------
>>> main.py

KeyError: 'user'
```
このように、正しい値を入力しないとKeyErrorが

</details>

## タイムライン検索
Twikitでの、タイムライン取得を解説します。

試しに、アプリ内での「おすすめ」からツイートのいいね数を取得してみましょう。

```python:main.py
from twikit import Client

client = Client()
client.load_cookies("cookies.json")

tweets = client.get_timeline()
for tweet in tweets:
    print(f"いいね数: {tweet.favorite_count}")
```
`client.get_timeline()`でおすすめのツイート(タイムライン)を取得することができます。`tweet.favorite_count`でツイートのいいね数を取得できます。

![スクリーンショット 2024-03-27 18.54.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756376/7058e250-e26c-a0db-f24a-4a7ea681f646.png)

次に、アプリ内での「フォロー中」からツイートのリツイート数を取得してみましょう。

:::note alert
Twikitのバグか、私の環境が悪いのか不明ですが、執筆時点ではコードを実行してもエラーが発生します。
:::

```python:main.py
from twikit import Client

client = Client()
client.load_cookies("cookies.json")

tweets = client.get_latest_timeline()
for tweet in tweets:
    print(f"リツート数: {tweet.retweet_count}")
```
`client.get_latest_timeline()`でフォロー中のツイートを取得することができます。
`tweet.retweet_count`でツイートのリツイート数を取得できます。

## Tips
### レートリミット(API制限)
頻繁に検索したり、いいねをしすぎると[API制限](https://developer.twitter.com/ja/docs/twitter-api/v1/rate-limits)になります。
ここでは詳細な制約などを解説します。

一般的には15分間隔で制限がリセットされます。

| アクション | 回数(15分) |
|:-:|:-:|
| ツイートの投稿, 削除  | 50  |
| タイムラインの取得  | 900  |
| ユーザー検索  | 75  |
| リストの作成  | 300  |
| リストの削除  | 300  |
| リストの更新  | 300  |
| フォロー、フォロワー取得  | 15  |
| DMの取得  | 15  |

ただ、いいねは24時間で1000件という制限があります。
細かい制限は以下のサイトを参考にしてください。

https://developer.twitter.com/ja/docs/twitter-api/v1/rate-limits

知りたいことは大体書いてます。
![スクリーンショット 2024-03-27 13.44.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756376/7bb63954-c247-c6e5-b4ce-3881b4458ea0.png)

# 最後に
Twikitでほとんど完結するぐらい色んなことができるので、ぜひお試しください。
パッと書いた記事なので、定期的に更新していく予定です。

Python中級者の方であればドキュメントを読んで複雑なコードも書けるはずです。

https://twikit.readthedocs.io/en/latest/