Боты на KernelGram
Как создать своего бота и подключить к нему код: ответы на частые вопросы и рабочий пример.
Три шага
- 01Создайте ботаНапишите
@BotFatherкоманду/newbotи получите токен. - 02Смените адресВ библиотеке укажите
api.kernelgram.clubвместо Telegram. - 03Запустите кодМетоды те же, что в Bot API:
sendMessage,getUpdatesи другие.
Частые вопросы
Как создать бота?
Напишите @BotFather прямо в приложении и отправьте команду /newbot. Он спросит имя бота, затем юзернейм (обязательно должен заканчиваться на bot, например my_cool_bot). В конце вы получите токен — строку вида 123456789:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Какой адрес API использовать вместо api.telegram.org?
https://api.kernelgram.club. Все методы (sendMessage, getUpdates, getFile и т.д.) работают точно так же, как в оригинальном Bot API — меняется только адрес.
На каком языке/библиотеке писать бота?
На любом. Это обычный HTTP JSON API, как оригинальный. Для Python подойдут стандартные библиотеки — у всех есть параметр для смены адреса сервера:
python-telegram-bot:ApplicationBuilder().token(TOKEN).base_url("https://api.kernelgram.club/bot")aiogram:TelegramAPIServer.from_base("https://api.kernelgram.club")pyTelegramBotAPI:telebot.apihelper.API_URL = "https://api.kernelgram.club/bot{0}/{1}"
Как скачивать файлы, которые прислали боту?
Как обычно: вызовите getFile, чтобы получить file_path, затем скачайте файл по адресу https://api.kernelgram.club/file/bot<TOKEN>/<file_path>.
Токен утёк / скомпрометирован, что делать?
Напишите @BotFather команду /revoke и выберите бота — старый токен сразу перестанет действовать, выдастся новый.
Что ещё умеет @BotFather?
/mybots — список ваших ботов, /setname, /setdescription, /setabouttext, /setcommands, /setinline, /setjoingroups, /setprivacy — всё как в оригинальном Telegram.
Можно ли удалить бота насовсем?
Нет — как и в оригинале, ботов нельзя удалить полностью, только отозвать токен (/revoke) или скрыть его функциональность.
Бот не подключается / DNS error / ClientConnectorDNSError (частое на мобильном интернете, Termux)
Cloudflare отдаёт для api.kernelgram.club и IPv4, и IPv6 адреса. У части мобильных операторов IPv6 до Cloudflare не доходит, из-за чего клиент падает с ошибкой резолвинга или No route to host. Решение — заставить библиотеку использовать только IPv4, штатными средствами, без патчей socket.getaddrinfo:
aiogram:
import socket
from aiohttp import TCPConnector
from aiogram import Bot
from aiogram.client.session.aiohttp import AiohttpSession
from aiogram.client.telegram import TelegramAPIServer
class IPv4Session(AiohttpSession):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._connector_type = TCPConnector
self._connector_init = {"family": socket.AF_INET}
session = IPv4Session(api=TelegramAPIServer.from_base("https://api.kernelgram.club"))
bot = Bot(token=BOT_TOKEN, session=session)
Чистый aiohttp (без aiogram):
import socket
import aiohttp
connector = aiohttp.TCPConnector(family=socket.AF_INET)
async with aiohttp.ClientSession(connector=connector) as session:
...
Пример: бот-эхо на Python
Рабочий пример без сторонних фреймворков, только requests. Отвечает на /start и повторяет любое сообщение.
import time
import requests
TOKEN = "ВАШ_ТОКЕН_ОТ_BOTFATHER"
API = f"https://api.kernelgram.club/bot{TOKEN}"
def get_updates(offset=None):
params = {"timeout": 30}
if offset:
params["offset"] = offset
r = requests.get(f"{API}/getUpdates", params=params, timeout=35)
return r.json()["result"]
def send_message(chat_id, text):
requests.post(f"{API}/sendMessage", json={"chat_id": chat_id, "text": text})
def main():
offset = None
print("Бот запущен...")
while True:
for update in get_updates(offset):
offset = update["update_id"] + 1
message = update.get("message")
if not message:
continue
chat_id = message["chat"]["id"]
text = message.get("text", "")
if text == "/start":
send_message(chat_id, "Привет! Я бот на KernelGram. Напиши что-нибудь.")
else:
send_message(chat_id, f"Ты написал: {text}")
if __name__ == "__main__":
main()
Сохраните как bot.py, вставьте свой токен и запустите: python3 bot.py. Больше ничего настраивать не нужно.