PythonのTwitter制御ライブラリTweepy〜ダブルクリックで実行できる形式に変更〜

目次

Tweepy

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

今回は最後のツイート部分のプログラム作成とダブルクリックで実行できる形式に変更をしていきます。

またその際、バグが見つかったので、その修正に関して解説をしていきます。

ということで前回、前々回のおさらいから。

最初のセルはTwitter APIへの接続ですが、ここで前回使った「datetime」モジュールもインポートしておきます。

<セル1>

import tweepy
import datetime

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)

実行結果

リツイートされたツイートの取得部分です。

<セル2>

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)

実行結果
[]

リツイートしてくれたユーザーの取得部分です。

<セル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)

実行結果
[]

ここまでが前回、前々回で作成した部分です。

これらをダブルクリックで実行できる形式に組み替えつつ、最後のツイートの部分のプログラムを作成していきましょう。

ダブルクリックで実行できる形式への変更

Pythonプログラムをダブルクリックで実行できる形式への変更の仕方は前に解説しています。

流れとしては、これまで作成してきたプログラムをdef文を使って関数化して、それらを合わせてmain関数に格納するという流れです。

まずはそれぞれの部分をdef文を使って関数としていきましょう。

セル1ではプログラム文というよりも設定なので、ここはこのままで問題ありません。

ただ今後、リツイートを取得するアカウントを変更したり、取得期間を簡単に変更できるよう、ここに変数「account」と「check_days」を定義しておきましょう。

また現在時間もここで取得しておきます(time_now = datetime.datetime.now())。

<セル1 変更>

import tweepy
import datetime

account = "@Nori_3PySci"
check_days = 1

time_now = datetime.datetime.now()

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)

リツイートされたツイートを取得する部分では、アカウント(account)、取得期間(check_days)、現在時間(time_now)を入力し、リツイートされたツイートのIDを返すような関数にします。

<セル2 変更>

def tweet_check(account, check_days, time_now):
    
    tweets = tweepy.Cursor(api.user_timeline, id=account).items(100)

    rt_ids = []

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

    return rt_ids

「tweets = tweepy.Cursor(api.user_timeline, id=”@Nori_3PySci”).items(100)」のアカウント部分(@Nori_3PySci)をaccountに変更することと、

if time_now – (tw.created_at + datetime.timedelta(hours=9)) <= datetime.timedelta(days=1):の「days=1」の部分を「days=check_days」に変更することを忘れないでください。

次はリツイートしてくれたユーザーを取得する部分ですが、ここは先ほど取得したリツイートされたツイートのIDのリスト(rt_ids)を入力して、リツイートしてくれたユーザー(rt_users)を返すような関数にするだけです。

<セル3 変更>

def rtuser_check(rt_ids):
    
    rt_users = []

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

    return rt_users

ツイートする部分のプログラムを作成

次にツイートする部分のプログラムを作成していきます。

ツイートの仕方は前に解説していますので、よかったらそちらの記事もどうぞ。

前回、リツイートされたツイートを取得しようとした時、残念ながら1日単にではリツイートされたものがないという状況でした。

ということで、リツイートされた時とリツイートされなかった時の2パターンを作り、さらにリツイートされた時はツイートしてくれたユーザー10人のユーザー名をツイートするという形にしましょう。

最初はランキング形式でTOP10としようと思ったのですが、どうやら現状ではそこまでリツイートされていないということで、今回はそこまで拘らないということにしましょう。

ということでこんな感じです。

<セル4>

def rtuser_tweet(rt_users):

    if len(rt_users) != 0:
        tweet_content = '\n'.join(rt_users[:10])
        api.update_status("(APIテスト中)\n今日もみなさんのリツイート、ありがとうございます!\n\n" +  tweet_content + "\n\n#RT感謝砲") 
    elif len(rt_users) == 0:
        api.update_status("(APIテスト中)\n今日は残念ながら、リツイートありませんでした...\n\n#RT感謝砲")

「def rtuser_tweet(rt_users):」で先ほど取得したリツイートしてくれたユーザーのリストを入力します。

「if len(rt_users) != 0:」でまずはリツイートしてくれた人が0人でなかった場合の場合わけをしています。

その場合は、「tweet_content = ‘\n’.join(rt_users[:10])」で10人のユーザー名を改行を入れつつ連結します。

そして「api.update_status(“(APIテスト中)\n今日もみなさんのリツイート、ありがとうございます!\n\n” + tweet_content + “\n\n#RT感謝砲”)」で感謝ツイートをついーとしています。

またツイートしてくれた人がいなかった場合は、「elif len(rt_users) == 0:」で場合分けして、「api.update_status(“(APIテスト中)\n今日は残念ながら、リツイートありませんでした…\n\n#RT感謝砲”)」でツイートしています。

これでツイート部分は完成です。

main関数部分のプログラムを作成

次にmain関数の部分のプログラムを作成していきます。

先ほどdef文で作成したプログラムを繋いでいくだけなので、こんな感じです。

<セル5>

def main(account, check_days, time_now):
    rt_ids = tweet_check(account, check_days, time_now)
    rt_users = rtuser_check(rt_ids)
    rtuser_tweet(rt_users)

そして実行部分。

<セル6>

if __name__ == '__main__':
    main(account, check_days, time_now)

実行結果

実行してみると確かにツイートできています。

ただ残念ながらこの日はリツイートされたものが無かったようです。

これで完成と喜んでいたのですが、実はこのプログラムには重大なバグがあることが分かりました。

次回はそのバグの解説と修正を行っていきましょう。

ではでは今回はこんな感じで。

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

コメント

コメントする

目次
閉じる