¿Cómo podría lograr esto? No parece que pueda entender realmente qué hacer…
He mirado:
pero no entiendo. Lo principal que tampoco entiendo es cómo obtener cada ID aleatorio y luego enviarlo para que se elimine, ya que cada ID es diferente…
¿Cómo podría lograr esto? No parece que pueda entender realmente qué hacer…
He mirado:
pero no entiendo. Lo principal que tampoco entiendo es cómo obtener cada ID aleatorio y luego enviarlo para que se elimine, ya que cada ID es diferente…
Lola, ¿cómo se eliminan todas las publicaciones de Discourse de un usuario a través de la API?
Por cierto, no creo que haya una forma de eliminar masivamente a través de la API. Creo que necesitas escribir un script para recorrer cada publicación y eliminarla. Dependiendo de cuántas publicaciones, los límites de tasa podrían ser un problema.
Lola, ¿cómo escribo un script para eliminar masivamente publicaciones de Discourse?
POR CIERTO, ¿por qué usas la API para hacer esto?
Creo que también se puede hacer como una tarea de rake desde la línea de comandos.
¡Gracias, lo intentaré hoy mismo! Entonces, ¿se puede hacer eso de la recolección como un usuario normal? Me gustaría que todo esto se hiciera como un usuario normal que no es personal.
Esto.
Cuando ejecuté el siguiente script de Python:
import requests
# Configuración
discourse_base_url = 'https://forums.mysite.me/'
api_key = 'eb4065d1dergrgh45h45h54h45reg4g70cbeb274bf7f87'
api_username = 'username'
target_username = 'targetusername'
# Encabezados para solicitudes de API
headers = {
'eb4065d1dergrgh45h45h54h45reg4g70cbeb274bf7f87': api_key,
'B': api_username
}
def get_user_posts(username):
"""Obtener publicaciones de un usuario específico."""
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):
"""Eliminar una publicación específica."""
url = f'{discourse_base_url}/posts/{post_id}.json'
response = requests.delete(url, headers=headers)
return response.status_code == 200
def main():
# Obtener publicaciones del usuario
posts = get_user_posts(target_username)
# Eliminar cada publicación
for post in posts:
post_id = post.get('id')
if delete_post(post_id):
print(f'Publicación {post_id} eliminada con éxito')
else:
print(f'Error al eliminar la publicación {post_id}')
if __name__ == '__main__':
main()
En mi terminal/consola, obtengo:
Error al eliminar la publicación 73
Error al eliminar la publicación 71
Error al eliminar la publicación 69
Error al eliminar la publicación 60
Error al eliminar la publicación 47
Intenté con 2 claves de API que creé. Una con solo yo que puedo usarla y otra con todos los usuarios. Ambas veces, usé la opción Global. Mismo resultado.
Eso no va a funcionar. Ni siquiera para las solicitudes de API. Después de cierto punto, los usuarios no pueden eliminar sus propias publicaciones.
Por lo general, la mejor opción es anonimizar todas las publicaciones de un usuario si ya no desea formar parte del foro. Esto simplemente cambiará su nombre de usuario por algo aleatorio para que sus publicaciones ya no estén asociadas con él.
@Lilly Vi la respuesta que eliminaste. Entonces, ¿qué hay de hacer que funcione para mí o para otro usuario administrador? No estoy seguro si viste, pero edité mi publicación anterior para incluir el resultado que estoy obteniendo al usar ese script.
Supongo que lo mismo se puede preguntar a ti también, @blake, jaja.
Esto es solo para probar en este momento.
Eliminé porque Blake ya respondió.
Puedes probar esta solicitud curl para el id de tu publicación
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"
Para ver si devuelve un error diferente, pero probablemente solo dirá “Ocurrió un error” ![]()
Parece que hay algunas configuraciones del sitio sobre los usuarios que eliminan publicaciones que puedes ajustar. También parece que podría haber un botón de “Eliminar todas las publicaciones” en algún lugar.
Probando el comando curl anterior:
curl -X GET "https://forums.mysite.me/posts.json?username=targetusername" \
-H "Api-Key: eb4065d56u7u6u65u54y54uy566575w4yer343434ac8a770cbeb274bf7f87" \
-H "Api-Username: AdminUsername"
Así que se ejecutó y me trajo las publicaciones… pero luego obtuve esto:
C:\Users\User>-H "Api-Key: eb4065d56u7u6u65u54y54uy566575w4yer343434ac8a770cbeb274bf7f87"
'-H' no se reconoce como un comando interno o externo,
programa o archivo por lotes operable.
C:\Users\User>-H "Api-Username: AdminUsername"
'-H' no se reconoce como un comando interno o externo,
programa o archivo por lotes operable.
¿Es esto normal o por qué está sucediendo?
El comando curl que ingresaste no es el mismo que el del siguiente enlace.\n\nParece que estás usando la terminal cmd de Windows, tal vez no le gusten los \\ que separan las líneas. Puedes simplemente eliminarlos para que todo esté en una sola línea.
Ya lo probé sin las barras. Ponerlo todo en una línea lo solucionó, ¡gracias!
Lo siento, me refería al que compartió Lilly.
Parece que hay un endpoint para eliminar en lote todas las publicaciones de un usuario.
Se activa con este botón en la página de usuarios desde el panel de administración.
Entonces, en lugar de tener que introducir manualmente un post-id (porque en ese momento, podría entrar en el sitio real y simplemente pulsar los botones de eliminar, ¿verdad?), ¿cómo se puede rellenar automáticamente para cada publicación?
Oh, ¡genial! ¿Entonces solo haría la URL?:
http://mysite.com/admin/users/79/delete_posts_batch?
O, ¿qué es este “79”? Supongo que es un ID de usuario que obtienes cuando vas al perfil del usuario.
Sí, es el ID del usuario y es una solicitud PUT. Devuelve el número de publicaciones eliminadas.
¿Entonces no lo haría?
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"
No es una solicitud DELETE, sino PUT. Además, aquí no hay parámetros de formulario.
Si es un administrador quien realiza la eliminación, existe una operación de administrador para \u003ckbd\u003e:garbage: Eliminar todas las publicaciones\u003c/kbd\u003e de un usuario.
Es posible que necesites ajustar otras configuraciones primero para permitir esto (eliminar todas las publicaciones máximo).
Ciertamente espero que esta no sea la clave API real de tu sitio. Como se mencionó anteriormente, es bastante fácil averiguar cuál es realmente tu sitio.
Deberías considerar esta clave como quemada y rotarla.
¿Entonces simplemente quito esa línea de formulario por completo?
EDITAR: Mantuve la línea y simplemente cambié “DELETE” por “PUT” y funcionó.
Eliminar publicaciones usando la API me está fallando con un error 403 y el cuerpo {“errors”:[“No tienes permiso para ver el recurso solicitado.”],“error_type”:“invalid_access”}
¿Alguna idea de cuál podría ser la solución?