python273 / vk_api

Модуль для создания скриптов для ВКонтакте | vk.com API wrapper
https://pypi.org/project/vk-api/
Apache License 2.0
1.33k stars 321 forks source link

[10] Internal server error при использовании reply_to #465

Open CMBCKSRL opened 2 years ago

CMBCKSRL commented 2 years ago

Написал бота, который отправляет гифку в ответ на сообщение определенного пользователя в беседе. Хочу сделать так, чтобы это сообщение было ответом, а не просто сообщением (пример, как хотелось реализовать см. ниже)

image

Для этого хотел использовать параметр reply_to метода send, но вылетает ошибка [10] Internal server error. Похожу, что проблема не на моей стороне. Код программы прилагается.

Код

import vk_api
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType

token = 'токен сообщества'

vk_session = vk_api.VkApi(token = token)
vk = vk_session.get_api()
longpoll = VkBotLongPoll(vk_session, <id сообщества>)

def write_msg(id, msg_id):
    vk_session.method('messages.send', {'chat_id': id,'random_id': 0, 'attachment': 'doc49903553_642595119', "reply_to": msg_id}) 

for event in longpoll.listen():
    if event.type == VkBotEventType.MESSAGE_NEW:
        if event.from_chat:
            id = event.chat_id
            sender = event.obj.message['from_id']
            if sender == <id человека, на чьи сообщения хочу реагировать>:
                msg_id = event.obj.message['conversation_message_id']
                write_msg(id, msg_id)

Без reply_to все работает хорошо, ошибка появилась только при его добавлении.

Hylk05 commented 2 years ago

Я где-то читал, что бот якобы не может отвечать на сообщения, в самом ВК такое ограничение. Не уверен насчёт этого, но я решил такую же проблему так: вместо reply_to можно использовать аргумент forward. Тогда ответ будет, но как на пересланное сообщение, что никак не отличается. Вот моя функция: def reply_mess(chat_id, mess_id, text): vk.messages.send(peer_id=chat_id, message=text, random_id=randint(0, 2 ** 32), forward=dumps({'peer_id': chat_id, 'conversation_message_ids': [mess_id], 'reply_to': True})) Да, dumps - функция из встроенного модуля json

Mawak0 commented 1 year ago

Способ выше не помог. Помогло сделать так: vk.messages.send(peer_id=event.peer_id, message="текст", random_id=random_id, forward_messages=event.message_id)

Aloki commented 1 year ago

@Hylk05, у параметра forward нет поля reply_to, есть is_reply. Если true - бот ответит на сообщение, если false или отсутствует, то перешлёт его.