2018年10月25日木曜日

Twitterの新しいAPIでダイレクトメッセージを送る(Tweepy編)

Twitterの新しいAPIでダイレクトメッセージを送るでtwurlとTwitterの新しいAPIでダイレクトメッセージを送信したけれど、他にダイレクトメッセージを送信する方法を探していたらTweepyを使う方法を見つけた。TweepyはRaspberry PiとPython3とTwitterでOCRボットを作るのように簡単にTwitterのAPIを使えるPython用ラッパー。ただ、Tweepyは新しいダイレクトメッセージに対応していないので、少し修正を加える必要がある。その手順も含めてTweepyでダイレクトメッセージを送信するまでの手順をまとめておく。


環境


Raspberry Pi (Raspbian Stretch)


※事前にTwitterの開発者向けのページでTwitter APIの利用に必要なAPIキーやトークンなどを取得しておく。


Tweepyインストール


現時点のTweepyの最新バージョン3.6.0をインストールする。pipでインストールすれば最新バージョンがインストールされる。


古いバージョンのTweepyがインストールされている場合は、アップデートしておく。



Tweepyのコードを修正


Tweepyは新しいダイレクトメッセージに対応していないのでコードを修正する。修正方法はDirect Message API changes #1081で紹介されている。

まずはTweepyがインストールされた場所を確認する。


Raspbian Stretchでは/usr/local/lib/python3.5/dist-packages/tweepyにインストールされた。このディレクトリにあるapi.pyとbinder.pyを修正する。

api.pyの修正箇所
Add send_direct_message_new function to send DM

binder.pyの修正箇所
Quick and dirty fix


ユーザーIDの確認


新しいAPIではユーザーIDが必要なので、Tweepyを使ってユーザーIDを確認する。以下のコードで自分のアカウントのユーザーIDとスクリーンネームを確認できる。
import tweepy

# Twitter APIの認証情報
# Twitterの開発者向けのページで取得したキーとトークンを使う
CONSUMER_KEY = 'Consumer Key'
CONSUMER_SECRET = 'Consumer Secret'
ACCESS_TOKEN = 'Access Token'
ACCESS_TOKEN_SECRET = 'Access Token Secret'

# 認証情報の設定
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)

# ユーザーIDの確認
tl = api.user_timeline()
print('User ID = ', tl[0].user.id_str)
print('Screen Name= ', tl[0].user.screen_name)


修正したTweepyでダイレクトメッセージを送信する


api.pyとbinder.pyの修正が済んだら、ダイレクトメッセージを送信してみる。以下のコードで送信できる。

import tweepy

# Twitter APIの認証情報
# Twitterの開発者向けのページで取得したキーとトークンを使う
CONSUMER_KEY = 'Consumer Key'
CONSUMER_SECRET = 'Consumer Secret'
ACCESS_TOKEN = 'Access Token'
ACCESS_TOKEN_SECRET = 'Access Token Secret'

ID = 'ユーザーID'

# 認証情報の設定
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)

# ダイレクトメッセージで送るメッセージ
text = 'Hello!'

#ダイレクトメッセージの送信
event = {
  "event": {
    "type": "message_create",
    "message_create": {
      "target": {
        "recipient_id": ID
      },
      "message_data": {
        "text": text
      }
    }
  }
}
api.send_direct_message_new(event)


2 件のコメント:

  1. こちら、参考にさせていただき、ツイート、メッセージの送信することができました!
    ありがとうございます!

    返信削除
    返信
    1. お役に立てて何よりです。

      削除