1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
# Bots Long Poll API
[![PkgGoDev](https://pkg.go.dev/badge/github.com/SevereCloud/vksdk/v2/longpoll-bot)](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2/longpoll-bot)
[![VK](https://img.shields.io/badge/developers-%234a76a8.svg?logo=VK&logoColor=white)](https://vk.com/dev/bots_longpoll)
## Подключение Bots Long Poll API
Long Poll настраивается автоматически. Вам не требуется заходить в настройки
сообщества.
### Версия API
Данная библиотека поддерживает версию API **5.131**.
### Инициализация
Модуль можно использовать с ключом доступа пользователя, полученным в
Standalone-приложении через Implicit Flow(требуются права доступа: **groups**)
или с ключом доступа сообщества(требуются права доступа: **manage**).
В начале необходимо инициализировать api:
```go
vk := api.NewVK("<TOKEN>")
```
А потом сам longpoll
```go
lp, err := longpoll.NewLongPoll(vk api.VK, groupID int)
// По умолчанию Wait = 25
// lp.Wait = 90
// lp.Ts = "123"
```
### HTTP client
В модуле реализована возможность изменять HTTP клиент - `lp.Client`
Пример прокси
```go
dialer, _ := proxy.SOCKS5("tcp", "127.0.0.1:9050", nil, proxy.Direct)
httpTransport := &http.Transport{
Dial: dialer.Dial,
// DisableKeepAlives: true,
}
httpTransport.Dial = dialer.Dial
lp.Client.Transport = httpTransport
```
### Обработчик событий
Для каждого события существует отдельный обработчик, который передает функции
`ctx` и `object`.
Пример для события `message_new`
```go
lp.MessageNew(func(ctx context.Context, obj events.MessageNewObject) {
...
})
```
Если вы хотите получать полный ответ от Long Poll(например для сохранения `ts`
или специальной обработки `failed`), можно воспользоваться следующим обработчиком.
```go
lp.FullResponse(func(resp object.LongPollBotResponse) {
...
})
```
Полный список событий Вы найдёте [в документации](https://vk.com/dev/groups_events)
### Контекст
Поля `groupID`, `ts` и `eventID` передаются в `ctx`. Чтобы получить их, можно
воспользоваться следующими функциями:
```go
groupID := events.GroupIDFromContext(ctx)
eventID := events.EventIDFromContext(ctx)
ts := longpoll.TsFromContext(ctx)
```
### Запуск и остановка
```go
// Запуск
if err := lp.Run(); err != nil {
log.Fatal(err)
}
// Безопасное завершение
// Ждет пока соединение закроется и события обработаются
lp.Shutdown()
// Закрыть соединение
// Требует lp.Client.Transport = &http.Transport{DisableKeepAlives: true}
lp.Client.CloseIdleConnections()
```
## Пример
```go
package main
import (
"log"
"github.com/SevereCloud/vksdk/v2/api"
longpoll "github.com/SevereCloud/vksdk/v2/longpoll-bot"
"github.com/SevereCloud/vksdk/v2/events"
)
func main() {
vk := api.NewVK("<TOKEN>")
lp, err := longpoll.NewLongPoll(vk, 12345678)
if err != nil {
panic(err)
}
lp.MessageNew(func(ctx context.Context, obj events.MessageNewObject) {
log.Print(obj.Message.Text)
})
lp.Run()
}
```
|