parent
6f1ef285e4
commit
701c5daad4
5 changed files with 134 additions and 0 deletions
@ -0,0 +1,6 @@ |
||||
config.json |
||||
|
||||
db/accounts/*.json |
||||
|
||||
actions/*.curl |
||||
scripts/* |
@ -0,0 +1,5 @@ |
||||
1. Ve a un toot de prueba tuyo, desde el panel de administración |
||||
2. Abre el "panel de desarrollador" del navegador. Ve a la sección "Red" (Network) |
||||
3. Realiza un borrado del toot de prueba. |
||||
4. Copia como "curl" la petición POST del borrado. |
||||
5. Pega el texto en este archivo y reemplaza el ID de account por {accid} y el ID del status por {status} |
@ -0,0 +1,8 @@ |
||||
{ |
||||
"db": { |
||||
"host": "127.0.0.1", |
||||
"port": 5432, |
||||
"username": "postgres", |
||||
"password": null |
||||
} |
||||
} |
@ -0,0 +1,16 @@ |
||||
[ |
||||
{ |
||||
"days_old": 30, |
||||
"visibility": "public", |
||||
"exclude": ["#Activismo", "#NoBIGTech", "#Octavillas", "#Pancartas"] |
||||
}, |
||||
{ |
||||
"days_old": 7, |
||||
"visibility": "unlisted", |
||||
"exclude": ["#NoBIGTech", "tutoriales"] |
||||
}, |
||||
{ |
||||
"days_old": 7, |
||||
"visibility": "followers" |
||||
} |
||||
] |
@ -0,0 +1,99 @@ |
||||
#!/bin/bash |
||||
import psycopg2 |
||||
import json |
||||
import os |
||||
import re |
||||
|
||||
|
||||
def psql_connect(): |
||||
cfg = json.loads(readf('config.json')) |
||||
return psycopg2.connect(\ |
||||
host=cfg['db']['host'],\ |
||||
port=cfg['db']['port'],\ |
||||
user=cfg['db']['username'],\ |
||||
password=cfg['db']['password']\ |
||||
) |
||||
|
||||
def get_statuses(accid, visibility, days_old): |
||||
visibility_set = { |
||||
'followers': 2, |
||||
'unlisted': 1, |
||||
'public': 0 |
||||
} |
||||
con = psql_connect() |
||||
cur = con.cursor() |
||||
cur.execute("SELECT id, created_at, text FROM statuses WHERE account_id = {accid} AND visibility = {visibility} AND DATE_PART('day', NOW() - created_at) >= {days_old} AND text != ''".replace('{accid}', str(accid)).replace('{visibility}', str(visibility_set[visibility])).replace('{days_old}', str(days_old))) |
||||
ret = cur.fetchall() |
||||
con.close() |
||||
return ret |
||||
|
||||
def get_statuses_pinned(accid): |
||||
con = psql_connect() |
||||
cur = con.cursor() |
||||
cur.execute('SELECT status_id FROM status_pins WHERE account_id = {}'.format(accid)) |
||||
ret = cur.fetchall() |
||||
con.close() |
||||
return [str(a[0]) for a in ret] |
||||
|
||||
|
||||
def main(): |
||||
accounts = {} |
||||
for fil in os.listdir('db/accounts'): |
||||
if not fil.endswith('.json'): |
||||
continue |
||||
id_ = fil.replace('.json', '') |
||||
accounts[id_] = json.loads(readf('db/accounts/{}'.format(fil))) |
||||
|
||||
action_delete = readf('actions/delete.curl') |
||||
for id_ in accounts: |
||||
account = accounts[id_] |
||||
pinned = get_statuses_pinned(id_) |
||||
allstatuses = [] |
||||
for item in accounts[id_]: |
||||
exclude = [] |
||||
if 'exclude' in item: |
||||
exclude = [a.lower() for a in item['exclude']] |
||||
exclude = [normalize(a) for a in exclude] |
||||
statuses = get_statuses(id_, item['visibility'], item['days_old']) |
||||
for id_status, created_at, text in statuses: |
||||
if str(id_status) in pinned: |
||||
continue |
||||
words = text.strip().replace('\n', ' ').lower() |
||||
words = re.sub(r'[^a-z0-9\#\@\.\-]', ' ', normalize(words)) |
||||
words = re.sub(r'\s+', ' ', words).split() |
||||
words = [a.strip('.') for a in words] |
||||
text = ' '+(' '.join(words))+' ' |
||||
text = re.sub(r'\s+', ' ', text) |
||||
excludeit = False |
||||
for excl in exclude: |
||||
if ' '+excl+' ' in text: |
||||
excludeit = True |
||||
break |
||||
if excludeit: |
||||
continue |
||||
allstatuses.append(id_status) |
||||
|
||||
allstatuses = sorted(set(allstatuses)) |
||||
cmd = action_delete.replace('{accid}', id_) |
||||
for status in allstatuses: |
||||
cmd2 = cmd.replace('{status}', str(status)) |
||||
print('I| Removing status '+str(status)+' ', end='') |
||||
os.system(cmd2+' >/dev/null 2>&1') |
||||
print('done') |
||||
|
||||
def normalize(t): |
||||
t = t.replace('á', 'a') |
||||
t = t.replace('é', 'e') |
||||
t = t.replace('í', 'i') |
||||
t = t.replace('ó', 'o') |
||||
t = t.replace('ú', 'u') |
||||
return t |
||||
|
||||
def readf(f): |
||||
r = open(f,'r') |
||||
c = r.read().strip() |
||||
r.close() |
||||
return c |
||||
|
||||
if __name__ == '__main__': |
||||
main() |
Loading…
Reference in new issue