tweepyによるDM操作

# はじめに
tweepyはTwitter APIを簡単に利用できるようにしたPythonのライブラリです。tweepyの機能は色々あるのですが、今回はDM(Direct Message)の機能について説明します。

:::note info
tweepyでDMを操作することはできないと書かれている記事があったのですが、公式ドキュメント見ると普通に出来るんですがね。どこの情報ですかね。。。
:::

:::note alert
本記事を悪用してスパムDMなどを不特定多数の人に大量送信すると、アカウント凍結の原因となります。絶対に悪用してはいけません。
また、Twitter APIはDMの制限が若干キツめなので短時間に色々やるとAPIに制限がかかる可能性があります。余裕を持って実行してください。
:::

### 付け加え
 - この記事はtweepyの最新バージョン(2021/12/31現在)に対応しております。
 - この記事ではDM操作の基本的な機能のみ説明しております。細かい機能についての説明はしていません。
 - APIのバージョンは**必ず1.1**を使ってください。**2.0ではエラー**になります。

:::note warn
本記事のようにソースコード内にトークンを直接書くのはオススメしません。
:::


### 改訂履歴
 - 2022/05/22 「DMの取得(2)」を訂正しました。
 - 2022/12/13 コメントにてご質問を受けた部分の説明を追加しました。

# DMを操作する
それでは早速DMを操作してみます。

前提条件

 - Twitter Developerに登録していること
 - Python3が動作するサーバー・PCがあること
 - tweepyライブラリがpipでインストールされていること

:::note warn
DM送信には`Read`、`Write`、`Direct Message`の権限が必要です。この記事のコードを実行してもDMが送信できないなどと文句を言う前に、API権限をよく確認しましょう。
:::

## DM送信
tweepyでDMを送信します。
DMを送信するには、`API.send_direct_message`を使います。

 - `recipient_id`には送信したい相手のIDを入力します。（`Screen Name`のことではありません。）
 - `message`には相手に送信したいメッセージを入力します。

実行例

```send_dm.py
import tweepy

def main():
    # API Key
    consumer_key = "xxxx"
    consumer_secret = "xxxx"
    access_token = "xxxx"
    access_token_secret = "xxxx"
    # 認証処理等
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    api = tweepy.API(auth)
    # 送信したいメッセージ
    message = "Hello, World!"
    recipient_id = 0000000000000000
    result = api.send_direct_message(recipient_id=recipient_id, text=message)
    print(result.id) # このIDは後々使います。

    
if __name__ == "__main__":
    main()
```

## DM削除
tweepyで送信したDMを削除します。（※自分から消えるだけで相手には残ります。）
DMを削除するには、`API.delete_direct_message`を使います。

 - `message_id`には削除したいDMのIDを入力します。

:::note
`message_id`は`API.send_direct_message`を実行したときに返される、`DirectMessage`オブジェクトに含まれています。
よく分からなければ、本記事のDM送信のコードを実行したときに表示されるIDを入力してください。
:::


実行例

```delete_dm.py
import tweepy

def main():
    # API Key
    consumer_key = "xxxx"
    consumer_secret = "xxxx"
    access_token = "xxxx"
    access_token_secret = "xxxx"
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    api = tweepy.API(auth)
    message_id = 0000000000000000
    api.delete_direct_message(id=message_id)
    
if __name__ == "__main__":
    main()
```

## DMの取得
tweepyで特定のDMの内容を取得します。
特定のDMを取得するには、`API.get_direct_message`を使います。

 - `message_id`には取得したいDMのIDを入力します。

:::note
`message_id`は`API.send_direct_message`を実行したときに返される、`DirectMessage`オブジェクトに含まれています。
よく分からなければ、本記事のDM送信のコードを実行したときに表示されるIDを入力してください。
:::


実行例

```get_dm.py
import tweepy

def main():
    # API Key
    consumer_key = "xxxx"
    consumer_secret = "xxxx"
    access_token = "xxxx"
    access_token_secret = "xxxx"
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    api = tweepy.API(auth)
    message_id = 0000000000000000
    print(api.get_direct_message(id=message_id))
    
if __name__ == "__main__":
    main()
```

## DMの取得(2)
tweepyでDMを取得します。
※上記とは違い、過去30日以内のすべてのダイレクトメッセージイベント（送信と受信の両方）を取得します。時系列の逆順に並べ替えられます。上記は指定されたIDのメッセージのみの情報を返します。
DMを取得するには`API.get_direct_messages`を使います。（"s"があることに注意）

:::note
`dm_dic_message`変数にメッセージデータが、`dictionary`オブジェクトとして格納されます。
[公式リファレンス](https://developer.twitter.com/en/docs/twitter-api/v1/direct-messages/sending-and-receiving/api-reference/list-events)

:::

```get_dm2.py
import tweepy

def main():
    # API Key
    consumer_key = "xxxx"
    consumer_secret = "xxxx"
    access_token = "xxxx"
    access_token_secret = "xxxx"
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    api = tweepy.API(auth)
    dm_obj = api.get_direct_messages()
    for dm_object in dm_obj:
        dm_dic = dm_object.message_create
        dm_dic_message = dm_dic['message_data']
        message = dm_dic_message['text']
        print(message)
    
if __name__ == "__main__":
    main()
```

# さいごに
全ての動作確認はできていないので、不具合があれば教えてほしいです。

# 参考文献
 - [tweepy公式ドキュメント](https://docs.tweepy.org/en/stable/index.html)

有志による日本語翻訳のドキュメントは最新バージョンに対応できていないので、参考にしておりません。