├── twitkeys.py ├── README.md ├── LICENSE └── gizoogle.py /twitkeys.py: -------------------------------------------------------------------------------- 1 | TWITTER_KEY = '___' 2 | TWITTER_SECRET_KEY = '___' 3 | ACCESS_TOKEN = '___' 4 | ACCESS_TOKEN_SECRET = '___' 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # twitter-gizoogle 2 | twitter-gizoogle is twitter bot that takes tweeted text, converts into a Snoop Doggified version using gizoogle.net, and tweets under a new handle. 3 | 4 | Currently I'm using this to run @DizonaldTrizump =) 5 | 6 | You need a twitter account, and a twitter key/token obtained from twitter. Then replace the placeholders in twitkeys.py 7 | 8 | Modules needed are requests, python-twitter, and bs4. 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Dan Shorstein 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /gizoogle.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import re 3 | import twitter 4 | from bs4 import BeautifulSoup 5 | import json 6 | import os 7 | from twitkeys import TWITTER_KEY, TWITTER_SECRET_KEY, ACCESS_TOKEN, ACCESS_TOKEN_SECRET 8 | 9 | 10 | TWITTER_HANDLES = ['@realDonaldTrump', '@POTUS'] 11 | HASHTAG = ' #Trizump' 12 | 13 | def main(): 14 | tweeted = load_tweets() 15 | api = twitter_api() 16 | tweets = get_tweets(api) 17 | send_tweets(tweets, tweeted, api) 18 | save_tweets(tweeted) 19 | 20 | 21 | def send_tweets(tweets, tweeted, api): 22 | for tweet in reversed(tweets): 23 | 24 | if tweet.id_str not in tweeted['tweets']: 25 | 26 | twizeet = gizoogle(tweet.text) + HASHTAG 27 | print('going to tweet id# {}'.format(tweet.id_str)) 28 | 29 | try: 30 | if len(twizeet) > 274: 31 | splits = twizeet.split() 32 | twizeet1 = ' '.join(splits[:int(len(splits)/3)]) + '..' 33 | twizeet2 = '..' + ' '.join(splits[int(len(splits)/3):int(len(splits)*2/3)]) + '..' 34 | twizeet3 = '..' + ' '.join(splits[int(len(splits)*2/3):]) 35 | api.PostUpdate(twizeet1) 36 | api.PostUpdate(twizeet2) 37 | api.PostUpdate(twizeet3) 38 | tweeted['tweets'].append(tweet.id_str) 39 | 40 | elif len(twizeet) > 140: 41 | splits = twizeet.split() 42 | twizeet1 = ' '.join(splits[:int(len(splits)/2)]) + '..' 43 | twizeet2 = '..' + ' '.join(splits[int(len(splits)/2):]) 44 | api.PostUpdate(twizeet1) 45 | api.PostUpdate(twizeet2) 46 | tweeted['tweets'].append(tweet.id_str) 47 | 48 | else: 49 | api.PostUpdate(twizeet) 50 | tweeted['tweets'].append(tweet.id_str) 51 | 52 | except Exception as e: 53 | print(e) 54 | 55 | else: 56 | print('{} already tweeted.'.format(tweet.id_str)) 57 | 58 | 59 | def get_tweets(api): 60 | 61 | tweets = [] 62 | tweet_text = [] 63 | 64 | for handle in TWITTER_HANDLES: 65 | tweets = api.GetUserTimeline(screen_name=handle) 66 | for tweet in tweets: 67 | if tweet.text not in tweet_text: 68 | tweets.append(tweet) 69 | tweet_text.append(tweet.text) 70 | 71 | return tweets 72 | 73 | 74 | def gizoogle(text): 75 | data = {'translatetext':text} 76 | r = requests.post('http://www.gizoogle.net/textilizer.php', data=data) 77 | soup = BeautifulSoup(r.text, 'html.parser') 78 | gizoogled = soup.form.get_text() 79 | 80 | print('****************') 81 | print('CONVERTED{}\n\nINTO\n{}'.format(text, gizoogled)) 82 | print('****************') 83 | 84 | return gizoogled 85 | 86 | 87 | def twitter_api(): 88 | api = twitter.Api(consumer_key=TWITTER_KEY, 89 | consumer_secret=TWITTER_SECRET_KEY, 90 | access_token_key=ACCESS_TOKEN, 91 | access_token_secret=ACCESS_TOKEN_SECRET) 92 | return api 93 | 94 | 95 | def load_tweets(): 96 | base_folder = os.path.abspath(os.path.dirname(__file__)) 97 | path = os.path.join(base_folder, 'tweeted.json') 98 | if os.path.isfile(path): 99 | with open(path) as filein: 100 | tweeted = json.load(filein) 101 | else: 102 | tweeted = {'tweets': []} 103 | return tweeted 104 | 105 | 106 | def save_tweets(tweeted): 107 | base_folder = os.path.abspath(os.path.dirname(__file__)) 108 | path = os.path.join(base_folder, 'tweeted.json') 109 | with open(path, 'w') as outfile: 110 | json.dump(tweeted, outfile) 111 | 112 | 113 | if __name__ == '__main__': 114 | main() 115 | --------------------------------------------------------------------------------