mais je ne comprends pas. La principale chose que je ne comprends pas non plus, c’est comment obtenir chaque ID aléatoire puis l’envoyer pour être supprimé, puisque chaque ID est différent…
Soit dit en passant, je ne pense pas qu’il y ait de moyen de supprimer en masse via l’API. Je pense que vous devez écrire un script pour parcourir chaque publication afin de la supprimer. Selon le nombre de publications, les limites de débit pourraient poser problème.
Lola, comment écrire un script pour supprimer en masse des publications Discourse ?
[quote=“Lola l’assistant de codage”]Pour effectuer un traitement par lots afin de supprimer des publications Discourse, vous pouvez utiliser un langage de script comme Python. Vous trouverez ci-dessous un exemple de script qui montre comment automatiser la suppression de publications pour un utilisateur spécifique. Ce script :
Récupère les publications d’un utilisateur spécifique.
Itère sur la liste des publications.
Supprime chaque publication individuellement.
Exemple de script Python
import requests
# Configuration
discours_base_url = 'http://votrediscours.example.com'
api_key = 'votre_cle_api'
api_username = 'votre_nom_utilisateur_admin'
nom_utilisateur_cible = 'utilisateurCible'
# En-têtes pour les requêtes API
headers = {
'Api-Key': api_key,
'Api-Username': api_username
}
def get_user_posts(username):
"""Récupère les publications d'un utilisateur spécifique."""
posts = []
url = f'{discours_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):
"""Supprime une publication spécifique."""
url = f'{discours_base_url}/posts/{post_id}.json'
response = requests.delete(url, headers=headers)
return response.status_code == 200
def main():
# Récupère les publications de l'utilisateur
posts = get_user_posts(nom_utilisateur_cible)
# Supprime chaque publication
for post in posts:
post_id = post.get('id')
if delete_post(post_id):
print(f'Publication {post_id} supprimée avec succès')
else:
print(f'Échec de la suppression de la publication {post_id}')
if __name__ == '__main__':
main()
Explication
Configuration : Définissez l’URL de base de votre instance Discourse, votre clé API, votre nom d’utilisateur API et le nom d’utilisateur cible dont vous souhaitez supprimer les publications.
Fonction get_user_posts : Récupère les publications de l’utilisateur spécifié. Adaptez l’URL ou les paramètres selon votre configuration Discourse.
Fonction delete_post : Supprime une publication par son ID.
Fonction main : Orchestre le processus en récupérant d’abord les publications de l’utilisateur, puis en supprimant chacune d’elles.
Notes importantes
Limites de débit : Soyez conscient des limites de débit de l’API Discourse. Si vous supprimez un grand nombre de publications, envisagez d’ajouter des délais entre les requêtes.
Permissions : Assurez-vous que votre clé API dispose des permissions nécessaires pour supprimer des publications.
Tests : Testez le script dans un environnement sûr avant de l’exécuter en production.
Ce script fournit un cadre de base. Selon vos besoins spécifiques, vous pourriez avoir besoin d’ajuster les points d’accès API, les paramètres, ou d’ajouter une gestion des erreurs et une journalisation.
[/quote]
Soit dit en passant, pourquoi utilisez-vous l’API pour faire cela ?
Je pense que cela peut également être fait sous forme de tâche Rake à partir de la ligne de commande.
Merci, je vais essayer ça aujourd’hui ! Alors, est-ce que ce genre de “rake” peut être fait en tant qu’utilisateur normal ? Je voudrais que tout cela soit fait en tant qu’utilisateur normal qui n’est pas un administrateur.
Ça.
Lorsque j’ai exécuté le script Python ci-dessous :
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()
Sur mon terminal/console, j’obtiens :
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
J’ai essayé 2 clés API que j’ai créées. Une avec seulement moi qui peux l’utiliser et une avec tous les utilisateurs. Les deux fois, j’ai utilisé l’option globale. Même résultat.
Cela ne fonctionnera pas. Même pour les requêtes API. Après un certain point, les utilisateurs ne peuvent pas supprimer leurs propres publications.
Habituellement, la meilleure option est d’anonymiser toutes les publications d’un utilisateur s’il ne souhaite plus faire partie du forum. Cela changera simplement son nom d’utilisateur en quelque chose d’aléatoire afin que ses publications ne lui soient plus associées.
@Lilly J’ai vu la réponse que tu as supprimée. Alors, qu’en est-il de la faire fonctionner pour moi-même ou pour un autre utilisateur administrateur ? Je ne suis pas sûr si tu as vu, mais j’ai édité mon message ci-dessus pour inclure le résultat que j’obtiens lorsque j’utilise ce script.
Je suppose que la même chose peut t’être demandée aussi, @blake, haha.
Il semble y avoir des paramètres de site concernant la suppression de messages par les utilisateurs que vous pouvez ajuster. Il semble également qu’il puisse y avoir un bouton “Supprimer tous les messages” quelque part.
Donc, cela a fonctionné et m’a renvoyé les publications… mais ensuite j’ai eu ceci :
C:\Users\User>-H "Api-Key: eb4065d56u7u6u65u54y54uy566575w4yer343434ac8a770cbeb274bf7f87"
'H' n'est pas reconnu en tant qu'commande interne ou externe,
un programme opérationnel ou un fichier de commandes.
C:\Users\User>-H "Api-Username: AdminUsername"
'H' n'est pas reconnu en tant qu'commande interne ou externe,
un programme opérationnel ou un fichier de commandes.
La commande curl que vous avez entrée n’est pas la même que celle de ci-dessus.
On dirait que vous utilisez le terminal cmd de Windows, peut-être qu’il n’aime pas le \\ qui sépare les lignes. Vous pouvez simplement les supprimer pour que tout soit sur une seule ligne.
Alors, au lieu d’avoir à entrer manuellement un post-id (parce qu’à ce moment-là, autant aller sur le site réel et appuyer sur les boutons de suppression, n’est-ce pas ?), comment cela peut-il être automatiquement rempli pour chaque post ?
Oh, génial ! Donc je ferais juste l’URL : http://mysite.com/admin/users/79/delete_posts_batch ?
Ou, qu’est-ce que le “79” ici ? un ID utilisateur, je suppose, que vous obtenez lorsque vous allez sur le profil de l’utilisateur ?
S’il s’agit d’un administrateur qui effectue la suppression, il existe une opération d’administrateur pour Supprimer tous les messages d’un utilisateur.
Vous devrez peut-être ajuster d’autres paramètres au préalable pour le permettre (delete all posts max).
J’espère sincèrement que ce n’est pas la clé API réelle de votre site. Comme indiqué précédemment, il est assez facile de déterminer de quel site il s’agit réellement.
Vous devriez considérer cette clé comme compromise et la faire pivoter.
La suppression des publications via l’API échoue pour moi avec une erreur 403 et le corps suivant : {“errors”:[“Vous n’êtes pas autorisé à consulter la ressource demandée.”],“error_type”:“invalid_access”}