Українська
Відкрити в Telegram
Aabout aiogram

about aiogram

@about_aiogram · канал · Технології · в індексі з 2026-07-02
190підписників
32постів в індексі
A
about aiogram
🗄 Що за бд редіс, Redis? #цікаве 👉 База даних Redis - (абр. remote dictionary server) швидке NoSQL сховище даних в форматі «ключ-значення», які зберігаються в оперативній пам'яті 📌 офіційної підтримки на Windows немає, але «якось» працювати можна 😀 І навіщо мені цим користуватись? Наприклад, якщо взяти 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) 📌 клас RedisStorage потрібен для з'єднання з редісом, він приймає екземпляр коннекту до бд або url з даними для підключення. Тут використано метод from_url, саме він приймає url і просуває іменовані аргументи якби ми передали їх у RedisStorage напряму 📌 параметр key_builder можна використати для класу DefaultKeyBuilder, який потрібен для налаштування побудови ключів у редісі, ми вказуємо with_destiny=True, щоб вони були більш унікальними один для одного 📌 аргументи state_ttl і data_ttl - задають час в секундах, після закінчення якого ключи (для state і data відповідно) будуть видалятися. За замовчуванням у ключів в редісі немає TTL (time to live) - тому вони просто не видаляються і накопичуються 3️⃣ Користуємось FSM і поглиблюємо знання 💭 В принципі на цьому можна було б закінчити, оскільки після вищезазначених інстру
7 · 1.1K ·
A
about aiogram
😀 Відправка в заданий час #цікаве 👉 Відправляти повідомлення через певний час - запланувати його, тобто зберігати до тих пір, поки воно не буде надіслано 😀 Що робити? Якщо немає на стороні телеграм - треба робити у себе. Можна спробувати такі інструменти: • asyncio • apscheduler • додаткові технології │ RabbitMQ │ Apache Kafka │ Redis ╰ Celery 💭 Якщо контент просто треба надіслати пізніше, то можна взяти функції asyncio, наприклад create_task, call_later чи call_at. Проте, якщо вам потрібно більше гнучкості, наприклад видаляти задачу до її виконання чи відслідковувати прогрес розсилки, зупиняти її і так далі, то треба дивитись на інші варіанти 😀 В цьому пості ми розглянемо гнучкий і найбільш простий варіант для бота ⏲ 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️⃣ Міні-інтерактив по документації • створення завдань • видалення завдань • призупинення і поновлення завдань • отримати всі завдання • змінити завдання • керування планувальником 💭 Можу запропонувати більш практичну статтю по APS від @Latand для aiogram 2.X - ось
6 · 827 ·
A
about aiogram
😀 Про фільтри #цікаве 👉 Фільтр в aiogram - це об'єкт який викликається, приймає дані апдейту і порівнює їх з вашими умовами, він повертає boolean або dict 📌 на хендлер можна повісити декілька фільтрів через кому, тоді апдейт дійде до нього тільки якщо всі вони повернуть True (логічне AND). Якщо ми хочемо логічне OR, тоді можна створити ще один декоратор чи реєстрацію. З цього випливає те, що один хендлер може ловити декілька типів апдейтів 📌 Основні види фільтрів • Текстові • Магічні • Кастомні • CDF • Спец. апдейти • Для відлову помилок ✏️ Текстові from aiogram.filters import Command Command("start") Command(commands=("foo", "bar")) 📌 фільтр Command створений для відлову команд, має для цього додаткові кейворди (prefix, ignore_mention), також з ним можна поєднувати CommandObject - цей об'єкт надає зручний спосіб вибирати будь-які дані команди, наприклад з "/get 65" взяти тільки 65. Для цього в хендлер передай кейворд command з анотацією із from aiogram.filters.command import CommandObject 🔮 Magic filers from aiogram import F 🪄 Магічні фільтри працюють завдяки додатковій бібліотеці magic-filter, яку підтримують розробники aiogram, проте окремо вона має трохи менше функціоналу. F це аліас для MagicFilter 💭 «магічні вирази» можна розуміти і представляти як lambda функцію. Від мене: для розуміння, F у ролі фільтра можна уявляти як сам об'єкт апдейту, тобто Message, CallbackQuery і т.д. Приклади (деякі методи універсальні): 🔻 Message F.text == "hello" F.photo F.text.in_({"1", "2"}) F.text.contains("bar") F.text.startswith("stop") F.text.endswith("foo") 🔻 CallbackQuery F.data == "my_data" F.data.in_({"close", "cancel"}) F.chat.type == "private" 🔻 Regex F.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}) • ще є такі варіанти 📌 є прикольний метод as('value'), він передає «відфільтрований» апдейт у арг
2 · 714 ·
A
about aiogram
🪝 Як підняти вебхук #цікаве 👉 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 🪄 Приклад
20 · 912 ·
A
about aiogram
Фотографія
натисніть — покажемо
@Tishka17 😳 GitHub #активіст Розробник. Помічник в чаті. Контрибьютор aiogram 😀Чим займався/ється: • веде свій особистий канал із дієвими порадами. Буде корисний будь-яким розробникам - @advice17 • творець aiogram-dialog. Це фреймворк з графічним інтерфейсом для тг ботів. Натхненний ідеями Android SDK та React.js (простіше кажучи він допомагає працювати з інлайн кнопками). Є бот для демонстрації роботи бібліотеки - @aiogram_dialog_demo_bot ~ 📚 Документація | 💭 Чат https://t.me/about_aiogram/17
8 · 736 ·
A
about aiogram
🔗 Deep Linking (Cheat sheet) #цікаве 👉 Telegram Deep Linking - (з англ. Глибокі посилання) це спеціальні види посилань, які певним чином обробляються клієнтами телеграм 🙂 Базові шаблони: • t.me/path?query • http://t.me/path?query • https://t.me/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> ➖➖➖➖➖➖➖➖➖➖ 👀 Цікавий канал посвячений Deep Linking 🌀 API > Deep Links 🍐 Книга Груші, повідомлення
10 · 760 ·
A
about aiogram
🔒 Middleware, Мідлвар #цікаве 👉 Middleware (в aiogram) - це спеціальний класс (можна реалізувати у вигляді функції), який має контроль над апдейтом до того, як на нього відреагує бот 😀 І навіщо мені цим користуватись? • Можна обробляти апдейт тільки якщо він відповідає нашим умовам • Є можливість «блокувати апдейт» наче його і не було • Загалом можна робити будь-які дії перед тим як бот відреагує на апдейт чи після цього 👀 Як цим користуватись? • Екземпляр мідлваря треба реєструвати у диспетчера чи роутера з певним типом апдейту який він буде обробляти 📌 Є «зовнішні» та «внутрішні» реєстрації Зовнішні - будуть завжди викликатись на вказаний тип апдейту dp.<event>.outer_middleware() Внутрішні - спрацюють якщо апдейт з потрібним типом потенційно потрапляє в якийсь хендлер (тобто пройде крізь всі фільтри) <router>.<event>.middleware() 📌 Реєстрація мідлваря, який буде обробляти будь-які апдейти dp.update.outer_middleware() 📌 Якщо комбінувати свій router і внутрішню реєстрацію, то мідлвар буде працювати тільки з хендлерами цього роутеру 🎒Пам'ятка новачка 1) Якщо мідлвар це класс, то в нього обов'язково повинен бути метод call - саме в ньому реалізується всі подальші дії після отримання апдейту 2) Точно знаємо який тип апдейтів приходить - анотуємо це. 3) За передачу апдейту по ланцюжку фільтрів і хендлерів відповідає виклик handler: await handler(event, data) 4) Виклик мідлваря приймає такі аргументи: > handler - хендлер (відомий тільки якщо це внутрішній мідлвар) > event - вхідна подія (підклас aiogram.types.base.TelegramObject) > data - контекстні дані (словник), через них передаються аргументи у фільтри й хендлери 🪄 Приклади мідлварей • Лічильник (з доки) - обробляє апдейти типу Message які проходять фільтри і потрапляють в якийсь хендлер цього роутера. Передає в хендлер аргумент «counter» • Антифлуд (від Груші) - реєструється на тип Message, перевіряє чи є ід чату в тимчасовому кеші, якщо є, то блокує апдейт, інакше записує його в нього • Ловл
2 · 1K ·
A
about aiogram
📦 Збірка технологій для розробки тг ботів на 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 📌 Закреслені - не рекомендовані для використання у великих проектах. Акцент збірки зроблений на безоплатному використанні інструментів, можливості їх асинхронної роботи, популярності
9 · 1K ·
A
about aiogram
🤖 Створення мультиботу #цікаве 👉 Мультибот - це бот, який може керувати іншими ботами. В aiogram 3.X такого можна написати з коробки (тобто для його створення вже є готові інструменти) 💭 Міньйон (мій сленг) - бот, що керується основним ботом 😀 І навіщо мені цим користуватись? • запускати кастомні конфігурації ботів-шаблонів під свої потреби • копіювати функціонал основного бота і використовувати його на різних токенах • розділяти інтерфейс основного бота на декілька більш менших 👀 Як цим користуватись? • для нормального мультибота необхідний вебхук (бонус внизу посту - як запустити найпростіший вебхук) • окрім 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 🎁 БОНУС - найпростіший вебхук в домашніх умовах 💭 Якщо в тебе вийшло запустити aiohttp додаток (web.Application) і ти хотів би потестувати бота, але при цьому немає SSL сертифікату або лінь його робити, то можна скористатись безкоштовним reverse proxy сервером який буде пересилати POST запити від телеграму до твого бота по захищеному тунелю (навіть якщо программа знаходиться за NAT-маршрутизатором чи брандмауером і в тебе сірий IP) 🛠 Називається цей інструмент - Ngrok 1️⃣ Завантажуємо його (на будь-яку ОС чи навіть docker) 2️⃣ Беремо порт на якому буде працювати наш aiohttp app, самого бота поки що не запускаємо. Далі заходимо в консоль і пишемо «ngrok http {your_port}» (для Windows там є окрема програма навіть). Далі ngr
36 · 1.4K ·
S
Shaon 🇺🇦
😀 Привіт усім, вибачайте що постів довго не було. Справа в тому, що я вже зовсім скоро буду студентом 😀 😀 У нас на каналі з'явився новий редактор - @nullmatawasoradesu, він також має свій канал зі схожою тематикою @aiogram_hent, тому заходьте і туди, дізнавайтесь нове. Він час від часу буде писати пости, коли я буду зайнятий
805 ·
イ
イリヤ (Illia, he/him)
😐 Якщо ти задаєш питання ось так.. #порада «Доброго дня! Підкажіть, чому може виникати NazvaPomylky: opys pomylky?» або взагалі ось так.. «Доброго дня! Допоможіть будь ласка, хто шарить у ...» ...то будь готовий, що шанси отримати допомогу будуть в рази менше. 🤔 А що не так? Спочатку розглянемо другий кейс, коли ти взагалі не переходиш до проблеми одразу. Це мета-питання, яких потрібно уникати в подібних чатах! Перший кейс, ти все таки надіслав текст помилки. Але ніхто не збирається витрачати свій час щоб відгадувати, що саме сталося. Назви й опису недостатньо, щоб зрозуміти твою проблему! Те саме стосується й випадків, коли ти прислав тільки скріншот коду й просто питаєш "Чому це не працює?" 📋 Ось список порад, як корректно задати питання й отримати фідбек якомога швидше. » Перед тим як написати у чат, спробуй розібратися з помилкою самостійно. Можливо, варто почитати документацію, або й зовсім підучити Python. » Не задавай мета-питань. » Якщо тобі погодилися допомогти у чаті, не потрібно одразу писати людині у ПП. (Більше про це ») » Показуй повну помилку, від Traceback (most recent call last): до NazvaPomylky: opys pomylky. » Не лінися ділитися контекстом помилки. Наприклад, якщо вона виникла у якомусь обробнику start_command, показуй увесь метод. » Ділися кодом й трейсбеком на пасті, а не скидай полотно у чаті. » Іноді, коли проблема неочевидна, просто показати код може бути недостатньо. Буде потрібен Мінімально відтворюваний приклад.
4 · 3.2K ·
S
Shaon 🇺🇦
Відео
8.6 МБ · натисніть — покажемо
2 · 936 ·
イ
イリヤ (Illia, he/him) 🇺🇦
💬 Chat Actions #цікаве Інколи може знадобитися виконати тривалу задачу, наприклад, надіслати файл великого розміру або дочекатися відповіді від API, щоб надіслати респонс користувачу. Щоб під час її виконання бот здавався більш "живим", а не просто наче підвисав у користувача — хорошою ідеєю буде надсилати "дію в чаті". 👀 Що ж це таке? Нам відомо, що коли юзер щось друкує, надсилає фото тощо — ми бачимо відповідний статус під його іменем. Це дає зрозуміти, що співрозмовник не просто проігнорував твоє повідомлення, а збирається відповісти. Так само і з ботом — щоб показати користувачу, що на його стороні щось відбувається, ми використовуєм аналогічний метод sendChatAction. Даний метод буде відображати вказаний розробником статус до п'яти секунд. 🤔 А якщо на виконання задачі мені потрібно більше, ніж п'ять секунд? Це також передбачено фреймворком. Він забезпечує утиліту ChatActionSender. Простий приклад: @router.message(Command("generate_photo")) async def generate_photo(message: Message, bot: Bot) -> Any: async with ChatActionSender.upload_photo(bot=bot, chat_id=message.chat.id): # Do something for a long time to get result result = await generate_photo(...) await message.answer_photo(photo=result) ⚒️ Є також спосіб забезпечити використовування chat action у всіх обробниках. Спочатку потрібно зареєструвати ChatActionMiddleware (що таке мідлварі?) на подію message: <router або dispatcher>.message.middleware(ChatActionMiddleware()) Тепер замість створення ChatActionSender у обробникуgenerate_photo ми можемо повісити мітку на обробник: @router.message(Command("generate_photo")) @flags.chat_action(ChatAction.UPLOAD_PHOTO) async def generate_photo(message: Message) -> Any: # Do something for a long time to get result result = await generate_photo(...) await message.answer_photo(photo=result) За потребою можна змінювати й конфігурацію ChatActionSender, а не тільки тип дії, що надсилаємо: @router.message(Command("generate_phot
4 · 874 ·
S
Shaon 🇺🇦
Фотографія
натисніть — покажемо
🤔 Новачки або aiogram roadmap #порада В чаті можна часто можна помітити подібні питання: • «Як створити бота? Хочу почати з цього», • «Чому треба писати равлики над функціями?» • «Що таке polling?» 💭 З цього можна зробити висновок: aiogram дуже приваблює новачків, але він для них надто складний. 👉 Якщо ти хочеш навчитися створювати ботів, то не зважай на популярні відео в ютубі, в яких показують як написати бота. Автори цих відео роблять скоріше міні-обзори, у них немає мети серйозно тебе вчити, вони навіть можуть дати тобі погані приклади (якщо це не плейлист чи курс). Через це багато хто не знає з чого почати написання ботів і цю сферу часто асоціюють із чимось примітивним, хоча це не завжди так. 🎁 Пропоную новачкам, які хочуть з чогось почати, слідувати aiogram roadmap, яку я створив, щоб було комфортно поглиблюватись у фреймворк і загалом розробку ботів. Вона також буде корисна тим, хто має досвід. Сама roadmap обов'язково буде оновлюватись, чекаю ваші думки с приводу неї
79 · 4.5K ·
S
Shaon 🇺🇦
🌍 i18n, l10n - мови у боті #цікаве 👉 i18n (internationalization) - процес, який надає можливість використовувати програмам кілька мов. l10n (localization) - більш конкретні дії, спрямовані на використання готових інструментів для роботи з мовами і адаптацію до мовних культур 📌 Обрано саме 18 і 10, бо це просто кількість літер між крайніми буквами (а повні слова всім лінь писати) 😀 І навіщо мені цим користуватись? • багатьом людям приємніше працювати зі своєю рідною мовою, це покращує користувацький досвід • знаючи те, які мови обирають користувачі можна більш точно показувати їм те, що треба саме нам (кому буде приємно бачити рекламу мовою, яку ми не знаємо?) 👀 Як цим користуватись? 1️⃣ Інструменти Почнемо з того, що нам треба працювати саме з ботом. На даний момент є такі інструменти: • вбудований aiogram.utils.i18n (на основі GNU gettext і Babel) • неофіційна aiogram_i18n від активного учасника спільноти Patrick (підтримує GNU gettext, але пріоритет на Project Fluent) Думаю, легше буде почати з aiogram_i18n, та і виглядає вона перспективніше. 📌 GNU gettext був створений у 1995 р, детальніше (багато цікавого загалом). Project Fluent - у 2019, це дослідницький проект Mozilla. Він був створений для вирішення багатьох проблем i18n/l10n, детальніше. 2️⃣ Як працює aiogram_i18n Простими словами її роботу можна описати так: • при отриманні апдейту бібліотека за допомогою менеджера отримує код мови користувача (en, uk) • спеціальний мідлвар користується цим менеджером і за допомогою Dependency Injection передає екземпляр I18nContext як i18n (назву можна змінити) у ланцюг до інших мідлварів, що стоять нижче, фільтрів і нарешті хендлерів • в екземплярі вже визначена мова (локаль) користувача, тому за допомогою I18nContext в хендлері можна діставати відповідні переклади чи змінювати локаль юзера за замовчуванням 3️⃣ Звідки і який менеджер бере локаль Якщо у нас локалі знаходяться в БД, то треба створити менеджер самостійно як підклас aiogram_i18n.managers.base.B
15 · 862 ·
S
Shaon 🇺🇦
👋 Всім привіт, в останні неділі писав бота. Це як мій пет проект, що буде корисний (на мій погляд) будь-якій активній людині в Telegram Якщо коротко - можна зберігати повідомлення будь-якого типу, кастомізувати, і за допомогою інлайн режиму надсилати їх у будь-які чати. Є пошук, приватність, мови 👉 Ось сам бот @ntosbot 📃 Кому цікаво, які технології юзав: • aiogram • aiogram-dialog • aiogram_i18n • PostgreSQL • psycopg3 • SQLAlchemy • Alembic • Redis • Docker 🔌 Хостинг - https://www.mvps.net/?aff=30539 :D. Поки перша версія, треба тестити, буду радий почути фідбек 💭 Чи було б цікаво почитати про деплой ботів (Docker, SSH keys)?
4 · 810 ·
S
Shaon 🇺🇦
📥 Деплой ботів та SSH ключі #цікаве 👉 Деплой - процес розгортання веб-сервісу (в нашому випадку бота) в робочому оточенні (хостинг чи власна інфраструктура) 1️⃣ Різні методи та інструменти На даний момент є дуже багато різних технологій для деплою і підтримки (CI/CD) програмного забезпечення. Виділяється з них Docker - дуже зручний інструмент для контейнеризації, він дозволяє один раз зібрати образ (image) і на його основі створювати контейнери - ізольовані (на рівні OC, а не hardware) середовища для роботи сервісів. Є параметри, щоб Docker сам запускав контейнери, якщо сервер перезавантажити, перевіряв їх на працездатність і не тільки. Звичайною практикою буде побачити базу даних в одному контейнері, а основний сервіс в іншому + ще якісь додаткові контейнери - кожен відповідатиме за свою задачу. Базові образи, наприклад Python, PostgreSQL є на DockerHub, тому якщо треба, докер сам їх завантажить для побудови image. Всі технології прив'язані до якоїсь OC, тому їх багато варіантів + різні версії + lite збірки - можна заплутатися. Але якщо треба - розберешся 2️⃣ Використання • Встанови докер та запусти його як сервіс • Напиши Dockerfile - в ньому будуть інструкції для побудови образу • Якщо в боті є додаткові сервіси (такі як бд, редіс і т.д) створи docker-compose.yaml щоб оркеструвати одразу декількома контейнерами (перед цим прочитай про мережі) • Дивись на приклади. Попрактикуйся з написанням образів та конфігів для компоузу, але головне розумій що робить та чи інша команда і коли що слід використовувати • Поцікався багатоетапними збірками (коли образ використовує збудований в цьому ж Dockerfile образ) • Дізнайся як відкривати порти. Це корисно, якщо треба взаємодіяти з сервісами не заходячи в сам контейнер. Наприклад за допомогою SSH тунелю можна локально в редакторі підключатись до БД в контейнері на сервері • Подивись що таке профілі, корисна штука за допомогою якої можна вибірково вказати, які сервіси компоузом не треба запускати, якщо ти цього явно н
2 · 857 ·
S
Shaon
✍️ Вебхук із самопідписаним сертифікатом + nginx, FastAPI #цікаве ✅ Це компактна cheatsheet для встановлення бота на вебхук із самопідписаним сертифікатом на свій сервер з nginx та FastAPI 📌 Що таке вебхук і які переваги він дає 📚 Трохи теорії 📝 Самопідписані сертифікати SSL/TLS створюються, видаються та обслуговуються вручну, без центру сертифікації! Це означає, що тобі не треба буде комусь платити за оформлення та обслуговування сертифікату! 👩‍💻 nginx - це швидкий веб-сервер, який може бути зворотнім проксі, балансувальником навантаження і не тільки 👉 FastAPI - це сучасний, високопродуктивний веб-фреймворк для створення API за допомогою Python 3.8+ на основі стандартних підказок типів Python • Самопідписаний сертифікат треба для безоплатного вебхуку • nginx буде отримувати POST запити на вебхук і пересилати їх на обробку до бота (схоже на reverse proxy server, але в цьому пості все на одному сервері) • FastAPI для обробки апдейтів бота вже за допомогою Python ✨ Генерація самопідписаного сертифікату Для створення сертифікату будемо користуватись утилітою OpenSSL openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./cert.key -outform PEM -out ./cert.pem • req - підкоманда для сертифікатів • x509 - один із стандартів для сертифікатів • days 365 - час життя сертифікату • newkey rsa:2048 - створити ключ алгоритмом RSA довжиною 2048 біт • outform PEM - необхідний формат генерації PEM • keyout і out - куди покласти ключ і сертифікат 📌 при генерації обов'язково введи IP адресу серверу або домен в поле Common Name 👩‍💻 Робота з nginx Для початку його треба встановити та запустити як сервіс. Приклад для Debian GNU/Linux sudo apt-get update sudo apt-get install nginx sudo nginx -v sudo systemctl enable nginx sudo systemctl status nginx ✨ Налаштуємо конфігурацію nginx • робота із сертифікатом • блокування запитів не від Telegram • пересилання запитів до FastAPI 🫱 Вставляємо в /etc/nginx/nginx.conf (в блок http) server { listen 443 ssl; # For HTTPS
17 · 1K ·
S
Shaon
⭐️ Telegram stars #цікаве 👉 Телеграм зірки - валюта в телеграм, яку можна купувати за реальні гроші та витрачати в месенжері на різні речі 🏆 Переваги у використанні зірок • Зручність - на відмінну від інших способів оплати, використання зірок набагато зручніше як для користувача так і для сервісу. Користувач може легко поповнити свій баланс зірок через банківську карту (якщо телеграм завантажено з офіційного сайту) чи у Play Market або App Store. Проведення оплати можна зробити в декілька дотиків • Легка можливість повернення зірок назад на баланс клієнта за допомогою ідентифікатору транзакції • За допомогою зірок можна оплачувати Telegram Ads та переводити їх в реальні гроші 😔 Неприємні моменти використання зірок • Всі цифрові товари, які можна придбати в твоєму сервісі повинні оплачуватись виключно за допомогою зірок (це не стосується фізичних товарів). Тобто, якщо ти продаєш цифрові товари іншими способами, то телеграм може частково (на окремих платформах) або повністю заблокувати доступ до твого сервісу. Теоретично, процес перевірки автоматизувати неможливо, тому це стосується тільки дуже великих проектів у яких є відповідні товари. Це означає, що маленькі сервіси можуть проводити оплату будь-яким способом, але я не рекомендую подібні способи • Комісія при оплаті зірками від 30% і більше, що руйнує деякі бізнес моделі • Твій сервіс зобов'язаний брати на себе відповідальність за обслуговування клієнтів і повністю сам вирішувати спірні моменти (зокрема мати команду /paysupport) • На даний момент, ціна однієї зірки становить 0.013 USD • Переведення зірок у реальні гроші буде доступно через 21 день після їх отримання сервісом. Це буде пов'язано з криптовалютою і такий механізм працюватиме на платформі Fragment. Поки що, реальних переведень зафіксовано не було, тому деталі невідомі • Зірки мають час життя в 3 роки з дати їх отримання і якщо їх не витратити, то вони автоматично спишуться з балансу 💭 Поки що, придбати зірки можна лише під час спроби оплатити чек.
40 · 3.1K ·
S
Shaon
Відповідь👋 Всім привіт, в останні неділі писав бота. Це як мій пет проект, що буде корисний (на мій погляд) будь-якій активній людині в Telegram Якщо коротко - можна зберігати повідомлення будь-якого типу, кастомізувати, і за допомогою інлайн режиму надсилати їх у будь-які чати. Є пошук, приватність, мови
📌 Тепер у каналу є навігатор по контенту - @aiotipbot Щоб використати бота, просто напиши його юзернейм у текстове поле 👉 Він був створений за допомогою @ntosbot, бо тепер він мультибот! Будь-хто може спробувати зробити у ньому своїх ботів, що працюватимуть через Inline Mode. Можливо, це найпростіший конструктор для створення подібних ботів
560 ·
S
Shaon
📡 Офіційний безкоштовний вебхук: aiohttp, nginx, домен, Let's Encrypt #цікаве ☑️ Це cheatsheet для встановлення бота на вебхук із сертифікатом від Let's Encrypt на свій сервер + його автооновлення + безкоштовний домен 📌 Перед цим варто прочитати • Що таке вебхук і які переваги він дає • Пост про самопідписаний сертифікат 📚 Трохи теорії 🔒 Let's Encrypt - це безкоштовний, автоматизований і відкритий центр сертифікації, створений некомерційною організацією Internet Security Research Group (ISRG) 🤖 Certbot - це безкоштовна утиліта з відкритим вихідним кодом для автоматичного використання сертифікатів Let's Encrypt 🪩 FreeDNS - середовище, де інші програмісти можуть безкоштовно обмінюватися доменними іменами один з одним. З'явився у 2001 році, тому що його засновник, Джошуа Андерсон, хотів розважитися зі своїм хобі, пов'язаним з доменами 💠 aiohttp - асинхронний HTTP клієнт/сервер для asyncio та Python 📌 Переваги офіційного сертифіката над самопідписаним: • твій сервер визнається всіма (нап. при переході на його адресу в браузері не буде ніяких попереджень про безпеку) • зручне автооновлення • при встановленні вебхуку не треба надсилати файл ⬇️ Загалом: • За допомогою FreeDNS отримуємо безкоштовний домен (для Let's Encrypt необхідно мати домен) • Сертифікат для вебхуку беремо в Let's Encrypt • certbot буде автоматично оновлювати наш сертифікат • nginx буде отримувати POST запити на вебхук і пересилати їх на обробку до бота • aiohttp буде приймати апдейти бота вже за допомогою Python 📌 Для різноманіття цього разу візьмемо aiohttp замість FastAPI, бо він більш легший. Але якщо тобі треба будувати API, то залишити FastAPI буде гарним рішенням ✨ Отримання безкоштовного домену 💭 Такий безкоштовний домен підійде або для тестів або для не дуже великих проектів. Тому, якщо в тебе серйозний проект, краще придбати домен • Зареєструйся на сайті • Перейди в розділ субдоменів і натисни «Add a subdomain» • Переконайся, що в полі «Type» написано А • У полі «Domain» обери б
15 · 921 ·
S
Shaon
🌱 Життєвий цикл апдейту в aiogram 💭 Зазвичай люди, що починають писати ботів намагаються ловити потрібне повідомлення першим робочим способом і не задумуються над тим, які у них є можливості для організації обробки цих повідомлень • Що таке апдейт • Які є способи їх отримання • Поняття реєстрації та обробника • Ланцюг обробників • Роутер і диспетчер - опис, порівняння • Механізм Dependency Injection • Детальний розбір мідлваря • Фільтрація апдейтів • Хендлер ⏫ Всі ці пункти я спробував розписати у максимально доступному форматі з поясненням різних моментів та описом елементарних помилок 🇺🇦 Стаття українською https://botfather.dev/news/zhittyevij-cikl-apdejtu-v-aiogram 🌍 Стаття англійською https://botfather.dev/news/lifecycle-of-an-update-in-aiogram 💫 Мені здається, що представлення цих понять в одній картині спростить написання ботів. Особливо, бачу в цьому сенс для новачків. Крім того, розуміння окремих моментів може бути корисним не тільки для ботів. Приємного читання! ⚡️ Дякую @Latand за його проект та можливість писати там статті
6 · 640 ·
S
Shaon
🦾 Local Bot API Server Вихідний код Bot API Server (BAS) є відкритим - telegram-bot-api. Його можна запустити локально та надсилати запити на свій власний сервер замість https://api.telegram.org 🔥 Переваги бота, що працює з локальним BAS • Завантаження файлів будь-якого розміру • Надсилання файлів розміром до 2 ГБ • Можна надсилати файли, використовуючи їхній локальний шлях і схему файлового URI • Дозволяється використовувати HTTP URL для вебхуку • Можна брати будь-які локальні IP та порти для вебхуку • Ліміт max_webhook_connections розширюється до 100_000 (замість 100) • Абсолютний локальний шлях отримується як значення поля file_path без необхідності завантажувати файл після запиту getFile 👉 Локальний BAS може покращити продуктивність ботів за рахунок більш низького пінгу та розширених лімітів ✏️ Загальні концепти 🦾 BAS це - додатковий рівнень абстракції для взаємодії з Telegram API у вигляді акаунта бота. Він є зручною реалізацією RestAPI для розробників і працює як фронт-енд для Telegram API. Зробити свій такий набагато складніше, BAS бере на себе інтерфейси Telegram API та роботу з MTProto. Всі боти взаємодіють з BAS і можуть працювати з ним на одному сервері ☑️ Global Bot API Server - звичайні боти взаємодіють з серверами Telegram через екземпляр telegram-bot-api, що обслуговується офіційно Сам же користувач ніколи не взаємодіє з BAS напряму (тобто користувацький додаток Telegram ніколи не підключається безпосередньо до сервера, на якому запущений BAS). Всі комунікації проходять через сервери Telegram, які внутрішньо пересилають їх двом залученим клієнтам MTProto: • додатку Telegram, що використовує користувач • екземпляру BAS, що працює під капотом ☑️ telegram-bot-api точно такий самий сервер, з яким спілкуються боти на api.telegram.org. Тут немає ніяких додаткових або прибраних шарів. Боти працюватимуть набагато швидше, якщо переключаться на локальний BAS, розташований у відповідному регіоні. Покращити продуктивність також може робота з локальними
5 · 542 ·
S
Shaon
👩‍💻 CI/CD з Github Actions 💭 Зараз зробимо CI/CD автоматизацію, яка при кожному оновленні коду в GitHub репозиторії буде переносити зміни на сервер 🛠 Інструменти 🔀 GitHub Actions - CI/CD платформа, що дозволяє автоматизувати твій build-test-deploy pipeline 👩‍💻 Docker - відкрита платформа для розробки, доставки та запуску додатків (розбирали в пості) 📁 Github Container Registry - зберігає image контейнерів в межах організації чи особистого акаунту, а також дозволяє пов'язати image із репозиторієм Сама концепція CI/CD набагато ширша, але в рамках даного посту все спрощено: CI - це build контейнера, CD - його release і deploy • GitHub Actions - в ролі вебхуку на push подію для репозиторію, який буде виконувати наші інструкції • Docker - для побудови образу (але можна і без нього, наприклад запускати бота з systemd) • Github Container Registry - для збереження образів (для приватної видимості, в DockerHub на це сильніші обмеження) ✏️ Пишемо конфігурацію Щоб скористатись GitHub Actions пишуть workflow файли, а вони налаштовані для запуску однієї чи декількох задач • YAML формат файлу • Мають знаходитись в .github/workflows/ • Основна структура: події, змінні середовища та завдання • І workflows і actions можна публікувати та перевикористовувати Давай розберемо готовий приклад name: Deploy to server on: push: branches: [ "main" ] env: REGISTRY: ghcr.io IMAGE_NAME: <your-nick>/<image-name>:latest permissions: contents: read packages: write jobs: publish: name: Publish image runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Login run: | echo ${{ secrets.GITHUB_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin - name: Build and Push run: | docker build . -t ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} deploy: needs: publish
9 · 626 ·
S
Shaon
🔍 Inline Mode #цікаве 👉 Інлайн режим - це інтегрована пошукова система для ботів, яка дозволяє зручно скористатися ботом з будь-якого чату знаючи тільки його юзернейм 🤨 І навіщо мені цим користуватись? Інлайн режим дозволяє робити багато речей, що будуть корисні в тій чи іншій ситуації, наприклад можна: • Формувати повідомлення з кнопками • Зробити каталог предметів • Ділитися чимось від імені юзера • Реалізувати пошуковий механізм 👀 Як цим користуватись? 📌 Для початку необхідно увімкнути цей режим для бота. Тому помісти апдейт типу inline_query в дозволені, а далі в @BotFather > /mybots > твій бот > Bot Settings > Inline Mode і натисни Turn On ⬇️ Розберемо всі нові типи і методи, які дає нам інлайн режим • InlineQuery - апдейт, що створюється при використанні пошуку • answerInlineQuery - метод, яким бот показує результати пошуку (ним відповідають на InlineQuery) • InlineQueryResultsButton - об'єкт-кнопка, що знаходиться над результатами • InlineQueryResult - загальний тип конкретного об'єкту в результаті • InputMessageContent - загальний тип конкретного об'єкту для перевантаження надсилання • ChosenInlineResult - апдейт, який доступний з увімкненим inline feedback в @BotFather для аналітики 💭 Це класичний inline mode. Також є додаткові штуки для їх використання в контексті WebApp, але зараз нам вони непотрібні 📌 Цікаві факти • InlineQuery немає даних про тип чату • answerInlineQuery може повертати результати з різними типами об'єктів (одночасно фото, аудіо..) • InlineQueryResult для деяких підтипів має Cached форми, тобто результатом може бути фото, що вже збережене на серверах телеграм • Якщо до повідомлення, яке надісло в інлайн режимі прикріплені кнопки, то при їх використанні бот отримає CallbackQuery без об'єкту Message 🔍 Концепція пошуку У нас є бот з інлайн режимом. У будь-якому чаті (де не заборонене медіа), як тільки ми вводимо в поле тексту його нікнейм, наприклад @bot hello то бот отримує апдейт InlineQuery з даними, в цьому випадку в запиті б
7 · 616 ·

Відкрита публічна стрічка з пошукового індексу ChatCrawler — «Google по публічному Telegram»; оновлюється в міру обходу майданчика. Час — UTC.

Лише публічний контент, офіційний API Telegram. Про проєкт · Питання · Межі індексу · Прибрати сторінку з видачі · Каталог · Пошук · Як ми рахуємо