Twitterで、自動リプライ(V2)したくなったので、Python+tweepyでやってみた。

2022年11月6日

いままで一方通行に話するだけだった「はぴぞう」君なんだが、リプライしてきたら何か返事をしたくなったのでちょっとずつやってみる。

1.せっかくなので何か話しかけられたら、何か返事してみたい。

ただ時報を流すだけの「はぴぞう」君なんだが、何か愛想が無いので何か反応できるようにしたくなった。

はぴぞう(@haptweepy)さん / Twitter

ストリーミングの部分はどうも扱いが難しそうなんだが、ストリーミングのAPI V1.1が使えないらしく、V2で作る必要があるようだ。

2.Twitter API V2でやれる方法を探すのだが・・・難解すぎる。

色々ググってみると、V2のコードで一番行き当たり付くのがこれ。

TwitterAPI v2のStreamでTwitter自動リプライするよ

初心者の私にはコードが長すぎて、一度やってみたものの何処が悪いのか解らないまま走らない。

#本田とじゃんけん を(簡易的に)作成する方法 – Qiita

次に見つけたのがこれ、これを骨にして作って見ようと思います。

ほぼコピーして作ってみたところ、このエラーが出て動かない。

Stream encountered HTTP error: 429
HTTP error response text: {"title":"ConnectionException","detail":"This stream is currently at the maximum allowed connection limit.","connection_issue":"TooManyConnections","type":"https://api.twitter.com/2/problems/streaming-connection"}

これはTwitterへのアクセスが多すぎるから制限がかかる、つまり使えなくなると言う事のようで動かない。

Twitter API でtweepy.StreamingClientを用いてリアルタイム監視を行うと、APIのツイート取得上限(200万 / 月)に直ぐに達してしまう問題を解決したい

たぶんこのコードを動かして、動かないからなんとかしてくれということを書いているサイトも見た。

うん。確かに動かない。

3.実際に動かしてみた。

tweepyのリファレンスを見ても良くわからなかったので、うーんと思っていたんだけど、あれ?これ切ったらどう?ってやってみたら偶然動いた。

「いま何時?」って聞いてやると何か答えます。

import tweepy
import json
import random

# API情報を記入
Bearer_Token=' '
consumer_key=' '
consumer_secret=' '
ACCESS_TOKEN=' '
ACCESS_TOKEN_SECRET=' '

# クライアントを作成(V2)
Client=tweepy.Client(
bearer_token=" ",
consumer_key=" ",
consumer_secret=" ",
access_token=" ",
access_token_secret=" ",
)

screen_name='ユーザー名'

class ClientProcess(tweepy.StreamingClient):
  def on_data(self, raw_data):
    response = json.loads(raw_data)
    # ツイートidを取得する
    tweet_id = response["data"]["id"]
    # ツイートの文章を取得する
    reply_text: str = response["data"]["text"]

    # 文章を空白で分割する ツイッターのタグは空白が入らないと受け付けないらしい
    text_list = reply_text.split()

    # いま何時?と聞かれたら
    if "いま何時?" in text_list:
      text = '%s' % random.choice(['そうねだいたいね', 'ちょっと待っててオー', 'まだはやい', 'え?', 'あ?'])
    # 違ったら無視
    else:
      return

Client.create_tweet(
  text=text,
  in_reply_to_tweet_id=tweet_id
  )
  return

#main()関数に入れてはダメ
printer = ClientProcess(Bearer_Token)
printer.add_rules(tweepy.StreamRule("to:ユーザー名"))
printer.filter()
#引用先はdef main()で書かれていたが、その記述にするとTwitterのフィルタリングがかからないようだ。

そう言うわけで、ちょっとだけお話ししてくれるようになりました。