Vk API Python: Получение списка бесед, в которых есть мой бот
Мне нужна помощь с VK API. Я хотел бы узнать, возможно ли получить список всех бесед, в которых состоит мой бот? Я пытался реализовать это сторонними методами (так как ничего не нашёл в документации по этому поводу), и вот, с какими проблемами я столкнулся.
Сначала, я попробовал такой способ. Я в цикле прогонял запрос getConversationMembers(peer_id) до тех пор, пока не получу error_code=10, который возвращается, если для бота беседы с таким идентификатором не существует.
def getSources(self):
res = []
i = 1
while True:
req = requests.get('https://api.vk.com/method/messages.getConversationMembers?peer_id={0}&v=5.131&access_token={1}'.format(2000000000 + i, config.token)).json()
if 'error' in req:
if req['error']['error_code'] == 6: #Слишком много запросов в секунду
time.sleep(0.4)
continue
elif req['error']['error_code'] == 10: #Internal Server Error, вызывается, если беседа не существует.
break
else:
res.append(i)
i += 1
else:
res.append(i)
i += 1
return res
Проблема была в том, что если бота исключат из беседы, то при прогоне эта беседа не будет выдавать код ошибки 10, но будет выдавать 917 (You have no access to this chat). И можно было бы убирать такие беседы, если бы такая же ошибка не вылезала и тогда, когда бот присутствует в беседе, но не имеет прав администратора. Дальше я заметил, что при вызове messages.send для тех бесед, из которых бот был исключён, выдаётся код ошибки 7, и я решил сделать таким образом, чтобы я мог получить список таких бесед через вызов messages.send, удаляя отправленное сообщение сразу после отправки, и удалить эти беседы из итогового списка. Вот код моего следующего решения:
def __getSources(self):
res = []
i = 1
while True:
req = requests.get('https://api.vk.com/method/messages.getConversationMembers?peer_id={0}&v=5.131&access_token={1}'.format(2000000000 + i, config.token)).json()
if 'error' in req:
if req['error']['error_code'] == 6:
time.sleep(0.4)
continue
elif req['error']['error_code'] == 10: #Internal Server Error, вызывается, если беседа не существует.
break
else:
res.append(i)
i += 1
else:
res.append(i)
i += 1
return res
def getSources(self):
res = await self.__getSources()
deleted = await self.getDeletedSources()
for i in deleted:
res.remove(i)
return res
def getDeletedSources(self):
res = []
for i in range(1, len(await self.__getSources()) + 1):
req = requests.get('https://api.vk.com/method/messages.send?peer_id={0}&message={1}&random_id=0&v=5.131&access_token={2}'.format(2000000000 + i, '⠀', config.token)).json()
if 'error' in req:
if req['error']['error_code'] == 6 #Слишком много запросов в секунду:
time.sleep(0.4)
continue
if req['error']['error_code'] == 7 #Если был исключён из беседы:
res.append(i)
else:
id = req["response"] #id сообщения
print(i)
self.vk.messages.delete(message_ids=[id], delete_for_all=1, peer_id = 2000000000 + i)
return res
И я получаю нужный результат, но я проверил это на двух разных тестовых беседах, и на одной messages.send возвращает в response идентификатор сообщения, по которому я его спокойно удаляю, а в другой messages.send возвращает в response 0 (со всеми правами у бота), и этот идентификатор является недействительным для vk.messages.delete. Таким образом получается, что бот когда при запуске получает этот список, оставляет в одной из бесед нежелательный спам, поэтому такое решение так же мне не подходит.
Вопросы такие:
- Есть ли вообще какой-то более нормальный метод решения такой задачи?
- И если нет, то почему возникает проблема, что во второй тестовой беседе messages.send вместо ID присланного сообщения возвращает 0, и как это можно исправить?
Заранее спасибо за ваши ответы. И уж извините меня за плохой код, я ещё неопытный питонист, поэтому элементы хорошего кода частенько перемешиваю с неэстетичным мусором и костылями. Не судите строго. И обязательно пишите, если нужна будет более подробная информация.