Skip to main content

Модуль на Python позволяющий быстро создавать VK ботов

Project description

vkton

 

vkton

Github top language Github language count Repository size License Github issues Github forks Github stars Discord Support Server

О библотеке   |   Преимущества   |   Технологии   |   Начало   |   Лицензия   |   Автор

Содержание

Параметры для команд
Параметры для сообщения
Кнопки и их конфигурация
Таск-лупы
Отправка каруселей
Ожидание ответа от пользователя
Ожидание ответа от нескольких пользователей
Переадресация и возвращение назад
События


:dart: О библотеке

vkton это модуль для упрощенного создания VK ботов на Python. В библиотеке вы найдете все необходимые классы, для ванильного использования vk-api.

:sparkles: Преимущества

:heavy_check_mark: Удобное и быстрое создание цепочек команд;
:heavy_check_mark: Возможность разделять код в несколько файлов;
:heavy_check_mark: Все необходимые функции для быстрого старта;

:rocket: Технологии

Технологии использованные в проекте:

:checkered_flag: Начало

# Установка самого модуля
$ pip install vkton

# Проверка, что все зависимости установлены
$ pip install PIL vk-api

Мой модуль гибко решает проблему навигации в боте. В каждом декораторе команды обязательным является параметр back_to. В него следует вписать название функции, которая будет вызвана в случае попытки пользователем выйти назад. Это позволяет не задумываясь сделать вложенные меню. Если вы описываете корневое меню, то впишите в back_to его же название.

Команду можно вызвать по любому слову из keywords или по названию функции (hello, meteo ...)

from vkton import Bot, Commands, Context
from vkton.ui import Button


bot = Bot("*group token here*", group_id=<айди группы>)  # активация бота


@Commands.command(keywords=["Привет", 'Say hello'], back_to='hello')
def hello(ctx: Context):
	ctx.user.send(
		'Hello, my Friend! You are using vkton by Alex Lovser! Nice to see you!',
		keys=[
			Button('Погода', 'white'),
			Button('Кнопка с ссылкой', 'red', link='https://pornhub.com')
		]
	)


@Commands.command(keywords=['Погода'], back_to='hello') 
def meteo(ctx: Context):
	ctx.user.send(
		'Погода обещает быть замечательной',
		keys=[
			bot.back_button # Заготовленная красная кнопка "Назад"
		]
	)


bot.run() # запуск бота

Вы также можете разделять код. Для этого вам необходимо написать все те же функции в любом файле, а далее просто импортировать их в главный файл. Сразу после импорта, ваши команды их других файлов будут добавлены в бота.

Каждой функции вы можете добавить параметры:

	@Commands.command(keywords=['Какой-то тест'], back_to='hello') 
	def test(ctx: Context, arg1, arg2):
		ctx.user.send(
			f'Вы отправили команду "test" где arg1={arg1} arg2={arg2}',
		)

	# Отправка: Какой-то тест 1000 Вася
	# Ответ от бота: Вы отправили команду "test" где arg1=1000 arg2=Вася

Если параметром должно быть упоминание пользователя
Например: Передать привет @alexlovser
Можно использовать готовый метод bot.parse_tag для получения id того, кого упомянули:

	@Commands.command(keywords=['Передать привет'], back_to='hello') 
	def say_hello(ctx: Context, mention):
		mentioned_user_id = bot.parse_tag(mention) # -> int | None
		if mentioned_user_id is not None:
			mentioned_user = bot.get_user(mentioned_user_id) # -> User | None
			if mentioned_user:
				mentioned_user.send(f'{ctx.user.tag} передал вам привет!')

Параметры для отправки сообщения:

:text: - Текст на сообщения
:keys: - Список со сгруппированными кнопкми для сообщения
:attachments: - Для прикрепления вложений к сообщению. Вложения должны быть в формате, который рекомендует документация ВК или с помощью класса vkton.objects.Attachment
:carousel: - В случае отсутствия кнопок можно добавить к сообщению карусель. Сделать это возоможно с помощью класса vkton.ui.CarouselField.

Вы можете удобно настроить ряды кнопок с помощью списков

... 
keys=[
	[ # Если вы хотите сгруппировать кнопки на одном ряду, то просто оберните их в список
		Button('1', 'white'), Button('2', 'white'),
	],
		Button('3', 'white'), Button('4', 'white'), Button('5', 'white'),
	[
		bot.back_button
	]
]
# [   1  ][  2  ]
# [ 3 ][ 4 ][ 5 ]
# [    Назад    ]

...

Каждая кнопка принимает несколько параметров:

Обязательные <Позиционные>
:title: - Текст на кнопке
:color: - 'red', 'green', 'blue', 'white' или те же слова на русском языке. Цвет самой кнопки.

Необязательные <Именные>
:link: - Используется для создания кнопки-ссылки
:inline: - Если в сообщении хотябы одна кнопка имеет данный параметр True, то кнопки появляются не в клавиатуре, а под сообщением.
:payload: - Словарь с контекстными данными для команды. После нажатия кнопки в объекте ctx.message.payload можно будет увидеть эти данные

Создания запланированных действий:

Очень часто нам необходимо циклично выполнять какие-либо действия в боте раз в заданный промежуток времени. Например раз в десять минут делать запрос в базу данных. Данный модель предоставляет удобное решение для данной задачи:

@Commands.task(timeout=3600) # время в секундах
def say_hello_task():
	bot.get_user(12345678).send(
		'Hello, world!',
		attachments='photo12345678_12345678'
	)

В данном случае бот будет раз в 1 час (3600 секунд) отправлять пользователю с id = 123456789 сообщение. При перезупуске бота таймер сбрасывается

Отправка карусели:

from vkton.ui import CarouselField


@Commands.command(keywords=['Карусель'], back_to='start') 
def carousel(ctx: Context):
	bot.get_user(12345678).send(
		'Hello, world!',
		carousel=[
			CarouselField(
				photo_id='photo12345678_12345678',
				title='TITLE1',
				description='description1',
				buttons=[
					Button('Подробнее', 'blue', payload={'some_id': '12345'})
				]
			),
			CarouselField(
				photo_id='photo12345678_12345678',
				title='TITLE2',
				description='description2',
				buttons=[
					Button('Подробнее', 'blue', payload={'some_id': '67890'})
				]
			),
		]
	)

Ожидание ответа от пользователя:

	ctx.user.send('Сколько будет 2 + 2?')

	# Если check() возвращает True, то код продолжится и будет возращено сообщение пользователя
	# Иначе бот будет продалжать ждать сообщение от пользователя
	def check(message: vkton.objects.Message) -> bool:
		return message.content == '4'

	user_message = bot.wait_message(ctx.user, timeout=24 * 3600, check=check) # -> <Message> | None

	if user_message is not None:
		user.send('Правильно! Это 4')
	else:
		user.send('Правильного ответа не поступило')

Ожидание ответа от нескольких пользователей:

Так как функция wait_message блокирует выполнение кода, ожидать ответ от нескольких пользователей не представляется возможным. Поэтому в качестве первого аргумета можно передать массив с пользователями, и бот будет ожидать сообщения от них одновременно.

users = [
	bot.get_user(12345678),
	bot.get_user(87654321),
	bot.get_user(12348765),
]

for user in users:
	user.send('Сколько будет 2 + 2?')

check = lambda message: message.content == '4'

messages = bot.wait_message(users, timeout=5 * 60, check=check) # -> dict[user_id, <Message> | None]

# По окончании вы получите словарь с данными ответов от нескольких пользователей
# Если пользователь не ответил или ответ не прошел проверку, то вместо сообщения будет None

print(messages)

Переадресация и возвращение назад:

Объект Commands имеет два удобных метода для переадресации:

Commands.go_back(ctx)

Данный метод выходит из выполняемой функции и запускает функцию, обозначенную в back_to (в декораторе)

Commands.redirect(ctx, to)

Чтобы попасть вопределенную точку программы, можно вызвать данный метод, в параметр to необходимо вписать название конкретной функции

События:

Вы также можете отслеживать некоторые события:

@Commands.event()
def on_message(message: vkton.objects.Message):
	print(message.content)

Данный пример единственного на данный момент события, доступного разработчикам, это on_message. Каждый раз, когда бот будет получать сообщение, данная функция будет вызываться и вы сможете более широко работать с пользователями. Очень можно называть события именно так, как это предусмативает библиотека, иначе вы получите ошибку.
Со временем я буду стараться увеличивать число доступных событий.

Лицензия

This project is under license from MIT. For more details, see the LICENSE file.

С :heart: от Alex Lovser

 

Вернуться вверх

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vkton-0.2.11.tar.gz (18.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

vkton-0.2.11-py3-none-any.whl (15.6 kB view details)

Uploaded Python 3

File details

Details for the file vkton-0.2.11.tar.gz.

File metadata

  • Download URL: vkton-0.2.11.tar.gz
  • Upload date:
  • Size: 18.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.5.1 CPython/3.10.7 Windows/10

File hashes

Hashes for vkton-0.2.11.tar.gz
Algorithm Hash digest
SHA256 fb18986e77f306f83920963aa2c9401103195a6019f7d99a94d2f1a5aeec0477
MD5 e91712b9fdd0966148965e69ce98e0e0
BLAKE2b-256 eb7e36743cb3b38058023b74b37fecea32949b01816ce7bd6e0ea9a921ba5492

See more details on using hashes here.

File details

Details for the file vkton-0.2.11-py3-none-any.whl.

File metadata

  • Download URL: vkton-0.2.11-py3-none-any.whl
  • Upload date:
  • Size: 15.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.5.1 CPython/3.10.7 Windows/10

File hashes

Hashes for vkton-0.2.11-py3-none-any.whl
Algorithm Hash digest
SHA256 71c099229e6078860380b218d1a992e7d8f1daae2c1276f9964798a0808091de
MD5 3a8ac628f8a4071f69fe193d50c9ddaa
BLAKE2b-256 c6a1a21627bfbf267c85cb8896bfafc7bb9b4d0ffa7548c7919091a2fbab4535

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page