mass_block.py
unknown
plain_text
4 years ago
5.0 kB
8
Indexable
import sys
import configparser
from os.path import isfile
import tweepy
import time
def main():
"""
Usage:
$ python twitter_block.py AccountName
The script expect the keys and tokens in a separate 'KEY_TOKEN.txt' file.
Sources:
https://stackoverflow.com/q/31000178/1391441
https://stackoverflow.com/a/17490816/1391441
"""
api, accountvar = APIAccount()
print("\nAccount whose followers to block: '{}'".format(accountvar))
# Read manually white-listed IDs
try:
with open("whitelist.txt", "r") as f:
whitelistIDs = f.read().split()
whitelistIDs = [int(_) for _ in whitelistIDs]
except FileNotFoundError:
whitelistIDs = []
# Fetch my followers
followers_fname = "my_followers.txt"
myfollowersIDs = IDsRequest(
None, api.followers_ids, followers_fname, False)
print("{} followers of my account".format(len(myfollowersIDs)))
# Fetch accounts I follow
followed_fname = "my_followed.txt"
myfollowedIDs = IDsRequest(None, api.friends_ids, followed_fname, False)
print("{} accounts followed by me".format(len(myfollowedIDs)))
# Fetch accounts already blocked (this is to speed up the block process)
blocked_fname = "blocked_IDs.txt"
if not isfile(blocked_fname):
IDsRequest(None, api.blocks_ids, blocked_fname)
with open(blocked_fname, "r") as f:
blockedIDs = f.read().split()
blockedIDs = [int(_) for _ in blockedIDs]
print("{} accounts already blocked".format(len(blockedIDs)))
# Request all the follower IDs for 'accountvar'
out_name = "{}_IDs.txt".format(accountvar)
if not isfile(out_name):
IDsRequest(accountvar, api.followers_ids, out_name)
with open(out_name, "r") as f:
followerids = f.read().split()
followerids = [int(_) for _ in followerids]
print("{} IDs requested".format(len(followerids)))
# Remove whitelisted IDs
followerids = list(set(followerids) - set(whitelistIDs))
# Remove accounts that I follow or that follow me
followerids = list(set(followerids) - set(myfollowersIDs))
followerids = list(set(followerids) - set(myfollowedIDs))
print("{} non whitelist or follow accounts".format(len(followerids)))
# Remove accounts that were already blocked
followerids = list(set(followerids) - set(blockedIDs))
print("{} non-blocked accounts".format(len(followerids)))
# Block non-blocked accounts
userBlock(api, followerids, blocked_fname)
def APIAccount():
"""
Define API call and name of account whose followers to block.
"""
# Read keys & tokens
config = configparser.ConfigParser()
config.read("KEY_TOKEN.txt")
consumer_key = config.get("api_token", "consumer_key")
consumer_secret = config.get("api_token", "consumer_secret")
access_token = config.get("api_token", "access_token")
access_token_secret = config.get("api_token", "access_token_secret")
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
# Make sure you have set wait_on_rate_limit to True while connecting
# through Tweepy
api = tweepy.API(
auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)
# Passed as argument
accountvar = sys.argv[1].lower()
return api, accountvar
def IDsRequest(accountvar, api_call, out_name, write=True, sec_sleep=60):
"""
Store blocked accounts from the issuing account or follower ids from
'accountvar'.
"""
print("Requesting IDs...")
listIDs = []
for page in tweepy.Cursor(
api_call, screen_name=accountvar).pages():
if write:
with open(out_name, "a") as f:
for _ in page:
f.write(str(_) + '\n')
else:
listIDs += [int(_) for _ in page]
if len(page) % 5000 == 0:
print("5000 IDs requested. Sleeping for {} seconds...".format(
sec_sleep))
time.sleep(sec_sleep)
return listIDs
def userBlock(api, users, blocked_fname):
"""
Block all users in 'users' list
"""
print("Blocking users...")
Nt = len(users)
start = time.time()
j, _5perc = 0, (5. * Nt) / 100.
with open(blocked_fname, "a") as f:
for i, user in enumerate(users):
try:
api.create_block(user)
f.write(str(user) + '\n')
except tweepy.TweepError:
print("Error: {}".format(user))
continue
if i > _5perc * j:
j += 1
# time used so far
tt = time.time() - start
# estimation of total time
t_tot = Nt * tt / (i + 1)
# estimation of time remaining
t_rem = t_tot - tt
txt = "Blocked: {} ({:.2f}%) | Time remaining: {:.1f} min"
print(txt.format(i, 100 * i / Nt, t_rem / 60.))
if __name__ == '__main__':
main()
Editor is loading...