Использование API vk.com¶
Вы можете использовать API, которое предоставляет вконтакте прямо из коробки, не привязываясь к боту или юзеру. Либо же вы можете использовать его из бота или юзера.
API¶
Используем чистое API:
from vkbottle.api import API
tokens = ["token-1", "token-2"]
api = API(tokens=tokens, throw_errors=True)
Параметр | Описание |
---|---|
tokens | список токенов / токен |
generator | название генератора токенов (может быть переназначено позже) |
throw_errors | нужно ли API Request выбрасывать исключение в случае неудачи |
generator нужен при слишкой большой нагрузке (больше 20 запросов в секунду). Вы можете использовать такие генераторы:
Название для поля generator |
Класс из vkbottle.api.api.builtin |
Описание |
---|---|---|
consistent | ConsistentTokenGenerator | В этом генераторе токены являются циклический очередью, токены используются последовательно с каждым запросом |
random | RandomTokenGenerator | Токены выбираются рандомно из данного списка |
limited | LimitedTokenGenerator | Токены используются максимальное возможное кол-во (limit ) раз |
classified (-) | ClassifiedTokenGenerator | Редко используемый генератор, доступен только через переопределение, нужен, если токены имеют разные права. Вместо списка токенов этот генератор получает схему (vkbottle.api.api.schema ) (документация по schema тут) |
Хороший пример с генератором: https://github.com/timoniq/vkbottle/blob/master/examples/tests/user/shuffle_tokens.py
-
throw_errors определяет стандартное поведение API . После, он может быть переопределен только при вызове собственно метода
-
tokens - может быть как списком токенов, так и одним токеном. В ботах рекомендуется использовать до 2 токенов (максимальная нагрузка - 40 запросов в секунду), тогда как при работе с юзерами может понадобится больше 6 из-за невероятно низкого лимита (3 запроса в секунду)
-
Дополнительно Пример кастомного генератора:
Напишем генератор для определения токена из двух типов по условию (vk me и обычный):
from vkbottle.api.api.util.token import AbstractTokenGenerator
import typing
import random
class CustomTokenGenerator(AbstractTokenGenerator):
def __init__(self, vk_me_tokens: typing.List[str], tokens: typing.List[str]):
self.vk_me_tokens = vk_me_tokens
self.tokens = tokens
async def get_token(self, method: str, params: dict) -> str:
if method in ["messages.setActivity", "messages.send"]:
return random.choice(self.vk_me_tokens)
return random.choice(self.tokens)
Теперь добавим его в наш API:
from vkbottle.api import API
api = API()
api.token_generator = CustomTokenGenerator(["vkme-token"], ["token-1", "token-2"])
Bot API, User API¶
Для вызова API методов с инициированным ботом потребуется использовать атрибут класса Bot.api
:
from vkbottle.bot import Bot
from vkbottle.user import User
from vkbottle.api.api.util.builtin import LimitedTokenGenerator
bot_token = "token-1"
user_tokens = ["user-token-1", "user-token-2", "user-token-3"]
user_generator = LimitedTokenGenerator(user_tokens, limit=3)
bot = Bot(tokens=bot_token, throw_errors=False)
user = User() # При переопределении генератора, токены оставлять не обязательно
user.api.token_generator = user_generator
# bot.api
Обращение к методам¶
VKBottle поддерживает только асинхронный вызов методов (операторы async/await)
Вызов¶
Для обращения к API требуется написать группу и название метода:
# ...
await api.users.get(1)
await bot.api.users.get(1)
await user.api.users.get(1)
Рекомендуется использовать IDE с подсказками, так как все методы, ответы и объекты типизированы, а все это полезно только при условии IDE с подсказками
Все методы нужно вызывать снейк кейсом, то есть
~~messages.getById~~ messages.get_by_id
Респонсы¶
Как сказано выше все типизировано. В ответе приходят объекты:
# ...
user = await bot.api.users.get(1)
print(user[0].first_name) # Павел
Клавиатуры¶
Клавиатуры можно генерировать двумя по-своему удобными путями, через специально разработанную схему (vkbottle.api.keybaord.generator.keyboard_gen
), либо через объективно ориентированный вариант генератора (vkbottle.api.keyboard.Keyboard
)
Генератор keyboard_gen¶
Генератор keyboard_gen является функцией принимающей один обязательный аргумент - схему. Схема является списком со списками со словарями (List[List[dict]]
)
Словари на последнем уровне вложенности по сути являеются объектами кнопок в словаре. Они принимают те же параметры что описаны в документации вк, с учетом трех поправок:
- вместо
label
можно использоватьtext
color
нужно ставить прямо в словаре- чтобы указать тип кнопки нужно назначить аргумент
type
в словарь кнопки
Пример:¶
from vkbottle.api.keyboard import keyboard_gen
keyboard = keyboard_gen(
[
[{"text": "Кнопка #1", "color": "positive"}, {"text": "Кнопка #2"}], # Это первый ряд кнопок
[{"type": "location", "text": "Деанон бесплатно"}], # Это второй ряд
],
inline=True,
)
Генератор Keyboard¶
Та же самая клавиатура на этом генераторе:
from vkbottle.api.keyboard import Keyboard, Text, Location
keyboard = Keyboard(inline=True)
keyboard.add_row()
keyboard.add_button(Text("Кнопка #1"), color="positive")
keyboard.add_button(Text("Кнопка #2"))
keyboard.add_row()
keyboard.add_button(Location("Деанон бесплатно"))
# keyboard.generate()
В обоих генераторах доступны для назначения аргументы:
- one_time - если True, клавиатура исчезнет после первого использования
- inline - если True, клавиатура будет прикреплена к сообщению
Генерацию клавиатуры можно ускорить благодаря установке модулей для работы с json: ujson
, hyperjson
, orjson
Uploader (раздел не закончен)¶
На данный момент доступно только загрузчики для фотографий и документов, но написать нужный не составит никакого труда при минимальных знаниях
Для начала работы с любым аплоадером, нужно его импортировать. На примере аплоадера для картинок:
from vkbottle.api.uploader.photo import PhotoUploader
Далее нужно связать его с апи (можно из бота или юзера), так же любой аплоадер принимает аргумент generate_attachment_strings
, при значении True после загрузки будет возвращаться уже готовая строка для отправления в attachment
:
from vkbottle.api.uploader.photo import PhotoUploader
from vkbottle.bot import Bot
bot = Bot(...)
photo_uploader = PhotoUploader(bot.api, generate_attachment_strings=True)
Теперь чтобы получить строку для отправки: await photo_uploader.upload_message_photo("img.png")
Загрузка по ссылке
Для того чтобы загрузить файл по ссылке воспользуйтесь методом get_data_from_link
:
from vkbottle.api.uploader.photo import PhotoUploader
from vkbottle.bot import Bot
bot = Bot(...)
photo_uploader = PhotoUploader(bot.api, generate_attachment_strings=True)
# ...
data = await photo_uploader.get_data_from_link("https://link_to_photo")
photo = await photo_uploader.upload_message_photo(data)
Дополнительно¶
Если метод из по какой то причине еще не был добавлен в vkbottle его можно вызвать с помощью api.request
:
from vkbottle.bot import Bot, Message
bot = Bot("token")
# Отрывок хендлера:
async def handler(ans: Message):
a = await bot.api.request("some.newMethod", {"strange": 1})
# В таком случае методы нужно писать в камель кейсе как сказано в документации и респонс возвращается словарем а не объектом
Авторизация с логином и паролем¶
Если вы хотите авторизоваться с помощью логина и пароля, для этого тоже есть решение:
from vkbottle.user import User
user = User(login="+71234567890", password="123456")
Перевод в VKScript¶
Вы можете воспользоваться трансляцией в вкскрипт для создания ваших запросов execute
. Это очень просто. Код из обернутой в декоратор vkscript функции автоматически транслируется в родной для execute вкскрипт:
from vkbottle import vkscript
@vkscript
def get_names(api, user_ids=1):
names = []
for user in api.users.get(user_ids=user_ids):
names.append(user.first_name)
return names
Для получения кода в вкскрипт просто вызовите эту функцию:
get_names(user_ids=[1, 10])