commit 71f7c21617a735c9f5360b9a3e85297f7a94effc Author: Verum Date: Fri Feb 28 18:16:05 2025 +0700 Создание бота по рекламе чатов diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..58872da --- /dev/null +++ b/.gitignore @@ -0,0 +1,184 @@ +# .gitignore +# Файл, запрещающий экспорт определённых частей кода + +# Игнорирование локального окружения и пользовательских конфигураций IDE +.* +.*/ +.idea +.venv/ +*.iml + +# Игнорирование директорий сборки +build/ +dist/ +develop-eggs/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# Игнорирование временных файлов операционной системы +Thumbs.db + +# Игнорирование файлов логов +BotLogs/ +*.log +*.logs + +# Игнорирование всех скачанных данных логирования +BotFiles/ + +# Игнорирование базы данных пользователя +MySQL/user_data.db +MySQL/user_data.json + +# Файл подсчёта строк +project_count_line.py + +# Игнорирование байт-кодных / оптимизированных / DLL файлов +__pycache__/ +*.py[cod] +*$py.class + +# Игнорирование C-расширений +*.so + +# PyInstaller +# Обычно эти файлы создаются скриптом Python из шаблона +# перед сборкой exe, чтобы внедрить дату или другую информацию. +*.manifest +*.spec + +# Логи установщика +pip-log.txt +pip-delete-this-directory.txt + +# Отчёты тестирования / покрытия кода +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Файлы переводов +*.mo +*.pot + +# Файлы Django +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Файлы Flask +instance/ +.webassets-cache + +# Файлы Scrapy +.scrapy + +# Документация Sphinx +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# Для библиотеки или пакета эти файлы можно игнорировать, +# так как код предназначен для выполнения в нескольких средах. +# .python-version + +# pipenv +# Согласно pypa/pipenv#598, рекомендуется включать Pipfile.lock в контроль версий. +# Однако, при совместной разработке, если есть платформозависимые зависимости +# или зависимости без кроссплатформенной поддержки, +# pipenv может установить неподходящие зависимости. +#Pipfile.lock + +# poetry +# Как и Pipfile.lock, рекомендуется включать poetry.lock в контроль версий, +# особенно для бинарных пакетов для обеспечения воспроизводимости. +#poetry.lock + +# pdm +# Как и Pipfile.lock, рекомендуется включать pdm.lock в контроль версий. +#pdm.lock +# pdm хранит конфигурации проекта в .pdm.toml, но не рекомендуется включать его в контроль версий. +# .pdm.toml + +# PEP 582 (например, используется в github.com/David-OConnor/pyflow и github.com/pdm-project/pdm) +__pypackages__/ + +# Файлы Celery +celerybeat-schedule +celerybeat.pid + +# Разобранные файлы SageMath +*.sage.py + +# Среды разработки +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Настройки проекта Spyder +.spyderproject +.spyproject + +# Настройки проекта Rope +.ropeproject + +# Документация mkdocs +/site + +# Кэш mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Анализатор типов Pyre +.pyre/ + +# Статический анализатор типов pytype +.pytype/ + +# Отладочные символы Cython +cython_debug/ + +# PyCharm +# JetBrains поддерживает отдельный шаблон JetBrains.gitignore, +# который можно найти здесь: https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore. +.idea/ + +# Отключение сессий +*.session +*.session-journal 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/ReklamaWorldBot.iml b/.idea/ReklamaWorldBot.iml new file mode 100644 index 0000000..d1d083d --- /dev/null +++ b/.idea/ReklamaWorldBot.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/easycode.ignore b/.idea/easycode.ignore new file mode 100644 index 0000000..04b63e2 --- /dev/null +++ b/.idea/easycode.ignore @@ -0,0 +1,13 @@ +.idea +.vscode +node_modules/ +dist/ +vendor/ +cache/ +.*/ +*.min.* +*.test.* +*.spec.* +*.bundle.* +*.bundle-min.* +*.log 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/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..8629177 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ 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/img.png b/img.png new file mode 100644 index 0000000..3691300 Binary files /dev/null and b/img.png differ diff --git a/main.py b/main.py new file mode 100644 index 0000000..5c8c5c0 --- /dev/null +++ b/main.py @@ -0,0 +1,104 @@ +# main.py +# Замена рекламщикам + +import asyncio +import sys +from os import getenv +from pyrogram import Client +from loguru import logger + +# Сообщение и путь к картинке, которую хотите отправить +image = 'img.png' +message = "Привет! Это тестовое сообщение с картинкой." + +# Список ID групп, куда будут отправляться сообщения +group_ids = [-1000000000, + ] + +# Ваши данные для авторизации +api_id = getenv('API_KEY') # Получите это на https://my.telegram.org +api_hash = getenv('API_HASH') # Получите это на https://my.telegram.org +phone_number = getenv('PHONE_NUMBER') # Ваш номер телефона в международном формате +password = getenv('PASSWORD') # Если включена двухфакторная аутентификация +bot_token = getenv('BOT_TOKEN') +Perm = "bot" + + +# Функция отправки по id +async def send_greetings(client): + # Проходим по каждой группе и отправляем сообщение + for group_id in group_ids: + try: + # Отправка картинки + await client.send_photo(group_id, photo=image, caption=message) + logger.bind(user=group_id).info("Сообщение успешно отправлено в группу") + except Exception as e: + logger.bind(user=group_id).error(f"Ошибка при отправке в группу: {e}") + + +# Функция бесконечного цикла сообщений +async def periodic_send(client): + while True: + await send_greetings(client) + # Ожидание 60 секунд перед отправкой следующего сообщения + await asyncio.sleep(14400) # 60 секунд = 1 минута, 1 час = 3600 секунд, 4 часа = 14400 + + +# Функция создания логгеров +async def loger(): + logger.remove() + max_size = '500 MB' + info_text = ("{time:YYYY-MM-DD HH:mm:ss} | " + "PRIMO-Message | " + "{extra[user]} | {message}") + error_text = ("{time:YYYY-MM-DD HH:mm:ss} | " + "PRIMO-ERROR | " + "{extra[user]} | {message}") + logger.add(sys.stderr, + colorize=True, + format=info_text, + level="INFO", + filter=lambda record: record["level"].name == "INFO", + ) # Добавлен аргумент sink + logger.add(sys.stderr, + colorize=True, + format=error_text, + level="ERROR", + filter=lambda record: record["level"].name == "ERROR", + ) # Добавлен аргумент sink + logger.add("start.log", + rotation=max_size, + format=info_text, + backtrace=True, + diagnose=True, + level="INFO", + filter=lambda record: record["level"].name == "INFO",) + logger.add("error.log", + rotation=max_size, + format=error_text, + backtrace=True, + diagnose=True, + level="ERROR", + filter=lambda record: record["level"].name == "ERROR",) + logger.bind(user="@Console").info("Программа запущена!\n") + + +# Основная функция запуска клиента +async def main(): + await loger() + if Perm == 1: # Исправлено условие + # Создаем клиента с использованием api_id и api_hash + async with Client("user_session", api_id=api_id, api_hash=api_hash, in_memory=True, + phone_number=phone_number, password=password) as client: + # Запускаем периодическую отправку сообщений + await periodic_send(client) + else: + # Создаем клиента с использованием api_id, api_hash и bot_token + async with Client("bot_session", bot_token=bot_token) as client: + # Запускаем периодическую отправку сообщений + await periodic_send(client) + + +# Бесконечный запуск +if __name__ == "__main__": + asyncio.run(main()) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..fede2d2 Binary files /dev/null and b/requirements.txt differ