Last active
February 9, 2020 20:59
-
-
Save Tazeg/a4b5ec7f083c6d038fa7 to your computer and use it in GitHub Desktop.
Track Twitter followers/unfollowers and receive difference by email
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python3 | |
# coding=utf-8 | |
######################################################################## | |
# AUTHOR : Jean-Francois GAZET | |
# WEB : http://www.jeffprod.com | |
# TWITTER : @JeffProd | |
# MAIL : [email protected] | |
# LICENCE : GNU GENERAL PUBLIC LICENSE Version 2, June 1991 | |
######################################################################## | |
import difflib | |
import tweepy | |
import os.path | |
import smtplib | |
######################################################################## | |
# CONF | |
######################################################################## | |
# local file to record followers | |
FOLLOWERS_FILE = '/home/user/followers.txt' | |
# send changes by mail | |
EMAIL_TO = '[email protected]' | |
EMAIL_FROM = '[email protected]' | |
# gmail app paswd, see https://support.google.com/accounts/answer/185833 | |
GMAIL_PSWD = 'xyxyxyxyxy' | |
# twitter API keys, see https://apps.twitter.com | |
consumer_key = '' | |
consumer_secret = '' | |
access_token = '' | |
access_token_secret = '' | |
# verbose | |
VERBOSE = False | |
######################################################################## | |
# FUNCTIONS | |
######################################################################## | |
# function to put a file into a string | |
def file_get_contents(fic): | |
with open(fic, 'r') as myfile: | |
return myfile.read() | |
# function to put a string into a file | |
def file_put_contents(filename, s): | |
f = open(filename, 'w') | |
f.write(s) | |
f.close() | |
def sendgmail(frm, to, subject, msg): | |
msgmail = "From: " + frm + "\n" + \ | |
"To: " + to + "\n" + \ | |
"Subject: " + subject + "\n\n" + \ | |
msg | |
server = smtplib.SMTP('smtp.gmail.com', 587) | |
server.starttls() | |
server.login(frm, GMAIL_PSWD) | |
server.sendmail(frm, to, msgmail) | |
server.quit() | |
log('email sent') | |
def log(msg): | |
if not VERBOSE: | |
return | |
print(msg) | |
######################################################################## | |
# PROGRAM | |
######################################################################## | |
# Auth Twitter API | |
auth = tweepy.OAuthHandler(consumer_key, consumer_secret) | |
auth.set_access_token(access_token, access_token_secret) | |
api = tweepy.API(auth) | |
# get current followers | |
c_followers = [] | |
try: | |
log('getting current followers') | |
for user in tweepy.Cursor(api.followers).items(): | |
c_followers.append(user.screen_name) | |
except tweepy.error.RateLimitError: | |
log('Rate limit exceeded') | |
exit(0) | |
c_followers.sort() | |
c_followers = "\n".join(c_followers) | |
# get previous followers from file | |
p_followers = '' | |
if os.path.isfile(FOLLOWERS_FILE): | |
log('getting previous followers') | |
p_followers = file_get_contents(FOLLOWERS_FILE) | |
else: # very first call, save followers list | |
log('followers file does not exists. writing it. exit') | |
file_put_contents(FOLLOWERS_FILE, c_followers) | |
exit(0) | |
# checking diff | |
result = '' | |
diff = difflib.ndiff(p_followers.splitlines(), c_followers.splitlines()) | |
changes = [l for l in diff if l.startswith('+ ') or l.startswith('- ')] | |
for c in changes: | |
result += c + "\n" | |
# saving current followers to file | |
log('writing current followers to file') | |
file_put_contents(FOLLOWERS_FILE, c_followers) | |
# if lists are differents : send email | |
if result != '': | |
subject = 'Twitter followers status' | |
msg = "Followers changes :\n\n" + \ | |
result + "\n" \ | |
"Current followers : " + str(c_followers.count("\n")) | |
sendgmail(EMAIL_FROM, EMAIL_TO, subject, msg) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment