Skip to content

User Long Poll API

Daniil Suvorov edited this page Sep 8, 2020 · 2 revisions

Documentation VK

Подключение User Long Poll API

Данный модуль по умолчанию поддерживает 3 версию

Инициализация

Модуль можно использовать с ключом доступа пользователя, полученным в Standalone-приложении через Implicit Flow(требуются права доступа: messages) или с ключом доступа сообщества(требуются права доступа: messages).

В начале необходимо инициализировать api:

vk := api.NewVK("<TOKEN>")

А потом сам longpoll

mode := longpoll.ReceiveAttachments + longpoll.ExtendedEvents
lp, err := longpoll.NewLongPoll(vk, mode)
// По умолчанию Wait = 25
// lp.Wait = 90
// lp.Ts = 123

HTTP client

В модуле реализована возможность изменять HTTP клиент - lp.Client

Пример прокси

dialer, _ := proxy.SOCKS5("tcp", "127.0.0.1:9050", nil, proxy.Direct)
httpTransport := &http.Transport{
	Dial:              dialer.Dial,
	// DisableKeepAlives: true,
}

client := &http.Client{
	Transport: httpTransport,
}

lp.Client = client

Обработчик событий

Обработчики, которые возвращают полноценные структуры:

Для каждого события существует отдельный обработчик, который передает функции []interface{}.

Пример для 4 события

lp.EventNew(4, func(event []interface{}) {
	...
})

Если вы хотите получать полный ответ от Long Poll(например для сохранения ts или специальной обработки failed), можно воспользоваться следующим обработчиком.

lp.FullResponse(func(resp object.LongPollResponse) {
	...
})

Полный список событий и их структуру Вы найдёте в документации

Запуск и остановка

// Запуск
if err := lp.Run(); err != nil {
	log.Fatal(err)
}

// Безопасное завершение
// Ждет пока соединение закроется и события обработаются
lp.Shutdown()

// Закрыть соединение
// Требует lp.Client.Transport = &http.Transport{DisableKeepAlives: true}
lp.Client.CloseIdleConnections()

Пример

package main

import (
	"log"

	"github.com/SevereCloud/vksdk/api"

	longpoll "github.com/SevereCloud/vksdk/v2/longpoll-user"
)

func main() {
	vk := api.NewVK("<TOKEN>")
	lp, err := longpoll.NewLongPoll(vk, 2)
	if err != nil {
		log.Fatal(err)
	}

	lp.EventNew(4, func(event []interface{}) error {
		log.Print(event[5].(string))

		return nil
	})

	if err := lp.Run(); err != nil {
		log.Fatal(err)
	}
}