Это здорово. Спасибо за информацию. В сети не так много материалов по Python x Discourse, поэтому я рад научиться новому, и, возможно, это поможет и другим. Я только что попробовал ваш код, и он, кажется, работает как ожидалось. Конечно, я не остановился на достигнутом, поэтому нашёл обходной путь, чтобы дойти до шага 5, а также другой способ получить нужные мне значения вплоть до сырого текста поста.
Вот что я хочу получить в итоге:
- Получать уведомления
- Получать номера постов (post_numbers)
- Получать содержимое поста
- Генерировать ответ с помощью OpenAI
- Отправлять ответ
- Помечать то же самое уведомление как прочитанное?
# Настройка бесконечного цикла для работы бота
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 (не уверен, сколько данных он может вместить, но, думаю, вы сможете обработать довольно много упоминаний).
- Идеальное решение для меня — помечать уведомление как прочитанное. Но я понял, что ни в одном из наших кодов мы не запрашиваем непрочитанные упоминания (хотя я сначала пытался получить непрочитанные уведомления, но не смог извлечь/сохранить переменную post_id, которая мне нужна для вызова /posts/get.json и получения содержимого “raw”.
Моя конечная цель — использовать ответ с API OpenAI. Но сначала мне нужно решить вышеуказанные проблемы.