This commit is contained in:
2024-06-17 10:53:33 +03:00
commit a1da810c2d
22 changed files with 1253 additions and 0 deletions

10
.idea/TGSendMess.iml generated Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.venv" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

6
.idea/encodings.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="PROJECT" charset="windows-1251" />
</component>
</project>

View File

@@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="PyInterpreterInspection" enabled="false" level="WARNING" enabled_by_default="false" />
</profile>
</component>

View File

@@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

7
.idea/misc.xml generated Normal file
View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="Python 3.11 (TGSendMess)" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11 (TGSendMess)" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/TGSendMess.iml" filepath="$PROJECT_DIR$/.idea/TGSendMess.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

237
.idea/workspace.xml generated Normal file
View File

@@ -0,0 +1,237 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="581e0c36-cd5c-4516-b40f-56b4247c4a5d" name="Changes" comment="">
<change afterPath="$PROJECT_DIR$/.idea/TGSendMess.iml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/encodings.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/inspectionProfiles/profiles_settings.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/modules.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/cookies.txt" afterDir="false" />
<change afterPath="$PROJECT_DIR$/cookiesinst.txt" afterDir="false" />
<change afterPath="$PROJECT_DIR$/downinstagram(01).py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/downinstagram(OLD).py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/downinstagram.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/downyoutube(OLD).py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/downyoutube.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/main.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/mainai(ORG).py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/mainai.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/mainai_01.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/session-bdg9840" afterDir="false" />
<change afterPath="$PROJECT_DIR$/testproxy.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/unitib.py" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Python Script" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 7
}</component>
<component name="ProjectId" id="2hmtn1iMUtLj9Fw29l2sm6mf4Hb" />
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;Python.downinstagram(01).executor&quot;: &quot;Run&quot;,
&quot;Python.downinstagram.executor&quot;: &quot;Run&quot;,
&quot;Python.downyoutube.executor&quot;: &quot;Run&quot;,
&quot;Python.main.executor&quot;: &quot;Run&quot;,
&quot;Python.mainai.executor&quot;: &quot;Run&quot;,
&quot;Python.testproxy.executor&quot;: &quot;Run&quot;,
&quot;Python.unitib.executor&quot;: &quot;Run&quot;,
&quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;SHARE_PROJECT_CONFIGURATION_FILES&quot;: &quot;true&quot;,
&quot;git-widget-placeholder&quot;: &quot;master&quot;,
&quot;last_opened_file_path&quot;: &quot;E:/code/python/BOTS/TGSendMess&quot;
}
}</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="E:\code\python\BOTS\TGSendMess" />
</key>
</component>
<component name="RunManager" selected="Python.downinstagram">
<configuration name="downinstagram" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="TGSendMess" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/downinstagram.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="downinstagram(01)" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="TGSendMess" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="E:\code\python\BOTS\TGSendMess\downinstagram(01).py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="downyoutube" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="TGSendMess" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/downyoutube.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="main" type="PythonConfigurationType" factoryName="Python" nameIsGenerated="true">
<module name="TGSendMess" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/main.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="testproxy" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="TGSendMess" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/testproxy.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="unitib" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="TGSendMess" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/unitib.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<recent_temporary>
<list>
<item itemvalue="Python.downinstagram" />
<item itemvalue="Python.downinstagram(01)" />
<item itemvalue="Python.testproxy" />
<item itemvalue="Python.unitib" />
<item itemvalue="Python.downyoutube" />
</list>
</recent_temporary>
</component>
<component name="SharedIndexes">
<attachedChunks>
<set>
<option value="bundled-python-sdk-09665e90c3a7-d3b881c8e49f-com.jetbrains.pycharm.community.sharedIndexes.bundled-PC-233.15026.15" />
</set>
</attachedChunks>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="581e0c36-cd5c-4516-b40f-56b4247c4a5d" name="Changes" comment="" />
<created>1718211243865</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1718211243865</updated>
</task>
<servers />
</component>
</project>

100
cookies.txt Normal file
View File

@@ -0,0 +1,100 @@
[
{
"domain": ".youtube.com",
"expirationDate": 1749808820,
"hostOnly": false,
"httpOnly": true,
"name": "__Secure-1PSIDTS",
"path": "/",
"sameSite": "unspecified",
"secure": true,
"session": false,
"storeId": "0",
"value": "sidts-CjIB3EgAEig6x8Zi1GICOToEqD1x6GhwHJgG5R0j5GV6t-27tchkeyT-FHm0-Y0xCYMJPRAA",
"id": 1
},
{
"domain": ".youtube.com",
"expirationDate": 1752767720,
"hostOnly": false,
"httpOnly": false,
"name": "__Secure-3PAPISID",
"path": "/",
"sameSite": "no_restriction",
"secure": true,
"session": false,
"storeId": "0",
"value": "FfkpbSW7qg4cjkJY/AkpC4q-O3p3b3L0q-",
"id": 2
},
{
"domain": ".youtube.com",
"expirationDate": 1752767720,
"hostOnly": false,
"httpOnly": true,
"name": "__Secure-3PSID",
"path": "/",
"sameSite": "no_restriction",
"secure": true,
"session": false,
"storeId": "0",
"value": "g.a000kghsPtdg15TJlEatSe9kUmdKojmpNxnkmBt3FJuuihP-pke-Ncw6Apxvn2la-U4KQfcIdAACgYKAZUSARASFQHGX2MiRWMw-0DwApH2_DAj01DK8hoVAUF8yKoc_FwmiTGATSiOQNJNuh0M0076",
"id": 3
},
{
"domain": ".youtube.com",
"expirationDate": 1749808881,
"hostOnly": false,
"httpOnly": true,
"name": "__Secure-3PSIDCC",
"path": "/",
"sameSite": "no_restriction",
"secure": true,
"session": false,
"storeId": "0",
"value": "AKEyXzXyWZBYFlRUBDxnUBiaB9ay97nbpNZJr2GU0BBm9sQNxkR66DBAWuu4vJQUBjgVNjsFtQ",
"id": 4
},
{
"domain": ".youtube.com",
"expirationDate": 1749808820,
"hostOnly": false,
"httpOnly": true,
"name": "__Secure-3PSIDTS",
"path": "/",
"sameSite": "no_restriction",
"secure": true,
"session": false,
"storeId": "0",
"value": "sidts-CjIB3EgAEig6x8Zi1GICOToEqD1x6GhwHJgG5R0j5GV6t-27tchkeyT-FHm0-Y0xCYMJPRAA",
"id": 5
},
{
"domain": ".youtube.com",
"expirationDate": 1752767720,
"hostOnly": false,
"httpOnly": true,
"name": "LOGIN_INFO",
"path": "/",
"sameSite": "no_restriction",
"secure": true,
"session": false,
"storeId": "0",
"value": "AFmmF2swRAIgcYKxrqSte4Yn5n5-KOHYUhNIxCGXCRKkhwfEjJMnGqwCIHkLK_sRfFRA7MWIw3CiUrAKGsuwajDYekkkl6scjnlD:QUQ3MjNmeTNRTFQxQmtFWGFfVWVlM25IZ2xUeWZla0JOZVB0cUdVNkVZZnZEODRYUVh6WlJVWklTaURfN1hEa3R6cEZwVnI4ZXMyNlZ5QmJDMUROWDUySHg3cllOdlpoY1FlU1BTNWczS19tb0ZsWnBMbU95cmk2VVBac19Yd1h6MUhIWG14Q19kR3lYdFpadEprc01CWUMxblZPQjVvQzBn",
"id": 6
},
{
"domain": ".youtube.com",
"expirationDate": 1752832881,
"hostOnly": false,
"httpOnly": false,
"name": "PREF",
"path": "/",
"sameSite": "unspecified",
"secure": true,
"session": false,
"storeId": "0",
"value": "f4=4000000&f6=40000000&tz=Europe.Moscow&f7=100",
"id": 7
}
]

169
cookiesinst.txt Normal file
View File

@@ -0,0 +1,169 @@
[
{
"domain": ".instagram.com",
"expirationDate": 1749755732,
"hostOnly": false,
"httpOnly": false,
"name": "csrftoken",
"path": "/",
"sameSite": "unspecified",
"secure": true,
"session": false,
"storeId": "0",
"value": "b0VvCnt6bpeRLHuNL05HSBGgRHPlity6",
"id": 1
},
{
"domain": ".instagram.com",
"expirationDate": 1752863864,
"hostOnly": false,
"httpOnly": true,
"name": "datr",
"path": "/",
"sameSite": "no_restriction",
"secure": true,
"session": false,
"storeId": "0",
"value": "djxrZgZtcBzybTD2CPPsp5jo",
"id": 2
},
{
"domain": ".instagram.com",
"expirationDate": 1718910575,
"hostOnly": false,
"httpOnly": false,
"name": "dpr",
"path": "/",
"sameSite": "no_restriction",
"secure": true,
"session": false,
"storeId": "0",
"value": "1.25",
"id": 3
},
{
"domain": ".instagram.com",
"expirationDate": 1726082132,
"hostOnly": false,
"httpOnly": false,
"name": "ds_user_id",
"path": "/",
"sameSite": "unspecified",
"secure": true,
"session": false,
"storeId": "0",
"value": "67280582376",
"id": 4
},
{
"domain": ".instagram.com",
"expirationDate": 1749839967,
"hostOnly": false,
"httpOnly": true,
"name": "ig_did",
"path": "/",
"sameSite": "unspecified",
"secure": true,
"session": false,
"storeId": "0",
"value": "ACAA553D-3700-44A5-BEC5-07D79F5D35A4",
"id": 5
},
{
"domain": ".instagram.com",
"expirationDate": 1749839872,
"hostOnly": false,
"httpOnly": false,
"name": "ig_nrcb",
"path": "/",
"sameSite": "unspecified",
"secure": true,
"session": false,
"storeId": "0",
"value": "1",
"id": 6
},
{
"domain": ".instagram.com",
"expirationDate": 1752863863,
"hostOnly": false,
"httpOnly": false,
"name": "mid",
"path": "/",
"sameSite": "unspecified",
"secure": true,
"session": false,
"storeId": "0",
"value": "Zms8dgALAAH52BW2v8XkpcE5vi3C",
"id": 7
},
{
"domain": ".instagram.com",
"expirationDate": 1752863968,
"hostOnly": false,
"httpOnly": true,
"name": "ps_l",
"path": "/",
"sameSite": "lax",
"secure": true,
"session": false,
"storeId": "0",
"value": "1",
"id": 8
},
{
"domain": ".instagram.com",
"expirationDate": 1752863968,
"hostOnly": false,
"httpOnly": true,
"name": "ps_n",
"path": "/",
"sameSite": "no_restriction",
"secure": true,
"session": false,
"storeId": "0",
"value": "1",
"id": 9
},
{
"domain": ".instagram.com",
"hostOnly": false,
"httpOnly": true,
"name": "rur",
"path": "/",
"sameSite": "lax",
"secure": true,
"session": true,
"storeId": "0",
"value": "\"NCG\\05467280582376\\0541749842132:01f78301f9efc3e2cc154c1a54027e9eb25b3082dcbb57ef5dd97d150546e8fe16e3581f\"",
"id": 10
},
{
"domain": ".instagram.com",
"expirationDate": 1749841730,
"hostOnly": false,
"httpOnly": true,
"name": "sessionid",
"path": "/",
"sameSite": "unspecified",
"secure": true,
"session": false,
"storeId": "0",
"value": "67280582376%3A20ESIE9VAJ6jdr%3A29%3AAYddxd1rRNeY8tdrBEQ1T8aXfRqh-jWJDosM5aYuDg",
"id": 11
},
{
"domain": ".instagram.com",
"expirationDate": 1718910575,
"hostOnly": false,
"httpOnly": false,
"name": "wd",
"path": "/",
"sameSite": "lax",
"secure": true,
"session": false,
"storeId": "0",
"value": "916x1024",
"id": 12
}
]

79
downinstagram(01).py Normal file
View File

@@ -0,0 +1,79 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
import logging
import os
import asyncio
from aiogram import Bot, Dispatcher, types
from aiogram.utils import executor
import instaloader
# Ваш токен от BotFather
API_TOKEN = '5285575539:AAGu_qK23xq98fta1fJmV9oyDYoq9yhzeHM'
# Настройка прокси
PROXY_URL = 'http://185.250.148.233:8899'
PROXY_AUTH = ('bots_man', 'Ax123456')
# Настройка логирования с записью в файл
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('bot_instagram_logs.log'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
# Инициализация бота и диспетчера с использованием прокси
async def create_bot():
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
return dp, bot
# Функция для скачивания видео с Instagram с использованием cookies
def download_instagram_video(url):
L = instaloader.Instaloader()
# Загрузка cookies
L.load_session_from_file('bdg9840', 'session-bdg9840')
try:
post = instaloader.Post.from_shortcode(L.context, url.split("/")[-2])
if post.is_video:
L.download_post(post, target="downloads")
video_filename = next((f for f in os.listdir("downloads") if f.endswith('.mp4')), None)
if video_filename:
video_path = os.path.join("downloads", video_filename)
return video_path, post.title
return None, None
except Exception as e:
logger.error(f"Ошибка при скачивании видео: {e}")
return None, None
async def on_startup(dp):
logger.info('Start polling.')
# Обработчик команды /start
async def send_welcome(message: types.Message):
await message.reply("Привет! Я бот для скачивания видео с Instagram. Отправьте ссылку на видео чтобы начать.")
# Обработчик получения ссылки на Instagram
async def handle_instagram_link(message: types.Message):
link = message.text
await message.reply("Видео скачивается, пожалуйста подождите...")
video_file, video_title = download_instagram_video(link)
if video_file:
caption = f"Вот ваше видео с Instagram: {video_title}" if video_title else "Вот ваше видео с Instagram"
with open(video_file, 'rb') as video:
await bot.send_video(message.chat.id, video, caption=caption)
os.remove(video_file)
else:
await message.reply("Произошла ошибка при скачивании видео. Пожалуйста, попробуйте ещё раз.")
if __name__ == '__main__':
dp, bot = asyncio.run(create_bot())
dp.register_message_handler(send_welcome, commands=['start'])
dp.register_message_handler(handle_instagram_link)
executor.start_polling(dp, skip_updates=True, on_startup=on_startup)

64
downinstagram(OLD).py Normal file
View File

@@ -0,0 +1,64 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
import logging
import os
from aiogram import Bot, Dispatcher, types
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from aiogram.utils import executor
import instaloader
# Ваш токен от BotFather
API_TOKEN = '5285575539:AAGu_qK23xq98fta1fJmV9oyDYoq9yhzeHM'
# Настройка логирования с записью в файл
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('bot_instagram_logs.log'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
# Инициализация бота и диспетчера
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
# Функция для скачивания видео с Instagram
def download_instagram_video(url):
L = instaloader.Instaloader()
try:
post = instaloader.Post.from_shortcode(L.context, url.split("/")[-2])
if post.is_video:
L.download_post(post, target="downloads")
video_filename = next((f for f in os.listdir("downloads") if f.endswith('.mp4')), None)
if video_filename:
return os.path.join("downloads", video_filename)
return None
except Exception as e:
logger.error(f"Ошибка при скачивании видео: {e}")
return None
# Обработчик команды /start
@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
await message.reply("Привет! Я бот для скачивания видео с Instagram. Отправьте ссылку на видео чтобы начать.")
# Обработчик получения ссылки на Instagram
@dp.message_handler()
async def handle_instagram_link(message: types.Message):
link = message.text
await message.reply("Видео скачивается, пожалуйста подождите...")
video_file = download_instagram_video(link)
if video_file:
with open(video_file, 'rb') as video:
await bot.send_video(message.chat.id, video, caption="Вот ваше видео с Instagram")
os.remove(video_file)
else:
await message.reply("Произошла ошибка при скачивании видео. Пожалуйста, попробуйте ещё раз.")
if __name__ == '__main__':
logger.info('Start polling.')
executor.start_polling(dp, skip_updates=True)

81
downinstagram.py Normal file
View File

@@ -0,0 +1,81 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
import logging
import os
from aiogram import Bot, Dispatcher, types
from aiogram.utils import executor
import instaloader
# Ваш токен от BotFather
API_TOKEN = '5285575539:AAGu_qK23xq98fta1fJmV9oyDYoq9yhzeHM'
# Ваши учетные данные Instagram
INSTAGRAM_USERNAME = 'bdg9840'
INSTAGRAM_PASSWORD = '-4m5kRsf_xesAjZ'
# Путь к файлу cookie
COOKIE_FILE = 'cookiesinst.txt'
# Настройка логирования с записью в файл
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('bot_instagram_logs.log'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
# Инициализация бота и диспетчера
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
# Функция для скачивания видео с Instagram
async def download_instagram_video(url):
L = instaloader.Instaloader()
# Проверяем, существует ли файл cookie
if os.path.isfile(COOKIE_FILE):
L.load_session_from_file(INSTAGRAM_USERNAME, COOKIE_FILE)
else:
session = instaloader.Session()
session.login(INSTAGRAM_USERNAME, INSTAGRAM_PASSWORD)
L.context = instaloader.context.Context(session)
L.save_session_to_file(COOKIE_FILE)
try:
post = instaloader.Post.from_shortcode(L.context, url.split("/")[-2])
if post.is_video:
L.download_post(post, target="downloads")
video_filename = next((f for f in os.listdir("downloads") if f.endswith('.mp4')), None)
if video_filename:
return os.path.join("downloads", video_filename)
return None
except Exception as e:
logger.error(f"Ошибка при скачивании видео: {e}")
return None
# Обработчик команды /start
@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
await message.reply("Привет! Я бот для скачивания видео с Instagram. Отправьте ссылку на видео чтобы начать.")
# Обработчик получения ссылки на Instagram
@dp.message_handler()
async def handle_instagram_link(message: types.Message):
link = message.text
await message.reply("Видео скачивается, пожалуйста подождите...")
video_file = await download_instagram_video(link)
if video_file:
with open(video_file, 'rb') as video:
await bot.send_video(message.chat.id, video, caption="Вот ваше видео с Instagram")
os.remove(video_file)
else:
await message.reply("Произошла ошибка при скачивании видео. Пожалуйста, попробуйте ещё раз.")
if __name__ == '__main__':
logger.info('Start polling.')
executor.start_polling(dp, skip_updates=True)

71
downyoutube(OLD).py Normal file
View File

@@ -0,0 +1,71 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
import logging
import os
from aiogram import Bot, Dispatcher, types
from aiogram.utils import executor
from pytube import YouTube, request
import youtube_dl
import yt_dlp as youtube_dl
# Ваш токен от BotFather
API_TOKEN = '564432189:AAEF5uBBZZ3VLUl-njjwzDRlqF4HCA9ceGo'
# Путь к файлу cookies.txt
COOKIES_FILE = 'cookies.txt'
# Настройка логирования с записью в файл
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('bot_logs.log'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
# Инициализация бота и диспетчера
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
# Обработчик команды /start
@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
await message.reply("Привет! Я бот для скачивания видео с YouTube. Отправьте команду /download чтобы начать.")
# Обработчик команды /download
@dp.message_handler(commands=['download'])
async def prompt_for_link(message: types.Message):
await message.reply("Пожалуйста, отправьте ссылку на видео или Shorts с YouTube.")
# Обработчик получения ссылки на YouTube
@dp.message_handler()
async def download_youtube_video(message: types.Message):
link = message.text
try:
ydl_opts = {
'outtmpl': '%(title)s.%(ext)s',
'cookies': COOKIES_FILE,
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
info_dict = ydl.extract_info(link, download=True)
video_file = ydl.prepare_filename(info_dict)
await message.reply("Видео скачивается, пожалуйста подождите...")
with open(video_file, 'rb') as video:
await bot.send_video(message.chat.id, video, caption="Вот ваше видео с YouTube")
os.remove(video_file)
except Exception as e:
logger.error(f"Ошибка при скачивании видео: {e}")
await message.reply("Произошла ошибка при скачивании видео. Пожалуйста, попробуйте ещё раз.")
if __name__ == '__main__':
logger.info('Start polling.')
executor.start_polling(dp, skip_updates=True)

69
downyoutube.py Normal file
View File

@@ -0,0 +1,69 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
import logging
import os
from aiogram import Bot, Dispatcher, types
from aiogram.utils import executor
import yt_dlp as youtube_dl
# Ваш токен от BotFather
API_TOKEN = '564432189:AAEF5uBBZZ3VLUl-njjwzDRlqF4HCA9ceGo'
# Путь к файлу cookies.txt
COOKIES_FILE = 'cookies.txt'
# Настройка логирования с записью в файл
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('bot_down_tube_logs.log'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
# Инициализация бота и диспетчера
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
# Обработчик команды /start
@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
await message.reply("Привет! Я бот для скачивания видео с YouTube. Отправьте команду /download чтобы начать.")
# Обработчик команды /download
@dp.message_handler(commands=['download'])
async def prompt_for_link(message: types.Message):
await message.reply("Пожалуйста, отправьте ссылку на видео или Shorts с YouTube.")
# Обработчик получения ссылки на YouTube
@dp.message_handler()
async def download_youtube_video(message: types.Message):
link = message.text
try:
ydl_opts = {
'outtmpl': '%(title)s.%(ext)s',
'format': 'bestvideo+bestaudio/best',
'merge_output_format': 'mp4',
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
info_dict = ydl.extract_info(link, download=True)
video_file = ydl.prepare_filename(info_dict)
await message.reply("Видео скачивается, пожалуйста подождите...")
with open(video_file, 'rb') as video:
caption = info_dict['title'] # Добавляем название видео к подписи
await bot.send_video(message.chat.id, video, caption=caption)
os.remove(video_file)
except Exception as e:
logger.error(f"Ошибка при скачивании видео: {e}")
await message.reply("Произошла ошибка при скачивании видео. Пожалуйста, попробуйте ещё раз.")
if __name__ == '__main__':
logger.info('Start polling.')
executor.start_polling(dp, skip_updates=True)

48
main.py Normal file
View File

@@ -0,0 +1,48 @@
import logging
from telegram import Update
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext, dispatcher
# Включаем логирование
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO
)
logger = logging.getLogger(__name__)
# Ваш токен от BotFather
TOKEN = '7279978236:AAEnzp3moKdIUqOZ_rCLuim7tyQwVBJDGOU'
# Список ID групп, куда будут пересылаться сообщения
TARGET_GROUP_IDS = [-1002243409068, -1002164079094_2, -1002150063511_2] # замените на реальные ID ваших групп
def start(update: Update, context: CallbackContext) -> None:
update.message.reply_text('Привет! Я бот, который пересылает сообщения в группы.')
def forward_message(update: Update, context: CallbackContext) -> None:
logger.info(f"Получено сообщение в группе {update.message.chat_id}")
for group_id in TARGET_GROUP_IDS:
try:
context.bot.forward_message(chat_id=group_id, from_chat_id=update.message.chat_id, message_id=update.message.message_id)
logger.info(f"Сообщение переслано в группу {group_id}")
except Exception as e:
logger.error(f"Ошибка при пересылке сообщения в группу {group_id}: {e}")
def main() -> None:
# Создание экземпляра Updater и Dispatcher
updater = Updater(TOKEN)
dispatcher = updater.dispatcher
# Обработчик команды /start
dispatcher.add_handler(CommandHandler("start", start))
# Обработчик всех сообщений для пересылки
dispatcher.add_handler(MessageHandler(Filters.text & ~Filters.command, forward_message))
# Запуск бота
updater.start_polling()
updater.idle()
if __name__ == '__main__':
main()

37
mainai(ORG).py Normal file
View File

@@ -0,0 +1,37 @@
import logging
from aiogram import Bot, Dispatcher, types
from aiogram.types import ParseMode
from aiogram.utils import executor
# Ваш токен от BotFather
API_TOKEN = '7279978236:AAEnzp3moKdIUqOZ_rCLuim7tyQwVBJDGOU'
# Список ID групп, куда будут пересылаться сообщения
TARGET_GROUP_IDS = [-1002164079094, -1002243409068, -1002150063511] # замените на реальные ID ваших групп
# Настройка логирования
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Инициализация бота и диспетчера
bot = Bot(token=API_TOKEN, parse_mode=ParseMode.HTML)
dp = Dispatcher(bot)
# Обработчик команды /start
@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
await message.reply("Привет! Я бот, который пересылает сообщения в группы.")
# Обработчик всех типов сообщений для пересылки
@dp.message_handler(content_types=types.ContentType.ANY)
async def forward_message(message: types.Message):
for group_id in TARGET_GROUP_IDS:
try:
await bot.forward_message(chat_id=group_id, from_chat_id=message.chat.id, message_id=message.message_id)
logger.info(f"Сообщение переслано в группу {group_id}")
except Exception as e:
logger.error(f"Ошибка при пересылке сообщения в группу {group_id}: {e}")
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)

73
mainai.py Normal file
View File

@@ -0,0 +1,73 @@
import logging
from aiogram import Bot, Dispatcher, types
from aiogram.types import ParseMode
from aiogram.utils import executor
# Ваш токен от BotFather
API_TOKEN = '7279978236:AAEnzp3moKdIUqOZ_rCLuim7tyQwVBJDGOU'
# ID группы, из которой будут пересылаться сообщения
#SOURCE_GROUP_ID = -1002243409068 # замените на реальный ID вашей основной группы
# Список ID групп, куда будут пересылаться сообщения
TARGET_GROUP_IDS = [-1002164079094, -1002243409068, -1002150063511, -1002191147447] # замените на реальные ID ваших групп
# Список ID разрешённых пользователей
ALLOWED_USER_IDS = [523763687, 1000964643, 794413216, 954527694] # замените на реальные ID разрешённых пользователей
# Настройка логирования с записью в файл
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('bot_logs.log'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
# Инициализация бота и диспетчера
bot = Bot(token=API_TOKEN, parse_mode=ParseMode.HTML)
dp = Dispatcher(bot)
# Обработчик команды /start
@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
await message.reply("Привет! Я бот, который пересылает сообщения в группы.")
# Обработчик всех типов сообщений для пересылки из личных сообщений боту
@dp.message_handler(content_types=types.ContentType.ANY)
async def forward_message(message: types.Message):
if message.chat.type == 'private': # Проверка, что сообщение пришло в личный чат
if message.from_user.id in ALLOWED_USER_IDS: # Проверка, что пользователь разрешён
for group_id in TARGET_GROUP_IDS:
try:
if message.content_type == types.ContentType.TEXT:
await bot.send_message(chat_id=group_id, text=message.text, disable_notification=True)
logger.info(f"Текстовое сообщение отправлено в группу {group_id}")
elif message.content_type == types.ContentType.PHOTO:
await bot.send_photo(chat_id=group_id, photo=message.photo[-1].file_id, caption=message.caption, disable_notification=True)
logger.info(f"Фото отправлено в группу {group_id}")
elif message.content_type == types.ContentType.DOCUMENT:
await bot.send_document(chat_id=group_id, document=message.document.file_id, caption=message.caption, disable_notification=True)
logger.info(f"Документ отправлен в группу {group_id}")
elif message.content_type == types.ContentType.VIDEO:
await bot.send_video(chat_id=group_id, video=message.video.file_id, caption=message.caption, disable_notification=True)
logger.info(f"Видео отправлено в группу {group_id}")
elif message.content_type == types.ContentType.AUDIO:
await bot.send_audio(chat_id=group_id, audio=message.audio.file_id, caption=message.caption, disable_notification=True)
logger.info(f"Аудио отправлено в группу {group_id}")
elif message.content_type == types.ContentType.VOICE:
await bot.send_voice(chat_id=group_id, voice=message.voice.file_id, caption=message.caption, disable_notification=True)
logger.info(f"Голосовое сообщение отправлено в группу {group_id}")
elif message.content_type == types.ContentType.VIDEO_NOTE:
await bot.send_video_note(chat_id=group_id, video_note=message.video_note.file_id, disable_notification=True)
logger.info(f"Видеозаметка отправлена в группу {group_id}")
else:
logger.warning(f"Тип сообщения {message.content_type} не поддерживается")
except Exception as e:
logger.error(f"Ошибка при отправке сообщения в группу {group_id}: {e}")
else:
logger.warning(f"Пользователь {message.from_user.id} не имеет доступа к боту")
await message.reply("У вас нет доступа к этому боту.")
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)

67
mainai_01.py Normal file
View File

@@ -0,0 +1,67 @@
import logging
from aiogram import Bot, Dispatcher, types
from aiogram.types import ParseMode
from aiogram.utils import executor
from pytube import YouTube
# Ваш токен от BotFather
API_TOKEN = '7279978236:AAEnzp3moKdIUqOZ_rCLuim7tyQwVBJDGOU'
# ID группы, из которой будут пересылаться сообщения
#SOURCE_GROUP_ID = -1002243409068 # замените на реальный ID вашей основной группы
# Список ID групп, куда будут пересылаться сообщения
TARGET_GROUP_IDS = [-1002164079094, -1002243409068, -1002150063511] # замените на реальные ID ваших групп
# Список ID разрешённых пользователей
ALLOWED_USER_IDS = [523763687, 1000964643, 794413216] # замените на реальные ID разрешённых пользователей
# Настройка логирования
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Инициализация бота и диспетчера
bot = Bot(token=API_TOKEN, parse_mode=ParseMode.HTML)
dp = Dispatcher(bot)
# Обработчик команды /start
@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
await message.reply("Привет! Я бот, который пересылает сообщения в группы.")
# Обработчик всех типов сообщений для пересылки из личных сообщений боту
@dp.message_handler(content_types=types.ContentType.ANY)
async def forward_message(message: types.Message):
if message.chat.type == 'private': # Проверка, что сообщение пришло в личный чат
if message.from_user.id in ALLOWED_USER_IDS: # Проверка, что пользователь разрешён
for group_id in TARGET_GROUP_IDS:
try:
if message.content_type == types.ContentType.TEXT:
await bot.send_message(chat_id=group_id, text=message.text, disable_notification=True)
logger.info(f"Текстовое сообщение отправлено в группу {group_id}")
elif message.content_type == types.ContentType.PHOTO:
await bot.send_photo(chat_id=group_id, photo=message.photo[-1].file_id, caption=message.caption, disable_notification=True)
logger.info(f"Фото отправлено в группу {group_id}")
elif message.content_type == types.ContentType.DOCUMENT:
await bot.send_document(chat_id=group_id, document=message.document.file_id, caption=message.caption, disable_notification=True)
logger.info(f"Документ отправлен в группу {group_id}")
elif message.content_type == types.ContentType.VIDEO:
await bot.send_video(chat_id=group_id, video=message.video.file_id, caption=message.caption, disable_notification=True)
logger.info(f"Видео отправлено в группу {group_id}")
elif message.content_type == types.ContentType.AUDIO:
await bot.send_audio(chat_id=group_id, audio=message.audio.file_id, caption=message.caption, disable_notification=True)
logger.info(f"Аудио отправлено в группу {group_id}")
elif message.content_type == types.ContentType.VOICE:
await bot.send_voice(chat_id=group_id, voice=message.voice.file_id, caption=message.caption, disable_notification=True)
logger.info(f"Голосовое сообщение отправлено в группу {group_id}")
elif message.content_type == types.ContentType.VIDEO_NOTE:
await bot.send_video_note(chat_id=group_id, video_note=message.video_note.file_id, disable_notification=True)
logger.info(f"Видеозаметка отправлена в группу {group_id}")
else:
logger.warning(f"Тип сообщения {message.content_type} не поддерживается")
except Exception as e:
logger.error(f"Ошибка при отправке сообщения в группу {group_id}: {e}")
else:
logger.warning(f"Пользователь {message.from_user.id} не имеет доступа к боту")
await message.reply("У вас нет доступа к этому боту.")
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)

BIN
session-bdg9840 Normal file

Binary file not shown.

14
testproxy.py Normal file
View File

@@ -0,0 +1,14 @@
import aiohttp
import asyncio
async def fetch(session, url):
proxy_auth = aiohttp.BasicAuth('bots_man', 'Ax123456')
async with session.get(url, proxy='http://185.250.148.233:8899', proxy_auth=proxy_auth) as response:
return await response.text()
async def main():
async with aiohttp.ClientSession() as session:
html = await fetch(session, 'http://example.com')
print(html)
asyncio.run(main())

95
unitib.py Normal file
View File

@@ -0,0 +1,95 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
import logging
import os
from aiogram import Bot, Dispatcher, types
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from aiogram.utils import executor
# Ваш токен от BotFather
API_TOKEN = '7437033939:AAHmX2KvRecp0Y2uKFlldWGtoZXgNvRKRUk'
# Настройка логирования с записью в файл
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('bot_uniti_logs.log'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
# Инициализация бота и диспетчера
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
# Переменная для хранения состояния пользователя
user_states = {}
# Функция для создания клавиатуры с inline-кнопками
def get_inline_keyboard():
keyboard = InlineKeyboardMarkup()
button1 = InlineKeyboardButton("Скачать с YouTube", callback_data="action_2")
button2 = InlineKeyboardButton("Отправить в группы", callback_data="action_1")
button3 = InlineKeyboardButton("Скачать с Instagram", callback_data="action_3")
keyboard.add(button1, button3)
keyboard.add(button2)
return keyboard
# Функция для создания клавиатуры с кнопкой отмены
def get_cancel_keyboard():
keyboard = InlineKeyboardMarkup()
cancel_button = InlineKeyboardButton("Отмена", callback_data="cancel")
keyboard.add(cancel_button)
return keyboard
# Функция для создания клавиатуры с кнопкой "Назад"
def get_back_keyboard():
keyboard = InlineKeyboardMarkup()
back_button = InlineKeyboardButton("Назад", callback_data="back")
keyboard.add(back_button)
return keyboard
# Обработчик команды /start
@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
await message.reply("Привет! Я бот с inline-кнопками. Выберите действие:", reply_markup=get_inline_keyboard())
# Обработчик нажатий на inline-кнопки
@dp.callback_query_handler(lambda c: c.data and c.data.startswith('action_'))
async def process_callback_button(callback_query: types.CallbackQuery):
action = callback_query.data
if action == 'action_1':
await bot.answer_callback_query(callback_query.id, text='Вы выбрали действие 1!')
# Отправить ссылку на другого бота
keyboard = InlineKeyboardMarkup()
keyboard.add(InlineKeyboardButton("Перейти в бот перессылки", url="https://t.me/TGSendMessageFiPiBot"))
await bot.send_message(callback_query.from_user.id, "Нажмите на кнопку, чтобы перейти в другой бот.",
reply_markup=keyboard)
elif action == 'action_2':
await bot.answer_callback_query(callback_query.id, text='Вы выбрали действие 2!')
# Отправить ссылку на другого бота
keyboard = InlineKeyboardMarkup()
keyboard.add(InlineKeyboardButton("Перейти в бота скачиваний с YouTube", url="https://t.me/haligali_bot"))
await bot.send_message(callback_query.from_user.id, "Нажмите на кнопку, чтобы перейти в другой бот.",
reply_markup=keyboard)
elif action == 'action_3':
await bot.answer_callback_query(callback_query.id, text='Вы выбрали действие 3!')
# Отправить ссылку на другого бота
keyboard = InlineKeyboardMarkup()
keyboard.add(InlineKeyboardButton("Перейти в бота скачиваний с Instagram", url="https://t.me/irktestass_bot"))
await bot.send_message(callback_query.from_user.id, "Нажмите на кнопку, чтобы перейти в другой бот.", reply_markup=keyboard)
await bot.edit_message_reply_markup(callback_query.from_user.id, callback_query.message.message_id, reply_markup=None)
# Обработчик нажатия на кнопку "Отмена" или "Назад"
@dp.callback_query_handler(lambda c: c.data and (c.data == 'cancel' or c.data == 'back'))
async def process_cancel_or_back_button(callback_query: types.CallbackQuery):
user_states[callback_query.from_user.id] = None
await bot.answer_callback_query(callback_query.id, text='Действие отменено.')
await bot.send_message(callback_query.from_user.id, "Действие отменено.", reply_markup=get_inline_keyboard())
if __name__ == '__main__':
logger.info('Start polling.')
executor.start_polling(dp, skip_updates=True)