Pull to refresh

Comments 24

В свое время был написан бот который пересылал в группу письма из почты. Крутился на AWS, но спустя некоторе время vk начал блокировать авторизацию, подсовывая капчу, в связи с чем бот был заброшен. А потом и телеграм подоспел с более адекватным API

Я тьфу-тьфу-тьфу с капчей не встречался т.к. бот запускается 1 раз и жужжит себе в фоне.

Насколько я помню, проблема была в том, что аккаунт был зарегистрирован из России, а 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, то изображение будет утеряно.

Идея интересная, просто казалось, что longpoll будет достаточно, для того, что бы получить всю нужную инфу.

Увы, но нет, недостаточно. ;)
Видели же, как отображаются пересланные сообщения?… fwd: 0_0…
Из этих удивлённых глаз никакую информацию не вытянуть — хоть пытай, хоть веди задушевную беседу.
Long Polling

Какое максимальное время ожидания события/ответа?
wait — время ожидания (так как некоторые прокси-серверы обрывают соединение после 30 секунд, мы рекомендуем указывать wait=25). Максимальное значение — 90.

Документация
А так насколько я понял longpoll.listen(): на бесконечном цикле
def listen(self):
        """ Слушать сервер

        :yields: :class:`Event`
        """

        while True:
            for event in self.check():
                yield event
Не видел реализацию на питоне, но он, скорее всего, просто делает периодические запросы в longpoll из разряда «а не появилось ли чего нового?». Если появилось — вернёт результат вам и перезапишет ts, чтобы в следующем запросе не продублировались данные, которые уже вам вернули только что.

Это не связано с временем ожидания.
UFO just landed and posted this here
Не все умеют в лаконичный Питон
Тут нет ничего питоно-специфичного же.)
Такая оптимизация внешнего вида присутствует много где.
UFO just landed and posted this here

Лучше тогда заменить список на множество. А 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 выдает ошибку, неразрешенная ссылка. Не могли бы вы написать, что в данном случае имеется в виду под 'vk'?
Тут мой косяк, я о нём недавно узнал. Дело в том что при копировании кода я забыл очень важную часть. Статью поправил.
vk = vk_session.get_api()
longpoll = VkLongPoll(vk_session)
Со времени публикации поста, в библиотеке vk_api, произошли изменения. Теперь ещё нужно указывать random_id. Например:
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']
    )#вернёт ссылку на новое фото
Sign up to leave a comment.

Articles