~ aiogram 3.X | aiogram 2.X
~ aiogram roadmap
~ Groosha & aiogram 3.X | aiogram 2.X
~ Latand & botfather.dev
~ ще канал про aiogram як цей
~ aiogram | contributors
~ examples 3.Х | examples 2.Х
~ Open Collective
🇺🇸 @aiogram 🇺🇦 @aiogramua
🇺🇿 @aiogram_uz 🇰🇿 @aiogram_kz
🇮🇷 @aiogram_fa 🇧🇷 @aiogram_br
• новини • меми
#активіст
#порада
#цікаве
🍐 Groosha
⏰ Відправка в заданий час
🔌 Збірка хостингів
🪝 Як підняти вебхук
📂 Шаблони для бота
🕸 Про фільтри
🔒 Middleware
🏭 Про Callback Factory
📼 Машина станів (FSM)
🗄 СУБД Redis
🤖 Створення мультиботу
📦 Технології для тг ботів
😀 aiogram roadmap
🌍 i18n, i10n - мови у боті
📥 Деплой ботів та SSH ключі
• TON (The Open Network)
UQDi31xJvtUmkKYepZ8NsblY0t_YJtcCKfC_1HyIrTc_IePV• https://send.monobank.ua/jar/2RPWpMWwz5
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
🍐 Groosha #активіст
@Groosha - активний учасник спільноти, він пише якісні та зрозумілі статті, а також ботів з благородною метою - навчити людей, нижче представлено кілька його робіт
📚 Книги зі створення Telegram-ботів мовою Python за допомогою aiogram (НОВАЧКАМ ЧИТАТИ)
~ aiogram 3.X | aiogram 2.X
👩💻 Демонстрація роботи aiogram разом з асинхронною sqlalalchemy і базою даних PostgreSQL
😀 Ігровий бот для гри в сапера
💬 Бот для зворотного зв'язку без використання бази даних
🔔 Бот для ловлі скарг від користувачів у групі
🎰 Демонстраційний бот для гри з кістками в Telegram
@Groosha - активний учасник спільноти, він пише якісні та зрозумілі статті, а також ботів з благородною метою - навчити людей, нижче представлено кілька його робіт
~ aiogram 3.X | aiogram 2.X
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
📂 Шаблони для телеграм бота #цікаве
🥇aiogram-bot-template
від @f0rden (⭐️ 474)
🥈tgbot_template
від @Tishka17 (⭐️ 257)
🥉tgbot_template_v3
від @Latand (⭐️ 141)
4) aiogram_template
від @bomzheg (⭐️ 88)
5) aiogram_bot_template
від @wakaree (⭐️ 86)
6) telegram-bot-template
від rodion-gudz (⭐️ 77)
7) aiogram_template
від @F0rzend (⭐️ 43)
8) Template
від @laymi0 (⭐️ 8)
🥇aiogram-bot-template
від @f0rden (⭐️ 474)
🥈tgbot_template
від @Tishka17 (⭐️ 257)
🥉tgbot_template_v3
від @Latand (⭐️ 141)
4) aiogram_template
від @bomzheg (⭐️ 88)
5) aiogram_bot_template
від @wakaree (⭐️ 86)
6) telegram-bot-template
від rodion-gudz (⭐️ 77)
7) aiogram_template
від @F0rzend (⭐️ 43)
8) Template
від @laymi0 (⭐️ 8)
❤1
🏭 Що таке callback factory (калбек фабрика)? #цікаве
👉 Callback Data Factory (CDF) - це інструмент для створення фільтрів на інлайн кнопках, він дозволяє поміщати в них данні (до 64 байтів - ліміт тг), які потім можна отримувати і відповідно реагувати (чимось схожий на enums)
🤨 І навіщо мені цим користуватись?
Корисна штука, коли вам в інлайн кнопках потрібна callback_data по типу item_1_73627352, item_2_7262626 (тобто декілька змінних у рядку). Для цього вже є готовий інструмент
👀 Як цим користуватись?
1️⃣ Імпортуємо CallbackData
2️⃣ Створюємо підклас CallbackData, наприклад
📌 prefix - це обов'язковий кейворд, який робить такі фільтри унікальними (це типу їхнє ід чи ім'я, воно в callback_data на першому місці)
📌 атрибути item_id і seller_id - допомагають розрізняти змінні в callback_data
3️⃣ Робимо інлайн клавіатуру з кнопкою
📌 метод pack() повертає данні об'єкту ItemForSale у вигляді рядка "item:1:2", тому зміна порядку атрибутів може щось зламати (також є unpack, він робить навпаки - перетворює рядок в об'єкт)
📌 CDF використовують в поєднанні з InlineKeyboardBuilder, бо потрібна динамічна клавіатура (данні можуть змінюватися)
4️⃣ Ловимо данні по кліку на кнопку
📌 тепер при натисканні на кнопку в консолі ми побачимо данні item_id і seller_id (які задавали при створенні кнопки)
📌 не можна змінювати назву аргументу callback_data в хендлері
📌 щоб ловити натискання ми користуємось методом filter() підкласу CallbackData, також в ньому можна писати правила магічного фильтру «F» якщо треба вказати щось точніше, наприклад
📚 Читати про це в документації
🍐 Книга Груші, про Callback factory
🤨 І навіщо мені цим користуватись?
Корисна штука, коли вам в інлайн кнопках потрібна callback_data по типу item_1_73627352, item_2_7262626 (тобто декілька змінних у рядку). Для цього вже є готовий інструмент
👀 Як цим користуватись?
1️⃣ Імпортуємо CallbackData
from aiogram.filters.callback_data import CallbackData
2️⃣ Створюємо підклас CallbackData, наприклад
class ItemForSale(CallbackData, prefix='item'):
item_id: int
seller_id: int
3️⃣ Робимо інлайн клавіатуру з кнопкою
from aiogram.utils.keyboard import InlineKeyboardBuilder
kb = InlineKeyboardBuilder()
kb.button(
text='Item',
callback_data=ItemForSale(
item_id=1,
seller_id=2,
).pack(),
)
kb = kb.as_markup()
4️⃣ Ловимо данні по кліку на кнопку
@router.callback_query(ItemForSale.filter())
async def test(
call: CallbackQuery,
callback_data: ItemForSale,
):
print(callback_data.item_id)
print(callback_data.seller_id)
F.item_id == 1 означає, що хендлер буде реагувати якщо заданий item_id в кнопці був 1🍐 Книга Груші, про Callback factory
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
📼 Що таке FSM, ФСМ, машина станів? #цікаве
👉 Finite State Machine (FSM) - це абстрактна машина, яка може перебувати в одному з кінцевого числа станів у будь-який момент часу. FSM може переходити з одного стану в інший як того забажає розробник
🤨 І навіщо мені цим користуватись?
Це стане в нагоді коли ми захочемо приймати якісь дані від юзера, наприклад під час заповнення анкети, реєстрації на щось чи просто обслуговування клієнта
👀 Як цим користуватись?
1️⃣ Потрібно зберігати введені данні
📌 ми додали в диспетчер параметр storage, він визначає де бот буде зберігати данні, в цьому випадку є декілька варіантів, але для практики вистачить оперативної пам'яті (коли ми вимкнемо бота - всі данні пропадуть). Якщо ми не хочемо втрачати данні при зупинці бота, то можемо використати наприклад бд Redis.
📌 за замовчуванням storage=MemoryStorage(), я вказав його для більш зрозумілого пояснення
2️⃣ Будуємо машину станів
📌 один підклас StatesGroup - одна машина станів, у ній ми пишемо атрибути-екземпляри класу State, їх можна сприймати як флашки чи фільтри на які реагує хендлер
3️⃣ Вводимо нашого бота в стан
📌 ми передаємо в хендлер аргумент state, за допомогою нього ми можемо керувати машинами станів, метод set_state задає новий стан, FSMContext потрібен для аннотації (так через IDE можна передивитись всі доступні методи)
📌 коли ми відправимо боту команду /start, то він увійде в стан і запитає наше ім'я
4️⃣ Ловимо повідомлення у стані
📌 в якості фильтра хендлера ми вказуємо очікуваний стан - тобто назву класу + атрибут, метод update_data оновлює данні які ми зберігаємо в storage, важливо розуміти, що вони не залежать від станів
📌 далі по аналогії можна ловити іншу інформацію, головне не забувати міняти стан і данні в storage та вказувати правильний тип апдейту (атрибут декоратора хендлера)
📌 після того, як ми отримаємо збереженні данні у вигляді словника за допомогою методу state.get_data(), їх можна видалити методом state.clear() - проте він чистить і стан, якщо потрібно прибрати тільки стан, то state.set_state(state=None) або тільки видалити дані - state.set_data({})
📚 Читати про це в документації
🍐 Книга Груші, про FSM
Це стане в нагоді коли ми захочемо приймати якісь дані від юзера, наприклад під час заповнення анкети, реєстрації на щось чи просто обслуговування клієнта
👀 Як цим користуватись?
1️⃣ Потрібно зберігати введені данні
from aiogram.fsm.storage.memory import MemoryStorage
dp = Dispatcher(storage=MemoryStorage())
2️⃣ Будуємо машину станів
from aiogram.fsm.state import StatesGroup, State
class Application(StatesGroup):
name = State()
phone_number = State()
denoscription = State()
3️⃣ Вводимо нашого бота в стан
from aiogram.fsm.context import FSMContext
@router.message(Command('start'))
async def start_cmd(msg: Message, state: FSMContext):
await state.set_state(Application.name)
await msg.answer('Як тебе звати?')
4️⃣ Ловимо повідомлення у стані
@router.message(Application.name)
async def get_name(msg: Message, state: FSMContext):
await state.update_data(name=msg.text)
await state.set_state(Application.name)
await msg.answer('Добре, тепер відправ свій номер')
🍐 Книга Груші, про FSM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🔌 Який хостинг обрати для бота в 2024р? #порада
💭 Я провів невелике опитування серед учасників моєї спільноти та склав рейтинг по згадуванню хостингів на спадання
🥇 AWS - 11
Американські веб сервіси Амазону. Є пробний період. Засновані у 2002р
📡 Регіони - для VPS Огайо, Північна Вірджинія, Орегон, Мумбаї, Сеул, Сінгапур, Сідней, Токіо, Центральна Канада, Франкфурт, Ірландія, Лондон, Париж Стокгольм
💎 Ціна VPS від $3.5
➖➖➖➖➖➖➖➖➖
🥈 DigitalOcean - 8
Американська компанія зі штаб квартирою у Нью-Йорку. Заснована у 2011р. Має 15 датацентрів.
📡 Регіони - 9, є Амстердам
💎 Ціна VPS від $4
➖➖➖➖➖➖➖➖➖
🥉 MVPS - 7
Компанія Республіки Кіпр. Заснована у 2018р. Має чудову безвідмовну роботу та гарну підтримку 24/7
📡 Регіони - 9 країн, є Нідерланди
💎 Ціна VPS від €4
➖➖➖➖➖➖➖➖➖
4️⃣ HETZNER - 6
Німецька компанія. Заснована у 1997р. Hetzner Online один із крупних хостингів і центрів обробки данних у Європі. Має свої датацентри
📡 Регіони - Німеччина, Фінляндія, США
💎 Ціна VPS від €3.8
➖➖➖➖➖➖➖➖➖
5️⃣ Oracle Cloud - 5
Американська компанія. Заснована у 2018р.
📡 Регіони - тут
💎 Ціни - тут
➖➖➖➖➖➖➖➖➖
6️⃣ ZOMRO - 3
Нідерландська (Zomro B.V.) і Латвійська (Podaon SIA) компанія. Заснована у 2014 році в Україні. Має датацентр у Нідерландах
📡 Регіони - Нідерланди
💎 Ціна VPS від €4
➖➖➖➖➖➖➖➖➖
7️⃣ VULTR - 3
Американська компанія. Заснована у 2014р
📡 Регіони - 32 штук (в датацентрах)
💎 Ціна VPS - від $2.5
➖➖➖➖➖➖➖➖➖
8️⃣ CONTABO - 2
Німецька компанія. Заснована у 2003р
Має 10 датацентрів.
📡 Регіони - Німеччина, Об'єднане королівство, США, US, Сінгапур, Сідней
💎 Ціна VPS від €4.5
➖➖➖➖➖➖➖➖➖
9️⃣ OVH - 1
Французька компанія. Заснована у 1999р. Найкрупніший європейський хостинг з 2011р. Має 34 датацентри у 8-ми країнах
📡 Регіони - датацентри, для VPS США
💎 Ціна VPS від $4.2
➖➖➖➖➖➖➖➖➖
10) Cockbox - 1
Автоматизований анонімний сервіс. Вся оплата в криптовалюті. Ціль - забезпечити конфіденційність клієнтів
📡 Регіони - Молдова, Румунія
💎 Ціна VPS від $10
➖➖➖➖➖➖➖➖➖
11) Google Cloud - 1
Платформа хмарних служб від компанії Google. Багато можливостей, є пробний період. Заснована в 2008р.
📡 Регіони - 35+, є Нідерланди
💎 Ціна VPS від ≈ $21
➖➖➖➖➖➖➖➖➖
🎚 Всі ціни вказані за 1 місяць
🖥 VPS - приватний сервер який ділить ресурси з іншими юзерами на одному фізичному комп'ютері (на такому можна запустити бота)
⚡️ Особисто я користувався на практиці тільки MVPS і мені дуже подобається. Якщо хочете подякувати, ось реферальне посилання :D (моя винагорода тимчасова і у вас нічого не забирається)
🏅 Дякую всім, хто приймав участь в опитуванні!
⏱ Останнє оновлення 28.02.2024
💭 Я провів невелике опитування серед учасників моєї спільноти та склав рейтинг по згадуванню хостингів на спадання
🥇 AWS - 11
Американські веб сервіси Амазону. Є пробний період. Засновані у 2002р
📡 Регіони - для VPS Огайо, Північна Вірджинія, Орегон, Мумбаї, Сеул, Сінгапур, Сідней, Токіо, Центральна Канада, Франкфурт, Ірландія, Лондон, Париж Стокгольм
💎 Ціна VPS від $3.5
➖➖➖➖➖➖➖➖➖
🥈 DigitalOcean - 8
Американська компанія зі штаб квартирою у Нью-Йорку. Заснована у 2011р. Має 15 датацентрів.
📡 Регіони - 9, є Амстердам
💎 Ціна VPS від $4
➖➖➖➖➖➖➖➖➖
🥉 MVPS - 7
Компанія Республіки Кіпр. Заснована у 2018р. Має чудову безвідмовну роботу та гарну підтримку 24/7
📡 Регіони - 9 країн, є Нідерланди
💎 Ціна VPS від €4
➖➖➖➖➖➖➖➖➖
4️⃣ HETZNER - 6
Німецька компанія. Заснована у 1997р. Hetzner Online один із крупних хостингів і центрів обробки данних у Європі. Має свої датацентри
📡 Регіони - Німеччина, Фінляндія, США
💎 Ціна VPS від €3.8
➖➖➖➖➖➖➖➖➖
5️⃣ Oracle Cloud - 5
Американська компанія. Заснована у 2018р.
📡 Регіони - тут
💎 Ціни - тут
➖➖➖➖➖➖➖➖➖
6️⃣ ZOMRO - 3
Нідерландська (Zomro B.V.) і Латвійська (Podaon SIA) компанія. Заснована у 2014 році в Україні. Має датацентр у Нідерландах
📡 Регіони - Нідерланди
💎 Ціна VPS від €4
➖➖➖➖➖➖➖➖➖
7️⃣ VULTR - 3
Американська компанія. Заснована у 2014р
📡 Регіони - 32 штук (в датацентрах)
💎 Ціна VPS - від $2.5
➖➖➖➖➖➖➖➖➖
8️⃣ CONTABO - 2
Німецька компанія. Заснована у 2003р
Має 10 датацентрів.
📡 Регіони - Німеччина, Об'єднане королівство, США, US, Сінгапур, Сідней
💎 Ціна VPS від €4.5
➖➖➖➖➖➖➖➖➖
9️⃣ OVH - 1
Французька компанія. Заснована у 1999р. Найкрупніший європейський хостинг з 2011р. Має 34 датацентри у 8-ми країнах
📡 Регіони - датацентри, для VPS США
💎 Ціна VPS від $4.2
➖➖➖➖➖➖➖➖➖
10) Cockbox - 1
Автоматизований анонімний сервіс. Вся оплата в криптовалюті. Ціль - забезпечити конфіденційність клієнтів
📡 Регіони - Молдова, Румунія
💎 Ціна VPS від $10
➖➖➖➖➖➖➖➖➖
11) Google Cloud - 1
Платформа хмарних служб від компанії Google. Багато можливостей, є пробний період. Заснована в 2008р.
📡 Регіони - 35+, є Нідерланди
💎 Ціна VPS від ≈ $21
➖➖➖➖➖➖➖➖➖
🎚 Всі ціни вказані за 1 місяць
🖥 VPS - приватний сервер який ділить ресурси з іншими юзерами на одному фізичному комп'ютері (на такому можна запустити бота)
⚡️ Особисто я користувався на практиці тільки MVPS і мені дуже подобається. Якщо хочете подякувати, ось реферальне посилання :D (моя винагорода тимчасова і у вас нічого не забирається)
🏅 Дякую всім, хто приймав участь в опитуванні!
⏱ Останнє оновлення 28.02.2024
❤6👍1🏆1🫡1
🗄 Що за бд редіс, Redis? #цікаве
👉 База даних Redis - (абр. remote dictionary server) швидке NoSQL сховище даних в форматі «ключ-значення», які зберігаються в оперативній пам'яті
📌 офіційної підтримки на Windows немає, але «якось» працювати можна
😀 І навіщо мені цим користуватись?
Наприклад, якщо взяти MemoryStorage, то данні які ми обробляємо за допомогою FSM будуть видалятися при зупинці бота. Але якщо ми хочемо, щоб данні зберігались? От для цього і підходить Redis (також з ним поєднують планувальники задач і черги, застосовують для роботи з хешем)
👀 Як цим користуватись?
1️⃣ Завантажуємо Redis
💭 Саме так і ніяк інакше, ви не під'єднаєтесь до того, чого у вас немає. Для кожної ОС є свої інструкції, які можуть різнитись, тому я не зможу описати процес встановлення персонально для вас - шукаємо це в інтернеті
2️⃣ Підключаємось до Redis
📌 клас RedisStorage потрібен для з'єднання з редісом, він приймає екземпляр коннекту до бд або url з даними для підключення. Тут використано метод from_url, саме він приймає url і просуває іменовані аргументи якби ми передали їх у RedisStorage напряму
📌 параметр key_builder можна використати для класу DefaultKeyBuilder, який потрібен для налаштування побудови ключів у редісі, ми вказуємо with_destiny=True, щоб вони були більш унікальними один для одного
📌 аргументи state_ttl і data_ttl - задають час в секундах, після закінчення якого ключи (для state і data відповідно) будуть видалятися. За замовчуванням у ключів в редісі немає TTL (time to live) - тому вони просто не видаляються і накопичуються
3️⃣ Користуємось FSM і поглиблюємо знання
💭 В принципі на цьому можна було б закінчити, оскільки після вищезазначених інструкцій нічого змінювати більше не треба, машини станів будуть працювати зовнішньо так само як це було б з MemoryStorage (дякуємо розробникам aiogram). Надалі можна лише поглиблюватись в те, як саме працює Redis і будуються (виглядають) ключі
📌 потренуватись можна в Docker
📌 ключі можуть бути - рядками, списками, множинами, хешами та сортованими множинами, а значення - рядками, числами, списками, множинами, хешами і бітовими рядками (в останньому до речі зберігаються ключі FSM)
📌 Redis може містити кілька баз даних, кожна з яких має унікальний номер. За замовчуванням їх 16 штук, від 0 до 15. Але це діло можна змінити в конфігураційних файлах
📚 Читати про це в документації
Наприклад, якщо взяти MemoryStorage, то данні які ми обробляємо за допомогою FSM будуть видалятися при зупинці бота. Але якщо ми хочемо, щоб данні зберігались? От для цього і підходить Redis (також з ним поєднують планувальники задач і черги, застосовують для роботи з хешем)
1️⃣ Завантажуємо Redis
2️⃣ Підключаємось до Redis
from aiogram.fsm.storage.redis import (
RedisStorage,
DefaultKeyBuilder,
)
storage = RedisStorage.from_url(
config.redis_url,
key_builder=DefaultKeyBuilder(
with_destiny=True,
),
state_ttl=timedelta(days=1),
data_ttl=timedelta(days=1),
)
dp = Dispatcher(storage=storage)
3️⃣ Користуємось FSM і поглиблюємо знання
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Якщо немає на стороні телеграм - треба робити у себе. Можна спробувати такі інструменти:
• asyncio
• apscheduler
• додаткові технології
│ RabbitMQ
│ Apache Kafka
│ Redis
╰ Celery
⏲ APScheduler (абр. advanced python scheduler) - це бібліотека для планування завдань
В ній є 4 базові типи компонентів:
• тригери (date, interval, cron)
• сховища задач (in-memory, Redis..)
• планувальники (є AsyncIOScheduler)
• виконавці (відправляють завдання на виконання)
1️⃣ Екземпляр планувальника та його запуск
from apscheduler.schedulers.asyncio import AsyncIOScheduler
scheduler = AsyncIOScheduler()
scheduler.start()
AsyncIOScheduler
2️⃣ Міні-інтерактив по документації• створення завдань
• видалення завдань
• призупинення і поновлення завдань
• отримати всі завдання
• змінити завдання
• керування планувальником
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
📌 Основні види фільтрів
• Текстові
• Магічні
• Кастомні
• CDF
• Спец. апдейти
• Для відлову помилок
✏️ Текстові
from aiogram.filters import Command
Command("start")
Command(commands=("foo", "bar"))
command з анотацією із from aiogram.filters.command import CommandObject🔮 Magic filers
from aiogram import F
Приклади (деякі методи універсальні):
🔻 Message
F.text == "hello"
F.photo
F.text.in_({"1", "2"})
F.text.contains("bar")
F.text.startswith("stop")
F.text.endswith("foo")
🔻 CallbackQueryF.data == "my_data"
F.data.in_({"close", "cancel"})
F.chat.type == "private"
🔻 RegexF.text.regexp(r'Hi, .+')
• and через символ &
F.text == 1 & F.chat.id == 8
• or через символ |F.text == "k" | F.text.len() == 1
• not через символ
~
~F.chat.id.in_({1, 2, 3})
• ще є такі варіантиaiogram.filters.magic_data - це інструмент для створення фільтрів з вашими данними, які можуть бути передані в аргументи хендлера (через мідлвар, Distpacher чи іншим способом). Наприклад - MagicData(F.from_user.id == F.config.admin_id), де config переданий аргументPlease open Telegram to view this post
VIEW IN TELEGRAM
👍2
🪝 Як підняти вебхук #цікаве
👉 Webhook (для тг ботів) - це механізм отримання апдейтів шляхом ловлі POST-запитів до вашого веб-сервера, а не опитування телеграма на пряму
💡 при polling (опитуванні) ми беремо апдейти з ендпоінту api.telegram.org, а от з вебхуком задаємо наше персональне посилання, куди вже сам телеграм буде відправляти апдейти, а ми їх ловити
🤨 І навіщо мені цим користуватись?
• у ситуації, коли бот має дуже велике навантаження, тобто отримує багато апдейтів за одиницю часу. Відомо, що опитування (getUpdates) дає можливість взяти максимально 100 апдейтів за виклик
• якщо не хочемо бачити записи в консолі про те, що не вдалося отримати апдейти. При polling кожний бот постійно робить запити на api.telegram.org навіть якщо апдейтів немає. Треба пам'ятати, що кожен виклик getUpdates має час виконання і певне навантаження
• цей механізм дає можливість розподіляти апдейти на потрібні вам сервера обробки і реалізувати горизонтальне масштабування проекту
👀 Як цим користуватись?
1️⃣ Домен або IP-адреса з сервером
💭 Очевидно, що телеграм буде слати апдейти на вказаний URL, до якого ви повинні мати доступ, тому необхідно завести свій сервер з необов'язковим доменом. Про організацію цього моменту можна почитати в інтернеті, а вибрати хостинг тут
2️⃣ Безпечне з'єднання з сервером
💭 Телеграм в якійсь мірі переймається про безпеку та конфіденційність своїх користувачів, тому не буде відправляти апдейти по небезпечному з'єднанню
• сервер повинен мати SSL/TLS сертифікат (другий наступник першого), щоб підтримувати HTTPS запити від телеграму. Дозволяється самописний сертифікат, але його встановлення відрізняється, для когось це може бути дещо складнішим (такий зазвичай прив'язують до IP-адреси)
📌 На каналі є пости про це
• Самопідписаний сертифікат
• Сертифікат від Let's Encrypt
3️⃣ Отримання апдейтів
💭 Є багато способів стежити за вхідними POST-запитами на ваш сервер, наприклад за допомогою:
• aiohttp
• FastAPI
• Flask
• reverse proxy server
🪄 Приклад з aiohttp (оригінал коду для мультибота):
📌
📌
📌
📌
4️⃣ Безпека та секретні токени
💭 Якщо є сервер який приймає запити, то цим можуть скористатися хацкери. От наприклад, вони відправлять свій POST запит, бот подумає що це апдейт - неправильно сериліазує і виникне помилка. Щоб перешкоди подібному деякі перевіряють IP-адресу відправника (у тг вони статичні), хтось додає в запити телеграму свої ключі, які звіряють на сервері, але вибір лишається за вами, проте я не рекомендую користуватись API токеном бота в ролі секрету, якщо це не мультибот
5️⃣ Як безкоштовно спробувати вебхук без SSL сертифікату та домену (листай вниз посту)
🌀 Telegram Bot API - Webhooks
🍐 Якийсь вебхук Груші
• у ситуації, коли бот має дуже велике навантаження, тобто отримує багато апдейтів за одиницю часу. Відомо, що опитування (getUpdates) дає можливість взяти максимально 100 апдейтів за виклик
• якщо не хочемо бачити записи в консолі про те, що не вдалося отримати апдейти. При polling кожний бот постійно робить запити на api.telegram.org навіть якщо апдейтів немає. Треба пам'ятати, що кожен виклик getUpdates має час виконання і певне навантаження
• цей механізм дає можливість розподіляти апдейти на потрібні вам сервера обробки і реалізувати горизонтальне масштабування проекту
1️⃣ Домен або IP-адреса з сервером
2️⃣ Безпечне з'єднання з сервером
• сервер повинен мати SSL/TLS сертифікат (другий наступник першого), щоб підтримувати HTTPS запити від телеграму. Дозволяється самописний сертифікат, але його встановлення відрізняється, для когось це може бути дещо складнішим (такий зазвичай прив'язують до IP-адреси)
• Самопідписаний сертифікат
• Сертифікат від Let's Encrypt
3️⃣ Отримання апдейтів
• aiohttp
• FastAPI
• Flask
• reverse proxy server
bot.set_webhook(URL_FOR_UPDATES)
app = web.Application()
SimpleRequestHandler(
dispatcher=dp, bot=bot,
).register(
app, path=WEBHOOK_PATH,
)
setup_application(app, dp, bot=bot)
web.run_app(
app,
host=WEB_SERVER_HOST,
port=WEB_SERVER_PORT,
)
bot.set_webhook - метод, який передає телеграму URL для подальшої відправки туди апдейтівweb та app - модуль для взаємодії з HTTP протоколом і екземпляр-додаток aiohttp відповідноSimpleRequestHandler - спец. фільтр aiogram, який ловить лише POST запити і перенаправляє їх на обробку до нашого ботаsetup_application - функція aiogram, яка допомагає налаштувати startup-shutdown процеси aiohttp додатку разом з ботом4️⃣ Безпека та секретні токени
5️⃣ Як безкоштовно спробувати вебхук без SSL сертифікату та домену (листай вниз посту)
🌀 Telegram Bot API - Webhooks
🍐 Якийсь вебхук Груші
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
@Tishka17 😳 GitHub #активіст
Розробник. Помічник в чаті. Контрибьютор aiogram
😀 Чим займався/ється:
• веде свій особистий канал із дієвими порадами. Буде корисний будь-яким розробникам - @advice17
• творець aiogram-dialog. Це фреймворк з графічним інтерфейсом для тг ботів. Натхненний ідеями Android SDK та React.js (простіше кажучи він допомагає працювати з інлайн кнопками). Є бот для демонстрації роботи бібліотеки - @aiogram_dialog_demo_bot
~📚 Документація | 💭 Чат
https://news.1rj.ru/str/about_aiogram/17
Розробник. Помічник в чаті. Контрибьютор aiogram
• веде свій особистий канал із дієвими порадами. Буде корисний будь-яким розробникам - @advice17
• творець aiogram-dialog. Це фреймворк з графічним інтерфейсом для тг ботів. Натхненний ідеями Android SDK та React.js (простіше кажучи він допомагає працювати з інлайн кнопками). Є бот для демонстрації роботи бібліотеки - @aiogram_dialog_demo_bot
~
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
• t.me/path?query
• http://t.me/path?query
• https://news.1rj.ru/str/path?query
• tg://path?query
У цьому пості ми розглянемо найбільш вживані посилання в контексті ботів. Якщо ти хочеш дізнатись всі види посилань і те як вони утворюються, то внизу буде офіційна стаття на цю тему. Я розповім про їх популярні шаблони та інструменти з коробки aiogram
1️⃣ Згадування юзера по ід
tg://user?id=<id>
📦 можна дістати з об'єкта User атрибутом url (from_user.url)✏️ Цікаві факти про це посилання
➖➖➖➖➖➖➖➖➖➖
2️⃣ Передача параметра у команді /start
t.me/<username>?start=<parameter>
📦 from aiogram.utils.deep_linking import create_start_link
➖➖➖➖➖➖➖➖➖➖3️⃣ Додати бота в группу
t.me/<username>?startgroup
📦 from aiogram.utils.deep_linking import create_startgroup_link
➖➖➖➖➖➖➖➖➖➖4️⃣ Додати бота в канал
t.me/<username>?startchannel&admin=<permissions>
➖➖➖➖➖➖➖➖➖➖5️⃣ Надсилання підготовленого повідомлення
tg://msg_url?text=<your_text>
➖➖➖➖➖➖➖➖➖➖6️⃣ Створення спойлеру
<tg-spoiler>text</tg-spoiler>
➖➖➖➖➖➖➖➖➖➖🌀 API > Deep Links
🍐 Книга Груші, повідомлення
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2👎1
🔒 Middleware, Мідлвар #цікаве
👉 Middleware (в aiogram) - це спеціальний класс (можна реалізувати у вигляді функції), який має контроль над апдейтом до того, як на нього відреагує бот
😀 І навіщо мені цим користуватись?
• Можна обробляти апдейт тільки якщо він відповідає нашим умовам
• Є можливість «блокувати апдейт» наче його і не було
• Загалом можна робити будь-які дії перед тим як бот відреагує на апдейт чи після цього
👀 Як цим користуватись?
• Екземпляр мідлваря треба реєструвати у диспетчера чи роутера з певним типом апдейту який він буде обробляти
📌 Є «зовнішні» та «внутрішні» реєстрації
Зовнішні - будуть завжди викликатись на вказаний тип апдейту
📌 Реєстрація мідлваря, який буде обробляти будь-які апдейти
📌 Якщо комбінувати свій router і внутрішню реєстрацію, то мідлвар буде працювати тільки з хендлерами цього роутеру
🎒Пам'ятка новачка
1) Якщо мідлвар це класс, то в нього обов'язково повинен бути метод call - саме в ньому реалізується всі подальші дії після отримання апдейту
2) Точно знаємо який тип апдейтів приходить - анотуємо це.
3) За передачу апдейту по ланцюжку фільтрів і хендлерів відповідає виклик handler:
>
>
>
🪄 Приклади мідлварей
• Лічильник (з доки) - обробляє апдейти типу Message які проходять фільтри і потрапляють в якийсь хендлер цього роутера. Передає в хендлер аргумент «counter»
• Антифлуд (від Груші) - реєструється на тип Message, перевіряє чи є ід чату в тимчасовому кеші, якщо є, то блокує апдейт, інакше записує його в нього
• Ловля альбомів - реєструється на Message і відловлює повідомлення з media_group_id, передає список елементів як аргумент «album» в хендлер
• Передача сесій бд (від мене) - за допомогою
• Перевірка на бан (від мене) - дістає тг ід юзера і перевіряє його у списку заблокованих користувачів, блокує апдейт якщо результат пошуку True
📚 Читати про це в документації
🍐 Книга Груші, про Мідлвари
• Можна обробляти апдейт тільки якщо він відповідає нашим умовам
• Є можливість «блокувати апдейт» наче його і не було
• Загалом можна робити будь-які дії перед тим як бот відреагує на апдейт чи після цього
• Екземпляр мідлваря треба реєструвати у диспетчера чи роутера з певним типом апдейту який він буде обробляти
Зовнішні - будуть завжди викликатись на вказаний тип апдейту
dp.<event>.outer_middleware()
Внутрішні - спрацюють якщо апдейт з потрібним типом потенційно потрапляє в якийсь хендлер (тобто пройде крізь всі фільтри)<router>.<event>.middleware()
dp.update.outer_middleware()
🎒Пам'ятка новачка
1) Якщо мідлвар це класс, то в нього обов'язково повинен бути метод call - саме в ньому реалізується всі подальші дії після отримання апдейту
2) Точно знаємо який тип апдейтів приходить - анотуємо це.
3) За передачу апдейту по ланцюжку фільтрів і хендлерів відповідає виклик handler:
await handler(event, data)
4) Виклик мідлваря приймає такі аргументи:>
handler - хендлер (відомий тільки якщо це внутрішній мідлвар)>
event - вхідна подія (підклас aiogram.types.base.TelegramObject)>
data - контекстні дані (словник), через них передаються аргументи у фільтри й хендлери• Лічильник (з доки) - обробляє апдейти типу Message які проходять фільтри і потрапляють в якийсь хендлер цього роутера. Передає в хендлер аргумент «counter»
• Антифлуд (від Груші) - реєструється на тип Message, перевіряє чи є ід чату в тимчасовому кеші, якщо є, то блокує апдейт, інакше записує його в нього
• Ловля альбомів - реєструється на Message і відловлює повідомлення з media_group_id, передає список елементів як аргумент «album» в хендлер
• Передача сесій бд (від мене) - за допомогою
async_sessionmaker (це з SQLAlchemy) дістає сесію для роботи з бд і дає її новому екземпляру класса з вашими запитами до бази данних, передає готовий клас як аргумент «db» в хендлер чи фільтр• Перевірка на бан (від мене) - дістає тг ід юзера і перевіряє його у списку заблокованих користувачів, блокує апдейт якщо результат пошуку True
🍐 Книга Груші, про Мідлвари
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👎1
📦 Збірка технологій для розробки тг ботів на Python #цікаве
😀 Фреймворки для TG Bot API
• aiogram •telebot
• python-telegram-bot
🌐 Веб фреймворки
• aiohttp • Starlette
• FastAPI • Sanic
• Quart • Django
🖥 СУБД
•SQLite3 • PostgreSQL
• MySQL
🗃 NoSQL СУБД
• Redis • MongoDB
😀 ORM і міграції
• SQLAlchemy • Alembic
🛖 Робоче середовище
• venv • Docker
📅 Планувальники і брокери завдань
• APSheduler • RabbitMQ
• Apache Kafka • Celery
• Nats
🧮 Тестування
• unittest • pytest
• mock • coverage
🗜 DevOps і CI/CD
• GitHub Actions • GitLab
• Ansible
📌 Закреслені - не рекомендовані для використання у великих проектах. Акцент збірки зроблений на безоплатному використанні інструментів, можливості їх асинхронної роботи, популярності
• aiogram •
• python-telegram-bot
• aiohttp • Starlette
• FastAPI • Sanic
• Quart • Django
•
• MySQL
🗃 NoSQL СУБД
• Redis • MongoDB
• SQLAlchemy • Alembic
🛖 Робоче середовище
• venv • Docker
📅 Планувальники і брокери завдань
• APSheduler • RabbitMQ
• Apache Kafka • Celery
• Nats
• unittest • pytest
• mock • coverage
🗜 DevOps і CI/CD
• GitHub Actions • GitLab
• Ansible
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
• запускати кастомні конфігурації ботів-шаблонів під свої потреби
• копіювати функціонал основного бота і використовувати його на різних токенах
• розділяти інтерфейс основного бота на декілька більш менших
• для нормального мультибота необхідний вебхук (бонус внизу посту - як запустити найпростіший вебхук)
• окрім
SimpleRequestHandler для основного бота, нам потрібен буде TokenBasedRequestHandler, щоб реєструвати інших ботів-посіпак, він буде брати їх токени для створення вебхук посилань, тому обовʼязково треба, щоб в path у методі register була константа {bot_token} (класи брати із aiogram.webhook.aiohttp_server)🔅 MRE найпростішого мультибота: у нього міньйони додаються в рантаймі і підключаються до одного й того ж самого диспетчера (тобто виконують однакові дії)
https://github.com/aiogram/aiogram/blob/dev-3.x/examples/multibot.py
https://pastebin.com/GSbGe34K
🛠 Називається цей інструмент - Ngrok
1️⃣ Завантажуємо його (на будь-яку ОС чи навіть docker)
2️⃣ Беремо порт на якому буде працювати наш aiohttp app, самого бота поки що не запускаємо. Далі заходимо в консоль і пишемо «
ngrok http {your_port}» (для Windows там є окрема програма навіть). Далі ngrok видасть нам декілька посилань, беремо те, яке починається з https бо телеграм не буде слати на http3️⃣ Змінюємо посилання (BASE_URL) у нашій програмі на те, яке взяли у ngrok. Запускаємо бота, готово! Тепер бот буде працювати на вебхуці
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
«Доброго дня! Підкажіть, чому може виникати
NazvaPomylky: opys pomylky?»або взагалі ось так..
«Доброго дня! Допоможіть будь ласка, хто шарить у ...»
...то будь готовий, що шанси отримати допомогу будуть в рази менше.
Спочатку розглянемо другий кейс, коли ти взагалі не переходиш до проблеми одразу. Це мета-питання, яких потрібно уникати в подібних чатах!
Перший кейс, ти все таки надіслав текст помилки. Але ніхто не збирається витрачати свій час щоб відгадувати, що саме сталося. Назви й опису недостатньо, щоб зрозуміти твою проблему!
Те саме стосується й випадків, коли ти прислав тільки скріншот коду й просто питаєш "Чому це не працює?"
📋 Ось список порад, як корректно задати питання й отримати фідбек якомога швидше.
» Перед тим як написати у чат, спробуй розібратися з помилкою самостійно. Можливо, варто почитати документацію, або й зовсім підучити Python.
» Не задавай мета-питань.
» Якщо тобі погодилися допомогти у чаті, не потрібно одразу писати людині у ПП. (Більше про це »)
» Показуй повну помилку, від
Traceback (most recent call last): до NazvaPomylky: opys pomylky.» Не лінися ділитися контекстом помилки. Наприклад, якщо вона виникла у якомусь обробнику
start_command, показуй увесь метод.» Ділися кодом й трейсбеком на пасті, а не скидай полотно у чаті.
» Іноді, коли проблема неочевидна, просто показати код може бути недостатньо. Буде потрібен Мінімально відтворюваний приклад.
Please open Telegram to view this post
VIEW IN TELEGRAM