【tweepy】自分のタイムラインの中から条件に合うフォローしていないアカウントを探すプログラムを作成[Python]

  • URLをコピーしました!
目次

tweepy

これまでPythonのTwitter API制御ライブラリtweepyを使って、色々なことを試してきました。

今でも使っているものもあれば、早々に使わなくなってしまったプログラムもあります。

それでも色々できるようになってきたのは、とても楽しいですので、まだまだ新しいプログラムを作っていきましょう。

ということで今回からはフォロー支援プログラムを作ってみます。

フォロー支援プログラムの概要

今回作成するのは、多くのフォロワーさんと繋がっていて、さらに相互フォローしてくれそうな人を探すプログラムです。

Twitterはフォロー、フォロワーの数ではないという意見はごもっともです。

でも自分のツイートをより広く拡散させようと思った時に、フォロワーさんの数というのはやはり重要になってきます。

かといって有名インフルエンサーのように面白いツイートをして、フォロワーさんだけが爆発的に増えて、爆発的に拡散されるなんてことはなかなか凡人の私にとってはとても難しいこと。

となるとこちらからフォローして、こちらのアカウントを認識してもらい、さらに相互フォローしてもらうことで、フォロワーさんの数を増やし、拡散してもらえる素地を作るというのが大事なことになります。

また別の観点から言うと、たくさんのフォロワーさんと相互に繋がっている人には面白い情報がたくさん流れてきます。

そういう情報により広く、より多く触れられるのも相互フォローを広げていくメリットです。

そして意識的にフォローしていくと、同じような人ばかりのアカウントになりがちですが、機械的にフォローしていくと自分と違う知識、経験、考え方を持っている人と繋がれる可能性があるので、それはそれで楽しいかなと思います。

ということで今回は「自分のタイムラインでまだフォローしていない人の中からフォロワー○人以上、フォロワー/フォロー値○以上○以下のアカウント」を探すプログラムを作成してみます。

「フォロワー○人以上」はもちろん多くの人と繋がっているということで分かってもらえると思います。

「フォロワー/フォロー値○以上○以下」というのはフォロー過多にもフォロワー過多にもなっていないアカウントを探すためです。

フォロワー/フォロー値が小さい場合、そのアカウントばかりがフォローしている状態になっていますし、逆にフォロワー/フォロー値が大きい場合、そのアカウントは多くの人からフォローされているが、そのアカウントは積極的にはフォローしていない状態になっていることが分かります。

つまりフォロワー/フォロー値を一定以上、一定以下にすることで、フォローしたらフォローし返してくれるだろうアカウントを探そうというわけです。

それでは始めていきましょう。

プログラム全体

まずはプログラム全体をお見せします。

import tweepy

follower_min = 10000
ff_ratio_min = 0.9
ff_ratio_max = 1.2

account = "@account_name"

consumer_key = ' consumer key '
consumer_secret = ' consumer 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, wait_on_rate_limit = True)

def gettimeline():
    tweets = tweepy.Cursor(api.home_timeline, id=account).items(200)
    
    return tweets

def getscreenname(tweets):
    collected_users = []
    for tw in tweets:
        if not tw.user.screen_name == account.lstrip('@'):
            if tw.text.startswith("RT"):
                user = tw.retweeted_status.user.screen_name
                followers = tw.retweeted_status.user.followers_count
                follows = tw.retweeted_status.user.friends_count
                following = tw.retweeted_status.user.following
                
                if following == False:
                    if follows == 0:
                        follows = 1
                    if followers >= follower_min and ff_ratio_min <= followers/follows <= ff_ratio_max:
                        if not user in collected_users:
                            collected_users.append(f"{user}")
                            
    return collected_users

def main():
    tweets = gettimeline()
    collected_users = getscreenname(tweets)
    print(collected_users)

if __name__ == '__main__':
    main()

設定部分

まずは設定部分から見ていきましょう。

import tweepy

follower_min = 10000
ff_ratio_min = 0.9
ff_ratio_max = 1.2

account = "@account_name"

consumer_key = ' consumer key '
consumer_secret = ' consumer 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, wait_on_rate_limit = True)

ライブラリやらTwitter APIへの接続に関しては、これまでも何度もやってきていますので、解説は省略します。

これまでと違うところとしては、「follower_min」、「ff_ratio_min」、「ff_ratio_max」を定義しているところです。

これが抽出するアカウントのフォロワーの数、そしてフォロワー/フォロー値の値になります。

とりあえずはフォロワー数10,000人、フォロワー/フォロー値を0.9〜1.2としておきました。

ここは自分が抽出したいアカウントに合わせて変更してください。

タイムラインの取得

次にタイムラインの取得をする関数を作成します。

def gettimeline():
    tweets = tweepy.Cursor(api.home_timeline, id=account).items(200)
    
    return tweets

前に特定ユーザーのタイムラインを取得する方法として、「api.user_timeline(“@アカウント名”)」を紹介しました。

前の記事を書いた際にはあまり意識していなかったのですが、「api.user_timeline(“@アカウント名”)」で取得できるのは、特定ユーザーの「ツイートのタイムライン」です。

つまりそのユーザーのツイートしか取得できません。

今回取得したいのは、特定のユーザーの「フォローしている人から流れてくるタイムライン」です。

この場合は、「api.home_timeline(“@アカウント名”)」となります。

これと複数のツイートを一度に取得するカーソル「tweepy.Cursor(api.home_timeline, id = アカウント名).item(取得数)」と合わせることで、先ほどのプログラムになるということです。

(ちなみにこれだけなら関数化しなくても良かった気がします…)

条件に合うアカウント名の取得

次に条件に合うアカウントを取得する関数を作成します。

def getscreenname(tweets):
    collected_users = []
    for tw in tweets:
        if not tw.user.screen_name == account.lstrip('@'):
            if tw.text.startswith("RT"):
                user = tw.retweeted_status.user.screen_name
                followers = tw.retweeted_status.user.followers_count
                follows = tw.retweeted_status.user.friends_count
                following = tw.retweeted_status.user.following
                
                if following == False:
                    if follows == 0:
                        follows = 1
                    if followers >= follower_min and ff_ratio_min <= followers/follows <= ff_ratio_max:
                        if not user in collected_users:
                            collected_users.append(f"{user}")
                            
    return collected_users

まず先ほど取得したタイムラインから自分でないアカウントがリツイートしたツイートを抽出します。

for tw in tweets:
    if not tw.user.screen_name == account.lstrip('@'):
        if tw.text.startswith("RT"):

ここでtw.user.screen_nameでそのツイートをしたアカウント名を取得し、設定部分で定義した自分のアカウント名と比較し、違う場合だけ抽出し、自分のツイートを取り除きます。

その後もタイムライン上にあるのは、自分のフォロワーさんがツイート、リツイート、リプライしたツイートです。

つまり自分がフォローしていないアカウントを探すためにはリツイート、もしくはリプライしたツイートの元のツイートを取得する必要があります。

ということで「if tw.text.startswith(“RT”)」でリツイートだけ取得します。

なぜリツイートだけかと言うと、リプライを取得するのが難しそうだったからというだけです…

モチベーションのためにもとりあえずは最低限満足できるレベルで動くプログラムを作成していくということで。

取得したリツイートから、そのリツイートの元のツイートからユーザー名やフォロー数、フォロワー数、自分をフォローしているかどうかの状態を取得します。

            user = tw.retweeted_status.user.screen_name
            followers = tw.retweeted_status.user.followers_count
            follows = tw.retweeted_status.user.friends_count
            following = tw.retweeted_status.user.following

このようにリツイートされたツイートのユーザーの情報を取得するには「tw.retweeted_status.user」を使用します。

その後ろに「.screen_name」を付ければ元ツイートをしたアカウント名、「.followers_count」や「.friends_cound」を付ければ元ツイートをしたアカウント名のフォロワー数、フォロー数、「.following」を付ければ自分のアカウントをフォローしているか分かります。

次に自分をフォローしていないアカウントを抽出し、フォロー数が「0」の場合のフォロワー/フォロー値のエラー対策をします。

if following == False:
    if follows == 0:
        follows = 1

「if following == False:」で自分をフォローしていないアカウントを抽出しています。

そしてフォロー数が「0」だと0での割り算となってしまい計算できないので、「0」だった場合はとりあえず強制的に「1」にしてエラーを回避しようと言うわけです。

最後にフォロワー数、フォロワー/フォロー値から条件に合うユーザーを取得し、すでにリストの中に入っていなければ、リストに入れるという流れです。

if followers >= follower_min and ff_ratio_min <= followers/follows <= ff_ratio_max:
    if not user in collected_users:  
        collected_users.append(f"{user}")

実行部分

最後に実行部分です。

def main():
    tweets = gettimeline()
    collected_users = getscreenname(tweets)
    print(collected_users)

if __name__ == '__main__':
    main()

ここは先ほど作成した関数を使って、順に作成するだけなので、解説は割愛します。

これで実行すると、こんな感じにユーザー名のリストが得られます。

実行結果
['bekotaizi', 'grennoonigiri', 'sonic_4', 'KYOEITOSANtenpo']

一人一人ここでは紹介はしませんが、テストしてみたところ問題なく条件にあったアカウントが取得できていました。

ただこのままではこのアカウント名をコピーして、ツイッターで検索して、フォローするとなかなかめんどくさいステップがまだまだ残っています。

ということでもう少し手順を簡略化するために、この取得したアカウント名をLINEに送って、そこからワンタップでTwitterにアクセスできるようにしたいと思います。

そこで次回はLINE APIを使ってみましょう。

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

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次