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 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)' 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 = 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)) cur.execute(twitter_sql, (bot_uuid, twitter_username))
@ -106,14 +106,15 @@ def check_db_conn():
def ask_account(): def ask_account():
print(f'Setting up Mastodon bot account...\n') print(f'Setting up Mastodon/Pleroma bot account...\n')
hostname = input("Enter Mastodon hostname: ") hostname = input("Enter Mastodon/Pleroma hostname: ")
hostname_soft = input("Server software (mastodon or pleroma)? ")
user_name = input(f'User name, ex. user@{hostname}? ') user_name = input(f'User name, ex. user@{hostname}? ')
user_password = getpass.getpass("User password? ") user_password = getpass.getpass("User password? ")
app_name = 'replicator' app_name = 'replicator'
twitter_username = input(f'Twitter username (ex. jack)? ') 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): def log_in(hostname, user_name, user_password, app_name):
@ -185,13 +186,13 @@ if __name__ == '__main__':
check_db_conn() 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) is_duplicate = check_account(user_name)
if is_duplicate: if is_duplicate:
print(f'Mastodon account already exist!') print(f'Bot account already exist!')
sys.exit() sys.exit()
@ -201,7 +202,7 @@ if __name__ == '__main__':
if len(token) > 0: 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: if save_error == None:

Veure arxiu

@ -191,13 +191,17 @@ if __name__ == '__main__':
db = replicator_db db = replicator_db
db_user = replicator_db_user db_user = replicator_db_user
table = "id" table = "mastodon_id"
sql = f'create table {table} (toot_id bigint PRIMARY KEY, tweet_id bigint)' sql = f'create table {table} (toot_id bigint PRIMARY KEY, tweet_id bigint)'
create_table(db, db_user, table, sql) 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" 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) create_table(db, db_user, table, sql)

Veure arxiu

@ -1,5 +1,6 @@
import os import os
from mastodon import Mastodon from mastodon import Mastodon
from mastodon.Mastodon import MastodonMalformedEventError, MastodonNetworkError, MastodonReadTimeout, MastodonAPIError, MastodonIllegalArgumentError
import psycopg2 import psycopg2
import sys import sys
import time import time
@ -30,7 +31,9 @@ def load_bots():
client_token_lst = [] 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: try:
@ -58,9 +61,11 @@ def load_bots():
client_token_lst.append(row[5]) client_token_lst.append(row[5])
hostname_soft_lst.append(row[6])
cur.close() 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: except (Exception, psycopg2.DatabaseError) as error:
@ -108,6 +113,42 @@ def get_tusername(bot_id):
conn.close() 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): def parse_url(toot_text):
@ -123,7 +164,7 @@ def parse_url(toot_text):
return tuit_text return tuit_text
def get_toot_id(tweet_id): def get_toot_id(tweet_id, software):
toot_id = 0 toot_id = 0
@ -135,7 +176,13 @@ def get_toot_id(tweet_id):
cur = conn.cursor() cur = conn.cursor()
cur.execute('select toot_id, tweet_id from id where tweet_id=(%s)', (tweet_id,)) 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() row = cur.fetchone()
@ -157,9 +204,15 @@ def get_toot_id(tweet_id):
conn.close() conn.close()
def write_db(toot_id, tweet_id): def write_db(toot_id, tweet_id, softname):
sql_insert_ids = 'INSERT INTO id(toot_id, tweet_id) VALUES (%s,%s)' 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 conn = None
@ -299,7 +352,7 @@ if __name__ == '__main__':
replicator_db, replicator_db_user = db_config() 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 logged_in = False
@ -313,6 +366,8 @@ if __name__ == '__main__':
t_username = get_tusername(bot_id_lst[i]) t_username = get_tusername(bot_id_lst[i])
software = get_software(bot_id_lst[i])
# check new tweets # check new tweets
if not logged_in: if not logged_in:
@ -341,11 +396,11 @@ if __name__ == '__main__':
tweet_id = tweet.id tweet_id = tweet.id
toot_id = get_toot_id(tweet_id) toot_id = get_toot_id(tweet_id, software)
if toot_id == 0: 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 is_reply = False
@ -357,7 +412,7 @@ if __name__ == '__main__':
tweet_reply_id = tweet.in_reply_to_status_id 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: if reply_toot_id != 0:
@ -399,9 +454,15 @@ if __name__ == '__main__':
toot_text = f'{toot_text}\n{url}' toot_text = f'{toot_text}\n{url}'
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 try:
write_db(toot_id, tweet_id) 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, software)
except MastodonAPIError as a_error:
sys.stdout.write(f'\nbot: {t_username}\nerror: {str(a_error)}\n')
time.sleep(2) time.sleep(2)