tweepy のapi.search て完璧じゃないの!?


はじめに

僕の生きる糧である女優の松岡茉優さんの最新画像を自動取得すべく、LINE Bot の作りました。

もしよかったらQRコードで追加してやってください。僕が喜びます。

詳しいコードは以下の記事もしくは GitHub をご覧ください。
[毎日定時に推し画像が送られてくるLINE Bot を作った]
https://qiita.com/soma_sekimoto/items/4c01d0ab890024d6f87c

GitHub
https://github.com/SomaSekimoto/MayuDelivery

この画像送信bot の画像取得元が、twitter になっています。(なぜなら情報が早いから。つまり最新の画像も出るのが早い。)

tweepy を使って実装して、つい今日まで満足していました。tweepy 神だなぁと思っていました。

あ、ちなみにもうお気づきかもしれませんが、これは技術的なことあんまり書かないです。

tweepy で api.search 使っていたのだが何かおかしい。。。

最近ふと思いついて、
コード内で記述している 検索ワードを、実際の twitter の検索窓にも入力して全く同じ

検索部分のコード

q = f"#松岡茉優 OR 松岡茉優 -'松岡茉優似' filter:media exclude:retweets min_faves:10 since:{yesterday}"

tweets = tweepy.Cursor( api.search, q=q, tweet_mode='extended', include_entities=True).items(20)

ドキュメント読んでみたらちゃんと書いてあった。

Please note that Twitter's search service and, by extension, the Search API is not meant to be an exhaustive source of Tweets. Not all Tweets will be indexed or made available via the search interface.

要は、

「Search メソッドで全部のツイートを取得するわけではないですよ!!」

ってことだと僕は解釈しました。

そもそもの tweepy の仕様だったのか。。。。

でもどのツイートが取得できてどれができないのか知りたい。知りたい。

result_type="mixed" で取りたかったツイートを取得できた。

取得したかったツイートが取得できた。

修正前

q = f"#松岡茉優 OR 松岡茉優 -'松岡茉優似' filter:media exclude:retweets min_faves:10 since:{yesterday}"

tweets = tweepy.Cursor( api.search, q=q, tweet_mode='extended', include_entities=True).items(20)

修正後

q = f"#松岡茉優 OR 松岡茉優 -'松岡茉優似' filter:media exclude:retweets min_faves:10 since:{yesterday}"

tweets = tweepy.Cursor( api.search, q=q, tweet_mode='extended', result_type="mixed", include_entities=True).items(20)

result_type で設定できる値は、三種類あって
"recent": 時系列で最新のツイートを検索
"popular": 人気のあるツイートを検索(何を基準に人気か判断しているかは不明)
"mixed": 上記を混ぜたもの。
となっている。

さらに、調べていくと、デフォルトだと "recent" が設定されていることがわかった。

以下記事参照

https://note.com/katomaru0510/n/n8797618a68ce
https://qiita.com/mima_ita/items/ba59a18440790b12d97e

おわりに

完全に自分のやらかしでした。

もちろん result_type の存在も知っていましたが、デフォルトだと そういったツイートの種類にかかわらず全部取得してきてくれるものだと勘違いしていました。

とりあえず今回は解決しましたが、根本的にtweepy の api.search について解明できたわけではないので、これからも tweepy 使いながら理解を深めていきます。