我该如何实现这一点?似乎真的弄不清楚该怎么做……
我看过:
但我不明白。我也不明白的主要问题是如何获取每个随机 ID,然后发送它们进行删除,因为每个 ID 都不同……
我该如何实现这一点?似乎真的弄不清楚该怎么做……
我看过:
但我不明白。我也不明白的主要问题是如何获取每个随机 ID,然后发送它们进行删除,因为每个 ID 都不同……
Lola,如何通过 API 删除用户的所有 Discourse 帖子?
顺便说一句,我不认为可以通过 API 进行批量删除。我认为您需要编写一个脚本来逐个循环删除帖子。根据帖子的数量,速率限制可能会成为问题。
Lola,我该如何编写一个脚本来批量删除 Discourse 帖子?
顺便说一句,您为什么要使用 API 来执行此操作?
我认为也可以通过命令行作为 rake 任务来完成。
谢谢,今天晚些时候会试试!那么,普通用户也能执行那些 rake 操作吗?我想让所有操作都由普通用户(非管理员)完成。
这个。
当我运行下面的 Python 脚本时:
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()
在我的终端/控制台中,我得到:
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
我尝试了 2 个我创建的 API 密钥。一个只有我能使用,另一个是所有用户都能使用。两次都使用了全局选项。结果相同。
这行不通。即使是 API 请求也是如此。在某个点之后,用户就不能删除自己的帖子了。
通常最好的选择是匿名化用户的所有帖子,如果他们不再想参与论坛的话。这只会将他们的用户名更改为随机名称,这样他们的帖子就不再与他们相关联了。
@Lilly 看到你删掉的回复了。那么,如何让它对我自己或其他管理员用户生效呢?不确定你是否看到,但我编辑了上面的帖子,加入了使用该脚本时得到的输出结果。
我想同样的问题也可以问你,@blake,哈哈。
这只是为了测试。
因为 Blake 已经回答了,所以我删除了。
您可以尝试使用此 curl 请求来处理您的帖子 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"
看看它是否会返回不同的错误,但很可能只会显示“发生错误” ![]()
看起来有一些关于用户删除帖子的站点设置可以调整。另外,似乎还有一个“删除所有帖子”的按钮在某个地方。
正在尝试上面的 curl 命令:
curl -X GET "https://forums.mysite.me/posts.json?username=targetusername" \
-H "Api-Key: eb4065d56u7u6u65u54y54uy566575w4yer343434ac8a770cbeb274bf7f87" \
-H "Api-Username: AdminUsername"
所以,它运行并为我获取了帖子……但然后我收到了这个:
C:\Users\User>-H "Api-Key: eb4065d56u7u6u65u54y54uy566575w4yer343434ac8a770cbeb274bf7f87"
'-H' 不是内部或外部命令,也不是可运行的程序或批处理文件。
C:\Users\User>-H "Api-Username: AdminUsername"
'-H' 不是内部或外部命令,也不是可运行的程序或批处理文件。
这是正常的还是为什么会发生这种情况?
您输入的 curl 命令与上面 https://meta.discourse.org/t/delete-all-posts-by-a-user-on-entire-site-with-api/302332/12?u=blake 的命令不同。
看起来您使用的是 Windows cmd 终端,它可能不喜欢用 \\ 分隔行。您可以直接删除它们,让命令都在一行上。
已经试过没有斜杠了。将其全部放在一行中解决了问题,谢谢!
抱歉,我是指 Lilly 分享的那个。
那么,不必手动输入 post-id(因为那样的话,我还不如直接访问实际网站并点击删除按钮,对吧?),如何才能为每个帖子自动填充呢?
哦,太棒了!那么我应该将 URL 设置为:
http://mysite.com/admin/users/79/delete_posts_batch?
或者,“79”在这里是什么意思?我猜是您访问用户个人资料时获得的用户的 ID?
是的,那是用户的 ID,这是一个 PUT 请求。它会返回被删除帖子的数量。
所以,我不会这样做?
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"
不是 DELETE 请求,而是 PUT 请求。此外,这里没有表单参数。
如果执行删除的是管理员,则有一个管理员操作可供选择:\u003ckbd\u003e:garbage: 删除用户的所有帖子\u003c/kbd\u003e。\n\n您可能需要先调整其他设置以允许此操作(“删除所有帖子的最大数量”)。\n\n[quote="45thj5ej, post:20, topic:302332"]\neb4065d45745678u564754y4545y545445674y34545y50cbeb274bf7f87\n[/quote]\n\n我当然希望这并不是您网站的实际 API 密钥。如前所述,很容易就能找出您的网站究竟是哪个。\n\n您应该认为此密钥已泄露并进行轮换。
所以把那条表单线完全去掉?
编辑:我保留了那条线,只是把“DELETE”改成了“PUT”,然后就成功了。
使用 API 删除帖子时,我遇到了 403 错误,返回体为 {"errors":["You are not permitted to view the requested resource."],"error_type":"invalid_access"}。
有什么办法可以解决吗?