diff --git a/helpers.py b/helpers.py index e3cafcc..cb079a5 100755 --- a/helpers.py +++ b/helpers.py @@ -11,32 +11,24 @@ def _config(key): key {string} -- Name of the key in the config.json file. """ - my_file = Path('config.json') + my_file = Path("config.json") if not my_file.is_file(): - - print('--- Main config.json file not found. Exiting.') - + print("--- Main config.json file not found. Exiting.") sys.exit() - config_file = open('config.json') + config_file = open("config.json") config = config_file.read() if not config: - - print('--- config.json invalid. Exiting.') - + print("--- config.json invalid. Exiting.") sys.exit() config = json.loads(config) if config.get(key): - return config.get(key) - else: - - print('--- config.json invalid. Exiting.') - + print("--- config.json invalid. Exiting.") sys.exit() @@ -46,8 +38,7 @@ def _info(message): Arguments: message {string} -- Log message. """ - - print(' _info > ' + message) + print(f" _info > {message}") def _error(message): @@ -56,5 +47,4 @@ def _error(message): Arguments: message {string} -- Log message. """ - - print(' _error > ' + message) + print(f" _error > {message}") diff --git a/run.py b/run.py index 8e646f9..37cec61 100644 --- a/run.py +++ b/run.py @@ -4,7 +4,7 @@ import social import sys -if __name__ == '__main__': +if __name__ == "__main__": """ It all starts here... @@ -15,20 +15,13 @@ if __name__ == '__main__': tweets = social.getTweets() if not tweets: - - helpers._error( - '__main__ => No tweets fetched.') - + helpers._error("__main__ => No tweets fetched.") sys.exit() - helpers._info('__main__ => ' + str(len(tweets)) + ' tweets fetched.') + helpers._info(f"__main__ => {len(tweets)} tweets fetched.") for tweet in tweets: - if social.tootTheTweet(tweet): - - helpers._info('__main__ => Tooted "' + tweet['text'] + '"') - helpers._info( - '__main__ => Tooting less is tooting more. Sleeping...') - + helpers._info(f'__main__ => Tooted "{tweet["text"]}"') + helpers._info("__main__ => Tooting less is tooting more. Sleeping...") sys.exit() diff --git a/social.py b/social.py index 96cb833..282209f 100644 --- a/social.py +++ b/social.py @@ -4,6 +4,7 @@ from bs4 import BeautifulSoup from pathlib import Path import base64 + def getTweets(): """ Get list of tweets, with tweet ID and content, from configured Twitter account URL. @@ -13,50 +14,38 @@ def getTweets(): """ all_tweets = [] - - url = helpers._config('tweets.source_account_url') + url = helpers._config("tweets.source_account_url") if not url: - - helpers._error('getTweets() => The source Twitter account URL (' + url + ') was incorrect. Could not retrieve tweets.') - + helpers._error( + f"getTweets() => The source Twitter account URL ({url}) was incorrect. Could not retrieve tweets.") return False headers = {} - headers['accept-language'] = 'en-US,en;q=0.9' - headers['dnt'] = '1' - headers['user-agent'] = helpers._config('gen.APP_NAME') + headers["accept-language"] = "en-US,en;q=0.9" + headers["dnt"] = "1" + headers["user-agent"] = helpers._config("gen.APP_NAME") data = requests.get(url) - - html = BeautifulSoup(data.text, 'html.parser') - - timeline = html.select('#timeline li.stream-item') + html = BeautifulSoup(data.text, "html.parser") + timeline = html.select("#timeline li.stream-item") if timeline is None: - - helpers._error('getTweets() => Could not retrieve tweets from the page. Please make sure the source Twitter account URL (' + url + ') is correct.') - + helpers._error( + f"getTweets() => Could not retrieve tweets from the page. Please make sure the source Twitter account URL ({url}) is correct." + ) return False - helpers._info('getTweets() => Fetched tweets for ' + url + '.') + helpers._info(f"getTweets() => Fetched tweets for {url}.") for tweet in timeline: - - tweet_id = tweet['data-item-id'] - + tweet_id = tweet["data-item-id"] try: - - tweet_text = tweet.select('p.tweet-text')[0].get_text() - + tweet_text = tweet.select("p.tweet-text")[0].get_text() except: - - helpers._info('getTweets() => No tweet text found. Moving on...') - + helpers._info("getTweets() => No tweet text found. Moving on...") continue - all_tweets.append({"id": tweet_id, "text": tweet_text}) - return all_tweets if len(all_tweets) > 0 else None @@ -71,62 +60,58 @@ def tootTheTweet(tweet): tweet {dictionary} -- Dictionary containing the "id" and "text" of a single tweet. """ - host_instance = helpers._config('toots.host_instance') - token = helpers._config('toots.app_secure_token') - - tweet_id = tweet['id'] + host_instance = helpers._config("toots.host_instance") + token = helpers._config("toots.app_secure_token") + tweet_id = tweet["id"] if not host_instance: - - helpers._error('tootTheTweet() => Your host Mastodon instance URL (' + host_instance + ') was incorrect.') - + helpers._error( + f"tootTheTweet() => Your host Mastodon instance URL ({host_instance}) was incorrect." + ) return False if not token: - - helpers._error('tootTheTweet() => Your Mastodon access token was incorrect.') - - return False - - headers = {} - headers['Authorization'] = 'Bearer ' + token - headers['Idempotency-Key'] = tweet_id - - data = {} - data['status'] = tweet['text'] - data['visibility'] = 'public' - - tweet_check_file_path = helpers._config('toots.cache_path') + tweet['id'] - tweet_check_file = Path(tweet_check_file_path) - if tweet_check_file.is_file(): - - helpers._info('tootTheTweet() => Tweet ' + tweet_id + ' was already posted. Reposting...') - + helpers._error("tootTheTweet() => Your Mastodon access token was incorrect.") return False - else: + headers = {} + headers["Authorization"] = f"Bearer {token}" + headers["Idempotency-Key"] = tweet_id - tweet['text'].encode('utf-8') - - tweet_check = open(tweet_check_file_path, mode='w') - tweet_check.write(tweet['text']) + data = {} + data["status"] = tweet["text"] + data["visibility"] = "public" + + tweet_check_file_path = helpers._config("toots.cache_path") + tweet["id"] + tweet_check_file = Path(tweet_check_file_path) + if tweet_check_file.is_file(): + helpers._info( + f"tootTheTweet() => Tweet {tweet_id} was already posted. Reposting..." + ) + return False + else: + tweet["text"].encode("utf-8") + + tweet_check = open(tweet_check_file_path, mode="w") + tweet_check.write(tweet["text"]) tweet_check.close() - helpers._info('tootTheTweet() => New tweet ' + tweet_id + ' => "' + tweet['text'] + '".') + helpers._info( + f'tootTheTweet() => New tweet {tweet_id} => "{tweet["text"]}".' + ) response = requests.post( - url=host_instance + '/api/v1/statuses', data=data, headers=headers) + url=f"{host_instance}/api/v1/statuses", data=data, headers=headers + ) if response.status_code == 200: - - helpers._info('tootTheTweet() => OK. Posted tweet ' + tweet_id + 'to Mastodon.') - helpers._info('tootTheTweet() => Response: ' + response.text) - + helpers._info(f"tootTheTweet() => OK. Posted tweet {tweet_id} to Mastodon.") + helpers._info(f"tootTheTweet() => Response: {response.text}") return True else: - - helpers._info('tootTheTweet() => FAIL. Could not post tweet ' + tweet_id + 'to Mastodon.') - helpers._info('tootTheTweet() => Response: ' + response.text) - + helpers._info( + f"tootTheTweet() => FAIL. Could not post tweet {tweet_id} to Mastodon." + ) + helpers._info(f"tootTheTweet() => Response: {response.text}") return False