commit 347db3a8e0367373c95f97820bca2db87fed3544 Author: timka Date: Mon Jan 8 20:37:52 2024 +0300 Initial commit diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..f74c661 --- /dev/null +++ b/.env.example @@ -0,0 +1 @@ +TOKEN= \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..65f338d --- /dev/null +++ b/.gitignore @@ -0,0 +1,161 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ +temp.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/discord.xml b/.idea/discord.xml new file mode 100644 index 0000000..d8e9561 --- /dev/null +++ b/.idea/discord.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..c59b3e1 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..57c7da9 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..be587e8 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/transcard_bot.iml b/.idea/transcard_bot.iml new file mode 100644 index 0000000..74d515a --- /dev/null +++ b/.idea/transcard_bot.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..2fbf809 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +Readme в разработке \ No newline at end of file diff --git a/handlers.py b/handlers.py new file mode 100644 index 0000000..97470c1 --- /dev/null +++ b/handlers.py @@ -0,0 +1,34 @@ +from aiogram import Router +from aiogram.filters import Command +from aiogram.types import Message + +from utils import tk_balance + +router = Router() + + +@router.message(Command("start")) +@router.message(Command("about")) +async def start_command(message: Message): + await message.reply("""👋 Привет! Я - бот, который поможет тебе узнать баланс твоей транспортной карты не выходя из Телеграма! + +👍 Просто отправь мне номер свой транспортной карты, и я тебе скажу её баланс! + +⚠️ Обрати внимание, что я работаю только с транспортными картами города Казань. Спасибо за понимание""") + + +@router.message() +async def check_tk_balance(message: Message): + if not message.text.isdigit(): + return await message.reply("😔 Сожалею, но это не номер транспортной карты") + msg = await message.answer("⏳ Проверяю баланс...") + balance = await tk_balance(int(message.text)) + if not balance: + return await msg.edit_text("""😔 Произошла ошибка при получении данных. + +🤔 Если вы считаете, что вы все ввели верно, пожалуйста, подождите 15 минут""") + await msg.edit_text( + text=f"""💸 Баланс вашей транспортной карты: {balance} руб. + +⚠️ Прошу обратить внимание, не учитывается баланс, который находится в отложенном пополнении. Он появится после записи ресурса на карту""" + ) diff --git a/main.py b/main.py new file mode 100644 index 0000000..b753c2c --- /dev/null +++ b/main.py @@ -0,0 +1,27 @@ +from os import environ +from logging import basicConfig, INFO +from asyncio import get_event_loop + +from aiogram import Bot, Dispatcher +from aiogram.enums import ParseMode +from dotenv import load_dotenv + +from handlers import router + +load_dotenv() + + +async def main(): + bot = Bot( + token=environ.get("TOKEN"), + parse_mode=ParseMode.HTML + ) + dp = Dispatcher() + dp.include_router(router) + await dp.start_polling(bot) + + +if __name__ == "__main__": + basicConfig(level=INFO) + loop = get_event_loop() + loop.run_until_complete(main()) diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..d8f8982 --- /dev/null +++ b/utils.py @@ -0,0 +1,22 @@ +from xml.etree import ElementTree + +from aiohttp import ClientSession + + +async def tk_balance(card_number: int): + async with ClientSession() as session: + response = await session.post( + url="https://transkart.ru/api/payment/checkCard", + json={ + "card": card_number + } + ) + await session.close() + text = await response.text() + file = open("temp.xml", "w+") + file.write(text) + file.close() + balance = ElementTree.parse("temp.xml").findtext(".//pbtext").replace("Билет длительного пользования", "").replace(" СЂСѓР±.", "") + if not balance: + return + return int(balance)