見出し画像

❝コード公開❞ PythonでTwitterを自動化するコードを書いてみた

1.はじめに

これまで時間をかけて人間の手でやっていた作業の手間を最小限にできないか、願わくば副業として収益を得られないかということで、Pythonを勉強して様々な作業の自動化を図っています。

いくつかのシステムを構想しており、その一つとしてTwitterのあれこれを自動化するコードを書いたので、紹介します。
本ツールで使用しているTweepyモジュールは、2021年9月(たぶん)にリリースされた4.0.0以降では、それ以前のバージョンから仕様が変わっており、以前のコードでは動かなくなっています。

公開しているコードは、Tweepyの仕様変更に対応したものです
Tweepyを使ったコードは無料で公開されているものもたくさんありますが、更新されていないものも多くあったので、それが今回こちらで公開しようと思ったきっかけにもなっています。

こちらのコードを利用するには、Twitter APIのElevatedアクセスを申請し、承認されている必要があります。
また、完全自動化を行うには、Windowsの場合は「タスク スケジューラ」、Macの場合は「cron」を活用するのが良いですが、このあたりの情報は検索するとたくさん情報が出てきますので、本ノートには記載しておりません。
もし分からないことがあれば、お気軽に問い合わせください。

※なお、システムが動作することは検証済みですが、私自身はプロフェッショナルなプログラマーではなく、趣味でコードを書いている程度ですので、コードが決して美しくないという点についてはご了承ください。

2.自動化できること

本ツールでは、大きく6つの自動化ができます。それぞれの内容について簡単に解説します。

①ツイートの自動化1(通常のツイート)

あらかじめ用意しておいたつぶやき候補リストの中から、ランダムにつぶやき内容をピックアップして、ツイートを実行します。
CSVファイルから読み込むように設定しているので、改行や絵文字にも対応しています。

また、つぶやく際に、同じくあらかじめ用意しておいたハッシュタグをつけられるようにしています。こちらは、テキストファイルから読み込むように設定しています。

ツイート文の構成は、「本文+1行空けてタグ」となります。
ーーーーーーーーーーツイート例ーーーーーーーーーー
F1日本GP、もうすぐ開幕ですね!

#F1 #F1日本GP #F1JP
ーーーーーーーーーーーーーーーーーーーーーーーーー

※②以降の機能も同様ですが、CSVやテキストファイルは、各自設定したディレクトリに用意するようにしてください。これらのファイルがない場合はエラーとなります。

②ツイートの自動化2(相互フォロー依頼用)

①とほぼ同じ内容ですが、Twitterの運用自動化を狙っていたので、相互フォロー依頼用のつぶやき内容とハッシュタグを別のファイルで管理・運用するために作ったものです。少しだけツイート文の構成が変わります。

ツイート文の構成は、「本文+1行空けてタグ(タグは1行1つ)」となります。
ーーーーーーーーーーツイート例ーーーーーーーーーー
フォローお願いします!!

#フォローお願いします
#相互フォロー募集
#フォロバ100
#フォロバ
#フォローバック
ーーーーーーーーーーーーーーーーーーーーーーーーー

運用自動化をするには、④の機能と組み合わせるのが良いです。

③フォローの自動化1(通常のフォロー)

あらかじめ設定したキーワードに対し、そのキーワードを含むツイートをしたユーザーをフォローします。
ただし、60日以内に一度フォローしたユーザーと、30日以内にアンフォローしたユーザーはフォローしないように設定しています。
また、Twitterには業者も多いため、NGワードも設定できるようにしています。

④フォローの自動化2(フォローされた相手のフォロー)

フォローしてくれたユーザーのうち、フォローをしていないユーザーをフォローバックします。

②の機能と組み合わせるが良いです。
具体的には、②で相互フォロー依頼用ツイートを実行し、一定時間後(私は2時間後に設定しています)にこちらの④を実行するという使い方です。

⑤フォロー解除の自動化1(通常の解除)

古いフォロワーから順にフォロー解除を行います。
相手がフォローしてくれているかは関係なく古い順にフォロー解除します。

⑥フォロー解除の自動化2(片思いフォローの解除)

フォローしているユーザーの中から、片思いフォローを古い順にフォロー解除します。

3.作成したコードと簡単な説明

共通のコード

必要なライブラリをインポートします。Tweepyをインストールしていない場合は、インストールしておいてください

# ライブラリのインポート
import tweepy
import random
import time
import unicodedata
import csv
from datetime import datetime as dt
import datetime

# ファイル関連の設定
「data_dir」には、つぶやき候補リストなど、各種ファイルを格納しているディレクトリパスを入力してください。
「tweet_acnt」には、任意の文字を入れてください。複数アカウントを自動運用することを想定して作ったものです。

# 実行数の設定
一度の実行でフォローやアンフォローをする数の設定を行います。
「follow_max」:フォロー数の設定。③の機能で使用
「follow_back_max」:フォローバック数の設定。④の機能で使用
「unfollow_max」:アンフォロー数の設定。⑤の機能で使用
「unfollow_oneway_max」:片思いフォローのアンフォロー数の設定。⑥の機能で使用

# Twitterの認証
「my_user_id」:TwitterのユーザーIDを入力
「api_key」「api_secret」「access_key」「access_secret」:取得したTwitter APIの各種キーを入力
「proxy」:プロキシを利用する際に入力。利用しない場合は削除

# 実行する機能
「tweet_normal()」:①の機能を実行
「tweet_follow()」:②の機能を実行
「follow()」:③の機能を実行
「follow_back()」:④の機能を実行
「unfollow()」:⑤の機能を実行
「unfollow_oneway()」:⑥の機能を実行

if __name__ == '__main__':
    # ファイル関連の設定
    data_dir = '***'
    tweet_acnt = '***'

    # 日付関連の設定
    d_today = datetime.date.today()

    # 実行数の設定
    follow_max = 30
    follow_back_max = 20
    unfollow_max = 15
    unfollow_oneway_max = 10

    # Twitterの認証
    my_user_id = '***'
    api_key = "***"
    api_secret = "***"
    access_key = "***"
    access_secret = "***"
    proxy = "http://***:***@***:***"
    auth = tweepy.OAuthHandler(api_key, api_secret)
    auth.set_access_token(access_key, access_secret)
    api = tweepy.API(auth, proxy=proxy) #プロキシを利用しない場合は、「api = tweepy.API(auth)」に変更

    # 実行する機能
    tweet_normal() #実行しない場合は削除
    tweet_follow() #実行しない場合は削除
    follow() #実行しない場合は削除
    follow_back() #実行しない場合は削除
    unfollow() #実行しない場合は削除
    unfollow_oneway() #実行しない場合は削除

全角・半角・記号を含めて文字数を正確にカウントするためのコードです。

def get_east_asian_width_count(text):
    # 半角での文字数カウント
    count = 0
    for c in text:
        if unicodedata.east_asian_width(c) in 'FWA':
            count += 2
        else:
            count += 1
    return count

アカウント凍結対策のため(効果があるかは不明)、実行時にランダムで待機時間を設定しています。
時間は適宜変更してください。

def wait_sec_calc():
    # 1アクションごとの待ち時間の設定
    # 7割:2秒後から10秒後までランダムで待機、2割:30秒後から60秒後までランダムで待機、1割:300秒後から600秒後までランダムで待機
    rand_wait = random.random()
    if rand_wait > 0.3:
        wait_sec = random.randint(2, 10)
    elif rand_wait > 0.1:
        wait_sec = random.randint(30, 60)
    else:
        wait_sec = random.randint(300, 600)
    return wait_sec

①ツイートの自動化1(通常のツイート)

  • 簡単な説明

# ツイート内容の読み込み
CSVファイルからランダムでつぶやき内容を1つ読み込みます。

# ハッシュタグの読み込み & ツイート文の作成
ランダムでツイート文にハッシュタグをつけます。デフォルトでは50%の確率でハッシュタグを付けるようにしています。変更する場合は、21行目の数字を変えてください。
また、ハッシュタグの数は2~4個の中でランダムに選択するようにしています。ただし、ハッシュタグを付けるとツイート文が140文字を超えてしまう場合は、それ以上ハッシュタグを付けないようにしています(例:ランダムで4個が選択されたとしても、3個目のハッシュタグを付けると140文字になってしまう場合は2個で停止)。
※「randrange(x, y)」はx以上、y未満のランダムな整数を返すので、ハッシュタグの個数を変更する際には注意してください。

  • 用意するファイル

ツイート文(CSVファイル)
 1行ずつ記載
 ファイル名:test_tweet_normal_list.csv
ハッシュタグ(TXTファイル)
 1行ずつ記載
 ファイル名:test_tweet_normal_tag_list.txt
※ファイル名は、共通設定で「tweet_acnt」を「test」とした場合として記載

  • コード

def tweet_normal():
    dt_now = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
    f = open(data_dir + tweet_acnt + '_log.txt', 'a')
    f.write(dt_now + ":通常のツイートを試みます\n")
    f.close()

    try:
        # ツイート内容の読み込み
        count = 0
        tweet_list = []
        with open(data_dir + tweet_acnt + '_tweet_normal_list.csv', 'r', encoding='utf-8-sig') as f:
            line = csv.reader(f)
            for row in line:
                count += 1
                tweet_list.append(row)
            s = tweet_list[random.randrange(count)]
            tweet_str = "".join(s)

        # ハッシュタグの読み込み & ツイート文の作成
        add_tag = random.random()
        if add_tag > 0.5: #1/2の確率でタグ付け
            tag_num_list = []
            loop_check = 0
            with open(data_dir + tweet_acnt + '_tweet_normal_tag_list.txt', 'r', encoding='utf-8-sig') as f:
                tag_list = f.read().split("\n")
                tag_list.remove('')
                max_tag_num = random.randrange(2, 5) #タグの数を指定(2~4個)
                while len(tag_num_list) < max_tag_num:
                    tag_num = random.randrange(len(tag_list))
                    if not tag_num in tag_num_list:
                        tag_num_list.append(tag_num)
                for num in tag_num_list:
                    tweet_len = get_east_asian_width_count(tweet_str)
                    tag_len = get_east_asian_width_count(tag_list[num])
                    if loop_check == 0:
                        loop_check = 1
                        if tweet_len + tag_len + 2 <= 280:
                            tweet_str = tweet_str + '\n\n' + tag_list[num]
                    elif loop_check == 1:
                        if tweet_len + tag_len + 1 <= 280:
                            tweet_str = tweet_str + ' ' + tag_list[num]

        # ツイートの実行
        api.update_status(tweet_str)

        dt_now = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
        f = open(data_dir + tweet_acnt + '_log.txt', 'a')
        f.write(dt_now + ":ツイートを投稿しました\n")
        f.close()

    except:
        dt_now = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
        f = open(data_dir + tweet_acnt + '_log.txt', 'a')
        f.write(dt_now + ":ツイートに失敗しました\n")
        f.close()

②ツイートの自動化2(相互フォロー依頼用)

  • 簡単な説明

# ツイート内容の読み込み
CSVファイルからランダムでつぶやき内容を1つ読み込みます。

# ハッシュタグの読み込み & ツイート文の作成
ランダムでツイート文にハッシュタグをつけます。
また、ハッシュタグの数は5~7個の中でランダムに選択するようにしています。ただし、ハッシュタグを付けるとツイート文が140文字を超えてしまう場合は、それ以上ハッシュタグを付けないようにしています(例:ランダムで7個が選択されたとしても、5個目のハッシュタグを付けると140文字になってしまう場合は4個で停止)。
※「randrange(x, y)」はx以上、y未満のランダムな整数を返すので、ハッシュタグの個数を変更する際には注意してください。

  • 用意するファイル

ツイート文(CSVファイル)
 1行ずつ記載
 ファイル名:test_tweet_follow_list.csv
ハッシュタグ(TXTファイル)
 1行ずつ記載
 ファイル名:test_tweet_follow_tag_list.txt
※ファイル名は、共通設定で「tweet_acnt」を「test」とした場合として記載

  • コード

def tweet_follow():
    dt_now = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
    f = open(data_dir + tweet_acnt + '_log.txt', 'a')
    f.write(dt_now + ":相互フォロー用のツイートを試みます\n")
    f.close()

    try:
        # ツイート内容の読み込み
        count = 0
        tweet_list = []
        with open(data_dir + tweet_acnt + '_tweet_follow_list.csv', 'r', encoding='utf-8-sig') as f:
            line = csv.reader(f)
            for row in line:
                count += 1
                tweet_list.append(row)
            s = tweet_list[random.randrange(count)]
            tweet_str = "".join(s)

        # ハッシュタグの読み込み & ツイート文の作成
        tag_num_list = []
        loop_check = 0
        with open(data_dir + tweet_acnt + '_tweet_follow_tag_list.txt', 'r', encoding='utf-8-sig') as f:
            tag_list = f.read().split("\n")
            tag_list.remove('')
            max_tag_num = random.randrange(5, 8) #タグの数を指定(5~7個)
            while len(tag_num_list) < max_tag_num:
                tag_num = random.randrange(len(tag_list))
                if not tag_num in tag_num_list:
                    tag_num_list.append(tag_num)
            for num in tag_num_list:
                tweet_len = get_east_asian_width_count(tweet_str)
                tag_len = get_east_asian_width_count(tag_list[num])
                if loop_check == 0:
                    loop_check = 1
                    if tweet_len + tag_len + 2 <= 280:
                        tweet_str = tweet_str + '\n\n' + tag_list[num]
                elif loop_check == 1:
                    if tweet_len + tag_len + 1 <= 280:
                        tweet_str = tweet_str + '\n' + tag_list[num]

        # ツイートの実行
        api.update_status(tweet_str)

        dt_now = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
        f = open(data_dir + tweet_acnt + '_log.txt', 'a')
        f.write(dt_now + ":ツイートを投稿しました\n")
        f.close()

    except:
        dt_now = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
        f = open(data_dir + tweet_acnt + '_log.txt', 'a')
        f.write(dt_now + ":ツイートに失敗しました\n")
        f.close()

③フォローの自動化1(通常のフォロー)

  • 簡単な説明

# フォローの実施
設定した検索ワードの中からランダムにキーワードを1つ抽出し、そのキーワードを含むツイートをしたユーザーをフォローします。
ただし、60日以内に一度フォローしたユーザーと、30日以内にアンフォローしたユーザーはフォローしないように設定しています。
また、Twitterには業者も多いため、NGワードとして設定したキーワードが含まれる場合はフォローしないように設定しています。

# フォロー数のブレの設定
TwitterはBotに対する対策が厳しいので、共通設定で設定したフォロー数に対して、ブレを設定しています。デフォルトでは15%のブレとしています。変更する場合は、43行目の数字を変えてください。

  • 用意するファイル

検索ワード(TXTファイル)
 1行ずつ記載
 ファイル名:test_follow_keyword_list.txt
ハッシュタグ(TXTファイル)
 1行ずつ記載
 ファイル名:test_follow_ngword_list.txt
※ファイル名は、共通設定で「tweet_acnt」を「test」とした場合として記載

  • コード

def follow():
    dt_now = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
    f = open(data_dir + tweet_acnt + '_log.txt', 'a')
    f.write(dt_now + ":フォローを試みます\n")
    f.close()

    try:
        # 検索ワードの設定
        with open(data_dir + tweet_acnt + '_follow_keyword_list.txt', 'r', encoding='utf-8-sig') as f:
            keyword_list = f.read().split("\n")
            keyword_list.remove('')
            keyword = random.choice(keyword_list)

        # NGワードの設定
        with open(data_dir + tweet_acnt + '_follow_ngword_list.txt', 'r', encoding='utf-8-sig') as f:
            ngword_list = f.read().split("\n")
            ngword_list.remove('')

        # フォロー済みリストの取得(過去60日分)
        followed_unfollowed_id_past = []
        for days_before in range(60): #今日の分を含む
            d_past = d_today - datetime.timedelta(days=days_before)
            try:
                with open(data_dir + 'follow_data/' + tweet_acnt + '_followed_list_' + str(d_past) + '.txt', 'r', encoding='utf-8-sig') as f:
                    followed_list = f.read().split("\n")
                    followed_list.remove('')
                    followed_unfollowed_id_past.extend(followed_list)
            except Exception as e:
                print(e)

        # アンフォロー済みリストの取得(過去30日分)
        for days_before in range(30): #今日の分を含む
            d_past = d_today - datetime.timedelta(days=days_before)
            try:
                with open(data_dir + 'follow_data/' + tweet_acnt + '_unfollowed_list_' + str(d_past) + '.txt', 'r', encoding='utf-8-sig') as f:
                    unfollowed_list = f.read().split("\n")
                    unfollowed_list.remove('')
                    followed_unfollowed_id_past.extend(unfollowed_list)
            except Exception as e:
                print(e)

        # フォロー数のブレを設定(プラスマナイス15%)
        num_vol = round(follow_max * 0.15)
        if num_vol != 0:
            num_vol_neg = num_vol * -1
            follow_max_rev = follow_max + random.randint(num_vol_neg, num_vol)
        else:
            follow_max_rev = follow_max

        # 検索とフォローの実行
        follow_cnt = 0
        followed_id_now = []
        search_results = api.search_tweets(q=keyword, count=follow_max*2)
        for result in search_results:
            if follow_cnt < follow_max_rev:
                try:
                    screen_name = result.user._json['screen_name']
                    user_id = result.user._json['id']
                    if not screen_name in followed_id_now and not screen_name in followed_unfollowed_id_past:
                        ngword_chk = 0
                        for item in ngword_list:
                            if item in result.user._json['description']:
                                ngword_chk = 1
                        if ngword_chk == 0:
                            api.create_friendship(user_id=user_id)
                            followed_id_now.append(screen_name)
                            follow_cnt += 1
                            wait_sec = wait_sec_calc()
                            time.sleep(wait_sec)
                except Exception as e:
                    print(e)

        # フォロー済みリストのテキストへの保存
        f = open(data_dir + 'follow_data/' + tweet_acnt + '_followed_list_' + str(d_today) + '.txt', 'a')
        for num in range(len(followed_id_now)):
            f.write(followed_id_now[num] + "\n")
        f.close()

        dt_now = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
        f = open(data_dir + tweet_acnt + '_log.txt', 'a')
        f.write(dt_now + ":" + str(follow_cnt) + "人をフォローしました\n")
        f.close()

    except:
        dt_now = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
        f = open(data_dir + tweet_acnt + '_log.txt', 'a')
        f.write(dt_now + ":フォローに失敗しました\n")
        f.close()

④フォローの自動化2(フォローされた相手のフォロー)

  • 簡単な説明

# フォローの実施
フォロワーIDとフォローIDを取得し、フォローされているがフォローしていない相手を抽出し、フォローを実施します。

# フォロー数のブレの設定
TwitterはBotに対する対策が厳しいので、共通設定で設定したフォロー数に対して、ブレを設定しています。デフォルトでは15%のブレとしています。変更する場合は、12行目の数字を変えてください。

  • 用意するファイル

なし

  • コード

def follow_back():
    dt_now = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
    f = open(data_dir + tweet_acnt + '_log.txt', 'a')
    f.write(dt_now + ":フォローバックを試みます\n")
    f.close()

    try:
        # フォロワーIDとフォローIDを取得
        followers = api.get_follower_ids(screen_name=my_user_id)
        following = api.get_friend_ids(screen_name=my_user_id)

        # フォロー数のブレを設定(プラスマナイス15%)
        num_vol = round(follow_back_max * 0.15)
        if num_vol != 0:
            num_vol_neg = num_vol * -1
            follow_back_max_rev = follow_back_max + random.randint(num_vol_neg, num_vol)
        else:
            follow_back_max_rev = follow_back_max

        # フォローバックの実行
        follow_cnt = 0
        followed_id_now = []
        for result in followers:
            if result not in following:
                if follow_cnt < follow_back_max_rev:
                    try:
                        api.create_friendship(user_id=result)
                        followed_id_now.append(api.get_user(user_id=result).screen_name)
                        follow_cnt += 1
                        wait_sec = wait_sec_calc()
                        time.sleep(wait_sec)
                    except Exception as e:
                        print(e)
                else:
                    break

        # フォロー済みリストのテキストへの保存
        f = open(data_dir + 'follow_data/' + tweet_acnt + '_followed_list_' + str(d_today) + '.txt', 'a')
        for num in range(len(followed_id_now)):
            f.write(followed_id_now[num] + "\n")
        f.close()

        dt_now = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
        f = open(data_dir + tweet_acnt + '_log.txt', 'a')
        f.write(dt_now + ":" + str(follow_cnt) + "人をフォローバックしました\n")
        f.close()

    except:
        dt_now = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
        f = open(data_dir + tweet_acnt + '_log.txt', 'a')
        f.write(dt_now + ":フォローバックに失敗しました\n")
        f.close()

⑤フォロー解除の自動化1(通常の解除)

  • 簡単な説明

# アンフォローの実施
相手がフォローしてくれているかは関係なく、フォローした時期が古い順にフォロー解除を行います。
Twitter APIを使ってフォローIDを取得すると、新しい順に読み込まれるようなので、21行目のfor文で「[::-1]」として、古い順に読み込んで解除するようにしています。

# アンフォロー数のブレの設定
TwitterはBotに対する対策が厳しいので、共通設定で設定したアンフォロー数に対して、ブレを設定しています。デフォルトでは15%のブレとしています。変更する場合は、12行目の数字を変えてください。

  • 用意するファイル

なし

  • コード

def unfollow():
    dt_now = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
    f = open(data_dir + tweet_acnt + '_log.txt', 'a')
    f.write(dt_now + ":フォロー解除を試みます\n")
    f.close()

    try:
        # フォローIDを取得
        following = api.get_friend_ids(screen_name=my_user_id)

        # アンフォロー数のブレを設定(プラスマナイス15%)
        num_vol = round(unfollow_max * 0.15)
        if num_vol != 0:
            num_vol_neg = num_vol * -1
            unfollow_max_rev = unfollow_max + random.randint(num_vol_neg, num_vol)
        else:
            unfollow_max_rev = unfollow_max

        # フォロー解除の実行
        unfollow_cnt = 0
        unfollowed_id_now = []
        for result in following[::-1]:
            if unfollow_cnt < unfollow_max_rev:
                try:
                    screen_name = api.get_user(user_id=result).screen_name
                    api.destroy_friendship(user_id=result)
                    unfollowed_id_now.append(screen_name)
                    unfollow_cnt += 1
                    wait_sec = wait_sec_calc()
                    time.sleep(wait_sec)
                except Exception as e:
                    print(e)
            else:
                break

        # アンフォロー済みリストのテキストへの保存
        f = open(data_dir + 'follow_data/' + tweet_acnt + '_unfollowed_list_' + str(d_today) + '.txt', 'a')
        for num in range(len(unfollowed_id_now)):
            f.write(unfollowed_id_now[num] + "\n")
        f.close()

        dt_now = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
        f = open(data_dir + tweet_acnt + '_log.txt', 'a')
        f.write(dt_now + ":" + str(unfollow_cnt) + "人をフォロー解除しました\n")
        f.close()

    except:
        dt_now = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
        f = open(data_dir + tweet_acnt + '_log.txt', 'a')
        f.write(dt_now + ":フォロー解除に失敗しました\n")
        f.close()

⑥フォロー解除の自動化2(片思いフォローの解除)

  • 簡単な説明

# アンフォローの実施
⑤と似ているのですが、こちらではフォローしているユーザーの中から、片思いフォローのみを抽出して、古い順にフォロー解除を行います。
ただし、直近でフォローしたユーザーは解除しないようにしています。デフォルトでは直近3日としています。変更する場合は、14行目の数字を変えてください。

# アンフォロー数のブレの設定
TwitterはBotに対する対策が厳しいので、共通設定で設定したアンフォロー数に対して、ブレを設定しています。デフォルトでは15%のブレとしています。変更する場合は、25行目の数字を変えてください。

  • 用意するファイル

なし

  • コード

def unfollow_oneway():
    dt_now = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
    f = open(data_dir + tweet_acnt + '_log.txt', 'a')
    f.write(dt_now + ":片思いのフォロー解除を試みます\n")
    f.close()

    try:
        # フォロワーIDとフォローIDを取得
        followers = api.get_follower_ids(screen_name=my_user_id)
        following = api.get_friend_ids(screen_name=my_user_id)

        # フォロー済みリストの取得(過去3日分)
        followed_id_past = []
        for days_before in range(3): #今日の分を含む
            d_past = d_today - datetime.timedelta(days=days_before)
            try:
                with open(data_dir + 'follow_data/' + tweet_acnt + '_followed_list_' + str(d_past) + '.txt', 'r', encoding='utf-8-sig') as f:
                    followed_list = f.read().split("\n")
                    followed_list.remove('')
                    followed_id_past.extend(followed_list)
            except Exception as e:
                print(e)

        # アンフォロー数のブレを設定(プラスマナイス15%)
        num_vol = round(unfollow_oneway_max * 0.15)
        if num_vol != 0:
            num_vol_neg = num_vol * -1
            unfollow_oneway_max_rev = unfollow_oneway_max + random.randint(num_vol_neg, num_vol)
        else:
            unfollow_oneway_max_rev = unfollow_oneway_max

        # 片思いフォロー解除の実行
        unfollow_cnt = 0
        unfollowed_id_now = []
        for result in following[::-1]:
            if result not in followers:
                if unfollow_cnt < unfollow_oneway_max_rev:
                    try:
                        screen_name = api.get_user(user_id=result).screen_name
                        if not screen_name in followed_id_past:
                            api.destroy_friendship(user_id=result)
                            unfollowed_id_now.append(screen_name)
                            unfollow_cnt += 1
                            wait_sec = wait_sec_calc()
                            time.sleep(wait_sec)
                    except Exception as e:
                        print(e)
                else:
                    break

        # アンフォロー済みリストのテキストへの保存
        f = open(data_dir + 'follow_data/' + tweet_acnt + '_unfollowed_list_' + str(d_today) + '.txt', 'a')
        for num in range(len(unfollowed_id_now)):
            f.write(unfollowed_id_now[num] + "\n")
        f.close()

        dt_now = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
        f = open(data_dir + tweet_acnt + '_log.txt', 'a')
        f.write(dt_now + ":" + str(unfollow_cnt) + "人の片思いフォローを解除しました\n")
        f.close()

    except:
        dt_now = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
        f = open(data_dir + tweet_acnt + '_log.txt', 'a')
        f.write(dt_now + ":片思いフォローの解除に失敗しました\n")
        f.close()

4.お問い合わせ

第3章の説明部分にできるだけ詳しく記載したつもりですが、システムがうまく動作しない場合には、下記のメールアドレスまでご連絡ください。

また、ご不明点やご質問、ご要望なども受け付けておりますので、お気軽にご連絡いただければ幸いです。可能な限り早く返信するようにいたします。

メールアドレス:k.sawa.0425@gmail.com

この記事が気に入ったらサポートをしてみませんか?