Added Pleroma server support

This commit is contained in:
spla 2022-02-18 18:25:29 +01:00
pare 992f96eba6
commit 1e2806e23b
S'han modificat 3 arxius amb 88 adicions i 22 eliminacions

Veure arxiu

@ -49,7 +49,7 @@ def save_bot_account(hostname, username, client_id, client_secret, token, twitte
save_error = None
mastodon_sql = f'INSERT INTO maccounts (bot_id, hostname, username, client_id, client_secret, client_token) VALUES (%s,%s,%s,%s,%s,%s)'
mastodon_sql = f'INSERT INTO maccounts (bot_id, hostname, username, client_id, client_secret, client_token, hostname_soft) VALUES (%s,%s,%s,%s,%s,%s,%s)'
twitter_sql = f'INSERT INTO taccounts (bot_id, username) VALUES (%s,%s)'
@ -61,7 +61,7 @@ def save_bot_account(hostname, username, client_id, client_secret, token, twitte
cur = conn.cursor()
cur.execute(mastodon_sql, (bot_uuid, hostname, username, client_id, client_secret, token))
cur.execute(mastodon_sql, (bot_uuid, hostname, username, client_id, client_secret, token, hostname_soft))
cur.execute(twitter_sql, (bot_uuid, twitter_username))
@ -106,14 +106,15 @@ def check_db_conn():
def ask_account():
print(f'Setting up Mastodon bot account...\n')
hostname = input("Enter Mastodon hostname: ")
print(f'Setting up Mastodon/Pleroma bot account...\n')
hostname = input("Enter Mastodon/Pleroma hostname: ")
hostname_soft = input("Server software (mastodon or pleroma)? ")
user_name = input(f'User name, ex. user@{hostname}? ')
user_password = getpass.getpass("User password? ")
app_name = 'replicator'
twitter_username = input(f'Twitter username (ex. jack)? ')
return (hostname, user_name, user_password, app_name, twitter_username)
return (hostname, hostname_soft, user_name, user_password, app_name, twitter_username)
def log_in(hostname, user_name, user_password, app_name):
@ -185,13 +186,13 @@ if __name__ == '__main__':
check_db_conn()
hostname, user_name, user_password, app_name, twitter_username = ask_account()
hostname, hostname_soft, user_name, user_password, app_name, twitter_username = ask_account()
is_duplicate = check_account(user_name)
if is_duplicate:
print(f'Mastodon account already exist!')
print(f'Bot account already exist!')
sys.exit()
@ -201,7 +202,7 @@ if __name__ == '__main__':
if len(token) > 0:
save_error = save_bot_account(hostname, user_name, client_id, client_secret, token, twitter_username)
save_error = save_bot_account(hostname, hostname_soft, user_name, client_id, client_secret, token, twitter_username)
if save_error == None:

Veure arxiu

@ -191,13 +191,17 @@ if __name__ == '__main__':
db = replicator_db
db_user = replicator_db_user
table = "id"
table = "mastodon_id"
sql = f'create table {table} (toot_id bigint PRIMARY KEY, tweet_id bigint)'
create_table(db, db_user, table, sql)
table = "pleroma_id"
sql = f'create table {table} (toot_id varchar(18) PRIMARY KEY, tweet_id bigint)'
create_table(db, db_user, table, sql)
table = "maccounts"
sql = f'create table {table} (bot_id uuid, hostname varchar(20), username varchar(45), client_id varchar(45), client_secret varchar(45), client_token varchar(45), PRIMARY KEY (bot_id))'
sql = f'create table {table} (bot_id uuid, hostname varchar(20), username varchar(45), client_id varchar(45), client_secret varchar(45), client_token varchar(45), hostname_soft varchar(10), PRIMARY KEY (bot_id))'
create_table(db, db_user, table, sql)

Veure arxiu

@ -1,5 +1,6 @@
import os
from mastodon import Mastodon
from mastodon.Mastodon import MastodonMalformedEventError, MastodonNetworkError, MastodonReadTimeout, MastodonAPIError, MastodonIllegalArgumentError
import psycopg2
import sys
import time
@ -30,7 +31,9 @@ def load_bots():
client_token_lst = []
sql = 'select bot_id, hostname, username, client_id, client_secret, client_token from maccounts'
hostname_soft_lst = []
sql = 'select bot_id, hostname, username, client_id, client_secret, client_token, hostname_soft from maccounts'
try:
@ -58,9 +61,11 @@ def load_bots():
client_token_lst.append(row[5])
hostname_soft_lst.append(row[6])
cur.close()
return(bot_id_lst, hostname_lst, username_lst, client_id_lst, client_secret_lst, client_token_lst)
return(bot_id_lst, hostname_lst, username_lst, client_id_lst, client_secret_lst, client_token_lst, hostname_soft_lst)
except (Exception, psycopg2.DatabaseError) as error:
@ -108,6 +113,42 @@ def get_tusername(bot_id):
conn.close()
def get_software(bot_id):
software = ''
sql = 'select hostname_soft from maccounts where bot_id=(%s)'
try:
conn = None
conn = psycopg2.connect(database = replicator_db, user = replicator_db_user, password = "", host = "/var/run/postgresql", port = "5432")
cur = conn.cursor()
cur.execute(sql, (bot_id,))
row = cur.fetchone()
if row != 0:
software = row[0]
cur.close()
return(software)
except (Exception, psycopg2.DatabaseError) as error:
print(error)
finally:
if conn is not None:
conn.close()
def parse_url(toot_text):
@ -123,7 +164,7 @@ def parse_url(toot_text):
return tuit_text
def get_toot_id(tweet_id):
def get_toot_id(tweet_id, software):
toot_id = 0
@ -135,8 +176,14 @@ def get_toot_id(tweet_id):
cur = conn.cursor()
if software == 'mastodon':
cur.execute('select toot_id, tweet_id from id where tweet_id=(%s)', (tweet_id,))
elif software == 'pleroma':
cur.execute('select toot_id, tweet_id from pleroma_id where tweet_id=(%s)', (tweet_id,))
row = cur.fetchone()
if row != None:
@ -157,10 +204,16 @@ def get_toot_id(tweet_id):
conn.close()
def write_db(toot_id, tweet_id):
def write_db(toot_id, tweet_id, softname):
if softname == 'mastodon':
sql_insert_ids = 'INSERT INTO id(toot_id, tweet_id) VALUES (%s,%s)'
elif softname == 'pleroma':
sql_insert_ids = 'INSERT INTO pleroma_id(toot_id, tweet_id) VALUES (%s,%s)'
conn = None
try:
@ -299,7 +352,7 @@ if __name__ == '__main__':
replicator_db, replicator_db_user = db_config()
bot_id_lst, hostname_lst, username_lst, client_id_lst, client_secret_lst, client_token_lst = load_bots()
bot_id_lst, hostname_lst, username_lst, client_id_lst, client_secret_lst, client_token_lst, hostname_soft_lst = load_bots()
logged_in = False
@ -313,6 +366,8 @@ if __name__ == '__main__':
t_username = get_tusername(bot_id_lst[i])
software = get_software(bot_id_lst[i])
# check new tweets
if not logged_in:
@ -341,11 +396,11 @@ if __name__ == '__main__':
tweet_id = tweet.id
toot_id = get_toot_id(tweet_id)
toot_id = get_toot_id(tweet_id, software)
if toot_id == 0:
print(f'tweet id: {tweet.id}, {tweet.full_text}')
print(f'{t_username}, tweet id: {tweet.id}, {tweet.full_text}')
is_reply = False
@ -357,7 +412,7 @@ if __name__ == '__main__':
tweet_reply_id = tweet.in_reply_to_status_id
reply_toot_id = get_toot_id(tweet_reply_id)
reply_toot_id = get_toot_id(tweet_reply_id, software)
if reply_toot_id != 0:
@ -399,9 +454,15 @@ if __name__ == '__main__':
toot_text = f'{toot_text}\n{url}'
try:
toot_id = mastodon.status_post(toot_text, in_reply_to_id=reply_toot_id, media_ids=images_id_lst if is_media else None).id
write_db(toot_id, tweet_id)
write_db(toot_id, tweet_id, software)
except MastodonAPIError as a_error:
sys.stdout.write(f'\nbot: {t_username}\nerror: {str(a_error)}\n')
time.sleep(2)