質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1914閲覧

【tweepy】botをメンションした人へリアルタイムでリプライする機能を実装したい

kabos0809

総合スコア3

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2021/10/25 18:41

編集2021/10/25 18:51

よくある○○%で言葉がそろう系のbotを作成していて、サブ要素的な感じでbotをメンションした人へリプライをする機能を実装したいです。現在はscheduleモジュールを使って10秒おきにプログラムを実行しているのですが、うまくメンションしたアカウントを取得できていないのか、メンションをしても一向にリプライが送られてきません。どうすればよいか、有識者の方ご教授願います。

import tweepy import random import time import datetime import schedule def job(): print(datetime.datetime.now()) schedule.every(10).seconds.do(job) Twitter_ID = "---------------------------" SCREEN_NAME = '---------------------------------' CONSUMER_KEY = "---------------" CONSUMER_SECRET = "----------------------------------------------" ACCESS_TOKEN = "-----------------------------------------------------" ACCESS_TOKEN_SECRET = "------------------------------------------------" auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET) auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET) item_list = [...割愛...] api2 = tweepy.API(auth) status = api2.mentions_timeline() for mention in status: reply_text = "@"+str(mention.user.screen_name)+" "+ random.choice(item_list) api2.update_status(status = reply_text, in_reply_to_status_id = mention.id) while True: schedule.run_pending() time.sleep(1)

プログラムはこんな感じです。
最初の実行ではしっかりとプライが届いていますが、一度実行した後にメンションした場合にはリプライが届いていないといった感じです。

試したこと

while文での無限ループを試みたのですがそれもうまくいきませんでした。先述の通り、scheduleモジュールで10秒ごとに実行してもうまくいっていません。

実現したいこと

botをメンションしたツイートへリアルタイムで自動でリプライをできるようにしたい。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ご質問のコードでスケジュールされているのはjob関数であり、その中身は時刻を標準出力に出力するだけのようです。

python

1def job(): 2 print(datetime.datetime.now()) 3 4schedule.every(10).seconds.do(job)

正直な話、私はTwitterのAPIやTweepyには詳しくありませんが、以下のようにタイムラインの取得とリプライをjob関数内で行うべきではないでしょうか。

python

1api2 = tweepy.API(auth) 2 3def job(): 4 status = api2.mentions_timeline() 5 for mention in status: 6 reply_text = "@"+str(mention.user.screen_name)+" "+ random.choice(item_list) 7 api2.update_status(status = reply_text, in_reply_to_status_id = mention.id) 8 9schedule.every(10).seconds.do(job)

また、軽く調べてみると、Botのような継続的にツイートを監視する用途にはREST APIよりもStreaming APIの方が向いているかもしれません。
Tweepyにも継続監視ためのStreamListenerという仕組みが用意されているようです。

Tweepyでストリーミング - Python日本語ドキュメント

具体的にどんな感じで使うのかは以下の記事が参考になるかもしれません。
情報が古いかもしれませんので、上記のドキュメントと併せて読んでみてください。

Tweepyで雑にTwitter botを作ってみた - Qiita

以上、ご参考になれば幸いです。

投稿2021/10/25 20:48

fj68

総合スコア752

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kabos0809

2021/10/26 04:56

一度StreamListenerを試してはいるのですが、その時はAttribute errorになってしまいました。調べてみたところ、StreamListenerはStreamで統一されたようで、StreamListenerとしていたところをStreamに書き替えたらうまく動くようになりました。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問