mirror of
https://gitlab.com/jeancf/twoot.git
synced 2024-11-27 14:01:13 +00:00
Implemented command line parsing
This commit is contained in:
parent
9b8b748b5a
commit
32f3eccc70
74
twoot.py
Normal file → Executable file
74
twoot.py
Normal file → Executable file
|
@ -19,6 +19,7 @@
|
|||
'''
|
||||
|
||||
import sys
|
||||
import argparse
|
||||
import os
|
||||
import random
|
||||
import requests
|
||||
|
@ -29,14 +30,6 @@ import re
|
|||
from mastodon import Mastodon, MastodonError
|
||||
|
||||
|
||||
#TODO manage command line
|
||||
TWIT_ACCOUNT = 'hackaday'
|
||||
MAST_ACCOUNT = 'twoot@noirextreme.com'
|
||||
MAST_PASSWORD = 'AcX/ZK5Ml6fRVDFi'
|
||||
MAST_INSTANCE = 'mastodon.host'
|
||||
MAX_AGE = 5 # in days
|
||||
MIN_DELAY = 0 # in minutes
|
||||
|
||||
USER_AGENTS = [
|
||||
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36',
|
||||
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/68.0',
|
||||
|
@ -50,6 +43,7 @@ USER_AGENTS = [
|
|||
|
||||
#TODO log to file
|
||||
|
||||
|
||||
def cleanup_tweet_text(tt_iter):
|
||||
'''
|
||||
Receives an iterator over all the elements contained in the tweet-text container
|
||||
|
@ -109,6 +103,27 @@ def cleanup_tweet_text(tt_iter):
|
|||
return tweet_text
|
||||
|
||||
|
||||
def main(argv):
|
||||
|
||||
# Build parser for command line arguments
|
||||
parser = argparse.ArgumentParser(description='toot tweets.')
|
||||
parser.add_argument('-t', metavar='<twitter account>', action='store', required=True)
|
||||
parser.add_argument('-i', metavar='<mastodon instance>', action='store', required=True)
|
||||
parser.add_argument('-m', metavar='<mastodon account>', action='store', required=True)
|
||||
parser.add_argument('-p', metavar='<mastodon password>', action='store', required=True)
|
||||
parser.add_argument('-a', metavar='<max age in days>', action='store', type=float, default=1)
|
||||
parser.add_argument('-d', metavar='<min delay in mins>', action='store', type=float, default=0)
|
||||
|
||||
# Parse command line
|
||||
args = vars(parser.parse_args())
|
||||
|
||||
twit_account = args['t']
|
||||
mast_instance = args['i']
|
||||
mast_account = args['m']
|
||||
mast_password = args['p']
|
||||
max_age = float(args['a'])
|
||||
min_delay = float(args['d'])
|
||||
|
||||
# **********************************************************
|
||||
# Load twitter page of user. Process all tweets and generate
|
||||
# list of dictionaries ready to be posted on Mastodon
|
||||
|
@ -127,7 +142,7 @@ headers.update(
|
|||
)
|
||||
|
||||
# Download twitter page of user
|
||||
response = requests.get('https://twitter.com/' + TWIT_ACCOUNT, headers=headers)
|
||||
response = requests.get('https://twitter.com/' + twit_account, headers=headers)
|
||||
|
||||
# DEBUG: Save page to file
|
||||
of = open('twitter.html', 'w')
|
||||
|
@ -173,7 +188,7 @@ for result in results:
|
|||
tweet_text = cleanup_tweet_text(tt_iter)
|
||||
|
||||
# Check it the tweet is a retweet from somebody else
|
||||
if author_account.lower() != TWIT_ACCOUNT.lower():
|
||||
if author_account.lower() != twit_account.lower():
|
||||
tweet_text = 'RT from ' + author + ' @' + author_account + '\n\n' + tweet_text
|
||||
|
||||
# Add footer with link to original tweet
|
||||
|
@ -210,7 +225,6 @@ for result in results:
|
|||
for t in tweets:
|
||||
print(t)
|
||||
|
||||
|
||||
# **********************************************************
|
||||
# Iterate tweets. Check if the tweet has already been posted
|
||||
# on Mastodon. If not, post it and add it to database
|
||||
|
@ -223,33 +237,33 @@ db.execute('''CREATE TABLE IF NOT EXISTS toots (twitter_account TEXT, mastodon_i
|
|||
mastodon_account TEXT, tweet_id TEXT, toot_id TEXT)''')
|
||||
|
||||
# Create Mastodon application if it does not exist yet
|
||||
if not os.path.isfile(MAST_INSTANCE + '.secret'):
|
||||
if not os.path.isfile(mast_instance + '.secret'):
|
||||
try:
|
||||
Mastodon.create_app(
|
||||
'twoot',
|
||||
api_base_url='https://' + MAST_INSTANCE,
|
||||
to_file=MAST_INSTANCE + '.secret'
|
||||
api_base_url='https://' + mast_instance,
|
||||
to_file=mast_instance + '.secret'
|
||||
)
|
||||
|
||||
except MastodonError as me:
|
||||
print('failed to create app on ' + MAST_INSTANCE)
|
||||
print('failed to create app on ' + mast_instance)
|
||||
sys.exit(1)
|
||||
|
||||
# Log in to Mastodon instance
|
||||
try:
|
||||
mastodon = Mastodon(
|
||||
client_id=MAST_INSTANCE + '.secret',
|
||||
api_base_url='https://' + MAST_INSTANCE
|
||||
client_id=mast_instance + '.secret',
|
||||
api_base_url='https://' + mast_instance
|
||||
)
|
||||
|
||||
mastodon.log_in(
|
||||
username=MAST_ACCOUNT,
|
||||
password=MAST_PASSWORD,
|
||||
to_file=MAST_ACCOUNT + ".secret"
|
||||
username=mast_account,
|
||||
password=mast_password,
|
||||
to_file=mast_account + ".secret"
|
||||
)
|
||||
|
||||
except MastodonError as me:
|
||||
print('ERROR: Login to ' + MAST_INSTANCE + ' Failed')
|
||||
print('ERROR: Login to ' + mast_instance + ' Failed')
|
||||
print(me)
|
||||
sys.exit(1)
|
||||
|
||||
|
@ -258,7 +272,7 @@ for tweet in reversed(tweets):
|
|||
# Check in database if tweet has already been posted
|
||||
db.execute('''SELECT * FROM toots WHERE twitter_account = ? AND mastodon_instance = ? AND
|
||||
mastodon_account = ? AND tweet_id = ?''',
|
||||
(TWIT_ACCOUNT, MAST_INSTANCE, MAST_ACCOUNT, tweet['tweet_id']))
|
||||
(twit_account, mast_instance, mast_account, tweet['tweet_id']))
|
||||
tweet_in_db = db.fetchone()
|
||||
|
||||
if tweet_in_db is not None:
|
||||
|
@ -267,8 +281,8 @@ for tweet in reversed(tweets):
|
|||
|
||||
# Check that the tweet is not too young (might be deleted) or too old
|
||||
age_in_hours = (time.time() - float(tweet['timestamp'])) / 3600.0
|
||||
min_delay_in_hours = float(MIN_DELAY) / 60.0
|
||||
max_age_in_hours = float(MAX_AGE) * 24.0
|
||||
min_delay_in_hours = min_delay / 60.0
|
||||
max_age_in_hours = max_age * 24.0
|
||||
|
||||
if age_in_hours < min_delay_in_hours or age_in_hours > max_age_in_hours:
|
||||
# Skip to next tweet
|
||||
|
@ -287,8 +301,8 @@ for tweet in reversed(tweets):
|
|||
# Post toot
|
||||
try:
|
||||
mastodon = Mastodon(
|
||||
access_token=MAST_ACCOUNT + '.secret',
|
||||
api_base_url='https://' + MAST_INSTANCE
|
||||
access_token=mast_account + '.secret',
|
||||
api_base_url='https://' + mast_instance
|
||||
)
|
||||
|
||||
if len(media_ids) == 0:
|
||||
|
@ -297,12 +311,16 @@ for tweet in reversed(tweets):
|
|||
toot = mastodon.status_post(tweet['tweet_text'], media_ids=media_ids, visibility='public')
|
||||
|
||||
except MastodonError as me:
|
||||
print('ERROR: posting ' + tweet['tweet_text'] + ' to ' + MAST_INSTANCE + ' Failed')
|
||||
print('ERROR: posting ' + tweet['tweet_text'] + ' to ' + mast_instance + ' Failed')
|
||||
print(me)
|
||||
sys.exit(1)
|
||||
|
||||
# Insert toot id into database
|
||||
if 'id' in toot:
|
||||
db.execute("INSERT INTO toots VALUES ( ? , ? , ? , ? , ? )",
|
||||
(TWIT_ACCOUNT, MAST_INSTANCE, MAST_ACCOUNT, tweet['tweet_id'], toot['id']))
|
||||
(twit_account, mast_instance, mast_account, tweet['tweet_id'], toot['id']))
|
||||
sql.commit()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv)
|
||||
|
|
Loading…
Reference in New Issue
Block a user