|
import string |
|
from random import choice |
|
from asyncio.exceptions import TimeoutError |
|
from Data import Data |
|
from pyrogram import Client, filters |
|
from telethon import TelegramClient |
|
from telethon.sessions import StringSession |
|
from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton |
|
from pyrogram.errors import ( |
|
ApiIdInvalid, |
|
PhoneNumberInvalid, |
|
PhoneCodeInvalid, |
|
PhoneCodeExpired, |
|
SessionPasswordNeeded, |
|
PasswordHashInvalid |
|
) |
|
from telethon.errors import ( |
|
ApiIdInvalidError, |
|
PhoneNumberInvalidError, |
|
PhoneCodeInvalidError, |
|
PhoneCodeExpiredError, |
|
SessionPasswordNeededError, |
|
PasswordHashInvalidError |
|
) |
|
|
|
def generate_random_string(length): |
|
characters = string.ascii_uppercase + string.digits |
|
random_string = ''.join(choice(characters) for _ in range(length)) |
|
return random_string |
|
|
|
ERROR_MESSAGE = "Oops! An exception occurred! \n\n**Error** : {} " \ |
|
"\n\nTolong Laporan ke [Support](t.me/xtdevs) jika eror " \ |
|
"sensitive information and you if want to report this as " \ |
|
"this error message is not being logged by us!" |
|
|
|
@Client.on_message(filters.private & filters.command('generate')) |
|
async def main(_, msg): |
|
await msg.reply( |
|
"Please press which string you want to take", |
|
reply_markup=InlineKeyboardMarkup( |
|
[ |
|
[ |
|
InlineKeyboardButton("Pyrogram", callback_data="pyrogram"), |
|
InlineKeyboardButton("Telethon", callback_data="telethon") |
|
] |
|
] |
|
) |
|
) |
|
|
|
|
|
async def generate_session(bot, msg, telethon=False): |
|
await msg.reply("Starting {} Session Generation...".format("Telethon" if telethon else "Pyrogram")) |
|
user_id = msg.chat.id |
|
api_id_msg = await bot.ask(user_id, 'Please Send `API_ID`', filters=filters.text) |
|
if await cancelled(api_id_msg): |
|
return |
|
try: |
|
api_id = int(api_id_msg.text) |
|
except ValueError: |
|
await api_id_msg.reply('not true API_ID (which must be an integer). Please start generating session again.', quote=True, reply_markup=InlineKeyboardMarkup(Data.generate_button)) |
|
return |
|
api_hash_msg = await bot.ask(user_id, 'Please Send `API_HASH`', filters=filters.text) |
|
if await cancelled(api_id_msg): |
|
return |
|
api_hash = api_hash_msg.text |
|
phone_number_msg = await bot.ask(user_id, "**Please Enter Your Telegram Phone Number With Country Code Format.**\nExample: +1xxxxxxxx", filters=filters.text) |
|
if await cancelled(api_id_msg): |
|
return |
|
phone_number = phone_number_msg.text |
|
await msg.reply("Sending OTP...") |
|
clients_name = generate_random_string(12) |
|
if telethon: |
|
client = TelegramClient(StringSession(), api_id, api_hash) |
|
else: |
|
client = Client("{}".format(clients_name), api_id, api_hash) |
|
await client.connect() |
|
try: |
|
if telethon: |
|
code = await client.send_code_request(phone_number) |
|
else: |
|
code = await client.send_code(phone_number) |
|
except (ApiIdInvalid, ApiIdInvalidError): |
|
await msg.reply('`API_ID` and `API_HASH` combination is invalid. Please start generating session again.', reply_markup=InlineKeyboardMarkup(Data.generate_button)) |
|
return |
|
except (PhoneNumberInvalid, PhoneNumberInvalidError): |
|
await msg.reply('`PHONE_NUMBER` is invalid. Please start generating session again.', reply_markup=InlineKeyboardMarkup(Data.generate_button)) |
|
return |
|
try: |
|
phone_code_msg = await bot.ask(user_id, "**Please Check OTP Code from Official [Telegram Account](tg://openmessage?user_id=777000).Send OTP Code here after reading Format below.\n\nIf OTP Code is 12345 Please [ ADD SPACE** ] send it Like this `1 2 3 4 5`", filters=filters.text, timeout=600) |
|
if await cancelled(api_id_msg): |
|
return |
|
except TimeoutError: |
|
await msg.reply('Time limit reached 10 minutes. Please start generating strings again.', reply_markup=InlineKeyboardMarkup(Data.generate_button)) |
|
return |
|
phone_code = phone_code_msg.text.replace(" ", "") |
|
try: |
|
if telethon: |
|
await client.sign_in(phone_number, phone_code, password=None) |
|
else: |
|
await client.sign_in(phone_number, code.phone_code_hash, phone_code) |
|
except (PhoneCodeInvalid, PhoneCodeInvalidError): |
|
await msg.reply('OTP is invalid. Please start generating session again.', reply_markup=InlineKeyboardMarkup(Data.generate_button)) |
|
return |
|
except (PhoneCodeExpired, PhoneCodeExpiredError): |
|
await msg.reply('OTP is expired. Please start generating session again.', reply_markup=InlineKeyboardMarkup(Data.generate_button)) |
|
return |
|
except (SessionPasswordNeeded, SessionPasswordNeededError): |
|
try: |
|
two_step_msg = await bot.ask(user_id, 'Your account has enabled two-step verification. Please provide the password.', filters=filters.text, timeout=300) |
|
except TimeoutError: |
|
await msg.reply('Time limit reached 10 minutes. Please start generating strings again.', reply_markup=InlineKeyboardMarkup(Data.generate_button)) |
|
return |
|
try: |
|
password = two_step_msg.text |
|
if telethon: |
|
await client.sign_in(password=password) |
|
else: |
|
await client.check_password(password=password) |
|
if await cancelled(api_id_msg): |
|
return |
|
except (PasswordHashInvalid, PasswordHashInvalidError): |
|
await two_step_msg.reply('Invalid Password Provided. Please start generating session again.', quote=True, reply_markup=InlineKeyboardMarkup(Data.generate_button)) |
|
return |
|
if telethon: |
|
string_session = client.session.save() |
|
else: |
|
string_session = await client.export_session_string() |
|
text = "**{} STRING SESSION** \n\n`{}` \n\nGenerated by @pantekyks".format("TELETHON" if telethon else "PYROGRAM", string_session) |
|
await client.send_message("me", text) |
|
await client.disconnect() |
|
await phone_code_msg.reply("Successfully Fetched {} session string.\n\nPlease check the Saved Message!\n\nBy @rencprx".format("telethon" if telethon else "pyrogram")) |
|
|
|
|
|
async def cancelled(msg): |
|
if "/cancel" in msg.text: |
|
await msg.reply("Cancel Process!", quote=True, reply_markup=InlineKeyboardMarkup(Data.generate_button)) |
|
return True |
|
elif "/restart" in msg.text: |
|
await msg.reply("Restarting Bots!", quote=True, reply_markup=InlineKeyboardMarkup(Data.generate_button)) |
|
return True |
|
elif msg.text.startswith("/"): |
|
await msg.reply("Cancel generation process!", quote=True) |
|
return True |
|
else: |
|
return False |
|
|