Skip to content

Commit

Permalink
Merge branch 'PhilippBehmer-master'
Browse files Browse the repository at this point in the history
  • Loading branch information
kurozael committed Dec 2, 2015
2 parents 0a0bb72 + d7317be commit 157aa83
Show file tree
Hide file tree
Showing 2 changed files with 144 additions and 76 deletions.
8 changes: 6 additions & 2 deletions config.json.example
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@
"search-queries": ["RT to win", "Retweet and win"],
"follow-keywords": [" follow ", " follower "],
"fav-keywords": [" fav ", " favorite "],
"scan-update-time": 1800,
"retweet-update-time": 600,
"scan-update-time": 1800,
"retweet-update-time": 20,
"rate-limit-update-time": 10,
"min-ratelimit":10,
"min-ratelimit-retweet":20,
"min-ratelimit-search":40,
"consumer-key": "YOUR CONSUMER KEY",
"consumer-secret": "YOUR SECRET KEY",
"access-token-key": "YOUR ACCESS TOKEN KEY",
Expand Down
212 changes: 138 additions & 74 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import time
import json
import os.path
import sys

# Load our configuration from the JSON file.
with open('config.json') as data_file:
Expand All @@ -15,6 +16,10 @@
access_token_secret = data["access-token-secret"]
retweet_update_time = data["retweet-update-time"]
scan_update_time = data["scan-update-time"]
rate_limit_update_time = data["rate-limit-update-time"]
min_ratelimit = data["min-ratelimit"]
min_ratelimit_retweet = data["min-ratelimit-retweet"]
min_ratelimit_search = data["min-ratelimit-search"]
search_queries = data["search-queries"]
follow_keywords = data["follow-keywords"]
fav_keywords = data["fav-keywords"]
Expand All @@ -23,25 +28,66 @@
api = TwitterAPI(consumer_key, consumer_secret, access_token_key, access_token_secret)
post_list = list()
ignore_list = list()
#last_twitter_id = 0
ratelimit=[999,999,100]
ratelimit_search=[999,999,100]

if os.path.isfile('ignorelist'):
print("Loading ignore list")
with open('ignorelist') as f:
ignore_list = f.read().splitlines()
f.close()
print ignore_list
time.sleep(1)


# Print and log the text
def LogAndPrint( text ):
tmp = str(text)
tmp = text.replace("\n","")
print(tmp)
f_log = open('log', 'a')
f_log.write(tmp + "\n")
f_log.close()

def CheckError( r ):
r = r.json()
if 'errors' in r:
LogAndPrint("We got an error message: " + r['errors'][0]['message'] + " Code: " + str(r['errors'][0]['code']) )
#sys.exit(r['errors'][0]['code'])

def CheckRateLimit():
c = threading.Timer(rate_limit_update_time, CheckRateLimit)
c.daemon = True;
c.start()

global ratelimit
global ratelimit_search

if ratelimit[2] < min_ratelimit:
print("Ratelimit too low -> Cooldown (" + str(ratelimit[2]) + "%)")
time.sleep(30)

r = api.request('application/rate_limit_status').json()

for res_family in r['resources']:
for res in r['resources'][res_family]:
limit = r['resources'][res_family][res]['limit']
remaining = r['resources'][res_family][res]['remaining']
percent = float(remaining)/float(limit)*100

if res == "/search/tweets":
ratelimit_search=[limit,remaining,percent]

if res == "/application/rate_limit_status":
ratelimit=[limit,remaining,percent]

#print(res_family + " -> " + res + ": " + str(percent))
if percent < 5.0:
LogAndPrint(res_family + " -> " + res + ": " + str(percent) + " !!! <5% Emergency exit !!!")
sys.exit(res_family + " -> " + res + ": " + str(percent) + " !!! <5% Emergency exit !!!")
elif percent < 30.0:
LogAndPrint(res_family + " -> " + res + ": " + str(percent) + " !!! <30% alert !!!")
elif percent < 70.0:
print(res_family + " -> " + res + ": " + str(percent))


# Update the Retweet queue (this prevents too many retweets happening at once.)
def UpdateQueue():
Expand All @@ -54,14 +100,22 @@ def UpdateQueue():
print("Queue length: " + str(len(post_list)))

if len(post_list) > 0:
post = post_list[0]
LogAndPrint("Retweeting: " + str(post['id']) + " " + str(post['text'].encode('utf8')))

CheckForFollowRequest(post)
CheckForFavoriteRequest(post)
if not ratelimit[2] < min_ratelimit_retweet:

api.request('statuses/retweet/:' + str(post['id']))
post_list.pop(0)
post = post_list[0]
LogAndPrint("Retweeting: " + str(post['id']) + " " + str(post['text'].encode('utf8')))

CheckForFollowRequest(post)
CheckForFavoriteRequest(post)

r = api.request('statuses/retweet/:' + str(post['id']))
CheckError(r)
post_list.pop(0)

else:

print("Ratelimit at " + str(ratelimit[2]) + "% -> pausing retweets")


# Check if a post requires you to follow the user.
Expand All @@ -70,112 +124,122 @@ def CheckForFollowRequest(item):
text = item['text']
if any(x in text.lower() for x in follow_keywords):
try:
api.request('friendships/create', {'screen_name': item['retweeted_status']['user']['screen_name']})
r = api.request('friendships/create', {'screen_name': item['retweeted_status']['user']['screen_name']})
CheckError(r)
LogAndPrint("Follow: " + item['retweeted_status']['user']['screen_name'])
except:
user = item['user']
screen_name = user['screen_name']
api.request('friendships/create', {'screen_name': screen_name})
r = api.request('friendships/create', {'screen_name': screen_name})
CheckError(r)
LogAndPrint("Follow: " + screen_name)


# Check if a post requires you to favorite the tweet.
# Be careful with this function! Twitter may write ban your application for favoriting too aggressively
def CheckForFavoriteRequest(item):
text = item['text']

if any(x in text.lower() for x in fav_keywords):
try:
api.request('favorites/create', {'id': item['retweeted_status']['user']['id']})
LogAndPrint("Favorite: " + item['retweeted_status']['user']['id'])
r = api.request('favorites/create', {'id': item['retweeted_status']['id']})
CheckError(r)
LogAndPrint("Favorite: " + str(item['retweeted_status']['id']))
except:
api.request('favorites/create', {'id': item['id']})
LogAndPrint("Favorite: " + item['id'])
r = api.request('favorites/create', {'id': item['id']})
CheckError(r)
LogAndPrint("Favorite: " + str(item['id']))


# Scan for new contests, but not too often because of the rate limit.
def ScanForContests():
t = threading.Timer(scan_update_time, ScanForContests)
t.daemon = True;
t.start()
original_screen_name = None
# global last_twitter_id

print("=== SCANNING FOR NEW CONTESTS ===")


for search_query in search_queries:

print("Getting new results for: " + search_query)
global ratelimit_search

try:
# r = api.request('search/tweets', {'q':search_query, 'since_id':last_twitter_id})
r = api.request('search/tweets', {'q':search_query, 'result_type':"mixed", 'count':100})
c=0

for item in r:

c=c+1
user_item = item['user']
screen_name = user_item['screen_name']
text = item['text']
text = text.replace("\n","")
id = str(item['id'])
original_id=id
is_retweet = 0
if not ratelimit_search[2] < min_ratelimit_search:

print("=== SCANNING FOR NEW CONTESTS ===")

# if (item['id'] > last_twitter_id):
# last_twitter_id = item['id']

if 'retweeted_status' in item:
for search_query in search_queries:

is_retweet = 1
original_item = item['retweeted_status']
original_id = str(original_item['id'])
original_user_item = original_item['user']
original_screen_name = original_user_item['screen_name']
print("Getting new results for: " + search_query)

try:
r = api.request('search/tweets', {'q':search_query, 'result_type':"mixed", 'count':100})
CheckError(r)
c=0

for item in r:

c=c+1
user_item = item['user']
screen_name = user_item['screen_name']
text = item['text']
text = text.replace("\n","")
id = str(item['id'])
original_id=id
is_retweet = 0

if 'retweeted_status' in item:

is_retweet = 1
original_item = item['retweeted_status']
original_id = str(original_item['id'])
original_user_item = original_item['user']
original_screen_name = original_user_item['screen_name']

if not original_id in ignore_list:

if not original_screen_name in ignore_list:

if not screen_name in ignore_list:

if item['retweet_count'] > 0:

if not original_id in ignore_list:
post_list.append(item)
f_ign = open('ignorelist', 'a')

if not original_screen_name in ignore_list:

if item['retweet_count'] > 0:
if is_retweet:
print(id + " - " + screen_name + " retweeting " + original_id + " - " + original_screen_name + ": " + text)
ignore_list.append(original_id)
f_ign.write(original_id + "\n")
else:
print(id + " - " + screen_name + ": " + text)
ignore_list.append(id)
f_ign.write(id + "\n")

post_list.append(item)
f_ign = open('ignorelist', 'a')
f_ign.close()

else:

if is_retweet:
print(id + " - " + screen_name + " retweeting " + original_id + " - " + original_screen_name + ": " + text)
ignore_list.append(original_id)
f_ign.write(original_id + "\n")
print(id + " ignored: " + original_screen_name + " on ignore list")
else:
print(id + " - " + screen_name + ": " + text)
ignore_list.append(id)
f_ign.write(id + "\n")

f_ign.close()
print(original_screen_name + " in ignore list")

else:

if is_retweet:
print(id + " ignored: " + original_screen_name + " on ignore list")
print(id + " ignored: " + original_id + " on ignore list")
else:
print(original_screen_name + " in ignore list")
print(id + " in ignore list")

print("Got " + str(c) + " results")

else:
except Exception as e:
print("Could not connect to TwitterAPI - are your credentials correct?")
print("Exception: " + e)

if is_retweet:
print(id + " ignored: " + original_id + " on ignore list")
else:
print(id + " in ignore list")

print("Got " + str(c) + " results")
# print("Last ID: " + str(last_twitter_id))
else:

except Exception as e:
print("Could not connect to TwitterAPI - are your credentials correct?")
print("Exception: " + str(e))
print("Search skipped! Queue: " + str(len(post_list)) + " Ratelimit: " + str(ratelimit_search[1]) + "/" + str(ratelimit_search[0]) + " (" + str(ratelimit_search[2]) + "%)")


CheckRateLimit()
ScanForContests()
UpdateQueue()

Expand Down

0 comments on commit 157aa83

Please sign in to comment.