Асинхронная библиотека для NovCord Bot API в стиле aiogram (import novcord)
Project description
novcord — Python-библиотека для NovCord Bot API
Асинхронная библиотека для написания ботов NovCord. API в стиле aiogram: Dispatcher/Router, декораторы-хендлеры, magic-filter F, InlineKeyboardBuilder, лёгкий FSM.
Боты хостятся тобой: запускаешь скрипт на своём ПК/сервере — бот работает, пока скрипт запущен (как у Telegram). Сервер NovCord только отдаёт Bot API.
Установка
pip install novcord-bot
Ставится как novcord-bot, а в коде импортируется как import novcord (дефис в импортах Python недопустим). Зависимость — только aiohttp.
Пока пакет не опубликован в PyPI — ставь локально из этой папки:
cd novcord-python
pip install .
Публикация в PyPI (чтобы заработал глобальный pip install novcord-bot) описана в PUBLISHING.md.
Быстрый старт
import asyncio
from novcord import Bot, Dispatcher, Router, F
from novcord.filters import Command
from novcord.keyboard import InlineKeyboardBuilder
dp = Dispatcher()
router = Router()
dp.include_router(router)
@router.message(Command("start"))
async def start(message):
kb = InlineKeyboardBuilder()
kb.button(text="Кнопка", callback_data="hi")
kb.button(text="Сайт", url="https://novcord.online")
await message.answer("Привет!", reply_markup=kb.as_markup())
@router.callback_query(F.data == "hi")
async def hi(query):
await query.answer("Нажато!")
await query.message.answer("Спасибо за нажатие 👍")
@router.message(F.text)
async def echo(message):
await message.answer(message.text)
async def main():
bot = Bot("ТВОЙ_ТОКЕН") # токен из Настройки → Мои боты
await dp.start_polling(bot)
asyncio.run(main())
Токен берётся в приложении: Настройки → Мои боты → создать бота → скопировать токен.
Локальный сервер
bot = Bot("ТОКЕН", base_url="http://localhost:3008")
Фильтры
| Запись | Что значит |
|---|---|
Command("start") |
сообщение /start (и /start аргументы) |
F.text |
у сообщения непустой текст |
F.text.startswith("/") |
текст начинается с / |
F.text.contains("foo") |
текст содержит foo |
F.data == "a" |
у callback data == "a" |
F.data.in_({"a", "b"}) |
data в наборе |
MyStates.waiting |
текущее состояние FSM |
Несколько фильтров в одном декораторе = И (все должны пройти):
@router.message(Command("admin"), F.text.contains("secret"))
async def h(message): ...
Inline-клавиатура
kb = InlineKeyboardBuilder()
kb.button(text="A", callback_data="a")
kb.button(text="B", callback_data="b")
kb.button(text="Сайт", url="https://novcord.online")
kb.adjust(2, 1) # 2 кнопки в первом ряду, 1 во втором
markup = kb.as_markup()
FSM (пошаговые диалоги)
from novcord.fsm import State, StatesGroup
class Form(StatesGroup):
name = State()
age = State()
@router.message(Command("form"))
async def start(message, state): # state инжектится автоматически
await state.set_state(Form.name)
await message.answer("Имя?")
@router.message(Form.name)
async def got_name(message, state):
await state.update_data(name=message.text)
await state.set_state(Form.age)
await message.answer("Возраст?")
@router.message(Form.age)
async def got_age(message, state):
data = await state.update_data(age=message.text)
await state.clear()
await message.answer(f"{data['name']}, {data['age']}")
Хендлер может принимать state (FSMContext) и/или bot — они подставляются по имени параметра.
Методы Bot
| Метод | Описание |
|---|---|
get_me() |
инфо о боте |
send_message(chat_id, text, reply_markup=, reply_to_message_id=) |
текст |
send_photo(chat_id, photo=путь | file_url=, caption=, reply_markup=) |
фото |
send_document(chat_id, document=путь | file_url=, caption=) |
файл |
edit_message_text(chat_id, message_id, text, reply_markup=) |
редактировать |
delete_message(chat_id, message_id) |
удалить |
answer_callback_query(id, text=, show_alert=) |
ответ на нажатие |
set_my_commands([("start","Запуск")]) |
список команд |
get_my_commands() |
получить команды |
Про
chat_id: это id ПОЛЬЗОВАТЕЛЯ (message.from_user.id), не id диалога. Шорткатыmessage.answer()/callback.message.answer()подставляют его сами — вручную думать об этом не нужно.
Шорткаты
message.answer(text)— ответить в тот же чатmessage.reply(text)— ответить с цитированиемmessage.answer_photo(...),message.answer_document(...)message.edit_text(...),message.delete()callback.answer(text)— подтвердить нажатиеcallback.message— сообщение, под которым была кнопка
Примеры
examples/echo_bot.py— эхо + inline-кнопкиexamples/fsm_bot.py— пошаговая анкета (FSM)
Ограничения v1
- Только личные сообщения (DM). Серверные каналы — позже.
answer_callback_queryподтверждает нажатие (всплывающий тост в UI — на будущее); отвечай на нажатия обычнымmessage.answer/edit_text.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file novcord_bot-0.1.0.tar.gz.
File metadata
- Download URL: novcord_bot-0.1.0.tar.gz
- Upload date:
- Size: 17.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0c98e482b40fd94af9e66c50a66ca403e2ede4766eeaee74d17e4061d1941c45
|
|
| MD5 |
7d87efb4e2d9446415feb28d7d0129c9
|
|
| BLAKE2b-256 |
734055ddb6c10fefb95c7594b7b1d34d69877faf01f05218d5ebb92596ef7206
|
File details
Details for the file novcord_bot-0.1.0-py3-none-any.whl.
File metadata
- Download URL: novcord_bot-0.1.0-py3-none-any.whl
- Upload date:
- Size: 16.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
037fddf5f5984772b57e31800b2589a23f9e38482d60839360c288cb0a98dee5
|
|
| MD5 |
c490788989b8be8ca2834d755ec3dfd1
|
|
| BLAKE2b-256 |
82eeeebf915b75397247fed07a454c6f71467230e56fe18186678dad39cfaa34
|