# API

[![PkgGoDev](https://pkg.go.dev/badge/github.com/SevereCloud/vksdk/v2/api)](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2/api)
[![VK](https://img.shields.io/badge/developers-%234a76a8.svg?logo=VK&logoColor=white)](https://vk.com/dev/first_guide)

Данная библиотека поддерживает версию API **5.122**.

## Запросы

В начале необходимо инициализировать api с помощью [ключа доступа](https://vk.com/dev/access_token):

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

### Запросы к API

- `users.get` -> `vk.UsersGet(api.Params{})`
- `groups.get` с extended=1 -> `vk.GroupsGetExtended(api.Params{})`

Список всех методов можно найти на
[данной странице](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2/api?tab=doc#VK).

Пример запроса [`users.get`](https://vk.com/dev/users.get)

```go
users, err := vk.UsersGet(api.Params{
	"user_ids": 1,
})
if err != nil {
	log.Fatal(err)
}
```

### Параметры

[![PkgGoDev](https://pkg.go.dev/badge/github.com/SevereCloud/vksdk/v2/api/params)](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2/api/params)

Модуль params предназначен для генерации параметров запроса.

```go
// import "github.com/SevereCloud/vksdk/v2/api/params"

b := params.NewMessageSendBuilder()
b.PeerID(123)
b.Random(0)
b.DontParseLinks(false)
b.Message("Test message")

res, err = api.MessageSend(b.Params)
```

### Обработка ошибок

[![VK](https://img.shields.io/badge/developers-%234a76a8.svg?logo=VK&logoColor=white)](https://vk.com/dev/errors)

Обработка ошибок полностью поддерживает методы
[go 1.13](https://blog.golang.org/go1.13-errors)

```go
if errors.Is(err, api.ErrAuth) {
	log.Println("User authorization failed")
}
```

```go
var e *api.Error
if errors.As(err, &e) {
	switch e.Code {
	case api.ErrCaptcha:
		log.Println("Требуется ввод кода с картинки (Captcha)")
		log.Printf("sid %s img %s", e.CaptchaSID, e.CaptchaImg)
	case 1:
		log.Println("Код ошибки 1")
	default:
		log.Printf("Ошибка %d %s", e.Code, e.Text)
	}
}
```

Для Execute существует отдельная ошибка `ExecuteErrors`

### Запрос любого метода

Пример запроса [users.get](https://vk.com/dev/users.get)

```go
// Определяем структуру, которую вернет API
var response []object.UsersUser
var err api.Error

params := api.Params{
	"user_ids": 1,
}

// Делаем запрос
err = vk.RequestUnmarshal("users.get", &response, params)
if err != nil {
	log.Fatal(err)
}

log.Print(response)
```

### Execute

[![PkgGoDev](https://pkg.go.dev/badge/github.com/SevereCloud/vksdk/v2/errors)](https://pkg.go.dev/github.com/SevereCloud/vksdk/v2/api#VK.Execute)
[![VK](https://img.shields.io/badge/developers-%234a76a8.svg?logo=VK&logoColor=white)](https://vk.com/dev/execute)

Универсальный метод, который позволяет запускать последовательность других
методов, сохраняя и фильтруя промежуточные результаты.

```go
var response struct {
	Text string `json:"text"`
}

err = vk.Execute(`return {text: "hello"};`, &response)
if err != nil {
	log.Fatal(err)
}

log.Print(response.Text)
```

### Обработчик запросов

Обработчик `vk.Handler` должен возвращать структуру ответа от VK API и ошибку.
В качестве параметров принимать название метода и параметры.

```go
vk.Handler = func(method string, params ...api.Params) (api.Response, error) {
	// ...
}
```

Это может потребоваться, если вы можете поставить свой обработчик с
[fasthttp](https://github.com/valyala/fasthttp) и логгером.

Стандартный обработчик использует [encoding/json](https://pkg.go.dev/net/http)
и [net/http](https://pkg.go.dev/net/http). В стандартном обработчике можно
настроить ограничитель запросов и HTTP клиент.

#### Ограничитель запросов

К методам API ВКонтакте (за исключением методов из секций secure и ads) с
ключом доступа пользователя или сервисным ключом доступа можно обращаться не
чаще 3 раз в секунду. Для ключа доступа сообщества ограничение составляет 20
запросов в секунду. Если логика Вашего приложения подразумевает вызов
нескольких методов подряд, имеет смысл обратить внимание на метод execute. Он
позволяет совершить до 25 обращений к разным методам в рамках одного запроса.

Для методов секции ads действуют собственные ограничения, ознакомиться с ними
Вы можете на [этой странице](https://vk.com/dev/ads_limits).

Максимальное число обращений к методам секции secure зависит от числа
пользователей, установивших приложение. Если приложение установило меньше 10
000 человек, то можно совершать 5 запросов в секунду, до 100 000 — 8 запросов,
до 1 000 000 — 20 запросов, больше 1 млн. — 35 запросов в секунду.

Если Вы превысите частотное ограничение, сервер вернет ошибку с кодом
**6: "Too many requests per second."**.

С помощью параметра `vk.Limit` можно установить ограничение на определенное
количество запросов в секунду

### HTTP client

В модуле реализована возможность изменять HTTP клиент с помощью параметра
`vk.Client`

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

```go

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

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

vk.Client = client
```

### Ошибка с Captcha

[![VK](https://img.shields.io/badge/developers-%234a76a8.svg?logo=VK&logoColor=white)](https://vk.com/dev/captcha_error)

Если какое-либо действие (например, отправка сообщения) выполняется
пользователем слишком часто, то запрос к API может возвращать ошибку
"Captcha needed". При этом пользователю понадобится ввести код с изображения
и отправить запрос повторно с передачей введенного кода Captcha в параметрах
запроса.

**Код ошибки**: 14  
**Текст ошибки**: Captcha needed

Если возникает данная ошибка, то в сообщении об ошибке передаются также
следующие параметры:

- `err.CaptchaSID` - идентификатор captcha
- `err.CaptchaImg` - ссылка на изображение, которое нужно показать
  пользователю, чтобы он ввел текст с этого изображения.

В этом случае следует запросить пользователя ввести текст с изображения
`err.CaptchaImg` и повторить запрос, добавив в него параметры:

- `captcha_sid` - полученный идентификатор
- `captcha_key` - текст, который ввел пользователь

## Загрузка файлов

[![VK](https://img.shields.io/badge/developers-%234a76a8.svg?logo=VK&logoColor=white)](https://vk.com/dev/upload_files)

### 1. Загрузка фотографий в альбом

Допустимые форматы: JPG, PNG, GIF.
Файл объемом не более 50 МБ, соотношение сторон не менее 1:20

Загрузка фотографий в альбом для текущего пользователя:

```go
photosPhoto, err = vk.UploadPhoto(albumID, response.Body)
```

Загрузка фотографий в альбом для группы:

```go
photosPhoto, err = vk.UploadPhotoGroup(groupID, albumID, response.Body)
```

### 2. Загрузка фотографий на стену

Допустимые форматы: JPG, PNG, GIF.
Файл объемом не более 50 МБ, соотношение сторон не менее 1:20

```go
photosPhoto, err = vk.UploadWallPhoto(response.Body)
```

Загрузка фотографий в альбом для группы:

```go
photosPhoto, err = vk.UploadWallPhotoGroup(groupID, response.Body)
```

### 3. Загрузка главной фотографии пользователя или сообщества

Допустимые форматы: JPG, PNG, GIF.
Ограничения: размер не менее 200x200px, соотношение сторон от 0.25 до 3,
сумма высоты и ширины не более 14000px, файл объемом не более 50 МБ,
соотношение сторон не менее 1:20.

Загрузка главной фотографии пользователя

```go
photosPhoto, err = vk.UploadUserPhoto(file)
```

Загрузка фотографии пользователя или сообщества с миниатюрой

```go
photosPhoto, err = vk.UploadOwnerPhoto(ownerID, squareСrop,file)
```

Для загрузки главной фотографии сообщества необходимо передать его идентификатор
со знаком «минус» в параметре `ownerID`.

Дополнительно Вы можете передать параметр `squareСrop` в формате "x,y,w" (без
кавычек), где x и y — координаты верхнего правого угла миниатюры, а w — сторона
квадрата. Тогда для фотографии также будет подготовлена квадратная миниатюра.

Загрузка фотографии пользователя или сообщества без миниатюры:

```go
photosPhoto, err = vk.UploadOwnerPhoto(ownerID, "", file)
```

### 4. Загрузка фотографии в личное сообщение

Допустимые форматы: JPG, PNG, GIF.
Ограничения: сумма высоты и ширины не более 14000px, файл объемом
не более 50 МБ, соотношение сторон не менее 1:20.

```go
photosPhoto, err = vk.UploadMessagesPhoto(peerID, file)
```

### 5. Загрузка главной фотографии для чата

Допустимые форматы: JPG, PNG, GIF.
Ограничения: размер не менее 200x200px, соотношение сторон от 0.25 до 3, сумма
высоты и ширины не более 14000px, файл объемом не более 50 МБ, соотношение
сторон не менее 1:20.

Без обрезки:

```go
messageInfo, err = vk.UploadChatPhoto(peerID, file)
```

С обрезкой:

```go
messageInfo, err = vk.UploadChatPhotoCrop(peerID, cropX, cropY, cropWidth, file)
```

### 6. Загрузка фотографии для товара

Допустимые форматы: JPG, PNG, GIF.
Ограничения: минимальный размер фото — 400x400px, сумма высоты и ширины
не более 14000px, файл объемом не более 50 МБ, соотношение сторон не менее 1:20.

Если Вы хотите загрузить основную фотографию товара, необходимо передать
параметр `mainPhoto = true`.  Если фотография не основная, она не будет обрезаться.

Без обрезки:

```go
photosPhoto, err = vk.UploadMarketPhoto(groupID, mainPhoto, file)
```

Основную фотографию с обрезкой:

```go
photosPhoto, err = vk.UploadMarketPhotoCrop(groupID, cropX, cropY, cropWidth, file)
```

### 7. Загрузка фотографии для подборки товаров

Допустимые форматы: JPG, PNG, GIF.
Ограничения: минимальный размер фото — 1280x720px, сумма высоты и ширины
не более 14000px, файл объемом не более 50 МБ, соотношение сторон не менее 1:20.

```go
photosPhoto, err = vk.UploadMarketAlbumPhoto(groupID, file)
```

### 9. Загрузка видеозаписей

Допустимые форматы: AVI, MP4, 3GP, MPEG, MOV, MP3, FLV, WMV.

[Параметры](https://vk.com/dev/video.save)

```go
videoUploadResponse, err = vk.UploadVideo(params, file)
```

После загрузки видеозапись проходит обработку и в списке видеозаписей может
появиться спустя некоторое время.

### 10. Загрузка документов

Допустимые форматы: любые форматы за исключением mp3 и исполняемых файлов.
Ограничения: файл объемом не более 200 МБ.

`title` - название файла с расширением

`tags` - метки для поиска

`typeDoc` - тип документа.

- doc - обычный документ;
- audio_message - голосовое сообщение

Загрузить документ:

```go
docsDoc, err = vk.UploadDoc(title, tags, file)
```

Загрузить документ в группу:

```go
docsDoc, err = vk.UploadGroupDoc(groupID, title, tags, file)
```

Загрузить документ, для последующей отправки документа на стену:

```go
docsDoc, err = vk.UploadWallDoc(title, tags, file)
```

Загрузить документ в группу, для последующей отправки документа на стену:

```go
docsDoc, err = vk.UploadGroupWallDoc(groupID, title, tags, file)
```

Загрузить документ в личное сообщение:

```go
docsDoc, err = vk.UploadMessagesDoc(peerID, typeDoc, title, tags, file)
```

### 11. Загрузка обложки сообщества

Допустимые форматы: JPG, PNG, GIF.
Ограничения: минимальный размер фото — 795x200px, сумма высоты и ширины
не более 14000px, файл объемом не более 50 МБ. Рекомендуемый размер: 1590x400px.
В сутки можно загрузить не более 1500 обложек.

Необходимо указать координаты обрезки фотографии в параметрах
`cropX`, `cropY`, `cropX2`, `cropY2`.

```go
photo, err = vk.UploadOwnerCoverPhoto(groupID, cropX, cropY, cropX2, cropY2, file)
```

### 12. Загрузка аудиосообщения

Допустимые форматы: Ogg Opus.
Ограничения: sample rate 16kHz, variable bitrate 16 kbit/s, длительность
не более 5 минут.

```go
docsDoc, err = vk.UploadMessagesDoc(peerID, "audio_message", title, tags, file)
```

### 13. Загрузка истории

Допустимые форматы:​ JPG, PNG, GIF.
Ограничения:​ сумма высоты и ширины не более 14000px, файл объемом
не более 10МБ. Формат видео: h264 video, aac audio,
максимальное разрешение 720х1280, 30fps.

Загрузить историю с фотографией. [Параметры](https://vk.com/dev/stories.getPhotoUploadServer)

```go
uploadInfo, err = vk.UploadStoriesPhoto(params, file)
```

Загрузить историю с видео. [Параметры](https://vk.com/dev/stories.getVideoUploadServer)

```go
uploadInfo, err = vk.UploadStoriesVideo(params, file)
```

### Загрузка фоновой фотографии в опрос

Допустимые форматы: JPG, PNG, GIF.
Ограничения: сумма высоты и ширины не более 14000px, файл объемом не более 50 МБ,
соотношение сторон не менее 1:20.

```go
photosPhoto, err = vk.UploadPollsPhoto(file)
```

```go
photosPhoto, err = vk.UploadOwnerPollsPhoto(ownerID, file)
```

Для загрузки фотографии сообщества необходимо передать его идентификатор со
знаком «минус» в параметре `ownerID`.

### Загрузка фотографии для карточки

Для карточек используются квадратные изображения минимальным размером 400х400.
В случае загрузки неквадратного изображения, оно будет обрезано до квадратного.
Допустимые форматы: JPG, PNG, BMP, TIFF или GIF.
Ограничения: файл объемом не более 5 МБ.

```go
photo, err = vk.UploadPrettyCardsPhoto(file)
```

### Загрузка обложки для формы

Для форм сбора заявок используются прямоугольные изображения размером 1200х300.
В случае загрузки изображения другого размера, оно будет автоматически обрезано
до требуемого.
Допустимые форматы: JPG, PNG, BMP, TIFF или GIF.
Ограничения: файл объемом не более 5 МБ.

```go
photo, err = vk.UploadLeadFormsPhoto(file)
```

Полученные данные можно использовать в методах
[leadForms.create](https://vk.com/dev/leadForms.create)
и
[leadForms.edit](https://vk.com/dev/leadForms.edit).

Полученные данные можно использовать в методах
[prettyCards.create](https://vk.com/dev/prettyCards.create)
и
[prettyCards.edit](https://vk.com/dev/prettyCards.edit).

### Загрузки фотографии в коллекцию приложения для виджетов приложений сообществ

`imageType` (string) - тип изображения.

Возможные значения:

- 24x24
- 50x50
- 160x160
- 160x240
- 510x128

```go
image, err = vk.UploadAppImage(imageType, file)
```

### Загрузки фотографии в коллекцию сообщества для виджетов приложений сообществ

`imageType` (string) - тип изображения.

Возможные значения:

- 24x24
- 50x50
- 160x160
- 160x240
- 510x128

```go
image, err = vk.UploadGroupAppImage(imageType, file)
```

#### Примеры

Загрузка фотографии в альбом:

```go
response, err := os.Open("photo.jpeg")
if err != nil {
	log.Fatal(err)
}
defer response.Body.Close()

photo, err = vk.UploadPhoto(albumID, response.Body)
if err != nil {
	log.Fatal(err)
}
```

Загрузка фотографии в альбом из интернета:

```go
response, err := http.Get("https://sun9-45.userapi.com/c638629/v638629852/2afba/o-dvykjSIB4.jpg")
if err != nil {
	log.Fatal(err)
}
defer response.Body.Close()

photo, err = vk.UploadPhoto(albumID, response.Body)
if err != nil {
	log.Fatal(err)
}
```