PythonのTwitter制御ライブラリTweepy〜特定の期間のツイートの取得〜

目次

Tweepy

前回、PythonでTwitterを制御するためのライブラリTweepyを使って自分発のツイートの中から、リツイートされたものを取得し、さらにリツイートしたユーザーIDを取得しました。

ただこの状態ではある特定のツイート数のうち、リツイートされたものを取得している状態です。

今回は特定の期間のツイートに対し、リツイートされたツイートを取得し、リツイートしたユーザーIDを取得するようにプログラムを改変していきましょう。

ということでまずは前回のおさらいから。

最初のセルはTwitter APIへの接続です。

<セル1>

import tweepy

consumer_key = 'API keyを入力'
consumer_secret = 'API key secretを入力'
access_token = 'Access tokenを入力'
access_token_secret = 'Access token secretを入力'

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)

実行結果

次にリツイートされたツイートのIDを取得します。

<セル2>

tweets = tweepy.Cursor(api.user_timeline, id="@Nori_3PySci").items(100)

rt_ids = []

for tw in tweets:
    if (tw.text.startswith('RT')) or (tw.text.startswith('@')):
        pass
    else:
        if tw.retweet_count >= 1:
            rt_ids.append(tw.id)
            
print(rt_ids)

実行結果
[1348194883274739719, 1348097218755002368, 1348036645405089792, 1347877037168422913]

最後にリツイートしてくれたユーザーのIDを取得します。

<セル3>

rt_users = []

for ids in rt_ids:
    retweets = api.retweets(id=ids)
    for rt in retweets:
        rt_users.append("@" + rt.user.screen_name)
        
print(rt_users)

実行結果
['@hishihari', '@aikoku2004', '@wfV5wUj0WPOmdtq', '@kanta_traveler', '@IshikawaRpch', '@Y_D_O_harumichi']

これをもとに時間の概念を入れていきましょう。

datetimeモジュール

日時を扱うには「datetimeモジュール」を使うのが便利です。

datetimeモジュールは前に日時を取得し、フォーマットを変更するということを解説しています。

今回は現在日時の取得、時間の変更、時間の比較を使います。

それぞれ実際に試しつつ、解説をしていきましょう。

まずは現在日時の取得です。

「import datetime」でdatetimeモジュールをインポートして、「datetime.datetime.now()」で現在日時を取得します。

<セル4>

import datetime

time_now = datetime.datetime.now()

print(time_now)

実行結果
2021-01-12 21:49:24.068956

ツイートの日時の取得

次にツイートの日時の取得を行います。

こちらはdatetimeモジュールではなく、tweepyライブラリで行います。

先ほどリツイートされたツイートはIDを取得していますので、そのIDを「api.get_status(ツイートID)」とすることでそのツイートの情報を取得できるようになります。

そして「.created_at」とすることでツイートした時間を取得できます。

<セル5>

for ids in rt_ids:
    tw_status = api.get_status(ids)
    print(tw_status.created_at)

実行結果
2021-01-10 09:08:03
2021-01-10 02:39:58
2021-01-09 22:39:16
2021-01-09 12:05:02

これで取得できたと喜ぶのは早いです。

実はこの時間は協定世界時となっているため、日本の時間よりも9時間遅くなっています。

そこで取得した時間に9時間足すことで、日本時間に変更します。

ここで再度datetimeモジュールを使います。

ある日時に対して、特定の日数や時間を足したり引いたりするには、「datetime.timedelta()」を使うのが便利です。

例えば1日を取得したい場合には「datetime.timedelta(days=1)」とすることで、1日という時間を取得することができます。

また1時間を取得したい場合には「datetime.timedelta(hours=1)」、1週間を取得したい場合には「datetime.timedelta(weeks=1)」とすることで取得できます。

この単位としては、「weeks」、「days」、「hours」、「minutes」、「seconds」、「milliseconds」、「microseconds」を使うことができます。

「month」がないのはちょっとびっくりしましたが、月によって日数が違うことを考えるとないのも納得ですね。

それではツイート時間に9時間足すことで日本時間に変更していきましょう。

<セル6>

for ids in rt_ids:
    tw_status = api.get_status(ids)
    print(tw_status.created_at + datetime.timedelta(hours=9))

実行結果
2021-01-10 18:08:03
2021-01-10 11:39:58
2021-01-10 07:39:16
2021-01-09 21:05:02

特定の期間のツイートのみを取得

次に時間の比較をすることで、特定の期間にしたツイートのみを取得していきましょう。

ここでも使うのは「datetime.timedelta」です。

まずは1日の間のツイートで、リツイートされたツイートのIDを取得してみましょう。

<セル7>

tweets = tweepy.Cursor(api.user_timeline, id="@Nori_3PySci").items(100)

time_now = datetime.datetime.now()

rt_ids = []

for tw in tweets:
    if time_now - (tw.created_at + datetime.timedelta(hours=9)) <= datetime.timedelta(days=1):
        if (tw.text.startswith('RT')) or (tw.text.startswith('@')):
            pass
        else:
            if tw.retweet_count >= 1:
                rt_ids.append(tw.id)
            
print(rt_ids)

実行結果
[]

ここではif関数を使って、「time_now – (tw.created_at + datetime.timedelta(hours=9)) <= datetime.timedelta(days=1)」とすることで、現在時間からツイートした時間を引いて、その差分が1日以下になるものを選別しています。

ただ残念ながら、1日の間でリツイートされたツイートはなかったようで、空のリストが表示されてしましました。

そこで期間を7日間にしてみましょう。

<セル8>

tweets = tweepy.Cursor(api.user_timeline, id="@Nori_3PySci").items(100)

time_now = datetime.datetime.now()

rt_ids = []

for tw in tweets:
    if time_now - (tw.created_at + datetime.timedelta(hours=9)) <= datetime.timedelta(days=7):
        if (tw.text.startswith('RT')) or (tw.text.startswith('@')):
            pass
        else:
            if tw.retweet_count >= 1:
                rt_ids.append(tw.id)
            
print(rt_ids)

実行結果
[1348194883274739719, 1348097218755002368, 1348036645405089792, 1347877037168422913]

今度は4つのツイートIDが表示されました。

これで特定期間内に自分発のツイートでリツイートされたツイートIDを取得し、リツイートしてくれたユーザーIDを取得することができました。

次回は取得したユーザーIDを使って、感謝のツイートしてみましょう。

ということで今回はこんな感じで。

よかったらシェアしてね!

コメント

コメントする

目次
閉じる