booster/booster/twitter.py

168 lines
5.7 KiB
Python

#!/usr/bin/env python
# Booster Twitter Bot - Developed by acidvegas in Python (https://acid.vegas/booster)
# twitter.py
import random
import threading
import time
import tweepy
import config
import debug
import functions
class Booster(object):
def __init__(self):
self.api = None
self.me = None
self.favorites = 0
self.max_favorites = config.max_favorites
self.follows = 0
self.max_follows = config.max_follows
self.messages = 0
self.max_messages = config.max_messages
self.tweets = 0
self.max_tweets = config.max_tweets
self.unfollows = 0
self.max_unfollows = config.max_unfollows
self.send_message = config.send_message
self.message = config.message
def run(self):
self.login()
threading.Thread(target=self.loop_boost).start()
threading.Thread(target=self.loop_favorite).start()
threading.Thread(target=self.loop_follow).start()
threading.Thread(target=self.loop_search).start()
threading.Thread(target=self.loop_trend).start()
def login(self):
try:
auth = tweepy.OAuthHandler(config.consumer_key, config.consumer_secret)
auth.set_access_token(config.access_token, config.access_token_secret)
self.api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)
self.me = self.api.me()
except tweepy.TweepError as ex:
debug.error_exit('Failed to login to Twitter! ({0})'.format(str(ex)))
def loop_boost(self):
while True:
try:
if 'boost_tweet' in locals(): self.api.destroy_status(boost_tweet.id)
boost_tweet = self.api.update_status('RT for followers! #' + ' #'.join(config.boost_keywords))
self.tweets += 1
debug.alert('Re-posted boost tweet.')
except tweepy.TweepError as ex:
debug.error('Error occured in the boost loop', ex)
finally:
random.shuffle(config.boost_keywords)
time.sleep(60*5)
def loop_favorite(self):
while True:
try:
for tweet in tweepy.Cursor(self.api.home_timeline, exclude_replies=True).items(50):
if tweet.user.screen_name != self.me.screen_name:
if not tweet.favorited:
if random.choice((True, False, False, False, False)):
self.api.create_favorite(tweet.id)
self.favorites += 1
debug.alert('Favorited a friends tweet!')
time.sleep(30)
except tweepy.TweepError as ex:
debug.error('Error occured in the favorite loop!', ex)
finally:
time.sleep(60*15)
def loop_follow(self):
while True:
try:
followers = self.api.followers_ids(self.me.screen_name)
friends = self.api.friends_ids(self.me.screen_name)
non_friends = [friend for friend in followers if friend not in friends]
debug.action('Following back {0} supporters...'.format(len(non_friends)))
for follower in non_friends:
self.api.create_friendship(follower)
self.follows += 1
debug.alert('Followed back a follower!')
if self.follows >= self.max_follows:
break
if self.send_message:
self.api.send_direct_message(screen_name=follower, text=self.message)
time.sleep(30)
except tweepy.TweepError as ex:
debug.error('Error occured in the follow loop!', ex)
finally:
time.sleep(60*15)
def loop_search(self):
while True:
try:
query = random.choice(config.boost_keywords)
for item in self.api.search(q='#' + query, count=50, lang='en', result_type='recent'):
if not item.user.following and not item.favorited:
try:
self.api.create_favorite(item.id)
self.api.create_friendship(item.user.screen_name)
self.favorites += 1
self.follows += 1
debug.alert('Followed a booster twitter!')
except tweepy.TweepError as ex:
debug.error('Unknown error occured in the search loop!', ex)
time.sleep(30)
except tweepy.TweepError as ex:
debug.error('Error occured in the search loop!', ex)
finally:
time.sleep(60*15)
def loop_trend(self):
while True:
try:
trends = self.api.trends_place(str(config.woeid))
hashtags = [x['name'] for x in trends[0]['trends'] if x['name'].startswith('#')]
for trend in hashtags:
for item in self.api.search(q=trend, count=5, lang='en', result_type='top'):
self.api.update_status(item.tweet)
time.sleep(30)
except tweepy.TweepError as ex:
debug.error('Error occured in the trend loop!', ex)
finally:
time.sleep(60*15)
def loop_unfollow(self):
try:
followers = self.api.followers_ids(self.me.screen_name)
friends = self.api.friends_ids(self.me.screen_name)
non_friends = [friend for friend in friends if friend not in followers]
non_friends.reverse()
debug.action('Unfollowing {0} unsupporting friends...'.format(len(non_friends)))
for friend in non_friends:
self.api.destroy_friendship(friend)
self.unfollows += 1
debug.alert('Unfollowed an unsupporting friend!')
if self.unfollows == self.max_unfollows:
break
else:
time.sleep(60*functions.random_int(10,15))
except tweepy.TweepError as ex:
debug.error('Error occured in the unfollow loop!', ex)
finally:
self.unfollows = 0
def ratio_check(self):
if self.follows >= max_follows:
time.sleep(86400)
if self.me.friends_count >= 2000:
ratio = self.me.friends_count + (self.me.followers_count/10)
if self.me.friends_count >= ratio:
debug.action('Following to follower ratio is off! Starting the unfollow loop...')
unfollow_loop()
def stats(self):
debug.action('SceenName : ' + self.me.screen_name)
debug.action('Registered : ' + self.me.created_at)
debug.action('Favorites : ' + self.me.favourites_count)
debug.action('Following : ' + self.me.friends_count)
debug.action('Followers : ' + self.me.followers_count)
debug.action('Tweets : ' + self.me.statuses_count)