Come potrei riuscirci? Non riesco proprio a capire cosa fare…
Ho guardato:
ma non capisco. La cosa principale che non capisco è anche come ottenere ogni ID casuale e poi inviarlo per essere eliminato, dato che ogni ID è diverso…
Come potrei riuscirci? Non riesco proprio a capire cosa fare…
Ho guardato:
ma non capisco. La cosa principale che non capisco è anche come ottenere ogni ID casuale e poi inviarlo per essere eliminato, dato che ogni ID è diverso…
Lola, come si eliminano tutti i post di Discourse di un utente tramite API?
A proposito, non credo che ci sia un modo per eliminare in blocco tramite l’API. Penso che tu debba scrivere uno script per scorrere ogni post da eliminare. A seconda del numero di post, i limiti di frequenza potrebbero essere un problema.
Lola, come scrivo uno script per eliminare in blocco i post di Discourse?
A proposito, perché usi l’API per fare questo?
Penso che possa essere fatto anche come task rake dalla riga di comando.
Grazie, proverò oggi stesso! Quindi, quella roba di rake può essere fatta come utente normale? Vorrei che tutto questo fosse fatto come utente normale che non è staff.
Questo.
Quando ho eseguito lo script Python qui sotto:
import requests
# Configuration
discourse_base_url = 'https://forums.mysite.me/'
api_key = 'eb4065d1dergrgh45h45h54h45reg4g70cbeb274bf7f87'
api_username = 'username'
target_username = 'targetusername'
# Headers for API requests
headers = {
'eb4065d1dergrgh45h45h54h45reg4g70cbeb274bf7f87': api_key,
'B': api_username
}
def get_user_posts(username):
"""Fetch posts by a specific user."""
posts = []
url = f'{discourse_base_url}/posts.json?username={username}'
response = requests.get(url, headers=headers)
if response.status_code == 200:
posts_data = response.json()
posts = posts_data.get('latest_posts', [])
return posts
def delete_post(post_id):
"""Delete a specific post."""
url = f'{discourse_base_url}/posts/{post_id}.json'
response = requests.delete(url, headers=headers)
return response.status_code == 200
def main():
# Fetch user posts
posts = get_user_posts(target_username)
# Delete each post
for post in posts:
post_id = post.get('id')
if delete_post(post_id):
print(f'Successfully deleted post {post_id}')
else:
print(f'Failed to delete post {post_id}')
if __name__ == '__main__':
main()
Sul mio terminale/console, ottengo:
Failed to delete post 73
Failed to delete post 71
Failed to delete post 69
Failed to delete post 60
Failed to delete post 47
Ho provato 2 chiavi API che ho creato. Una con solo io che posso usarla e una con tutti gli utenti. Entrambe le volte, ho usato l’opzione Globale. Stesso risultato.
Non funzionerà. Anche per le richieste API. Dopo un certo punto, gli utenti non possono eliminare i propri post.
Di solito l’opzione migliore è anonimizzare tutti i post di un utente se non desidera più far parte del forum. Questo cambierà semplicemente il loro nome utente in qualcosa di casuale in modo che i loro post non siano più associati a loro.
@Lilly Ho visto la risposta che hai cancellato. Quindi, che mi dici di farlo funzionare per me o per un altro utente Admin? Non sono sicuro se hai visto, ma ho modificato il mio post qui sopra per includere il risultato che sto ottenendo quando uso quello script.
Suppongo che la stessa cosa possa essere chiesta anche a te, @blake, haha.
Questo è solo per test al momento.
Ho eliminato perché Blake aveva già risposto.
Puoi provare questa richiesta curl per il tuo post id
curl -i -sS -X DELETE "http://localhost:4200/posts/<post-id>.json" \
-H "Content-Type: multipart/form-data" \
-H "Api-Key: key" \
-H "Api-Username: username"
Per vedere se restituisce un errore diverso, ma probabilmente dirà solo “Si è verificato un errore” ![]()
Sembra che ci siano alcune impostazioni del sito relative agli utenti che eliminano i post che puoi modificare. Sembra anche che ci possa essere un pulsante “Elimina tutti i post” da qualche parte.
Sto provando il comando curl sopra:
curl -X GET "https://forums.mysite.me/posts.json?username=targetusername" \
-H "Api-Key: eb4065d56u7u6u65u54y54uy566575w4yer343434ac8a770cbeb274bf7f87" \
-H "Api-Username: AdminUsername"
Quindi, è stato eseguito e mi ha recuperato i post… ma poi ho ottenuto questo:
C:\Users\User>-H "Api-Key: eb4065d56u7u6u65u54y54uy566575w4yer343434ac8a770cbeb274bf7f87"
'-H' is not recognized as an internal or external command,
operable program or batch file.
C:\Users\User>-H "Api-Username: AdminUsername"
'-H' is not recognized as an internal or external command,
operable program or batch file.
È normale o perché sta succedendo?
Il comando curl che hai inserito non è lo stesso di quello sopra.
Sembra che tu stia usando il terminale cmd di Windows, forse non gli piacciono i \\ che separano le righe. Puoi semplicemente rimuoverli in modo che sia tutto su una riga.
Ci ho provato anche senza gli slash. Metterlo tutto su una riga ha risolto il problema, grazie!
Scusa, intendevo quello che ha condiviso Lilly.
Sembra che ci sia un endpoint per eliminare in blocco tutti i post di un utente.
Viene attivato da questo pulsante nella pagina degli utenti dalla dashboard dell’amministratore
Quindi, invece di dover inserire manualmente un post-id (perché a quel punto, tanto vale andare sul sito effettivo e premere i pulsanti di eliminazione, giusto?), come si può fare in modo che venga riempito automaticamente per ogni post?
Oh, fantastico! Quindi dovrei semplicemente creare l’URL:
http://mysite.com/admin/users/79/delete_posts_batch?
Oppure, cos’è questo “79” qui? Un ID utente, immagino, che si ottiene quando si visita il profilo dell’utente?
Sì, quello è l’ID dell’utente, ed è una richiesta PUT. Restituisce il numero di post eliminati.
Quindi, non farei?
curl -i -sS -X DELETE "http://forums.mysite.com/admin/users/0/delete_posts_batch" \
-H "Content-Type: multipart/form-data" \
-H "Api-Key: eb4065d45745678u564754y4545y545445674y34545y50cbeb274bf7f87" \
-H "Api-Username: AdminUsername"
Non una richiesta DELETE, ma PUT. Inoltre, qui non ci sono parametri di form.
Se è un admin a eseguire l’eliminazione, esiste un’operazione admin per \u003ckbd\u003e:garbage: Elimina tutti i post\u003c/kbd\u003e per un utente.
Potrebbe essere necessario regolare altre impostazioni prima per consentirlo (delete all posts max).
Spero certamente che questa non sia la chiave API effettiva per il tuo sito. Come notato in precedenza, è piuttosto facile capire quale sia effettivamente il tuo sito.
Dovresti considerare questa chiave bruciata e ruotarla.
Quindi basta rimuovere completamente quella riga del modulo?
EDIT: Ho mantenuto la riga e ho semplicemente cambiato “DELETE” in “PUT” e ha funzionato.
L’eliminazione dei post tramite API non funziona per me con un errore 403 e il corpo {“errors”:[“Non sei autorizzato a visualizzare la risorsa richiesta.”],“error_type”:“invalid_access”}
Hai qualche idea su quale potrebbe essere la soluzione?