[{"data":1,"prerenderedAt":861},["ShallowReactive",2],{"blog-ru-telegram-bot-python-2024":3},{"id":4,"title":5,"body":6,"date":847,"description":848,"extension":849,"meta":850,"navigation":169,"path":851,"readTime":852,"seo":853,"slug":854,"stem":855,"tags":856,"__hash__":860},"blogRu\u002Fru\u002Fblog\u002Ftelegram-bot-python-2024.md","Как написать Telegram-бота на Python в 2024 году — полное руководство",{"type":7,"value":8,"toc":834},"minimark",[9,14,23,30,35,68,72,75,89,93,131,134,142,146,223,227,324,328,396,400,492,496,568,572,616,753,757,810,814,821,830],[10,11,13],"h1",{"id":12},"как-написать-telegram-бота-на-python-в-2024-году","Как написать Telegram-бота на Python в 2024 году",[15,16,17,18,22],"p",{},"Telegram-боты — один из самых быстрых способов автоматизировать бизнес-процессы или создать полноценный продукт. В этой статье я расскажу, как с нуля построить ",[19,20,21],"strong",{},"production-ready бота"," с базой данных, правильной архитектурой и деплоем.",[15,24,25],{},[26,27],"img",{"alt":28,"src":29},"Архитектура Telegram-бота на Aiogram 3","\u002Fimages\u002Fblog\u002Fbot-architecture.svg",[31,32,34],"h2",{"id":33},"что-мы-построим","Что мы построим",[36,37,38,46,52,59,65],"ul",{},[39,40,41,42,45],"li",{},"Бот на ",[19,43,44],{},"Aiogram 3"," (async, современный API)",[39,47,48,51],{},[19,49,50],{},"PostgreSQL"," как хранилище данных",[39,53,54,55],{},"Конфигурация через ",[56,57,58],"code",{},".env",[39,60,61,64],{},[19,62,63],{},"Docker"," для деплоя",[39,66,67],{},"FSM (конечный автомат состояний) для многошаговых сценариев",[31,69,71],{"id":70},"почему-aiogram-3-а-не-python-telegram-bot","Почему Aiogram 3, а не python-telegram-bot",[15,73,74],{},"Aiogram 3 — де-факто стандарт для серьёзных ботов на Python:",[36,76,77,80,83,86],{},[39,78,79],{},"Полностью асинхронный (asyncio)",[39,81,82],{},"Роутеры и мидлвары как в FastAPI",[39,84,85],{},"Удобный FSM для диалогов",[39,87,88],{},"Активная поддержка и хорошая документация",[31,90,92],{"id":91},"установка-и-структура-проекта","Установка и структура проекта",[94,95,100],"pre",{"className":96,"code":97,"language":98,"meta":99,"style":99},"language-bash shiki shiki-themes github-light github-dark","pip install aiogram==3.* sqlalchemy asyncpg python-dotenv\n","bash","",[56,101,102],{"__ignoreMap":99},[103,104,107,111,115,118,122,125,128],"span",{"class":105,"line":106},"line",1,[103,108,110],{"class":109},"sScJk","pip",[103,112,114],{"class":113},"sZZnC"," install",[103,116,117],{"class":113}," aiogram==3.",[103,119,121],{"class":120},"sj4cs","*",[103,123,124],{"class":113}," sqlalchemy",[103,126,127],{"class":113}," asyncpg",[103,129,130],{"class":113}," python-dotenv\n",[15,132,133],{},"Структура проекта:",[94,135,140],{"className":136,"code":138,"language":139},[137],"language-text","bot\u002F\n├── handlers\u002F\n│   ├── __init__.py\n│   ├── common.py      # \u002Fstart, \u002Fhelp\n│   └── user.py        # пользовательские сценарии\n├── middlewares\u002F\n│   └── database.py    # инжект сессии в хэндлеры\n├── models\u002F\n│   └── user.py        # SQLAlchemy модели\n├── keyboards\u002F\n│   └── reply.py\n├── config.py\n└── main.py\n","text",[56,141,138],{"__ignoreMap":99},[31,143,145],{"id":144},"конфигурация","Конфигурация",[94,147,151],{"className":148,"code":149,"language":150,"meta":99,"style":99},"language-python shiki shiki-themes github-light github-dark","# config.py\nfrom pydantic_settings import BaseSettings\n\nclass Settings(BaseSettings):\n    BOT_TOKEN: str\n    DATABASE_URL: str\n    ADMIN_ID: int\n\n    class Config:\n        env_file = \".env\"\n\nsettings = Settings()\n","python",[56,152,153,158,164,171,177,183,189,195,200,206,212,217],{"__ignoreMap":99},[103,154,155],{"class":105,"line":106},[103,156,157],{},"# config.py\n",[103,159,161],{"class":105,"line":160},2,[103,162,163],{},"from pydantic_settings import BaseSettings\n",[103,165,167],{"class":105,"line":166},3,[103,168,170],{"emptyLinePlaceholder":169},true,"\n",[103,172,174],{"class":105,"line":173},4,[103,175,176],{},"class Settings(BaseSettings):\n",[103,178,180],{"class":105,"line":179},5,[103,181,182],{},"    BOT_TOKEN: str\n",[103,184,186],{"class":105,"line":185},6,[103,187,188],{},"    DATABASE_URL: str\n",[103,190,192],{"class":105,"line":191},7,[103,193,194],{},"    ADMIN_ID: int\n",[103,196,198],{"class":105,"line":197},8,[103,199,170],{"emptyLinePlaceholder":169},[103,201,203],{"class":105,"line":202},9,[103,204,205],{},"    class Config:\n",[103,207,209],{"class":105,"line":208},10,[103,210,211],{},"        env_file = \".env\"\n",[103,213,215],{"class":105,"line":214},11,[103,216,170],{"emptyLinePlaceholder":169},[103,218,220],{"class":105,"line":219},12,[103,221,222],{},"settings = Settings()\n",[31,224,226],{"id":225},"основной-файл","Основной файл",[94,228,230],{"className":148,"code":229,"language":150,"meta":99,"style":99},"# main.py\nimport asyncio\nfrom aiogram import Bot, Dispatcher\nfrom aiogram.fsm.storage.memory import MemoryStorage\nfrom handlers import common, user\nfrom config import settings\n\nasync def main():\n    bot = Bot(token=settings.BOT_TOKEN)\n    dp = Dispatcher(storage=MemoryStorage())\n\n    dp.include_router(common.router)\n    dp.include_router(user.router)\n\n    await dp.start_polling(bot)\n\nif __name__ == \"__main__\":\n    asyncio.run(main())\n",[56,231,232,237,242,247,252,257,262,266,271,276,281,285,290,296,301,307,312,318],{"__ignoreMap":99},[103,233,234],{"class":105,"line":106},[103,235,236],{},"# main.py\n",[103,238,239],{"class":105,"line":160},[103,240,241],{},"import asyncio\n",[103,243,244],{"class":105,"line":166},[103,245,246],{},"from aiogram import Bot, Dispatcher\n",[103,248,249],{"class":105,"line":173},[103,250,251],{},"from aiogram.fsm.storage.memory import MemoryStorage\n",[103,253,254],{"class":105,"line":179},[103,255,256],{},"from handlers import common, user\n",[103,258,259],{"class":105,"line":185},[103,260,261],{},"from config import settings\n",[103,263,264],{"class":105,"line":191},[103,265,170],{"emptyLinePlaceholder":169},[103,267,268],{"class":105,"line":197},[103,269,270],{},"async def main():\n",[103,272,273],{"class":105,"line":202},[103,274,275],{},"    bot = Bot(token=settings.BOT_TOKEN)\n",[103,277,278],{"class":105,"line":208},[103,279,280],{},"    dp = Dispatcher(storage=MemoryStorage())\n",[103,282,283],{"class":105,"line":214},[103,284,170],{"emptyLinePlaceholder":169},[103,286,287],{"class":105,"line":219},[103,288,289],{},"    dp.include_router(common.router)\n",[103,291,293],{"class":105,"line":292},13,[103,294,295],{},"    dp.include_router(user.router)\n",[103,297,299],{"class":105,"line":298},14,[103,300,170],{"emptyLinePlaceholder":169},[103,302,304],{"class":105,"line":303},15,[103,305,306],{},"    await dp.start_polling(bot)\n",[103,308,310],{"class":105,"line":309},16,[103,311,170],{"emptyLinePlaceholder":169},[103,313,315],{"class":105,"line":314},17,[103,316,317],{},"if __name__ == \"__main__\":\n",[103,319,321],{"class":105,"line":320},18,[103,322,323],{},"    asyncio.run(main())\n",[31,325,327],{"id":326},"хэндлер-start","Хэндлер \u002Fstart",[94,329,331],{"className":148,"code":330,"language":150,"meta":99,"style":99},"# handlers\u002Fcommon.py\nfrom aiogram import Router\nfrom aiogram.filters import CommandStart\nfrom aiogram.types import Message\n\nrouter = Router()\n\n@router.message(CommandStart())\nasync def cmd_start(message: Message):\n    await message.answer(\n        f\"Привет, {message.from_user.first_name}! 👋\\n\\n\"\n        \"Я помогу тебе автоматизировать твои задачи.\"\n    )\n",[56,332,333,338,343,348,353,357,362,366,371,376,381,386,391],{"__ignoreMap":99},[103,334,335],{"class":105,"line":106},[103,336,337],{},"# handlers\u002Fcommon.py\n",[103,339,340],{"class":105,"line":160},[103,341,342],{},"from aiogram import Router\n",[103,344,345],{"class":105,"line":166},[103,346,347],{},"from aiogram.filters import CommandStart\n",[103,349,350],{"class":105,"line":173},[103,351,352],{},"from aiogram.types import Message\n",[103,354,355],{"class":105,"line":179},[103,356,170],{"emptyLinePlaceholder":169},[103,358,359],{"class":105,"line":185},[103,360,361],{},"router = Router()\n",[103,363,364],{"class":105,"line":191},[103,365,170],{"emptyLinePlaceholder":169},[103,367,368],{"class":105,"line":197},[103,369,370],{},"@router.message(CommandStart())\n",[103,372,373],{"class":105,"line":202},[103,374,375],{},"async def cmd_start(message: Message):\n",[103,377,378],{"class":105,"line":208},[103,379,380],{},"    await message.answer(\n",[103,382,383],{"class":105,"line":214},[103,384,385],{},"        f\"Привет, {message.from_user.first_name}! 👋\\n\\n\"\n",[103,387,388],{"class":105,"line":219},[103,389,390],{},"        \"Я помогу тебе автоматизировать твои задачи.\"\n",[103,392,393],{"class":105,"line":292},[103,394,395],{},"    )\n",[31,397,399],{"id":398},"fsm-многошаговые-диалоги","FSM — многошаговые диалоги",[94,401,403],{"className":148,"code":402,"language":150,"meta":99,"style":99},"from aiogram.fsm.context import FSMContext\nfrom aiogram.fsm.state import State, StatesGroup\n\nclass OrderForm(StatesGroup):\n    waiting_name    = State()\n    waiting_phone   = State()\n    waiting_comment = State()\n\n@router.message(Command(\"order\"))\nasync def start_order(message: Message, state: FSMContext):\n    await state.set_state(OrderForm.waiting_name)\n    await message.answer(\"Как вас зовут?\")\n\n@router.message(OrderForm.waiting_name)\nasync def got_name(message: Message, state: FSMContext):\n    await state.update_data(name=message.text)\n    await state.set_state(OrderForm.waiting_phone)\n    await message.answer(\"Укажите номер телефона:\")\n",[56,404,405,410,415,419,424,429,434,439,443,448,453,458,463,467,472,477,482,487],{"__ignoreMap":99},[103,406,407],{"class":105,"line":106},[103,408,409],{},"from aiogram.fsm.context import FSMContext\n",[103,411,412],{"class":105,"line":160},[103,413,414],{},"from aiogram.fsm.state import State, StatesGroup\n",[103,416,417],{"class":105,"line":166},[103,418,170],{"emptyLinePlaceholder":169},[103,420,421],{"class":105,"line":173},[103,422,423],{},"class OrderForm(StatesGroup):\n",[103,425,426],{"class":105,"line":179},[103,427,428],{},"    waiting_name    = State()\n",[103,430,431],{"class":105,"line":185},[103,432,433],{},"    waiting_phone   = State()\n",[103,435,436],{"class":105,"line":191},[103,437,438],{},"    waiting_comment = State()\n",[103,440,441],{"class":105,"line":197},[103,442,170],{"emptyLinePlaceholder":169},[103,444,445],{"class":105,"line":202},[103,446,447],{},"@router.message(Command(\"order\"))\n",[103,449,450],{"class":105,"line":208},[103,451,452],{},"async def start_order(message: Message, state: FSMContext):\n",[103,454,455],{"class":105,"line":214},[103,456,457],{},"    await state.set_state(OrderForm.waiting_name)\n",[103,459,460],{"class":105,"line":219},[103,461,462],{},"    await message.answer(\"Как вас зовут?\")\n",[103,464,465],{"class":105,"line":292},[103,466,170],{"emptyLinePlaceholder":169},[103,468,469],{"class":105,"line":298},[103,470,471],{},"@router.message(OrderForm.waiting_name)\n",[103,473,474],{"class":105,"line":303},[103,475,476],{},"async def got_name(message: Message, state: FSMContext):\n",[103,478,479],{"class":105,"line":309},[103,480,481],{},"    await state.update_data(name=message.text)\n",[103,483,484],{"class":105,"line":314},[103,485,486],{},"    await state.set_state(OrderForm.waiting_phone)\n",[103,488,489],{"class":105,"line":320},[103,490,491],{},"    await message.answer(\"Укажите номер телефона:\")\n",[31,493,495],{"id":494},"работа-с-базой-данных","Работа с базой данных",[94,497,499],{"className":148,"code":498,"language":150,"meta":99,"style":99},"# models\u002Fuser.py\nfrom sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column\nfrom sqlalchemy import BigInteger, String, DateTime, func\n\nclass Base(DeclarativeBase):\n    pass\n\nclass User(Base):\n    __tablename__ = \"users\"\n\n    id:         Mapped[int]    = mapped_column(BigInteger, primary_key=True)\n    username:   Mapped[str | None] = mapped_column(String(64))\n    first_name: Mapped[str]    = mapped_column(String(128))\n    created_at: Mapped[DateTime] = mapped_column(server_default=func.now())\n",[56,500,501,506,511,516,520,525,530,534,539,544,548,553,558,563],{"__ignoreMap":99},[103,502,503],{"class":105,"line":106},[103,504,505],{},"# models\u002Fuser.py\n",[103,507,508],{"class":105,"line":160},[103,509,510],{},"from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column\n",[103,512,513],{"class":105,"line":166},[103,514,515],{},"from sqlalchemy import BigInteger, String, DateTime, func\n",[103,517,518],{"class":105,"line":173},[103,519,170],{"emptyLinePlaceholder":169},[103,521,522],{"class":105,"line":179},[103,523,524],{},"class Base(DeclarativeBase):\n",[103,526,527],{"class":105,"line":185},[103,528,529],{},"    pass\n",[103,531,532],{"class":105,"line":191},[103,533,170],{"emptyLinePlaceholder":169},[103,535,536],{"class":105,"line":197},[103,537,538],{},"class User(Base):\n",[103,540,541],{"class":105,"line":202},[103,542,543],{},"    __tablename__ = \"users\"\n",[103,545,546],{"class":105,"line":208},[103,547,170],{"emptyLinePlaceholder":169},[103,549,550],{"class":105,"line":214},[103,551,552],{},"    id:         Mapped[int]    = mapped_column(BigInteger, primary_key=True)\n",[103,554,555],{"class":105,"line":219},[103,556,557],{},"    username:   Mapped[str | None] = mapped_column(String(64))\n",[103,559,560],{"class":105,"line":292},[103,561,562],{},"    first_name: Mapped[str]    = mapped_column(String(128))\n",[103,564,565],{"class":105,"line":298},[103,566,567],{},"    created_at: Mapped[DateTime] = mapped_column(server_default=func.now())\n",[31,569,571],{"id":570},"dockerfile","Dockerfile",[94,573,576],{"className":574,"code":575,"language":570,"meta":99,"style":99},"language-dockerfile shiki shiki-themes github-light github-dark","FROM python:3.12-slim\n\nWORKDIR \u002Fapp\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\n\nCOPY . .\nCMD [\"python\", \"main.py\"]\n",[56,577,578,583,587,592,597,602,606,611],{"__ignoreMap":99},[103,579,580],{"class":105,"line":106},[103,581,582],{},"FROM python:3.12-slim\n",[103,584,585],{"class":105,"line":160},[103,586,170],{"emptyLinePlaceholder":169},[103,588,589],{"class":105,"line":166},[103,590,591],{},"WORKDIR \u002Fapp\n",[103,593,594],{"class":105,"line":173},[103,595,596],{},"COPY requirements.txt .\n",[103,598,599],{"class":105,"line":179},[103,600,601],{},"RUN pip install --no-cache-dir -r requirements.txt\n",[103,603,604],{"class":105,"line":185},[103,605,170],{"emptyLinePlaceholder":169},[103,607,608],{"class":105,"line":191},[103,609,610],{},"COPY . .\n",[103,612,613],{"class":105,"line":197},[103,614,615],{},"CMD [\"python\", \"main.py\"]\n",[94,617,621],{"className":618,"code":619,"language":620,"meta":99,"style":99},"language-yaml shiki shiki-themes github-light github-dark","# docker-compose.yml\nservices:\n  bot:\n    build: .\n    env_file: .env\n    depends_on: [db]\n    restart: unless-stopped\n\n  db:\n    image: postgres:16-alpine\n    env_file: .env\n    volumes:\n      - pgdata:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n\nvolumes:\n  pgdata:\n","yaml",[56,622,623,629,639,646,657,667,681,691,695,702,712,720,727,735,739,746],{"__ignoreMap":99},[103,624,625],{"class":105,"line":106},[103,626,628],{"class":627},"sJ8bj","# docker-compose.yml\n",[103,630,631,635],{"class":105,"line":160},[103,632,634],{"class":633},"s9eBZ","services",[103,636,638],{"class":637},"sVt8B",":\n",[103,640,641,644],{"class":105,"line":166},[103,642,643],{"class":633},"  bot",[103,645,638],{"class":637},[103,647,648,651,654],{"class":105,"line":173},[103,649,650],{"class":633},"    build",[103,652,653],{"class":637},": ",[103,655,656],{"class":120},".\n",[103,658,659,662,664],{"class":105,"line":179},[103,660,661],{"class":633},"    env_file",[103,663,653],{"class":637},[103,665,666],{"class":113},".env\n",[103,668,669,672,675,678],{"class":105,"line":185},[103,670,671],{"class":633},"    depends_on",[103,673,674],{"class":637},": [",[103,676,677],{"class":113},"db",[103,679,680],{"class":637},"]\n",[103,682,683,686,688],{"class":105,"line":191},[103,684,685],{"class":633},"    restart",[103,687,653],{"class":637},[103,689,690],{"class":113},"unless-stopped\n",[103,692,693],{"class":105,"line":197},[103,694,170],{"emptyLinePlaceholder":169},[103,696,697,700],{"class":105,"line":202},[103,698,699],{"class":633},"  db",[103,701,638],{"class":637},[103,703,704,707,709],{"class":105,"line":208},[103,705,706],{"class":633},"    image",[103,708,653],{"class":637},[103,710,711],{"class":113},"postgres:16-alpine\n",[103,713,714,716,718],{"class":105,"line":214},[103,715,661],{"class":633},[103,717,653],{"class":637},[103,719,666],{"class":113},[103,721,722,725],{"class":105,"line":219},[103,723,724],{"class":633},"    volumes",[103,726,638],{"class":637},[103,728,729,732],{"class":105,"line":292},[103,730,731],{"class":637},"      - ",[103,733,734],{"class":113},"pgdata:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n",[103,736,737],{"class":105,"line":298},[103,738,170],{"emptyLinePlaceholder":169},[103,740,741,744],{"class":105,"line":303},[103,742,743],{"class":633},"volumes",[103,745,638],{"class":637},[103,747,748,751],{"class":105,"line":309},[103,749,750],{"class":633},"  pgdata",[103,752,638],{"class":637},[31,754,756],{"id":755},"деплой-на-vps","Деплой на VPS",[94,758,760],{"className":96,"code":759,"language":98,"meta":99,"style":99},"git clone your-repo && cd bot\ncp .env.example .env  # заполнить токены\ndocker compose up -d\n",[56,761,762,782,796],{"__ignoreMap":99},[103,763,764,767,770,773,776,779],{"class":105,"line":106},[103,765,766],{"class":109},"git",[103,768,769],{"class":113}," clone",[103,771,772],{"class":113}," your-repo",[103,774,775],{"class":637}," && ",[103,777,778],{"class":120},"cd",[103,780,781],{"class":113}," bot\n",[103,783,784,787,790,793],{"class":105,"line":160},[103,785,786],{"class":109},"cp",[103,788,789],{"class":113}," .env.example",[103,791,792],{"class":113}," .env",[103,794,795],{"class":627},"  # заполнить токены\n",[103,797,798,801,804,807],{"class":105,"line":166},[103,799,800],{"class":109},"docker",[103,802,803],{"class":113}," compose",[103,805,806],{"class":113}," up",[103,808,809],{"class":120}," -d\n",[31,811,813],{"id":812},"итог","Итог",[15,815,816,817,820],{},"Правильно выстроенный Telegram-бот — это не просто скрипт с ",[56,818,819],{},"if '\u002Fstart'",". Это полноценное приложение с роутерами, мидлварами, базой данных и CI\u002FCD. Aiogram 3 даёт для этого все инструменты.",[15,822,823,824,829],{},"Если нужна помощь с разработкой бота — ",[825,826,828],"a",{"href":827},"\u002Fru#contact","напишите мне",".",[831,832,833],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":99,"searchDepth":160,"depth":160,"links":835},[836,837,838,839,840,841,842,843,844,845,846],{"id":33,"depth":160,"text":34},{"id":70,"depth":160,"text":71},{"id":91,"depth":160,"text":92},{"id":144,"depth":160,"text":145},{"id":225,"depth":160,"text":226},{"id":326,"depth":160,"text":327},{"id":398,"depth":160,"text":399},{"id":494,"depth":160,"text":495},{"id":570,"depth":160,"text":571},{"id":755,"depth":160,"text":756},{"id":812,"depth":160,"text":813},"2024-11-15","Пошаговое руководство по созданию production-ready Telegram-бота с использованием Aiogram 3, PostgreSQL и деплоем на VPS. От нуля до рабочего продукта.","md",{},"\u002Fru\u002Fblog\u002Ftelegram-bot-python-2024","12 мин",{"title":5,"description":848},"telegram-bot-python-2024","ru\u002Fblog\u002Ftelegram-bot-python-2024",[857,858,859,50,63],"Python","Telegram","Aiogram","lBwm20X1P9p9zLFZ2WkJnAaiGTUTd70JkBt9MXVYfVQ",1781783026372]