1001001

73。CTFのWrite-upや技術的な備忘録を書きとめたいです。

PythonのRequestsでTwitter APIを叩く

PythonTwitter用のライブラリ等を使わずにRequestsでAPIを叩く方法のメモ.やりたいことは「ある一つのアカウントのツイートを定期的に通知したい」だけなので,Bearer tokenを取得して GET statuses/user_timeline API を定期的に叩いて新しいツイートを取得すれば良い.

TL;DR

requestsでAPIを叩くコード.このコードではBearer Tokenの取得とTwitterアカウント「CVEnew」のタイムラインを取得している.コメントアウトしているcountの値で取ってくるツイート数を操作できる.



手順

以下のような手順で行います.1. がTwitter社のサイトで行うもので,2. 3.がプログラムで行うものです.

  1. Consumer Key (API Key), Consumer Secret (API Secret)を取得する為にTwitter appsでアプリを追加
  2. APIを叩くのに使うBearer tokenをPOST oauth2/token APIとConsumer Key (API Key), Consumer Secret (API Secret)を用いて取得
  3. Bearer tokenとGET statuses/user_timeline APIを使って特定アカウントのツイートを取得

各手順の説明の前に,Twitter APIを使う際に必要になるkeyやtokenについて少しまとめておきます.
(違う部分がありましたらご指摘お願いします.)

keyやtoken

以下のようなkeyやtokenがあります.

  • Consumer Key (API Key)
  • Consumer Secret (API Secret)
  • Access Token
  • Access Token Secret
  • Bearer Token
Consumer Key (API Key)

Twitter APIを使うには認証 (ユーザ認証,アプリケーション認証)を行う必要がありますが,その認証に必要になるAPI Keyです.
Twitter appsにアプリケーションを登録し取得します.

Consumer Secret (API Secret)

Twitter APIを使うには認証 (ユーザ認証,アプリケーション認証)を行う必要がありますが,その認証に必要になるAPI Secretです.
Twitter appsにアプリケーションを登録し取得します.

Access Token

上述した認証のうちユーザ認証に使用します.Access TokenとAccess Token Secretを取得してユーザ認証を行うことができると,そのユーザの詳細な,あるいは非公開の情報にアクセスすることができます.
開発者自身のユーザ認証に使用するAccess TokenはTwitter appsに登録したアプリケーションのページから取得できます.開発者自身以外 (Twitter APIを使うサービスを利用するユーザなど)のAccess TokenはAPIを使って取得します.

Access Token Secret

上述した認証のうちユーザ認証に使用します.Access TokenとAccess Token Secretを取得してユーザ認証を行うことができると,そのユーザの詳細な,あるいは非公開の情報にアクセスすることができます.
開発者自身のユーザ認証に使用するAccess Token SecretはTwitter appsに登録したアプリケーションのページから取得できます.開発者自身以外 (Twitter APIを使うサービスを利用するユーザなど)のAccess Token SecretはAPIを使って取得します.

Bearer Token

上述した認証のうちアプリケーション認証に使用します.取得はPOST oauth2/token APIとConsumer Key (API Key), Consumer Secret (API Secret)を用いて行います.
アプリケーション認証はユーザ認証ではないので,ユーザの詳細な,あるいは非公開な情報にはアクセスできません.その代わり,公開情報 (鍵垢でないユーザのツイートなど)はBearer Token一つさえあれば取得することが可能です.

つまり,

  • 公開情報にアクセスする場合はBearer Tokenを取得した上でAPIを使う
  • ユーザの非公開情報にアクセスする場合は都度そのユーザのAccess Token, Access Token Secretを取得してAPIを使う

という使い分けになります.

そして今回私が行いたいのは,「鍵垢でないユーザのツイートを定期的に取得する」ことなので,アプリケーション認証を行うためのBearer Tokenが取得できれば良さそうです.

ここからは上述した手順の説明に移ります.

Consumer Key (API Key), Consumer Secret (API Secret) の取得

これらを取得するには,Twitter appsでアプリを追加する必要があります.他のサービスでもよくありますが,「このアプリでこのAPIを使うで」というのを登録し,そのアプリケーションに対してKeyやSecretを発行してもらいます.

登録手順とConsumer Key, Consumer Secretの取得方法については以下のサイトが参考になります.
(同じサイトの別セクションなので上の方をスクロールすれば下のもあります.)

Bearer Tokenの取得

Bearer Tokenの取得はPOST oauth2/token APIを使います.以下のように取得できます.

# ref: https://developer.twitter.com/en/docs/basics/authentication/api-reference/token
headers = { "Content-Type" : "application/x-www-form-urlencoded;charset=UTF-8" }
data = { "grant_type":"client_credentials" }
oauth2_url = "https://api.twitter.com/oauth2/token"
r = requests.post(oauth2_url, data=data, headers=headers, auth=(config.CONSUMER_KEY, config.CONSUMER_SECRET))
bearer_token = r.json()["access_token"]
print("[*] Bearer token:", bearer_token, "\n")

Twitter appsで取得したConsumer KeyとConsumer Secretを使います.APIの詳細はコメントアウトのドキュメントをご覧ください.

User Timelineの取得

上で取得したBearer Tokenと,GET statuses/user_timeline APIを使って以下のように取得します.

# ref: http://benalexkeen.com/interacting-with-the-twitter-api-using-python/
# ref: https://developer.twitter.com/en/docs/tweets/timelines/api-reference/get-statuses-user_timeline.html
username = "CVEnew" # anything
url = "https://api.twitter.com/1.1/statuses/user_timeline.json"
headers = {
    "Authorization": "Bearer {}".format(bearer_token)
}
params = {
    "screen_name": username,
    #"count": 1,
}

r = requests.get(url, headers=headers, params=params)
tweets = r.json()

print(tweets[0])

以上の手順を行うことで特定ユーザのタイムラインを取得できます.
一連の操作を行うプログラムは記事上部のTL;DRを参考にしてください.

まとめ

以下の手順を行うことで,Pythonのライブラリを使わずにAPIを叩く形でUser Timelineを取得できます.

  • Consumer Key と Consumer SecretをTwitter appsから取得
  • POST oauth2/token APIでBearer Tokenを取得
  • GET statuses/user_timeline APIでUser Timelineを取得