Alle Beiträge eines Nutzers auf der gesamten Seite mit API löschen?

Wie kann ich das erreichen? Ich scheine nicht wirklich herauszufinden, was zu tun ist…

Ich habe mir Folgendes angesehen:

https://www.postman.com/api-evangelist/workspace/discourse/documentation/35240-c739e2a5-3ddf-4ffc-90e9-7dd579e8a55d?entity=request-35240-b041dc53-b653-4c46-b067-aee2b0a5cb46

aber ich verstehe es nicht. Das Hauptproblem, das ich auch nicht verstehe, ist, wie man jede zufällige ID erhält und dann zum Löschen sendet, da jede ID anders ist…

Lola, wie löscht man alle Discourse-Beiträge eines Benutzers über die API?

2 „Gefällt mir“

Übrigens glaube ich nicht, dass es eine Möglichkeit gibt, über die API Massenlöschungen durchzuführen. Ich denke, Sie müssen ein Skript schreiben, um jeden Beitrag einzeln zu durchlaufen und zu löschen. Je nachdem, wie viele Beiträge es sind, könnten Ratenbegrenzungen ein Problem darstellen.

Lola, wie schreibe ich ein Skript, um Discourse-Beiträge massenhaft zu löschen?

BTW, warum verwenden Sie die API, um dies zu tun?

Ich denke, es kann auch als Rake-Aufgabe von der Kommandozeile aus erledigt werden.

4 „Gefällt mir“

Vielen Dank, ich werde das heute ausprobieren! Kann dieses Rake-Zeug also als normaler Benutzer gemacht werden? Ich möchte, dass dies alles als normaler Benutzer geschieht, der kein Mitarbeiter ist.

Das.

Als ich das folgende Python-Skript ausführte:

import requests
# Konfiguration
discourse_base_url = 'https://forums.mysite.me/'
api_key = 'eb4065d1dergrgh45h45h54h45reg4g70cbeb274bf7f87'
api_username = 'username'
target_username = 'targetusername'

# Header für API-Anfragen
headers = {
    'eb4065d1dergrgh45h45h54h45reg4g70cbeb274bf7f87': api_key,
    'B': api_username
}

def get_user_posts(username):
    """Ruft Beiträge eines bestimmten Benutzers ab."""
    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):
    """Löscht einen bestimmten Beitrag."""
    url = f'{discourse_base_url}/posts/{post_id}.json'
    response = requests.delete(url, headers=headers)
    return response.status_code == 200

def main():
    # Benutzerbeiträge abrufen
    posts = get_user_posts(target_username)
    
    # Jeden Beitrag löschen
    for post in posts:
        post_id = post.get('id')
        if delete_post(post_id):
            print(f'Beitrag {post_id} erfolgreich gelöscht')
        else:
            print(f'Beitrag {post_id} konnte nicht gelöscht werden')

if __name__ == '__main__':
    main()

Auf meinem Terminal/in meiner Konsole erhalte ich:

Beitrag 73 konnte nicht gelöscht werden
Beitrag 71 konnte nicht gelöscht werden
Beitrag 69 konnte nicht gelöscht werden
Beitrag 60 konnte nicht gelöscht werden
Beitrag 47 konnte nicht gelöscht werden

Ich habe 2 API-Schlüssel ausprobiert, die ich erstellt habe. Einen, den nur ich verwenden kann, und einen für alle Benutzer. Beide Male wurde die globale Option verwendet. Gleiches Ergebnis.

Es tut mir leid, aber das hat mich laut auflachen lassen. Das konnte ich heute Morgen gut gebrauchen, haha.

2 „Gefällt mir“

Das wird nicht funktionieren. Selbst für API-Anfragen. Ab einem bestimmten Punkt können Benutzer ihre eigenen Beiträge nicht mehr löschen.

Normalerweise ist die beste Option, alle Beiträge eines Benutzers zu anonymisieren, wenn er nicht mehr Teil des Forums sein möchte. Dies ändert einfach seinen Benutzernamen in etwas Zufälliges, sodass seine Beiträge nicht mehr mit ihm in Verbindung gebracht werden.

1 „Gefällt mir“

@Lilly Habe die gelöschte Antwort gesehen. Was ist also damit, es für mich oder einen anderen Admin-Benutzer zum Laufen zu bringen? Ich bin mir nicht sicher, ob du es gesehen hast, aber ich habe meinen obigen Beitrag bearbeitet, um das Ergebnis einzufügen, das ich erhalte, wenn ich dieses Skript verwende.

Ich kann dasselbe wahrscheinlich auch an dich fragen, @blake, haha.

Das ist im Moment nur zum Testen.

Ich habe gelöscht, weil Blake bereits geantwortet hat.

Sie können diese Curl-Anfrage für Ihre Beitrags-ID versuchen

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"

Um zu sehen, ob eine andere Fehlermeldung zurückgegeben wird, aber wahrscheinlich wird nur “Ein Fehler ist aufgetreten” angezeigt :frowning:

Es scheint, dass es einige Website-Einstellungen bezüglich der Löschung von Beiträgen durch Benutzer gibt, die Sie anpassen können. Es scheint auch, dass es irgendwo eine Schaltfläche “Alle Beiträge löschen” geben könnte.

1 „Gefällt mir“

Den obigen Curl-Befehl ausprobieren:

curl -X GET "https://forums.mysite.me/posts.json?username=targetusername" \
-H "Api-Key: eb4065d56u7u6u65u54y54uy566575w4yer343434ac8a770cbeb274bf7f87" \
-H "Api-Username: AdminUsername"

Also, er lief und hat mir die Beiträge geholt… aber dann kam das hier:

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.

Ist das normal oder warum passiert das?

Der von Ihnen eingegebene Curl-Befehl ist nicht derselbe wie der aus oben.\n\nEs sieht so aus, als würden Sie das Windows-Eingabeaufforderungs-Terminal verwenden, vielleicht mag es die \\ zur Trennung von Zeilen nicht. Sie können sie einfach entfernen, sodass alles in einer Zeile steht.

Habe es bereits ohne die Schrägstriche versucht. Als alles in einer Zeile war, hat es funktioniert, danke!

Entschuldigung, ich meinte den, den Lilly geteilt hat.

Es scheint, dass es einen Endpunkt gibt, um alle Beiträge eines Benutzers in Stapelverarbeitung zu löschen.

Dies wird durch diese Schaltfläche auf der Benutzerseite im Admin-Dashboard ausgelöst

2 „Gefällt mir“

Wie kann diese automatisch für jeden Beitrag ausgefüllt werden, anstatt manuell eine post-id eingeben zu müssen (denn zu diesem Zeitpunkt könnte ich genauso gut auf die eigentliche Website gehen und auf die Löschschaltflächen klicken, oder?)?

Oh, super! Also würde ich die URL machen:
http://mysite.com/admin/users/79/delete_posts_batch?
Oder, was ist hier die “79”? Eine Benutzer-ID, nehme ich an, die man erhält, wenn man zum Profil des Benutzers geht?

Ja, das ist die Benutzer-ID und es ist eine PUT-Anfrage. Sie gibt die Anzahl der gelöschten Beiträge zurück.

Oh, also würde ich das nicht tun?

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"

Nicht DELETE, sondern PUT-Anfrage. Außerdem gibt es hier keine Formularparameter.

Wenn ein Administrator löscht, gibt es eine Administratoroperation, um \u003ckbd\u003e:garbage: Alle Beiträge löschen\u003c/kbd\u003e für einen Benutzer.

Möglicherweise müssen Sie zuerst andere Einstellungen anpassen, um dies zu ermöglichen (delete all posts max).

Ich hoffe wirklich, dass dies nicht der tatsächliche API-Schlüssel für Ihre Website ist. Wie bereits erwähnt, ist es ziemlich einfach herauszufinden, was Ihre Website tatsächlich ist.

Sie sollten diesen Schlüssel als verbrannt betrachten und ihn rotieren.

2 „Gefällt mir“

Soll ich diese Zeile also komplett entfernen?

EDIT: Ich habe die Zeile beibehalten und nur „DELETE“ in „PUT“ geändert, und es hat funktioniert.

Das Löschen von Beiträgen über die API schlägt bei mir mit einem 403-Fehler fehl, mit dem Body {“errors”:[“You are not permitted to view the requested resource.”],“error_type”:“invalid_access”}

Irgendeine Idee, was die Lösung sein könnte?