Python で Twitter API を呼び出し、検索条件を満たすツイートを取得する

こんにちは @ketancho です。今年もよろしくお願いします。

エゴサーチを自動化したく、表題の件を調査したのでそのメモです。やりたかったことは、

  • 特定の文字列が含まれるツイートを取得する
  • 時間を指定する(例:直近1時間)
  • 自身のツイートは除外
  • RT も除外

です。下記の Standard Search API を利用しました。

developer.twitter.com

Parameters 一覧を見ても、時間指定や除外条件あたりがなかったので、"特定の文字列が含まれるツイート" 全量を引いてきてゴリゴリ除外しないといけないのかな?と最初思ったのですが、q に普段 Twitter 検索しているのと同じ要領で時間の範囲、除外条件を渡してあげるだけで OK でした。

例えば log4ketancho -from:ketancho -RT since:2020-01-08_07:00:00_JST until:2020-01-08_08:00:00_JST このような値を渡してあげれば期待する値が取得できました。

書いたコード

例によって AWS Lambda 上で動かす前提です。もっとキレイに書けないものか。2020年は Python 力上げたい。

import os
import json
from requests_oauthlib import OAuth1Session
from datetime import datetime, timedelta, timezone

JST = timezone(timedelta(hours=+9), 'JST')

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):
    _search_tweet("log4ketancho")

def _search_tweet(target_word):
    now = datetime.now(JST).strftime("%Y-%m-%d_%H:00:00_JST")
    one_hour_ago = (datetime.now(JST) - timedelta(hours=1)).strftime("%Y-%m-%d_%H:00:00_JST")
    
    query_str = target_word + " " \
        "-from:ketancho -RT " \
        "since:" + one_hour_ago + " "\
        "until:" + now
        
    print(query_str)
    
    params = {
        "q": query_str
    }
    twitter_search_url = 'https://api.twitter.com/1.1/search/tweets.json'
    req = twitter.get(twitter_search_url, params = params)

    if req.status_code == 200:
        tweets = json.loads(req.text)['statuses']
        print(tweets)
        return tweets
    else:
        return req.status_code    
    

毎時1分に動かして、直近1時間以内の該当ツイートを取得しようと考えています。

関連記事

www.ketancho.net

www.ketancho.net