【Python】2つのアカウント間でフォロワーを共有させるプログラムを作成:LINE Notifyを使ったフォロワーの移動

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

tweepy

前にPythonのTwitter API制御ライブラリtweepyを使って、フォロワー情報をまとめるプログラムを作成しました。

せっかくフォロワー情報をまとめたなら、複数のアカウント間で比較し、情報をシェアしたいなと思うようになりました。

つまりはあるアカウントのフォロワーを、もう一つのアカウントに移すということができなかなというわけです。

ということで作ってみたのが今回のプログラムです。

プログラムの流れ

今回のプログラムの流れとしてはこんな感じです。

  1. 送り手側のJSONファイルを読み込み、辞書に格納
  2. 受け手側のJSONファイルを読み込み、辞書に格納
  3. 送り手のデータと受け手のデータを比較し、受け手側に無いフォロワーをピックアップ
  4. ピックアップしたフォロワーの中から、さらに何人かピックアップ
  5. LINE NotifyでLINEに送信

ということで今回必要なのは送り手と受け手のフォロワー情報を格納したJSONファイルとLINEに情報を送るためのLINE Notifyのグループです。

それらはこれらの記事で紹介していますので、よかったらどうぞ。

それでは始めましょう。

プログラム全体

まずはプログラム全体を見てみましょう。

import os
import json
import random
import requests

moving_num = 5

sender_filepath = r' 送り手側のJSONファイルのパス '
receiver_filepath = r' 受け手側のJSONファイルのパス '

line_notify_token = ' LINE Notifyのトークン'
line_notify_api = 'https://notify-api.line.me/api/notify'

def jsonread(json_file):
    with open(json_file) as json_in:
        json_dic = json.load(json_in)
        
    return json_dic

def listcompare(json_dic1, json_dic2):
    compared_dic = {}
    for accountid1 in json_dic1:
        if not accountid1 in json_dic2:
            compared_dic[accountid1] = json_dic1[accountid1]
            
    return compared_dic
        
def randompick(moving_dic):
    moving_list = random.sample(list(moving_dic), moving_num)
    
    collected_users = []
    for accountid in moving_list:
        if moving_dic[accountid]['no_tweets'] != 0:
            collected_users.append(moving_dic[accountid]['screen_name'])
    
    return collected_users

def sendlinemessage(collected_users):
    headers = {'Authorization': f'Bearer {line_notify_token}'}
    
    message = ''
    for user in collected_users:
        user_url = f'https://twitter.com/{user}'
        message = message + user_url + '\n'
    
    data = {'message': message}
    requests.post(line_notify_api, headers = headers, data = data)

def main():
    sender_dic = jsonread(sender_filepath)
    receiver_dic = jsonread(receiver_filepath)
    moving_dic = listcompare(sender_dic, receiver_dic)
    collected_users = randompick(moving_dic)
    sendlinemessage(collected_users)

if __name__ == '__main__':
    main()

ライブラリのインポートと基本設定部分

まずはライブラリのインポートと基本設定部分です。

import os
import json
import random
import requests

moving_num = 5

sender_filepath = r' 送り手側のJSONファイルのパス '
receiver_filepath = r' 受け手側のJSONファイルのパス '

line_notify_token = ' LINE Notifyのトークン'
line_notify_api = 'https://notify-api.line.me/api/notify'

今回、インポートするライブラリは「os」、「json」、「random」、「request」です。

Twitterのフォロワー情報を扱いますが、もう情報自体はJSONファイルにまとめられているので、今回はtweepyは使いません。

「moving_num」はプログラムを実行した際にLINE Notifyで送るフォロワーの数です。

5人までならこんな感じでURLだけでなく、それぞれのアカウントのボタンが表示されるので、5人にしておくのがいいでしょう。

「sender_filepath」と「receiver_filepath」は送り手と受け手のJSONファイルのパスです。

ローカルで実行する際は相対パスでもいいですが、サーバーで実行する際は絶対パスで指定する方が間違いがなくてオススメです。

「line_notify_token」と「line_notify_api」はそれぞれLINE NotifyのトークンとアクセスするAPIのURLです。

main関数

次に全体の流れを掴むため、main関数を見てみましょう。

def main():
    sender_dic = jsonread(sender_filepath)
    receiver_dic = jsonread(receiver_filepath)
    moving_dic = listcompare(sender_dic, receiver_dic)
    collected_users = randompick(moving_dic)
    sendlinemessage(collected_users)

2行目、3行目で送り手と受け手のフォロワー情報を「jsonread関数」を使って、辞書形式に格納しています。

そして4行目の「listcompare関数」で送り手と受け手のフォロワー情報を比較し、送り手にいて受け手にいないフォロワーの情報を辞書形式に格納しています。

5行目では送り手にいて受け手にいないフォロワー情報から「moving_num」で指定した人数を抽出しています。

6行目の「sendlinemessage関数」で抽出したフォロワー情報をLINE Notifyに送るという感じです。

これらの関数は自作関数ですので、それぞれを見ていきましょう。

jsonread関数

jsonread関数はJSONファイルを読み込み、辞書形式に格納し、その辞書を返す関数です。

def jsonread(json_file):
    with open(json_file) as json_in:
        json_dic = json.load(json_in)
        
    return json_dic

特筆することはないですが、JSONファイルをopen関数で開いたら、「json_dic = json.load(json_in)」だけで辞書形式になるので非常に重宝します。

listcompare関数

listcompare関数はフォロワー情報を格納した2つの辞書を比較し、送り手にはあって、受け手にはないフォロワーの情報をまとめた辞書を返す関数です。

def listcompare(json_dic1, json_dic2):
    compared_dic = {}
    for accountid1 in json_dic1:
        if not accountid1 in json_dic2:
            compared_dic[accountid1] = json_dic1[accountid1]
            
    return compared_dic

for関数とif関数を使って送り手にはあって、受け手にはないフォロワーを抽出しています。

randompick関数

randompick関数は、抽出した送り手にはあって、受け手にはないフォロワーからさらに「moving_num」で指定した人数だけフォロワーを抽出する関数です。

def randompick(moving_dic):
    moving_list = random.sample(list(moving_dic), moving_num)
    
    collected_users = []
    for accountid in moving_list:
        if moving_dic[accountid]['no_tweets'] != 0:
            collected_users.append(moving_dic[accountid]['screen_name'])
    
    return collected_users

random.sample関数を使ってリスト内から重複せずにランダムに指定された数のフォロワーを抽出しています。

抽出した後なのですが、アカウントIDを一つずつ読み込み、「if moving_dic[accountid][‘no_tweets’] != 0:」でツイート数が0のアカウントを除外しています。

これはフォロワーとは交流を目的としていきたいので、ツイートしていないアカウントは今回の目的に合わないという理由からです。

そして「collected_users.append(moving_dic[accountid][‘screen_name’])」でリストcollected_usersに情報を格納するのですが、この後、LINE Notifyで作成するURLに必要なのはアカウントIDではなく、スクリーンネームになります。

そのため「moving_dic[accountid][‘screen_name’]」としてアカウントIDからスクリーンネームに変換しています。

ちなみにJSONファイルに格納されている情報に関してはこちらの記事をご覧ください。

sendlinemessage関数

最後にLINE Notifyで共有するフォロワーのULRを送るsendlinemessage関数です。

def sendlinemessage(collected_users):
    headers = {'Authorization': f'Bearer {line_notify_token}'}
    
    message = ''
    for user in collected_users:
        user_url = f'https://twitter.com/{user}'
        message = message + user_url + '\n'
    
    data = {'message': message}
    requests.post(line_notify_api, headers = headers, data = data)

この部分はこちらの記事で使った関数をそのまま持ってきましたので、詳しくはこちらの記事をご覧ください。

これで完成です。

実行するとこんな感じでアカウントのURLがLINE Notifyに送られてきます。

後はぽちぽちとそれぞれのアカウントをタップし、フォローしていくというわけです。

ちなみに自動化するというのも(過剰でなければ)アリなのですが、再度どういうアカウントか確認しつつフォローするためにこのような形にしました。

自動化しすぎるとアカウント凍結の恐れもあるので、このくらいは手作業でやった方がいいのかなと思います。

これでアカウント間のフォロワーの共有もできるようになりました。

またTwitter関連で面白そうなことが浮かびましたら、どんどんプログラミングしていくことにしましょう。

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

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

コメント

コメントする

目次