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

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

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

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

Python

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

API

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

Q&A

解決済

1回答

1090閲覧

【Python】Tweepyを用いて任意の時間に投稿されるツイートを自動更新して取得したい

___0xharu

総合スコア1

Twitter

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

Python

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

API

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

0グッド

0クリップ

投稿2020/10/17 08:48

編集2020/10/18 03:36

前提・実現したいこと

はじめまして.独学でPythonの勉強をしているものです.
今回,Tweepyを用いて任意の時間に投稿されるツイートを自動更新して取得するコードについて質問があり,投稿させていただきます.

実現させたいことというのは,「ある任意の時間に投稿されるツイートを自動で更新して取得する」ということです.

書いてみたソースコード

さて,実際に色々と試してみた結果,ある任意の時間より前に投稿された最新ツイートは取得できたのですが,その時間に投稿されるツイートを取得するには至りませんでした.以下がそのコードです.

Python

1import tweepy 2import datetime 3import re 4 5CK = "*********" 6CS = "*********" 7AT = "*********" 8AS = "*********" 9 10auth = tweepy.OAuthHandler(CK, CS) 11auth.set_access_token(AT, AS) 12api = tweepy.API(auth) 13 14set_time = "" # ここに任意の時間を指定 15username = "" # 任意のTwitterユーザ名を記入 16 17dt = datetime.datetime.now() 18dt_min = dt.strftime("%M") 19 20while set_time != dt_min: 21 dt = datetime.datetime.now() 22 dt_min = dt.strftime("%M") 23 tweet = tweepy.Cursor(api.user_timeline, id = username, tweet_mode = "extended").items(1) 24 for status in tweet: 25 content = re.findall(r"\w+", status.full_text) 26 tt = re.findall(r"\d+", str(status.created_at)) 27 tt_min = tt[4] 28 print(content, tt) # もともと入れる予定はありませんでしたが,動作確認用に入れてみました. 29 if tt_min == set_time: 30 tweet = tweepy.Cursor(api.user_timeline, id = username, tweet_mode = "extended").items(1) 31 for status in tweet: 32 content = re.findall(r"\w+", status.full_text) 33 tt = re.findall(r"\d+", str(status.created_at)) 34 tt_min = tt[4] 35 print(content, tt) 36 break 37

出力結果

上記のコードを実行した結果,任意の時間までに投稿された最新ツイート1件を出力することはできたのですが,set_timeで設定した時間になると実行が終了してしまいます.

['*****', '*****'] (set_time以前の最新ツイートのツイート時間) ['*****', '*****'] (set_time以前の最新ツイートのツイート時間) ['*****', '*****'] (set_time以前の最新ツイートのツイート時間) ['*****', '*****'] (set_time以前の最新ツイートのツイート時間) ['*****', '*****'] (set_time以前の最新ツイートのツイート時間) (ここでset_timeになる) 何も出力されずに終了

試したこと

記載したソースコードの他にも,

Python

1import sys 2 3while set_time != dt_min: 4 dt = datetime.datetime.now() 5 dt_min = dt.strftime("%M") 6 tweet = tweepy.Cursor(api.user_timeline, id = username, tweet_mode = "extended").items(1) 7 for status in tweet: 8 content = re.findall(r"\w+", status.full_text) 9 tt = re.findall(r"\d+", str(status.created_at)) 10 tt_min = tt[4] 11 if set_time == tt_min: 12 sys.exit() 13 14while set_time == dt_min and set_time != tt_min: 15 dt = datetime.datetime.now() 16 dt_min = dt.strftime("%M") 17 tweet = tweepy.Cursor(api.user_timeline, id = username, tweet_mode = "extended").items(1) 18 for status in tweet: 19 content = re.findall(r"\w+", status.full_text) 20 tt = re.findall(r"\d+", str(status.created_at)) 21 tt_min = tt[4] 22 if set_time == dt_min and set_time == tt_min: 23 tweet = tweepy.Cursor(api.user_timeline, id = username, tweet_mode = "extended").items(1) 24 for status in tweet: 25 content = re.findall(r"\w+", status.full_text) 26 tt = re.findall(r"\d+", str(status.created_at)) 27 tt_min = tt[4] 28 print(content, tt_min) 29

と複雑にしてみたり...
そもそもツイート内の数字のみを取得したいという特性も利用して,

Python

1import time 2 3tweet = tweepy.Cursor(api.user_timeline, id = username, tweet_mode = "extended").items(1) 4 for status in tweet: 5 content = re.findall(r"\d+", status.full_text) 6 tt = re.findall(r"\d+", str(status.created_at)) 7 tt_min = tt[4] 8 9while len(content) == 0: 10 sys.stdout.write("\r更新中...") 11 sys.stdout.flush() 12 time.sleep(0.01) 13 if len(content) >= 1 and set_time == tt_min: 14 print(content, tt) 15 break 16

など,考えつきそうなものは手当たり次第試してみたのですが,どれもset_timeに投稿されるツイートの取得には至りませんでした.

Pythonの勉強を始めたばかりですので,そもそものコードに無駄がある・使い方が違うなどの意見も下さると嬉しいです.

何卒宜しくお願い申し上げます.

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

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

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

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

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

sfdust

2020/10/18 03:44 編集

冒頭に「Tweepyを用いて最新ツイートを1件取得するコード」についてといいつつ、「ある任意の時間に投稿されるツイートを自動で更新して取得する」コードを希望されているようです。 また、コードを見ると、「分」を指定して現在時刻(の分(%M))と比較しています。 希望している動作は以下のどちらでしょうか。 (1)「ある任意の時間」とは、「毎時(hours)の、指定した分(minute)」という意味でしょうか。 すなわち、毎時(hours)の、指定した分(minute)内にツイートされたものだけを取得したいのでしょうか。 すなわち、たとえば、「11時07分00秒以降、11時08分00秒より前」の1分間にツイートされた内容、「12時07分00秒以降、12時08分00秒より前」の1分間にツイートされた内容・・・を1時間ごとに取得すればよく、 その間の59分間にツイートされた内容は無視してもよいということでしょうか。 それとも (2)単純に1分間隔でツイートの有無を監視して、その都度、最新のツイートがあればそれを取得したいということでしょうか?
___0xharu

2020/10/18 03:33

sfdust様 ありがとうございます. >>冒頭に「Tweepyを用いて最新ツイートを1件取得するコード」についてといいつつ、「ある任意の時間に投稿されるツイートを自動で更新して取得する」コードを希望されているようです。 たしかに質問したい内容と実現したい内容が少し乖離したように感じますね... 申し訳ないです. >> また、コードを見ると、「分(%M)」を指定して現在時刻と比較しています。 set_timeとdt_minの比較のことを指しているのでしょうか.もしそのことについて言及されているのでしたら私の言葉足らずです.すみません.set_timeとは任意の分(minute)を指定するもので,これをdt_min(分)と比較しているつもりでした. >>希望している動作は以下のどちらでしょうか。 私の希望に近いのは(1)です.ただ,毎時の何分内にツイートされた内容というよりは私の指す「ある任意の時間」は何時何分というように,1日のうちでただ1点に限定されます.それではなぜ,分(minute)のみを指定するのかと言いますと,取得したいツイートを投稿しているユーザは,完全にランダムにツイートを更新しているという前提のもとで成り立っています. 説明が難しく言葉足らずかもしれませんが,宜しくお願い申し上げます.
sfdust

2020/10/18 03:43 編集

確認です。 たとえば対象の時刻として「午前11:07:00秒以降、午前11:08:00秒前」を指定する、 この場合、毎日「午前11:07:00秒以降、午前11:08:00より前」の60秒間だけリアルタイムに監視し、ツイートされた場合はその60秒間のツイートだけを取得すればよく それ以外の時間はツイート監視もせず、それ以外の時間にツイートされているものは無視する、 そういう理解でよろしいですね?
___0xharu

2020/10/18 03:51

sfdust様 返信いただき,大変感謝します. 確認についてですが,sfdust様のおっしゃる通りです.お手を煩わせてしまい,大変申し訳ありません. 宜しくお願い申し上げます.
guest

回答1

0

ベストアンサー

元質問文の1番目に掲示されたコードですと、指定した分(settime)と現在時刻の分が同じになった場合、whileループを抜けて終了してしまいます。

while set_time != dt_min: <--- set_time == dt_min である場合、whileループを抜けてプログラムが終わる (処理)

したがって、元のコードを生かすならば、下記のように、無限ループにしたうえで、1秒ごとに現在時刻が指定した時刻であるかどうか監視する形になります。

質問により仕様を明確化させていただいた結果を踏まえ、監視対象時間を時・分の形に変え、
かつ監視対象時間外のツイートについては一切無視する形としています。

(無限ループを抜ける場合は、CTRL+C(macの場合Command+Zでも終了できると思います。)を押してください)

(前略) import time (前略) set_time = "1107" # ここに監視したい時間+分を24時間制のHHMM形式で記入 例1107=午前11時07分 username = "" # 任意のTwitterユーザ名を記入 # 重複判定のために取得済みのツイートのIDを格納するset fetched_tweet_ids = set() while True: dt = datetime.datetime.now() dt_hour_min = dt.strftime("%H%M") # 現在時刻(時間+分)を格納する。※apiで取得される時間はUTCなのでUTC以外と比較する場合は適宜調整すること # 現在時刻が指定した時刻であるか判定し、指定した時刻ならば、処理を行う。 if dt_hour_min == set_time: tweet = tweepy.Cursor(api.user_timeline, id = username, tweet_mode = "extended").items(1) for status in tweet: # 取得したツイートが、すでに取得済のツイートと重複していないか判定する。 # 重複している場合はforループを抜ける。 if status.id in fetched_tweet_ids: break # 取得したツイートのIDを重複判定用のsetに格納する。 fetched_tweet_ids.add(status.id) # ツイートの時・分を取得 tt = re.findall(r"\d+", str(status.created_at)) tt_hour_min = ''.join((tt[3],tt[4])) # 指定した時間以外のツイートであった場合は、forループを抜ける。(本来ならば、前日の同じ時刻のツイートの存在まで考慮すべきですが、ここでは簡便のため考慮していません) if tt_hour_min != set_time: break # ここ以下にやりたい処理を書きます。 content = re.findall(r"\w+", status.full_text) print(content, tt) # 1秒ごとにチェックする time.sleep(1)

投稿2020/10/18 04:43

編集2020/10/18 07:51
sfdust

総合スコア1137

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

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

___0xharu

2020/10/18 07:20

sfdust様 回答ありがとうございます. sfdust様のご教示下さったコードとあわせて,ツイート投稿時間がutcで表示されることを踏まえてutc基準で時間を調整すると無事,取得することができました. 何から何まで本当にありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問