Bot API
Загальні відомості
Боти Telegram спілкуються з серверами Telegram через HTTP запити. Telegram Bot API — це специфікація цього інтерфейсу, тобто довгий список методів і типів даних, який зазвичай називають довідкою. Він визначає все, що можуть робити боти Telegram. Посилання на нього можна знайти на вкладці «Ресурси» в розділі «Telegram».
Цю систему можна візуалізувати наступним чином:
ваш бот на grammY <———HTTP———> Bot API <———MTProto———> Telegram
Пояснення: повідомлення бота надсилається як HTTP запит до серверу Bot API. Цей сервер знаходиться за адресою api
. Він конвертує запит у власний протокол Telegram, який називається MTProto, і відправить запит до серверної частини Telegram, яка відповідає за надсилання повідомлення користувачеві.
Так само щоразу, коли користувач відповідає, відбувається зворотний процес.
Коли ви запускаєте бота, вам потрібно визначитися з тим, як оновлення будуть надсилатися через HTTP зʼєднання. Це можна зробити за допомогою тривалого опитування або вебхуків.
Ви також можете розмістити сервер Bot API на своєму сервері. Це в основному корисно при надсиланні великих файлів або для зменшення затримок.
Виклик Bot API
Bot API — це те, що визначає, що можуть і чого не можуть робити боти. Кожен метод Bot API має еквівалент у grammY, і ми стежимо за тим, щоб бібліотека завжди була синхронізована з останніми та найкращими можливостями ботів. Наприклад, send
у довіднику Telegram Bot API і довіднику API grammY.
Виклик метода
Ви можете викликати методи API через bot
або так само через ctx
:
import { Api, Bot } from "grammy";
const bot = new Bot("");
async function sendHelloTo12345() {
// Надсилаємо повідомлення користувачу з id 12345.
await bot.api.sendMessage(12345, "Привіт!");
// Надсилаємо повідомлення та зберегігаємо відповідь, яка містить інформацію про надіслане повідомлення.
const sentMessage = await bot.api.sendMessage(12345, "Привіт знову!");
console.log(sentMessage.message_id);
// Надіслати повідомлення без обʼєкта `bot`.
const api = new Api(""); // <-- помістіть токен свого бота між ""
await api.sendMessage(12345, "Йоу!");
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const { Api, Bot } = require("grammy");
const bot = new Bot("");
async function sendHelloTo12345() {
// Надсилаємо повідомлення користувачу з id 12345.
await bot.api.sendMessage(12345, "Привіт!");
// Надсилаємо повідомлення та зберегігаємо відповідь, яка містить інформацію про надіслане повідомлення.
const sentMessage = await bot.api.sendMessage(12345, "Привіт знову!");
console.log(sentMessage.message_id);
// Надіслати повідомлення без обʼєкта `bot`.
const api = new Api(""); // <-- помістіть токен свого бота між ""
await api.sendMessage(12345, "Йоу!");
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import { Api, Bot } from "https://deno.land/x/grammy@v1.33.0/mod.ts";
const bot = new Bot("");
async function sendHelloTo12345() {
// Надсилаємо повідомлення користувачу з id 12345.
await bot.api.sendMessage(12345, "Привіт!");
// Надсилаємо повідомлення та зберегігаємо відповідь, яка містить інформацію про надіслане повідомлення.
const sentMessage = await bot.api.sendMessage(12345, "Привіт знову!");
console.log(sentMessage.message_id);
// Надіслати повідомлення без обʼєкта `bot`.
const api = new Api(""); // <-- помістіть токен свого бота між ""
await api.sendMessage(12345, "Йоу!");
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Зауважте, що
bot
— це просто екземпляр.api Api
, який попередньо сконструйовано для вашої зручності. Зауважте також, що якщо ви маєте доступ до обʼєкта контексту, тобто перебуваєте всередині обробника повідомлень, краще завжди викликатиctx
або одну з доступних дій..api
Хоча Api
покриває весь Bot API, він іноді дещо змінює сигнатури функцій, щоб зробити його зручнішим у використанні. Власне, усі методи Bot API очікують обʼєкт JSON із певними властивостями. Утім зверніть увагу, як send
у наведеному вище прикладі коду отримує два аргументи: ідентифікатор чату та текст повідомлення. grammY знає, що ці два значення належать властивостям chat
і text
відповідно, і створить для вас правильний обʼєкт JSON.
Як згадувалося раніше, ви можете вказати інші параметри в третьому аргументі типу Other
:
async function sendHelloTo12345() {
await bot.api.sendMessage(12345, "<i>Привіт!</i>", {
parse_mode: "HTML",
});
}
2
3
4
5
Крім того, grammY подбав про безліч технічних деталей, щоб спростити використання API. Наприклад, деякі властивості в певних методах потребують серіалізації за допомогою JSON
перед надсиланням. Це легко забути, важко налагодити та порушує виведення типів. grammY дозволяє вам узгоджено вказувати обʼєкти через API, а також гарантує, що відповідні властивості будуть серіалізовані перед їх надсиланням.
Визначення типів для Bot API
grammY постачається з повним набором типів Bot API. Репозиторій @grammyjs
містить визначення типів, які grammY використовує для внутрішнього використання. Ці визначення типів також безпосередньо експортуються з основного пакета grammy
, щоб ви могли використовувати їх у власному коді.
Визначення типів у Deno
У Deno ви можете просто імпортувати визначення типів із types
, який знаходиться поруч із mod
:
import { type Chat } from "https://deno.land/x/grammy@v1.33.0/types.ts";
Визначення типів у Node.js
На Node.js це складніше. Вам потрібно імпортувати типи з grammy
. Наприклад, ви отримуєте доступ до типу Chat
таким чином:
import { type Chat } from "grammy/types";
Однак офіційно Node.js підтримує належний імпорт підшляхів, починаючи лише з Node.js 16. Отже, TypeScript вимагає, щоб module
було встановлено на node16
або nodenext
. Налаштуйте відповідно свій tsconfig
і додайте виділений рядок:
{
"compilerOptions": {
// ...
"moduleResolution": "node16"
// ...
}
}
2
3
4
5
6
7
У деяких випадках це також може працювати без налаштування конфігурації TypeScript.
Неправильне автодоповнення у Node.js
Якщо ви не зміните свій файл tsconfig
, як описано вище, може статися так, що ваш редактор коду запропонує в автодоповненні імпортувати типи з grammy
або чогось подібного. Усі шляхи, що починаються з grammy
є внутрішніми. Не використовуйте їх. Вони можуть бути довільно змінені коли завгодно, тому ми наполегливо рекомендуємо вам імпортувати типи з grammy
.
Виклики Raw API
Бувають випадки, коли ви захочете використовувати оригінальні сигнатури функцій, але все одно покладаєтеся на зручність API grammY: наприклад, серіалізацію JSON, де це потребується. grammY підтримує це за допомогою властивостей bot
або ctx
.
Ви можете використовувати оригінальні методи наступним чином:
async function sendHelloTo12345() {
await bot.api.raw.sendMessage({
chat_id: 12345,
text: "<i>Привіт!</i>",
parse_mode: "HTML",
});
}
2
3
4
5
6
7
По суті, всі параметри з аргументів сигнатури функції обʼєднуються з обʼєктом параметрів методу, коли ви використовуєте оригінальний API.
Вибір місця розташування дата-центру
Пропустити решту сторінки, якщо ви тільки починаєте роботу.
Якщо ви хочете зменшити мережеву затримку вашого бота, має значення, де ви його розмістите.
Сервер Bot API за адресою api
знаходиться в Амстердамі, Нідерланди. Тому найкращим місцем для запуску бота є Амстердам.
Порівняння постачальників хостингу
Можливо, вас зацікавить наше порівняння постачальників хостингу.
Однак, ймовірно, є ще краще місце для запуску бота, хоча це потребує значно більших зусиль.
Памʼятайте, що сервер Bot API насправді не містить вашого бота. Він лише передає запити, перекладає між HTTP і MTProto тощо. Сервер Bot API може знаходитися в Амстердамі, але сервери Telegram розподілені між трьома різними місцями:
- Амстердам, Нідерланди;
- Маямі, штат Флорида, США;
- Сінгапур.
Отже, коли сервер Bot API надсилає запит до серверів Telegram, йому, можливо, доведеться надіслати дані через півсвіту. Відбудеться це чи ні, залежить від дата-центру самого бота. Дата-центр бота — це той самий дата-центр, що й у користувача, який створив бота. Дата-центр користувача залежить від багатьох факторів, у тому числі від місця розташування користувача.
Отже, ось що ви можете зробити, якщо хочете ще більше зменшити затримку.
- Зверніться до @where
_is і надішліть зі свого облікового запису будь-який файл. Він покаже вам місцезнаходження вашого облікового запису. Це також місцезнаходження вашого бота._my _dc _bot - Якщо ваш дата-центр знаходиться в Амстердамі, вам нічого не потрібно робити. В іншому випадку, продовжуйте читати.
- Орендуйте VPS у місці розташування вашого дата-центру.
- Запустіть локальний сервер Bot API на цьому VPS.
- Розмістіть бота в тому ж місці, що і ваш дата-центр.
Так кожен запит буде проходити лише найкоротший шлях між Telegram і вашим ботом.
Запуск локального сервера Bot API
Запуск власного сервера Bot API має дві основні переваги:
- Ваш бот може надсилати та отримувати великі файли.
- Ваш бот може зменшити мережеві затримки (дивіться вище).
Інші незначні переваги перераховані тут.
Ви повинні запустити сервер Bot API на VPS. Якщо ви спробуєте запустити його де-небудь в іншому місці, він буде виходити з ладу або втрачати повідомлення.
Ви також повинні скомпілювати сервер Bot API з нуля. Це корисно, якщо у вас є досвід компіляції великих проектів на C++, але якщо у вас його немає, ви можете просто скопіювати інструкції по збірці і сподіватися, що вони працюватимуть.
Найпростіший спосіб запустити сервер Bot API — скористатися генератором інструкцій по збірці, наданим Telegram..
Більше варіантів можна знайти в репозиторії сервера Bot API.
Зібравши сервер, ви отримаєте виконуваний файл, який можна запустити.
Ви отримали цей виконуваний файл? Тепер ви можете перемістити свого бота на локальний сервер Bot API!
Вихід з сервера розміщеного Bot API
По-перше, вам потрібно вийти з сервера, на якому розміщено Bot API. Візьміть цю URL-адресу і вставте її в браузер (не забудьте замінити <токен>
на токен вашого бота):
https://api.telegram.org/bot<токен>/logOut
Ви повинні побачити {"ok":
.
Налаштування grammY для використання локального сервера Bot API
Далі ви можете вказати grammY використовувати ваш локальний сервер Bot API замість api
. Припустимо, ваш бот працює на localhost
на порту 8081. Тоді вам слід використовувати наступну конфігурацію.
const bot = new Bot("", { // <-- використовуйте той самий токен, що й раніше
client: { apiRoot: "http://localhost:8081" },
});
2
3
Тепер ви можете запустити бота знову. Він буде використовувати локальний сервер Bot API.
Якщо щось пішло не так, і ви не знаєте, як це виправити, скільки б ви не гуглили, не соромтеся приєднатися до нашого чату спільноти і попросити про допомогу! Ми знаємо про вашу помилку ще менше, ніж ви, але, ймовірно, зможемо відповісти на ваші запитання.
Памʼятайте, що ви також повинні налаштувати свій код для роботи з локальними шляхами до файлів замість URL-адрес, що вказують на ваші файли. Наприклад, виклик get
дасть вам шлях до файлу, який вказує на ваш локальний диск, а не на файл, який спочатку потрібно завантажити з Telegram. Аналогічно, плагін файлів має метод get
, який повертає не URL-адресу, а абсолютний шлях до файлу.
Якщо ви коли-небудь захочете змінити цю конфігурацію і перенести свого бота на інший сервер, обовʼязково прочитайте цей розділ README репозиторію серверу Bot API.