PythonでTwitter API v2を叩いてツイートを取得する方法【サンプルコードあり】

2021-04-24
Main Image

目次

こんにちは。

Twitterでつぶやきたいけど、TL(タイムライン)を見て余計な俗な情報を脳にinputしたくないとき、ありますよね。

ということで、Pythonを使ってTwitterの画面を一切見ずにツイートしたり、自分のツイートを確認する方法を試してみました。

今回はTwitter APIの利用登録と、ツイートの取得方法をまとめていきます。

この方法だと、Twitterにアクセスすることなく、ツイートを確認できるようになります。

Twitter APIの利用登録

こちら(https://developer.twitter.com/en/apps)にアクセスし自分のTwitterアカウントでログインします。

Create an Appを押すと、Please apply for a Twitter developer accountとかいうダイアログが出てくるのでApplyを押します。

使用目的を聞かれるので、HobbyistExploring APIにしました。

この後、いくつかApplicationの使用目的を問われるテキストボックスが出てきます。

設問が英語なので、回答も一応英語で書いてみました。設問は100~200文字程度で、多分何を書いても大丈夫だと思います。私はpythonでツイートを分析するとか、1日に数回自動でツイートしてユーザーに情報を知らせる、みたいなことを書きました。

あとは、アプリケーションの作成画面に入れますので、アプリケーション名など基本的な情報を入力して作成します。

Pythonのパッケージをインストールする

Pythonでツイートの読み込みと書き込みをしてみるために、サンプルコードを調べてみました。

こちらのQiita記事が出てきました。

とりあえず、上記の記事を参考に、必要なパッケージをインストールします。

$ pip install requests requests-oauthlib

Pythonで Twitter API v2を使ってみる。

記事で使用しているTwitter APIは古いv1.1対応だったので、v2に対応させてみます。

v2は2020年8月にリリースされたバージョンのようです。

v1.1が2012年にリリースされたそうなので、8年ぶりのアップデートだとか。

認証情報の設定

上の記事のサンプルコードにかかれているCustomer Keyというのは、今はAPI keyと呼ばれているようです。

そこで、config.pyの中身を以下のように名前を置き換えて使用してみました。

AK = config.API_KEY
AS = config.API_SECRET_KEY
AT = config.ACCESS_TOKEN
ATS = config.ACCESS_TOKEN_SECRET
twitter = OAuth1Session(AK, AS, AT, ATS)

必要なキーの情報はTwitter Developer PortalのアプリケーションのSettingsから確認・再発行できます。

エンドポイントURLの設定

エンドポイントのURLをv2のURLに変える必要があります。

MY_ID = config.TWITTER_ID

url = f"https://api.twitter.com/2/users/{MY_ID}/tweets"

v2ではTwitter IDが必要になります。

とりあえず複数のプログラムから参照できるように、自分のIDをconfig.pyに書いておきました。

# Twitter ID
TWITTER_ID = "1368027189870956548"

Twitter IDの調べ方。というかTwitter IDって何。

Twitter IDって何って感じですが、上記のような数字列で、@penguinchordのようなアカウント名とは異なるものです。

APIでユーザを特定するために使用されているようですね。

調べ方はTwitter Developerのドキュメントを見るとPostman使えって書いてありますが、面倒なのでブラウザから調べました。

自分のTwitterページにアクセスし、WebページのソースをブラウザF12で開いてentitiesで検索すると出てきます。

F12はChromeやFireFoxで提供しているDeveloper Toolのショートカットです。

API v2でGETできるTweetsオブジェクトの構造

ツイートを取得するTweetsというAPIの基本的な使い方はこちら(DeveloperリファレンスのTimelines)から調べられます。

Tweetsは主にdataincludesに分かれて入ってきます。

dataの中にツイートの情報が、includesの中にユーザの情報が入っています。

Pythonで自分のツイートを取得してみる

上記のリファレンスを参考に、以下のパラメータを渡してGETしてみました。

params = {
  'expansions'  : 'author_id',
  'tweet.fields': 'created_at,public_metrics',
  'user.fields' : 'name',
  'max_results' : 5,
  }

res = twitter.get(url, params = params)

デフォルトでGetできるのはtext(ツイート文章)くらいですが、パラメータでOptionをつけることができます。

expansionsを指定することで、user.fieldsを連れてこれるようです。

tweets.fieldscreated_atで日付を、public_metricsでリツイート数やいいねの数を取得できます。

user.fieldsincludesに入ってきます。nameが表示される名前で、usernameが@に続くアカウント名ですね。

max_resultsで最大取得数を指定できます。

ここで注意ですが、created_at,public_metricsのように複数渡す場合は、間にスペースを空けないようにします。スペースを空けたりリスト型で渡すと、一つのパラメータを重複して渡していると誤解され、エラーが返ってきます。

GETで取得したレスポンスの中身

さて、上記で取得したres.contentを表示すると、このような中身でした。

{'data': [{'text': 'tweet test from python',
   'public_metrics': {'retweet_count': 0,
    'reply_count': 0,
    'like_count': 0,
    'quote_count': 0},
   'created_at': '2021-04-24T04:59:26.000Z',
   'id': '1385820656713879553',
   'author_id': '1368027189870956548'},
   
   ...

  'includes': {'users': [{'id': '1368027189870956548',
    'name': 'Penta@PenguinChord',
    'username': 'penguinchord'}]},
 'meta': {'oldest_id': '1368438406481543173',
  'newest_id': '1385820656713879553',
  'result_count': 3}}

まだ3件しかツイートしていないので、result_countは3になってますね^^;

取得したツイートを表示してみる

以下のfor文で、上記のresに取得したAPIのGETレスポンスの中身を表示させてみます。

表示させる内容は、ユーザ名と、ツイートした文章と、日付です。

tl = json.loads(res.text)

print(f"name : {tl['includes']['users'][0]['name']}")
print(f"user : {tl['includes']['users'][0]['username']}")
print('----------------------------')

for l in tl['data']:
  print(l['text'])
  print(l['created_at'])
  print('----------------------------')

表示内容は以下のようになりました。

name : Penta@PenguinChord
user : penguinchord
----------------------------
tweet test from python
2021-04-24T04:59:26.000Z
----------------------------
BlogをVercelでデプロイ。
まだ99.8%チュートリアルのまま。
ここからいじっていくのが楽しい。頑張ります〜
2021-03-07T05:50:40.000Z
----------------------------
hello, world!
2021-03-07T05:48:35.000Z
----------------------------

良い感じです。

ツイートを取得するPythonサンプルコード

ここまでをまとめたサンプルコードです。

基本は参考記事のコードを拝借し、v2に対応させました。

import json, config
from requests_oauthlib import OAuth1Session

MY_ID = config.TWITTER_ID

AK = config.API_KEY
AS = config.API_SECRET_KEY
AT = config.ACCESS_TOKEN
ATS = config.ACCESS_TOKEN_SECRET
twitter = OAuth1Session(AK, AS, AT, ATS)

url = f"https://api.twitter.com/2/users/{MY_ID}/tweets"

params = {
  'expansions'  : 'author_id',
  'tweet.fields': 'created_at,public_metrics',
  'user.fields' : 'name',
  'max_results' : 5,
  }

res = twitter.get(url, params = params)
tl = json.loads(res.text)

if res.status_code == 200:
  tl = json.loads(res.text)

  print(f"name : {tl['includes']['users'][0]['name']}")
  print(f"user : {tl['includes']['users'][0]['username']}")
  print('----------------------------')

  for l in tl['data']:
    print(l['text'])
    print(l['created_at'])
    print('----------------------------')
else:
    print("Failed: %d" % res.status_code)

自分以外のツイートを取得してみる

こちら(https://tweeterid.com/)にアカウント名(@に続く文字列)を入力すると、簡単にIDが調べられました。

試しにvercelを入力すると、IDが4686835494とわかります。

上のサンプルの{MY_ID}をこのIDに書き換えると、無事にVercelのツイートが取得できました。

まとめ

というわけで、PythonでTwitter API v2を叩いてツイートを取得する方法をDeveloper登録の方法からまとめてみました。

上記のサンプルコードですぐお試し頂けます。

また、IDを変えれば自分でなくとも好きなアカウントのツイートが取得できました。

これでブラウザからTwitterにアクセスせずにツイートがチェックできますね。

ご参考に。^^

ads【オススメ】未経験からプログラマーへ転職できる【GEEK JOBキャンプ】
▼ Amazonオススメ商品
ディスプレイライト デスクライト BenQ ScreenBar モニター掛け式
スマートLEDフロアライト 間接照明 Alexa/Google Home対応

Author

Penta

都内で働くITエンジニアもどき。好きなものは音楽・健康・貯金・シンプルでミニマルな暮らし。AWSクラウドやデータサイエンスを勉強中。学んだことや体験談をのんびり書いてます。TypeScript / Next.js / React / Python / AWS / インデックス投資 / 高配当株投資 More profile

Location : Tokyo, JPN

Contact : Twitter@penguinchord

Recommended Posts

Copy Right / Penguin Chord, ペンギンコード (penguinchord.com) 2022 / Twitter@penguinchord