Twitter API v2(申請不要)で般若心経 -その2-

こんにちは、ブングアプリ担当の鈴木です。

今回は前回、策定した仕様が実現できるか調べていきます。

仕様のおさらい

  1. 毎日0:00に般若心経278文字が含まれる直近24時間のツイートを検索、抽出し体よくHTMLに出力。
  2. 抽出する278個のツイートは重複させない。
  3. 対象ツイートは使用言語に「日本語」を設定している著者(Twitterer、ついったらー)のものとする。

Twitter API制限の確認

まずは1つ目です。
「毎日0:00に般若心経278文字が含まれる直近24時間のツイートを検索、抽出し体よくHTMLに出力。」
数的な制約があるか調べたところ、Twitter APIのプランとして全体の制限とAPI自体の制限がありました。

使用している申請不要なプラン(Essential access)は50万ツイート/月まで取得可能です。
https://developer.twitter.com/en/docs/projects/overview

1日278ツイート取得したいだけなのでこれは大丈夫そうです。
278ツイート × 30日 = 8,340

なお、その月に何ツイート取得したかはDashboard(https://developer.twitter.com/en/portal/dashboard)で確認できます。

続いて、今回使えそうな直近7日間のツイートを取得するAPI(GET /2/tweets/search/recent)は、

  • アプリの全ユーザーで15分間で450リクエストまで
  • 認証ユーザーごとに15分間で180リクエストまで

の制限がありました。
https://developer.twitter.com/en/docs/twitter-api/tweets/search/api-reference/get-tweets-search-recent

こちらは後者にひっかかりそうですが、時間をおいて取得すれば大丈夫ですね。

さらに調べるとこのAPI、1回のリクエストに対して返すツイート数をクエリパラメーター max_results で指定できるのですが、最小値が10とのことです。
つまり278文字1文字ずつに1リクエスト投げると(検索に引っかかれば)最低2,780ツイートが返ってくることになります。

とはいえ

278文字 ✕ 10ツイート ✕ 30日 = 83,400ツイート

50万ツイートの制限には引っかかりません、大丈夫。

また、直近24時間のツイートに限定するのはクエリパラメーター start_time で実行時刻の24時間前を指定すれば実現できそうです。

般若心経の重複文字の確認

Twitter API的には問題なさそうなので2つ目の「抽出する278個のツイートは重複させない。」を見ていきます。
前述のmax_resultsですが最小値は10ですが最大値は100でした。
重複なく100個まで1リクエストで抽出してくれることになります。

1個ずつしか取得できないと時刻やIDなどの条件指定で重複を除外していく必要があると考えていましたが、これならかなり楽できそうです。

ということで、max_resultsに設定する最大数を文字ごとに確認します。

いまさらですが、ここで用いる般若心経は以下のWikipediaで代表的なテキストとされるものとします。

仏説摩訶般若波羅蜜多心経
観自在菩薩行深般若波羅蜜多時照見五
蘊皆空度一切苦厄舎利子色不異空空不
異色色即是空空即是色受想行識亦復如
是舎利子是諸法空相不生不滅不垢不浄
不増不減是故空中無色無受想行識無眼
耳鼻舌身意無色声香味触法無眼界乃至
無意識界無無明亦無無明尽乃至無老死
亦無老死尽無苦集滅道無智亦無得以無
所得故菩提薩埵依般若波羅蜜多故心無
罣礙無罣礙故無有恐怖遠離一切顛倒夢
想究竟涅槃三世諸仏依般若波羅蜜多故
得阿耨多羅三藐三菩提故知般若波羅蜜
多是大神呪是大明呪是無上呪是無等等
呪能除一切苦真実不虚故説般若波羅蜜
多呪即説呪曰
羯諦羯諦波羅羯諦波羅僧羯諦菩提薩婆訶
般若心経

Pythonでカウントしてみます、

strings = {}

targets = \
"仏説摩訶般若波羅蜜多心経" \
"観自在菩薩行深般若波羅蜜多時照見五" \
"蘊皆空度一切苦厄舎利子色不異空空不" \
"異色色即是空空即是色受想行識亦復如" \
"是舎利子是諸法空相不生不滅不垢不浄" \
"不増不減是故空中無色無受想行識無眼" \
"耳鼻舌身意無色声香味触法無眼界乃至" \
"無意識界無無明亦無無明尽乃至無老死" \
"亦無老死尽無苦集滅道無智亦無得以無" \
"所得故菩提薩埵依般若波羅蜜多故心無" \
"罣礙無罣礙故無有恐怖遠離一切顛倒夢" \
"想究竟涅槃三世諸仏依般若波羅蜜多故" \
"得阿耨多羅三藐三菩提故知般若波羅蜜" \
"多是大神呪是大明呪是無上呪是無等等" \
"呪能除一切苦真実不虚故説般若波羅蜜" \
"多呪即説呪曰" \
"羯諦羯諦波羅羯諦波羅僧羯諦菩提薩婆訶" \
"般若心経"

for i in range(len(targets)):
    if targets[i] in strings.keys():
        strings[targets[i]] += 1
    else:
        strings.setdefault(targets[i], 1)

print(len(strings))

strings_sorted = sorted(strings.items(), reverse=True , key=lambda x:x[1])
print(strings_sorted)

結果です、

118
[('無', 21), ('羅', 9), ('不', 9), ('是', 9), ('波', 8), ('般', 7), ('若', 7), ('多', 7), ('空', 7), ('故', 7), ('蜜', 6), ('色', 6), ('呪', 6), ('菩', 4), ('亦', 4), ('羯', 4), ('諦', 4), ('説', 3), ('心', 3), ('薩', 3), ('行', 3), ('一', 3), ('切', 3), ('苦', 3), ('即', 3), ('想', 3), ('識', 3), ('明', 3), ('得', 3), ('提', 3), ('三', 3), ('仏', 2), ('訶', 2), ('経', 2), ('舎', 2), ('利', 2), ('子', 2), ('異', 2), ('受', 2), ('諸', 2), ('法', 2), ('滅', 2), ('眼', 2), ('意', 2), ('界', 2), ('乃', 2), ('至', 2), ('尽', 2), ('老', 2), ('死', 2), ('依', 2), ('罣', 2), ('礙', 2), ('大', 2), ('等', 2), ('摩', 1), ('観', 1), ('自', 1), ('在', 1), ('深', 1), ('時', 1), ('照', 1), ('見', 1), ('五', 1), ('蘊', 1), ('皆', 1), ('度', 1), ('厄', 1), ('復', 1), ('如', 1), ('相', 1), ('生', 1), ('垢', 1), ('浄', 1), ('増', 1), ('減', 1), ('中', 1), ('耳', 1), ('鼻', 1), ('舌', 1), ('身', 1), ('声', 1), ('香', 1), ('味', 1), ('触', 1), ('集', 1), ('道', 1), ('智', 1), ('以', 1), ('所', 1), ('埵', 1), ('有', 1), ('恐', 1), ('怖', 1), ('遠', 1), ('離', 1), ('顛', 1), ('倒', 1), ('夢', 1), ('究', 1), ('竟', 1), ('涅', 1), ('槃', 1), ('世', 1), ('阿', 1), ('耨', 1), ('藐', 1), ('知', 1), ('神', 1), ('上', 1), ('能', 1), ('除', 1), ('真', 1), ('実', 1), ('虚', 1), ('曰', 1), ('僧', 1), ('婆', 1)]

重複除くと全118文字、’無’が21文字で最大であとは10文字以下とわかりました。
なので、毎日118リクエスト/1191ツイート取得することになります。

これで重複について簡単に除外できることと、リクエスト数もマイルドになることがわかりました。

日本語に絞れるかの確認

最後に3つ目の仕様について確認していきます。
仕様で設定していた使用言語に「対象ツイートは使用言語に「日本語」を設定している著者(Twitterer、ついったらー)のものとする。」とはズレますがクエリオペレーターのlang:でjaを指定するとTwitterが日本語としてみなしたツイートのみ取得できるようなのでこちらを利用します。
合わせて3つ目の仕様を「対象ツイートはTwitterが日本語とみなしたもののみとする。」に変更します。

これで全ての仕様をほぼ満たせることがわかりましたので、次回から実装していきます。