@Dzhigit
Начинающий прогер

Работающий лонгполл в ВК на Python, через requests?

Никак не могу понять, как написать правильный обработчик запросов на питоне.
Проблема в том, что порт постоянно меняется (ts) и запросы пользователя либо просто не обрабатываются или не работают. Почему не использую vk_api: там нельзя использовать версию выше 5.92.

Имеется данная конструкция:

def check():
    longpoll = requests.get(("https://api.vk.com/method/groups.getLongPollServer?group_id=" + str(
        group_id) + "&access_token=" + str(vk) + "&v=" + str(version))).json()
    ts = longpoll["response"]["ts"]
    key = longpoll["response"]["key"]
    server = longpoll["response"]["server"].split(r'\'')
    server = ''.join(server)

    longpoll = requests.get((str(server) + "?act=a_check&key=" + str(key) + "&ts=" + str(ts) + "&wait=90")).json()

    print(longpoll)
    return longpoll["updates"]


#-----Longpoll Settings-----#
longpoll_set = requests.get(("https://api.vk.com/method/groups.setLongPollSettings?group_id=" + str(group_id) + "&enabled=1&api_version=5.110&message_new=1&access_token=" + str(vk) + "&v=5.110")).json()


while True:
    for event in check():
        if event["type"] == "message_new":
            id = event["object"]["message"]["peer_id"]
            message = event["object"]["message"]["text"]
            command = event["object"]["message"]["text"].lower()
            if event["object"]["message"]["attachments"] == True:
                for sticker in event["object"]["message"]["attachments"]:
                    if sticker["sticker"] == True:
                        sticker = sticker["sticker"]["sticker_id"]
            if event["object"]["message"]["attachments"] == True:
                for photo in event["object"]["message"]["attachments"]:
                    if photo["photo"] == True:
                        photo = photo["photo"]
  • Вопрос задан
  • 113 просмотров
Решения вопроса 1
@truenotnamed
Во-первых, если не ошибаюсь, ts — это не порт, а номер последнего события в данной группе. Он возвращается с каждым событием в группе, его нужно отправлять в каждом последующем запросе к Long Poll — об этом написано в документации. То есть нужно сделать подобно этому:

last_ts = None

def check():
    global last_ts
    params = {"access_token": str(vk), "v": str(version), "group_id": str(group_id)} # параметры GET-запроса, которые необходимо передать
    longpoll = requests.get("https://api.vk.com/method/groups.getLongPollServer", params).json()
    last_ts = longpoll["response"]["ts"]
    key = longpoll["response"]["key"]
    server = longpoll["response"]["server"].split(r'\'')
    server = ''.join(server)
    params = {"act": "a_check", "key": key, "ts": last_ts, "wait": 90} 
    longpoll = requests.get(server, params).json()
    print(longpoll)
    return longpoll["updates"]


Правда не уверен, что функция будет корректно работать с return. Скорее всего, тут понадобиться сделать так:
yield longpoll["updates"]
Тогда будет работать корректно.

А во-вторых, в vk_api можно поставить необходимую версию API:
import vk_api
vk = vk_api.VkApi(token = accessToken, api_version = "5.110")

Или так (уже после иниализации vk):
vk.api_version = "5.110"
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы