LoginSignup
6
5

More than 1 year has passed since last update.

tweepyによるDM操作

Last updated at Posted at 2021-12-31

はじめに

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

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

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

付け加え

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

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

改訂履歴

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

DMを操作する

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

前提条件

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

DM送信にはReadWriteDirect 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を入力します。

message_idAPI.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を入力します。

message_idAPI.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"があることに注意)

dm_dic_message変数にメッセージデータが、dictionaryオブジェクトとして格納されます。
公式リファレンス

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()

さいごに

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

参考文献

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

6
5
20

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5