이걸 어떻게 하면 될까요? 도대체 뭘 해야 하는지 잘 모르겠네요…
다음 자료들을 살펴봤습니다:
하지만 이해가 안 됩니다. 또한 각 ID가 서로 다르기 때문에, 각 랜덤 ID를 가져온 후 삭제하도록 전송하는 방법이 무엇인지도 잘 모르겠습니다…
이걸 어떻게 하면 될까요? 도대체 뭘 해야 하는지 잘 모르겠네요…
다음 자료들을 살펴봤습니다:
하지만 이해가 안 됩니다. 또한 각 ID가 서로 다르기 때문에, 각 랜덤 ID를 가져온 후 삭제하도록 전송하는 방법이 무엇인지도 잘 모르겠습니다…
Lola, API를 사용하여 사용자의 모든 Discourse 게시물을 삭제하는 방법은 무엇인가요?
참고로, API를 통해 일괄 삭제를 할 수 있는 방법이 없다고 생각합니다. 각 게시글을 순회하며 삭제하는 스크립트를 작성해야 할 것 같습니다. 게시글의 수에 따라 레이트 리밋(rate limit) 문제가 발생할 수 있습니다.
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
만들었던 API 키 두 개를 시도해 보았습니다. 하나는 저만 사용할 수 있는 키이고, 다른 하나는 모든 사용자가 사용할 수 있는 키입니다. 두 번 모두 Global 옵션을 사용했습니다. 결과는 동일했습니다.
그것은 불가능합니다. API 요청도 마찬가지입니다. 일정 시점 이후에는 사용자가 자신의 게시물을 삭제할 수 없습니다.
보통 가장 좋은 방법은 더 이상 포럼에 참여하지 않기를 원하는 사용자의 모든 게시물을 익명화하는 것입니다. 이렇게 하면 사용자 이름이 무작위로 변경되어 게시물이 더 이상 해당 사용자와 연결되지 않게 됩니다.
블레이크가 이미 답변을 해서 삭제했습니다.
포스트 ID에 대해 이 curl 요청을 시도해 볼 수 있습니다
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"
다른 오류가 반환되는지 확인해 보세요. 하지만 아마도 "An Error Occurred"라는 메시지만 표시될 것입니다 ![]()
사용자가 게시물을 삭제하는 것과 관련된 사이트 설정이 몇 가지 있는 것 같습니다. 이 설정을 조정해 볼 수 있습니다. 또한 어딘가에 “모든 게시물 삭제” 버튼이 있는 것 같습니다.
위의 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' 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.
이게 정상적인 건가요? 아니면 왜 이런 일이 발생하는 건가요?
입력하신 curl 명령어는 위에 나와 있는 것과 다릅니다.
Windows cmd 터미널을 사용 중인 것 같은데, 줄을 구분하는 \를 인식하지 못할 수 있습니다. 이 기호를 제거하고 모든 내용을 한 줄로 합치면 됩니다.
슬래시를 빼고 이미 시도해 봤어요. 전부 한 줄로 만들었더니 해결됐네요, 감사합니다!
죄송합니다, Lilly가 공유한 것을 말씀드린 거예요.
자, 그러면 post-id를 수동으로 입력해야 하는 대신(그 시점에서는 그냥 실제 사이트 가서 삭제 버튼을 누르는 게 낫지 않나요?), 각 게시물의 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 요청입니다. 또한 여기에는 폼 매개변수가 없습니다.
관리자가 삭제를 수행하는 경우, 해당 사용자를 위한
모든 게시물 삭제 관리자 작업이 있습니다.
이 작업을 허용하려면 먼저 다른 설정(예: delete all posts max)을 조정해야 할 수 있습니다.
이것이 실제 사이트의 API 키가 아니기를 진심으로 바랍니다. 이전에 언급했듯이, 실제 사이트가 무엇인지 파악하는 것은 꽤 쉬운 일입니다.
해당 키는 이미 노출된 것으로 간주하고, 반드시 교체(rotate)하시기 바랍니다.
그럼 그 폼 라인을 완전히 제거하라는 뜻인가요?
수정: 라인을 그대로 두면서 "DELETE"를 "PUT"으로 변경했는데, 작동했습니다.
API를 사용하여 게시물을 삭제하려고 하면 본문이 {“errors”:[“You are not permitted to view the requested resource.”],“error_type”:“invalid_access”}인 403 오류가 발생합니다.
해결 방법이 있을까요?