API로 사용자의 사이트 전체 게시물을 삭제할 수 있나요?

이걸 어떻게 하면 될까요? 도대체 뭘 해야 하는지 잘 모르겠네요…

다음 자료들을 살펴봤습니다:

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

하지만 이해가 안 됩니다. 또한 각 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 요청도 마찬가지입니다. 일정 시점 이후에는 사용자가 자신의 게시물을 삭제할 수 없습니다.

보통 가장 좋은 방법은 더 이상 포럼에 참여하지 않기를 원하는 사용자의 모든 게시물을 익명화하는 것입니다. 이렇게 하면 사용자 이름이 무작위로 변경되어 게시물이 더 이상 해당 사용자와 연결되지 않게 됩니다.

@Lilly 삭제하신 답변을 봤어요. 그래서 제 자신이나 다른 관리자 계정으로 작동하게 만드는 건 어떨까요? 확인하셨는지 모르겠지만, 해당 스크립트를 사용할 때 나오는 결과를 위에서 쓴 게시물에 수정해서 추가해 두었어요.

@blake 님에게도 같은 질문을 할 수 있겠죠, 하하.

지금은 테스트용입니다.

블레이크가 이미 답변을 해서 삭제했습니다.

포스트 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"라는 메시지만 표시될 것입니다 :frowning:

사용자가 게시물을 삭제하는 것과 관련된 사이트 설정이 몇 가지 있는 것 같습니다. 이 설정을 조정해 볼 수 있습니다. 또한 어딘가에 “모든 게시물 삭제” 버튼이 있는 것 같습니다.

위의 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 요청입니다. 또한 여기에는 폼 매개변수가 없습니다.

관리자가 삭제를 수행하는 경우, 해당 사용자를 위한 :garbage: 모든 게시물 삭제 관리자 작업이 있습니다.

이 작업을 허용하려면 먼저 다른 설정(예: delete all posts max)을 조정해야 할 수 있습니다.

이것이 실제 사이트의 API 키가 아니기를 진심으로 바랍니다. 이전에 언급했듯이, 실제 사이트가 무엇인지 파악하는 것은 꽤 쉬운 일입니다.

해당 키는 이미 노출된 것으로 간주하고, 반드시 교체(rotate)하시기 바랍니다.

그럼 그 폼 라인을 완전히 제거하라는 뜻인가요?

수정: 라인을 그대로 두면서 "DELETE"를 "PUT"으로 변경했는데, 작동했습니다.

API를 사용하여 게시물을 삭제하려고 하면 본문이 {“errors”:[“You are not permitted to view the requested resource.”],“error_type”:“invalid_access”}인 403 오류가 발생합니다.

해결 방법이 있을까요?