├── Dockerfile
├── LICENSE
├── Procfile
├── README.md
├── app.json
├── configs.py
├── helpers
├── block_exts_handler.py
├── file_size_checker.py
├── filters.py
├── forwarder.py
└── kanger.py
├── main.py
└── requirements.txt
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ubuntu:20.04
2 |
3 | ENV DEBIAN_FRONTEND=noninteractive
4 |
5 | WORKDIR /app
6 |
7 | RUN apt-get update
8 | RUN echo y | apt-get install locales
9 | RUN echo y | apt install build-essential
10 | RUN apt -qq install -y --no-install-recommends \
11 | curl \
12 | git \
13 | gnupg2 \
14 | wget \
15 |
16 | RUN set -ex; \
17 | apt-get update \
18 | && apt-get install -y --no-install-recommends \
19 | busybox \
20 | git \
21 | python3 \
22 | python3-dev \
23 | python3-pip \
24 | python3-lxml \
25 | pv \
26 | && apt-get autoclean \
27 | && apt-get autoremove \
28 | && rm -rf /var/lib/apt/lists/*
29 |
30 | RUN pip3 install setuptools wheel yarl multidict
31 | COPY requirements.txt .
32 | RUN pip3 install -r requirements.txt
33 | RUN dpkg-reconfigure locales
34 | COPY . /app
35 |
36 | CMD ["python3", "main.py"]
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Abir Hasan
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Procfile:
--------------------------------------------------------------------------------
1 | worker: python3 main.py
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Forward-Client
2 | This is Telegram Messages Forwarder bot by [@AbirHasan2005](https://github.com/AbirHasan2005).
3 |
4 | Use this at your own risk. I will not be responsible for any kind of issue while using this! Better use a different Telegram Account instead of using Main Telegram Account.
5 |
6 | ### Features:
7 | - Kang Whole Chat Messages to other Chats.
8 | - Can cause Telegram Account Ban!
9 | - Forward From Chat To Chat.
10 | - Can Forward from Multiple Chats to Multiple Chats :)
11 | - Automatically forward new messages From Chat To Chat.
12 | - Bot 😁
13 | - Simple & Userfriendly 😅
14 |
15 | ### Configs:
16 | - `API_ID` - Get from my.telegram.org or [@TeleORG_Bot](https://t.me/TeleORG_Bot)
17 | - `API_HASH` - Get from my.telegram.org or [@TeleORG_Bot](https://t.me/TeleORG_Bot)
18 | - `STRING_SESSION` - Get this from [@StringSessionGen_Bot](https://t.me/StringSessionGen_Bot)
19 | - `FORWARD_FILTERS` - Filters can be `text`, `video`, `document`, `gif`, `sticker`, `photo`, `audio`, `poll`, `forwarded`. Separate with Space.
20 | - `FORWARD_TO_CHAT_ID` - Forward To Chat IDs. Separate with Space.
21 | - `FORWARD_FROM_CHAT_ID` - Forward From Chat IDs. Separate with Space.
22 | - `FORWARD_AS_COPY` - Forward Messages as Copy or with Forward Tag. Value should be `True`/`False`.
23 | - `BLOCKED_EXTENSIONS` - Don't Forward those Media Messages which contains Blocked Extensions. Example: `mp4 mkv mp3 zip rar`. Separate with Space.
24 | - `MINIMUM_FILE_SIZE` - Minimum File Size for Media Message to be able to Forward. Should be in Bytes.
25 | - `BLOCK_FILES_WITHOUT_EXTENSIONS` - Value can be `True`/`False`. If `True` those files which doesn't have file extension will not be Forwarded.
26 |
27 | ### **Commands:**
28 | - `!start` - Check Bot Alive or Not.
29 | - `!help` - Get this Message.
30 | - `!kang` - Start All Messages Kanger.
31 | - `!restart` - Restart Heroku App Dyno Workers.
32 | - `!stop` - Stop Kanger & Restart Service.
33 |
34 | ### Support Group:
35 |
36 |
37 | ### Video Tutorial:
38 | [](https://youtu.be/_xuptk2KUbk)
39 |
40 | ### Deploy Now:
41 | [](https://heroku.com/deploy?template=https://github.com/AbirHasan2005/Forward-Client)
42 |
43 | ### Host Locally:
44 | ```sh
45 | git clone https://github.com/AbirHasan2005/Forward-Client
46 | cd Forward-Client
47 | pip3 install -r requirements.txt
48 | # Setup Configurations in configs.py file!
49 | python3 main.py
50 | ```
51 |
52 | ### Follow on:
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
--------------------------------------------------------------------------------
/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "This is Telegram Messages Forwarder Userbot by @AbirHasan2005",
3 | "description": "This is Telegram Messages Forwarder Userbot in Pyrogram by @AbirHasan2005",
4 | "keywords": [
5 | "telegram",
6 | "messages",
7 | "forwarder",
8 | "userbot"
9 | ],
10 | "repository": "https://github.com/AbirHasan2005/Forward-Client",
11 | "website": "https://telegram.dog/AbirHasan2005",
12 | "success_url": "https://t.me/Discovery_Updates",
13 | "env": {
14 | "API_ID": {
15 | "description": "Get this value from my.telegram.org or @TeleORG_Bot"
16 | },
17 | "API_HASH": {
18 | "description": "Get this value from my.telegram.org or @TeleORG_Bot"
19 | },
20 | "STRING_SESSION": {
21 | "description": "Get this from @StringSessionGen_Bot"
22 | },
23 | "FORWARD_FROM_CHAT_ID": {
24 | "description": "Forward From Chat IDs. Separate with Space."
25 | },
26 | "FORWARD_TO_CHAT_ID": {
27 | "description": "Forward To Chat IDs. Separate with Space."
28 | },
29 | "FORWARD_FILTERS": {
30 | "description": "Filters can be `text`, `video`, `document`, `gif`, `sticker`, `photo`, `audio`, `poll`, `forwarded`. Separate with Space.",
31 | "required": false
32 | },
33 | "BLOCKED_EXTENSIONS": {
34 | "description": "Don't Forward those Media Messages which contains Blocked Extensions. Example: `mp4 mkv mp3 zip rar`. Separate with Space.",
35 | "required": false
36 | },
37 | "MINIMUM_FILE_SIZE": {
38 | "description": "Minimum File Size for Media Message to be able to Forward. Should be in Bytes.",
39 | "required": false
40 | },
41 | "BLOCK_FILES_WITHOUT_EXTENSIONS": {
42 | "description": "Value can be `True`/`False`. If `True` those files which doesn't have file extension will not be Forwarded.",
43 | "required": false
44 | },
45 | "HEROKU_API_KEY": {
46 | "description": "Put Heroku API Key from https://dashboard.heroku.com/account"
47 | },
48 | "HEROKU_APP_NAME": {
49 | "description": "Your Heroku App Name."
50 | },
51 | "FORWARD_AS_COPY": {
52 | "description": "Forward Messages as Copy or with Forward Tag. Value should be True/False.",
53 | "required": false
54 | }
55 | },
56 | "buildpacks": [
57 | {
58 | "url": "heroku/python"
59 | }
60 | ],
61 | "formation": {
62 | "worker": {
63 | "quantity": 1,
64 | "size": "free"
65 | }
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/configs.py:
--------------------------------------------------------------------------------
1 | # (c) @AbirHasan2005
2 |
3 | import os
4 | import heroku3
5 |
6 |
7 | class Config(object):
8 | # Get This From @TeleORG_Bot
9 | API_ID = int(os.environ.get("API_ID"))
10 | API_HASH = os.environ.get("API_HASH")
11 | # Get This From @StringSessionGen_Bot
12 | STRING_SESSION = os.environ.get("STRING_SESSION")
13 | # Forward From Chat ID
14 | FORWARD_FROM_CHAT_ID = list(set(int(x) for x in os.environ.get("FORWARD_FROM_CHAT_ID", "-100").split()))
15 | # Forward To Chat ID
16 | FORWARD_TO_CHAT_ID = list(set(int(x) for x in os.environ.get("FORWARD_TO_CHAT_ID", "-100").split()))
17 | # Filters for Forwards
18 | DEFAULT_FILTERS = "video document photo audio text gif forwarded poll sticker"
19 | FORWARD_FILTERS = list(set(x for x in os.environ.get("FORWARD_FILTERS", DEFAULT_FILTERS).split()))
20 | BLOCKED_EXTENSIONS = list(set(x for x in os.environ.get("BLOCKED_EXTENSIONS", "").split()))
21 | MINIMUM_FILE_SIZE = os.environ.get("MINIMUM_FILE_SIZE", None)
22 | BLOCK_FILES_WITHOUT_EXTENSIONS = bool(os.environ.get("BLOCK_FILES_WITHOUT_EXTENSIONS", False))
23 | # Forward as Copy. Value Should be True or False
24 | FORWARD_AS_COPY = bool(os.environ.get("FORWARD_AS_COPY", True))
25 | # Sleep Time while Kang
26 | SLEEP_TIME = int(os.environ.get("SLEEP_TIME", 10))
27 | # Heroku Management
28 | HEROKU_API_KEY = os.environ.get("HEROKU_API_KEY")
29 | HEROKU_APP_NAME = os.environ.get("HEROKU_APP_NAME")
30 | HEROKU_APP = heroku3.from_key(HEROKU_API_KEY).apps()[HEROKU_APP_NAME] if HEROKU_API_KEY and HEROKU_APP_NAME else None
31 | # Message Texts
32 | HELP_TEXT = """
33 | This UserBot can forward messages from any Chat to any other Chat also you can kang all messages from one Chat to another Chat.
34 |
35 | 👨🏻💻 **Commands:**
36 | • `!start` - Check UserBot Alive or Not.
37 | • `!help` - Get this Message.
38 | • `!kang` - Start All Messages Kanger.
39 | • `!restart` - Restart Heroku App Dyno Workers.
40 | • `!stop` - Stop Kanger & Restart Service.
41 |
42 | ©️ **Developer:** @AbirHasan2005
43 | 👥 **Support Group:** [【★ʟя★】](https://t.me/JoinOT)"""
44 |
--------------------------------------------------------------------------------
/helpers/block_exts_handler.py:
--------------------------------------------------------------------------------
1 | # (c) @AbirHasan2005
2 |
3 | from configs import Config
4 | from pyrogram.types import Message
5 |
6 |
7 | async def CheckBlockedExt(event: Message):
8 | media = event.document or event.video or event.audio or event.animation
9 | if (Config.BLOCK_FILES_WITHOUT_EXTENSIONS is True) and ("." not in media.file_name):
10 | return True
11 | if (media is not None) and (media.file_name is not None):
12 | _file = media.file_name.rsplit(".", 1)
13 | if len(_file) == 2:
14 | if (_file[-1].lower() in Config.BLOCKED_EXTENSIONS) or (_file[-1].upper() in Config.BLOCKED_EXTENSIONS):
15 | return True
16 | else:
17 | return False
18 | else:
19 | return False
20 |
--------------------------------------------------------------------------------
/helpers/file_size_checker.py:
--------------------------------------------------------------------------------
1 | # (c) @AbirHasan2005
2 |
3 | from pyrogram.types import Message
4 | from configs import Config
5 |
6 |
7 | async def CheckFileSize(msg: Message):
8 | media = msg.video or msg.document or msg.audio or msg.photo or msg.animation
9 | if (Config.MINIMUM_FILE_SIZE is not None) and (media.file_size < int(Config.MINIMUM_FILE_SIZE)):
10 | return False
11 | else:
12 | return True
13 |
--------------------------------------------------------------------------------
/helpers/filters.py:
--------------------------------------------------------------------------------
1 | # (c) @AbirHasan2005
2 |
3 | from configs import Config
4 | from pyrogram.types import Message
5 |
6 |
7 | async def FilterMessage(message: Message):
8 | if (message.forward_from or message.forward_from_chat) and ("forwarded" not in Config.FORWARD_FILTERS):
9 | return 400
10 | if (len(Config.FORWARD_FILTERS) == 9) or ((message.video and ("video" in Config.FORWARD_FILTERS)) or (message.document and ("document" in Config.FORWARD_FILTERS)) or (message.photo and ("photo" in Config.FORWARD_FILTERS)) or (message.audio and ("audio" in Config.FORWARD_FILTERS)) or (message.text and ("text" in Config.FORWARD_FILTERS)) or (message.animation and ("gif" in Config.FORWARD_FILTERS)) or (message.poll and ("poll" in Config.FORWARD_FILTERS)) or (message.sticker and ("sticker" in Config.FORWARD_FILTERS))):
11 | return 200
12 | else:
13 | return 400
14 |
--------------------------------------------------------------------------------
/helpers/forwarder.py:
--------------------------------------------------------------------------------
1 | # (c) @AbirHasan2005
2 |
3 | import asyncio
4 | from configs import Config
5 | from pyrogram import Client
6 | from pyrogram.types import Message
7 | from pyrogram.errors import FloodWait
8 | from helpers.filters import FilterMessage
9 | from helpers.file_size_checker import CheckFileSize
10 | from helpers.block_exts_handler import CheckBlockedExt
11 |
12 |
13 | async def ForwardMessage(client: Client, msg: Message):
14 | try:
15 | ## --- Check 1 --- ##
16 | can_forward = await FilterMessage(message=msg)
17 | if can_forward == 400:
18 | return 400
19 | ## --- Check 2 --- ##
20 | has_blocked_ext = await CheckBlockedExt(event=msg)
21 | if has_blocked_ext is True:
22 | return 400
23 | ## --- Check 3 --- ##
24 | file_size_passed = await CheckFileSize(msg=msg)
25 | if file_size_passed is False:
26 | return 400
27 | ## --- Check 4 --- ##
28 | for i in range(len(Config.FORWARD_TO_CHAT_ID)):
29 | try:
30 | if Config.FORWARD_AS_COPY is True:
31 | await msg.copy(Config.FORWARD_TO_CHAT_ID[i])
32 | else:
33 | await msg.forward(Config.FORWARD_TO_CHAT_ID[i])
34 | except FloodWait as e:
35 | await asyncio.sleep(e.value)
36 | await client.send_message(chat_id="me", text=f"#FloodWait: Stopped Forwarder for `{e.value}s`!")
37 | await asyncio.sleep(Config.SLEEP_TIME)
38 | await ForwardMessage(client, msg)
39 | except Exception as err:
40 | await client.send_message(chat_id="me", text=f"#ERROR: `{err}`\n\nUnable to Forward Message to `{str(Config.FORWARD_TO_CHAT_ID[i])}`")
41 | except Exception as err:
42 | await client.send_message(chat_id="me", text=f"#ERROR: `{err}`")
43 |
--------------------------------------------------------------------------------
/helpers/kanger.py:
--------------------------------------------------------------------------------
1 | # (c) @AbirHasan2005
2 |
3 | import asyncio
4 | from configs import Config
5 | from pyrogram import Client
6 | from pyrogram.types import Message
7 | from pyrogram.errors import UserDeactivatedBan
8 | from helpers.forwarder import ForwardMessage
9 |
10 |
11 | async def Kanger(c: Client, m: Message):
12 | await m.edit(text=f"Checking `{str(Config.FORWARD_FROM_CHAT_ID[0])}` ...")
13 | await asyncio.sleep(2)
14 | try:
15 | ForwardFromChat = await c.get_chat(chat_id=Config.FORWARD_FROM_CHAT_ID[0])
16 | await m.edit(text=f"Successfully Linked with `{ForwardFromChat.title}` !")
17 | except Exception as err:
18 | await m.edit(text=f"Sorry, can't get **Forward From Chat**!\n\n**Error:** `{err}`")
19 | return 400
20 | await asyncio.sleep(2)
21 | for i in range(len(Config.FORWARD_TO_CHAT_ID)):
22 | await m.edit(text=f"Checking `{Config.FORWARD_TO_CHAT_ID[i]}` ...")
23 | await asyncio.sleep(2)
24 | try:
25 | ForwardToChat = await c.get_chat_member(chat_id=Config.FORWARD_TO_CHAT_ID[i], user_id=(await c.get_me()).id)
26 | if not ForwardToChat.permissions.can_send_messages:
27 | await m.edit(text=f"Sorry, you don't have permission to send messages in {ForwardToChat.title} !")
28 | return 400
29 | await m.edit(text=f"Successfully Linked with `{ForwardToChat.title}` !")
30 | await asyncio.sleep(2)
31 | except Exception as err:
32 | await m.edit(text=f"Sorry, can't get **Forward To Chat**!\n\n**Error:** `{err}`")
33 | return 400
34 | await asyncio.sleep(2)
35 | await m.edit(text="Trying to Forward Now ...")
36 | async for message in c.iter_history(chat_id=Config.FORWARD_FROM_CHAT_ID[0], reverse=True):
37 | await asyncio.sleep(Config.SLEEP_TIME)
38 | try:
39 | try_forward = await ForwardMessage(c, message)
40 | if try_forward == 400:
41 | return 400
42 | except UserDeactivatedBan:
43 | print("Congratulations!\nYour Account Banned Successfully!\nI already told you use a Fake Account. Hope you remember.")
44 | break
45 | except Exception as err:
46 | await c.send_message(chat_id="me", text=f"#ERROR: `{err}`")
47 | await m.edit(text="Channel Files Successfully Kanged!\n\n©️ A Forwarder Userbot by @AbirHasan2005")
48 |
--------------------------------------------------------------------------------
/main.py:
--------------------------------------------------------------------------------
1 | # (c) @AbirHasan2005 | Thomas Shelby
2 | # This is Telegram Messages Forwarder UserBot!
3 | # Use this at your own risk. I will not be responsible for any kind of issue while using this!
4 |
5 | import os
6 | import sys
7 | import time
8 | import asyncio
9 | from pyrogram import Client, filters, enums
10 | from pyrogram.types import Message
11 | from pyrogram.errors import FloodWait
12 | from configs import Config
13 | from helpers.kanger import Kanger
14 | from helpers.forwarder import ForwardMessage
15 |
16 | RUN = {"isRunning": True}
17 | User = Client(
18 | name='pyrogram',
19 | api_hash=Config.API_HASH,
20 | api_id=Config.API_ID,
21 | in_memory=True,
22 | session_string=Config.STRING_SESSION
23 | )
24 |
25 |
26 | @User.on_message((filters.text | filters.media))
27 | async def main(client: Client, message: Message):
28 | if (-100 in Config.FORWARD_TO_CHAT_ID) or (-100 in Config.FORWARD_FROM_CHAT_ID):
29 | try:
30 | await client.send_message(
31 | chat_id="me",
32 | text=f"#VARS_MISSING: Please Set `FORWARD_FROM_CHAT_ID` or `FORWARD_TO_CHAT_ID` Config!"
33 | )
34 | except FloodWait as e:
35 | await asyncio.sleep(e.value)
36 | return
37 | if (message.text == "!start") and message.from_user.is_self:
38 | if not RUN["isRunning"]:
39 | RUN["isRunning"] = True
40 | await message.edit(
41 | text=f"Hi, **{(await client.get_me()).first_name}**!\nThis is a Forwarder Userbot by @AbirHasan2005",
42 | disable_web_page_preview=True)
43 | elif (message.text == "!stop") and message.from_user.is_self:
44 | RUN["isRunning"] = False
45 | return await message.edit("Userbot Stopped!\n\nSend `!start` to start userbot again.")
46 | elif (message.text == "!help") and message.from_user.is_self and RUN["isRunning"]:
47 | await message.edit(
48 | text=Config.HELP_TEXT,
49 | disable_web_page_preview=True)
50 | elif message.text and (message.text.startswith("!add_forward_")) and message.from_user.is_self and RUN["isRunning"]:
51 | if len(message.text.split(" ", 1)) < 2:
52 | return await message.edit(f"{message.text} chat_id")
53 | for x in message.text.split(" ", 1)[-1].split(" "):
54 | if x.isdigit() and message.text.startswith("!add_forward_to_chat"):
55 | Config.FORWARD_TO_CHAT_ID.append(int(x))
56 | elif x.isdigit() and message.text.startswith("!add_forward_from_chat"):
57 | Config.FORWARD_FROM_CHAT_ID.append(int(x))
58 | elif x.lower().startswith("all_joined_"):
59 | chat_ids = []
60 | if x.lower() == "all_joined_groups":
61 | await message.edit("Listing all joined groups ...")
62 | async for dialog in client.get_dialogs():
63 | chat = dialog.chat
64 | if chat and (chat.type in [enums.ChatType.GROUP, enums.ChatType.SUPERGROUP]):
65 | chat_ids.append(chat.id)
66 | if x.lower() == "all_joined_channels":
67 | await message.edit("Listing all joined channels ...")
68 | async for dialog in client.get_dialogs():
69 | chat = dialog.chat
70 | if chat and (chat.type == enums.ChatType.CHANNEL):
71 | chat_ids.append(chat.id)
72 | if not chat_ids:
73 | return await message.edit("No Chats Found !!")
74 | for chat_id in chat_ids:
75 | if chat_id not in Config.FORWARD_TO_CHAT_ID:
76 | Config.FORWARD_TO_CHAT_ID.append(chat_id)
77 | else:
78 | pass
79 | return await message.edit("Added Successfully!")
80 | elif message.text and (message.text.startswith("!remove_forward_")) and message.from_user.is_self and RUN["isRunning"]:
81 | if len(message.text.split(" ", 1)) < 2:
82 | return await message.edit(f"{message.text} chat_id")
83 | for x in message.text.split(" ", 1)[-1].split(" "):
84 | try:
85 | if x.isdigit() and message.text.startswith("!remove_forward_to_chat"):
86 | Config.FORWARD_TO_CHAT_ID.remove(int(x))
87 | elif x.isdigit() and message.text.startswith("!remove_forward_from_chat"):
88 | Config.FORWARD_FROM_CHAT_ID.remove(int(x))
89 | else:
90 | pass
91 | except ValueError:
92 | pass
93 | return await message.edit("Removed Successfully!")
94 | elif (message.text in ["!restart"]) and message.from_user.is_self:
95 | if Config.HEROKU_APP is None:
96 | await message.edit(
97 | text="Restarting Userbot ...",
98 | disable_web_page_preview=True
99 | )
100 | # https://stackoverflow.com/a/57032597/15215201
101 | os.execl(sys.executable, sys.executable, *sys.argv)
102 | else:
103 | await message.edit(
104 | text="Restarting Heroku Dyno ..."
105 | )
106 | Config.HEROKU_APP.restart()
107 | time.sleep(30)
108 | elif (message.text == "!kang") and message.from_user.is_self and RUN["isRunning"]:
109 | if len(Config.FORWARD_FROM_CHAT_ID) > 1:
110 | await message.edit(
111 | text="Sorry Sir,\n"
112 | "We can Kang only one Chat! But you put multiple Chat IDs in `FORWARD_FROM_CHAT_ID` Config!",
113 | disable_web_page_preview=True
114 | )
115 | return
116 | await message.edit(
117 | text=f"Trying to Get All Messages from `{str(Config.FORWARD_FROM_CHAT_ID[0])}` and Forwarding to {' '.join(str(Config.FORWARD_TO_CHAT_ID))} ...",
118 | disable_web_page_preview=True)
119 | await asyncio.sleep(5)
120 | try_kang = await Kanger(c=User, m=message)
121 | if try_kang == 400:
122 | return
123 | elif message.chat.id in Config.FORWARD_FROM_CHAT_ID and RUN["isRunning"]:
124 | try_forward = await ForwardMessage(client, message)
125 | if try_forward == 400:
126 | return
127 |
128 |
129 | User.run()
130 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | pyrogram
2 | TgCrypto
3 | heroku3
4 |
--------------------------------------------------------------------------------