Как работает User Long Poll API ВКонтакте? Проблемы с подключением

209
01 мая 2018, 00:31

Мне не понятно, как работает User Long Poll API. Можете подсказать? С Bots Long Poll API я разобрался, а с пользовательским не очень. Два вопроса:

  1. Как дать понять серверу ВК куда присылать события?
  2. Как обработать события на моём сервере?

Я сделал так:

  1. Сначала получил server, key и ts с помощью messages.getLongPollServer.
  2. Отправил со своего сервера запрос такого вида (как в документации):

    https://{$server}?act=a_check&key={$key}&ts={$ts}&wait=25&mode=2&version=3 переменные поменял на те, что в пункте 1

  3. А дальше что? ВК будет присылать события на адрес страницы, с которой был запрос к пункту 2 или как?

Если да, то как их обрабатывать? Например, надо просто все события записать в файл. Тогда на PHP я пишу так:

header("Content-Type: text/html; charset=utf-8"); 
header("HTTP/1.0 200 OK"); 
$event = json_decode(file_get_contents('php://input'), true); 
file_put_contents('1.txt', $event);

Но что-то ничего не записывает. Отправляю сам себе сообщения, а файлик пустой.

Answer 1

Странно, что вы говорите, что разобрались с Bots longPoll, ведь принцип же одинаковый.

Если обратиться к той же справке вк, то даже там вполне понятно описано.

А теперь, я попробую на пальцах:

  • Long polling - это когда вы кидаете http - запрос на сервер. Но сервер не обязан вам отвечать сразу же. Он ждёт около 30 секунд, и после этого присылает вам пустой ответ (если ничего не произошоо).

  • Если что-то все же произошло, сервер отвечает на ваш запрос раньше 30-и секунд.

  • После того, как сервер вам ответит, вы кидаете ему новый запрос, и он вас ответит либо через 30 сек, либо раньше, есои что-то произойдёт.

  • Время, после которого сервер отвечает и обрывает соединение, ограничено 30-ю секундами (вы можете задать его сами, апи вк позволяет, если не ошибаюсь), т.к. возможны проблемы с некоторым сетевым оборудованием, которое само разоряет такое соединение после 30-и секунд.

  • И да, вы указываете серверу куда кидать ответ тогда, когда посылаете запрос, ведь сервер в состоянии определить, откуда он пришёл)

А теперь рассмотрим ситуацию по шагам:

  1. Вы отправляете запрос на сервер
  2. Проходит 10 сек
  3. Сервер понимает, что что-то произошло, отвечает вам ({ts: ..., updates: [...]}), соединение закрывается
  4. Вы сразу же открываете новое соединение очередным запросом
  5. Проходит 30 секунд, но за это время серверу нечего было вам отправить
  6. По истечении времени сервер присылает вам пустой ответ (вк шлёт в формате {updates:[]}, если не ошибаюсь).

Как-то так, надеюсь, что понятно.

И да. Я не пхп-шник, но парсить как json вам нужно именно ту "страничку", которую вернет вам запрос на адрес https://{$server}?act=a_check&key={$key}&ts={$ts}&wait=25&mode=2&version=3 .

READ ALSO
Как отключить комментарии в DLE везде, кроме блога?

Как отключить комментарии в DLE везде, кроме блога?

Как отключить комментарии в DLE везде, кроме блога?

178
Не работает php artisan

Не работает php artisan

Написал свой проект на laraveleЗахотел обновить миграции, удалил все таблицы и хочу сделать миграцию

177
Не работает кодеровка utf-8

Не работает кодеровка utf-8

Всем приветПомогите решить проблему

187
Отображение reCaptcha Android на web сайте?

Отображение reCaptcha Android на web сайте?

Есть приложение на андроиде к примеру myappapk и там используется reCaptcha Android(В качестве проверки при создании данной капчи на сайте гугла необходимо...

194