Python > 멘션된 경우 게시물 내용 가져오기

정말 유용하네요. 정보 주셔서 감사합니다. Python과 Discourse에 대한 정보가 밖에 많이 없어서 배우게 되어 좋고, 이 글이 다른 분들에게도 도움이 되었으면 합니다. 말씀하신 코드를 바로 시도해 봤는데, 예상대로 작동하는 것 같습니다. 물론 저는 멈추지 않고 계속 실험을 계속해서 5단계까지 도달하는 우회 방법을 찾았고, 게시글 원본(raw) 콘텐츠를 그대로 붙여넣을 수 있는 필요한 값을 가져오는 다른 방법도 찾았습니다.

제가 기본적으로 원하는 것은 다음과 같습니다.

  1. 알림 가져오기
  2. post_numbers 가져오기
  3. 게시글 콘텐츠 가져오기
  4. OpenAI로 답변 생성
  5. 답변 게시
  6. 해당 알림을 읽음으로 표시?
# 봇을 무한대로 실행하기 위한 루프 설정
while True:
    # user_actions 가져오기 및 게시글 ID 조회    
    data = {
    'username': 'theuser',
    # 멘션과 답변의 경우 필터 6 + 7을 가져와야 하는데, 어째서인지 JSON 응답이 하나만 반환됩니다.
    'filter': 6 | 7,
    'limit': 10,
    }
    
    unread_mentions = client.user_actions.json.get(data)
    print(unread_mentions)

    user_actions = unread_mentions['user_actions']

    # 각 읽지 않은 멘션에 대해 반복
    for user_action in unread_mentions['user_actions']:
        topic_id = user_action['topic_id']
        post_number = user_action['post_number']
        post_id = user_action['post_id']
        username = user_action['username']

        print(f'Topic ID: {topic_id}, Post Number: {post_number}, Post ID: {post_id}, Reply to: {username}')
    
        # 게시글 콘텐츠 가져오기   
        post = client.posts[post_id].json.get()

        # 게시글 콘텐츠 출력
        post_content = post['raw']

        # 게시글에 대한 응답 생성
        response = generate_response(post_content)
    
        # 포럼에 응답 게시
        content = {
            'topic_id': topic_id,
            'raw': response + ' @' + str(username)
        }
        make_post = client.posts.json.post(content)

현재 두 가지 문제가 있습니다:

  • 멘션이 하나만 가져와집니다. 무언가를 빠뜨린 것 같은데, 아직 원인을 찾지 못했습니다.
  • 물론 게시글에는 한 번만 답변해야 하며, 루프를 돌리고 있으므로 이를 방지하는 장치가 필요합니다.
    • post_id를 .txt 파일에 저장할 수 있습니다 (얼마나 많은 데이터를 저장할 수 있을지 확실하지 않지만, 꽤 많은 멘션을 처리할 수 있을 것 같습니다.)
    • 제 이상적인 해결책은 알림을 읽음으로 표시하는 것이었습니다. 하지만 우리의 코드 어디에서도 읽지 않은 멘션을 가져오는 것이 아니라는 것을 깨달았습니다 (처음에는 읽지 않은 알림을 가져오려고 시도했지만, /posts/get.json을 사용해 “raw” 콘텐츠를 가져오기 위해 필요한 post_id 변수를 추출/저장하는 데 실패했습니다.)

최종 목표는 OpenAI API로 응답을 피드하는 것입니다. 하지만 먼저 위의 문제를 해결하는 방법을 찾아야 합니다.