Twitter API で自身のアカウントの最新ツイートを取得する

こんにちは @ketancho です。以前、Twitter ボットを作って運用するのは勉強になりますよー、と書きました。

www.ketancho.net

これまで私が作った Twitter Bot は「ツイートする」機能のみを使うものばかりだったのですが、「自分のタイムラインから過去のツイートを取得する」機能が必要なボットを作りたくなったので、そのあたりの実装メモをポストしたいと思います。取得条件は、

  • 自分のツイートのうち、その時点で最新のもののテキスト部分がほしい
  • ただし、RT や他の人への Reply は除いた「最新」が取りたい

です。

直近ツイートを取得する機能はあるだろうなーと思っていたので、最悪20ほど直近ツイートを取得し、上から順になめて "RT" 始まりのものと "@" 始まりではないものをクルクル探していけば、最低限の要件は満たせるかなと考えていましたが、調べてみると思いの外簡単に取得することができました。

GET statuses/user_timeline を使う

developer.twitter.com

まず GET statuses/user_timeline を使うことで、自分の直近ツイートを取得することができます。上のドキュメントを見ると、ユーザーが渡せるパラメータ一覧が書いてあるのですが、

  • count: 取得するツイートの数を指定
  • exclude_replies: Reply を除外するか
  • include_rts: RT を含めるか

といったものがあり、私がやりたかったことが全てできそうな雰囲気です。Twitter API すばらしい。

コード化してみる

Python で実装していきます。最終的には AWS Lambda 上で動かしたいので、こんなコードになっています。実装のベースは下記の記事もあわせてご覧いただければと思います。

www.ketancho.net

import os
import json
from requests_oauthlib import OAuth1Session

CK = os.environ['CK'] # * enter your Consumer Key *
CS = os.environ['CS']  # * enter your Consumer Secret *
AT = os.environ['AT'] # * enter your Access Token *
AS = os.environ['AS'] # * enter your Accesss Token Secert *

twitter = OAuth1Session(CK, CS, AT, AS)

def lambda_handler(event, context):
    newest_tweet = _get_newest_tweet()['text']
    print(newest_tweet)

def _get_newest_tweet():
    url = 'https://api.twitter.com/1.1/statuses/user_timeline.json'
    params = {
        "count": 1,
        "exclude_replies": True,
        "include_rts": False
    }
    req = twitter.get(url, params = params)

    if req.status_code == 200:
        newest_tweet = json.loads(req.text)[0]
        return newest_tweet
    else:
        return req.status_code

結果は、、、

Function Logs
日曜日は来ないが土曜日は来るはず🤔 https://t.co/QYfCZ4Yely

いい感じですね;)

まとめ

  • Twitter API で自分のタイムラインを取得する方法を整理しました
  • 用意されているパラメータで、ユースケースが満たせそうな雰囲気を感じました
  • Python 化しました

それでは良い週末を!