Comments 24
Насколько я помню, проблема была в том, что аккаунт был зарегистрирован из России, а AWS крутилась где-то снаружи. В результате ВК периодически решал что неплохо бы проверить кто это пишет сообщения, и прямо посреди работы бота мог заблочить последующую отправку до тех пор пока я не заходил на инстанс AWS и руками не подтверждал что это действительно "я". Не помню точно, почему не перенес в Россию, вполне возможно что у амазона был жирный кредит, а тратиться на сервера не хотелось
У вас в показанных кусках я не увидел ограничение на количество обращений к API. Насколько я помню, 2-3 в секунду — оптимальное. При превышении начнёт капчу просить.
И так же при однотипных действиях начнёт просить, но на общий функционал не повлияет — longpoll как работал, так и будет работать, просто некоторое время не будет отправлять сообщения. У меня при 10 однотипных действиях действиях просто 2-3 последних не отрабатывает. И через пару секунд уже работает, как ни в чём не бывало.
Забавно, что сам вчера начал писать бота, который выкладывает в паблик картинки, которые прислали в конфе. Правда столкнулся с проблемой, что во-первых atttachments
, который приходит при событии longpoll
имеет не очень удобный формат:
attachment1_type, attachment1, attachment2_type, attachment2, etc
Второе, это то что картинки, которые скинули в конфу невсегда доступны по прямой ссылке, что затрудняет их скачивание и публикацию ( если вообще не блокирует эту возможность )
Второе, это то что картинки, которые скинули в конфу невсегда доступны по прямой ссылке, что затрудняет их скачивание и публикацию ( если вообще не блокирует эту возможность )
Когда именно картинки не доступны по прямой ссылке?
longpoll в принципе не даёт адекватной возможности разбирать вложения и пересылки, ибо данные там не дают совершенно никакой информации о них.
Я решил проблему так: если в сообщении было вложение картинки\пересылки, то делаю запрос в messages.getById (что-то подобное) и получаю всю информацию по указанному сообщению. И в этой информации ВСЕГДА есть прямая ссылка на вложение(видео, аудио, аудиосообщение, изображение, документ).
В вашем случае есть вариант уменьшить количество запросов к API — накапливать сообщения с изображениями и затем делать запрос с 10-20 сообщениями сразу. Но один ньюанс — если пользователь удалит картинку до запроса getById, то изображение будет утеряно.
Long Polling
Какое максимальное время ожидания события/ответа?
wait — время ожидания (так как некоторые прокси-серверы обрывают соединение после 30 секунд, мы рекомендуем указывать wait=25). Максимальное значение — 90.
Документация
def listen(self):
""" Слушать сервер
:yields: :class:`Event`
"""
while True:
for event in self.check():
yield event
Это не связано с временем ожидания.
Лучше тогда заменить список на множество. А event.text
вероятно имеет тип строки.
vars = {'википедия', 'вики', 'wikipedia', 'wiki'}
if event.text.lower() in vars:
# ...
message='Московское время: ' + str(now.strftime("%H:%M"))
Лучше string interpolation использовать. И читаемость повысится, и писать удобнее:
message=f'Московское время: {now:%H:%M}'
vk.messages.send( #Отправляем сообщение
user_id=event.user_id,
random_id=event.random_id,
message='Ваш текст')
UPD:
upload = vk_api.VkUpload(vk_session)
photo = upload.photo( # Подставьте свои данные
'way',
album_id=260569312,
group_id=180755234
)
vk_photo_url = 'https://vk.com/photo{}_{}'.format(
photo[0]['owner_id'], photo[0]['id']
)#вернёт ссылку на новое фото
Пишем чат бота для ВКонтакте на python с помощью longpoll