diff --git a/gpt 优化后的速度版本.py b/gpt 优化后的速度版本.py index aaa84a96b..32005f376 100644 --- a/gpt 优化后的速度版本.py +++ b/gpt 优化后的速度版本.py @@ -84,3 +84,4 @@ async def main(): if __name__ == "__main__": asyncio.run(main()) +# .\xray.exe -c .\1_5000_client_am_ip_1v1.json \ No newline at end of file diff --git a/models/__init__.py b/models/__init__.py new file mode 100644 index 000000000..172c75c01 --- /dev/null +++ b/models/__init__.py @@ -0,0 +1,23 @@ +import pymysql +from peewee import MySQLDatabase + +# 安装 pymysql 作为 MySQLdb +pymysql.install_as_MySQLdb() + +# 数据库配置 +db_config = { + 'database': 'lm', + 'user': 'lm', + 'password': 'phzEDrRDEeNZ7yFX', + 'host': '192.168.1.79', + 'port': 3306 +} + +# 全局数据库实例 +db = MySQLDatabase( + db_config['database'], + user=db_config['user'], + password=db_config['password'], + host=db_config['host'], + port=db_config['port'] +) diff --git a/models/device_info.py b/models/device_info.py new file mode 100644 index 000000000..97691eed6 --- /dev/null +++ b/models/device_info.py @@ -0,0 +1,16 @@ +from peewee import * +from models import db + + +class DeviceInfo(Model): + id = AutoField(primary_key=True) # 主键,自增字段 + phone = CharField(max_length=50, null=False) # varchar(50) NOT NULL + device_model = CharField(max_length=50, null=False) # varchar(50) NOT NULL + system_version = CharField(max_length=50, default='Windows 10') # varchar(50) DEFAULT 'Windows 10' + app_version = CharField(max_length=50, default='5.5.5 x64') # varchar(50) DEFAULT '5.5.5 x64' + is_valid_session = IntegerField(default=0) # int DEFAULT '0' COMMENT '0 无效, 1 有效' + host = CharField(max_length=50, null=True) # varchar(50) DEFAULT NULL COMMENT '服务器ip' + + class Meta: + database = db # 指定数据库 + table_name = 'device_info' # 指定表名 \ No newline at end of file diff --git a/models/tg_models.py b/models/tg_models.py new file mode 100644 index 000000000..94828e1f8 --- /dev/null +++ b/models/tg_models.py @@ -0,0 +1,143 @@ +from models import db +from peewee import * + + +class TelegramAccount(Model): + id = AutoField() + server_id = CharField(max_length=255, null=True, column_name='server_id') + ld_name = CharField(max_length=255, null=True, column_name='ld_name') + index_id = IntegerField(null=True, column_name='index_id') + one_phone_number = CharField(max_length=10, null=True, column_name='one_phone_number') + telephone = CharField(max_length=255, null=True, column_name='telephone') + phone_type = IntegerField(null=True, column_name='phone_type') + is_logged_in_telegram = IntegerField(null=True, column_name='is_logged_in_telegram') + manufacturer = CharField(null=True, ) # 电话号码 + + proxy_type = CharField(null=True, ) # 电话号码 + addr = CharField(null=True, ) # 电话号码 + port = CharField(null=True, ) # 电话号码 + user = CharField(null=True, ) # 电话号码 + pwd = CharField(null=True, ) # 电话号码 + + # url = CharField(max_length=255, null=True, column_name='url') + # login_cipher = CharField(max_length=255, null=True, column_name='login_cipher') + # is_check_out_device = IntegerField(null=True, column_name='is_check_out_device') + # check_out_device_time = CharField(max_length=255, null=True, column_name='check_out_device_time') + # logged_in_telegram_time = CharField(max_length=255, null=True, column_name='logged_in_telegram_time') + # is_logged_in_wallet = IntegerField(null=True, column_name='is_logged_in_wallet') + # logged_in_wallet_time = CharField(max_length=255, null=True, column_name='logged_in_wallet_time') + # paw_2fa = CharField(max_length=255, null=True, column_name='paw_2fa') + # create_time = CharField(max_length=255, null=True, column_name='create_time') + # update_time = CharField(max_length=255, null=True, column_name='update_time') + # paw_2fa_time = CharField(max_length=255, null=True, column_name='paw_2fa_time') + # hk_url = CharField(max_length=255, null=True, column_name='hk_url') + # cats_stast = CharField(max_length=255, null=True, column_name='cats_stast') + # bit_id = CharField(max_length=255, null=True, column_name='bit_id') + # bit_name = CharField(max_length=255, null=True, column_name='bit_name') + # backups = IntegerField(null=True, column_name='backups') + # tg_start = CharField(max_length=255, null=True, ) + # mumu_is_logged_in_telegram = IntegerField(null=True, ) + + class Meta: + database = db + table_name = 'teleqram_account' + + +class TelegramAccountMumu(Model): + id = AutoField() + server_id = CharField(max_length=255, null=True, column_name='server_id') + ld_name = CharField(max_length=255, null=True, column_name='ld_name') + index_id = IntegerField(null=True, column_name='index_id') + one_phone_number = CharField(max_length=10, null=True, column_name='one_phone_number') + telephone = CharField(max_length=255, null=True, column_name='telephone') + url = CharField(max_length=255, null=True, column_name='url') + phone_type = IntegerField(null=True, column_name='phone_type') + is_logged_in_telegram = IntegerField(null=True, column_name='is_logged_in_telegram') + login_cipher = CharField(max_length=255, null=True, column_name='login_cipher') + is_check_out_device = IntegerField(null=True, column_name='is_check_out_device') + check_out_device_time = CharField(max_length=255, null=True, column_name='check_out_device_time') + logged_in_telegram_time = CharField(max_length=255, null=True, column_name='logged_in_telegram_time') + is_logged_in_wallet = IntegerField(null=True, column_name='is_logged_in_wallet') + logged_in_wallet_time = CharField(max_length=255, null=True, column_name='logged_in_wallet_time') + paw_2fa = CharField(max_length=255, null=True, column_name='paw_2fa') + create_time = CharField(max_length=255, null=True, column_name='create_time') + update_time = CharField(max_length=255, null=True, column_name='update_time') + paw_2fa_time = CharField(max_length=255, null=True, column_name='paw_2fa_time') + hk_url = CharField(max_length=255, null=True, column_name='hk_url') + cats_stast = CharField(max_length=255, null=True, column_name='cats_stast') + bit_id = CharField(max_length=255, null=True, column_name='bit_id') + bit_name = CharField(max_length=255, null=True, column_name='bit_name') + backups = IntegerField(null=True, column_name='backups') + + class Meta: + database = db + table_name = 'teleqram_account_mumu' + + +# 定义服务器信息模型 +class ServerInfo(Model): + id = AutoField() + server_id = CharField(max_length=255, null=True, help_text='服务器id') + index_id = IntegerField(null=True, help_text='模拟器id') + one_phone_number = CharField(max_length=10, null=True, help_text='电话号码区号', + collation='utf8mb3_general_ci') + telephone = CharField(max_length=255, null=True, help_text='电话号码', collation='utf8mb3_general_ci') + url = CharField(max_length=255, null=True, help_text='验证码url', collation='utf8mb3_general_ci') + phone_type = IntegerField(null=True, help_text='电话号码状态 0:已死1:活着') + text = CharField(max_length=255, null=True, help_text='助忘词', collation='utf8mb3_general_ci') + token = CharField(max_length=255, null=True, help_text='钱包地址', collation='utf8mb3_general_ci') + is_logged_in_telegram = IntegerField(null=True, help_text='是否登录了tg 0:登录失败1:登录成功') + login_cipher = CharField(max_length=255, null=True, help_text='登录密码', collation='utf8mb3_general_ci') + is_check_out_device = IntegerField(null=True, help_text='是否登出设备 0 :踢设备失败1:以踢设备') + logged_in_telegram_time = CharField(max_length=255, null=True, help_text='登录telegram的时间', + collation='utf8mb3_general_ci') + is_logged_in_wallet = IntegerField(null=True, help_text='是否绑定了wallet 0:绑定失败1:已绑定') + logged_in_wallet_time = CharField(max_length=255, null=True, help_text='绑定钱包时间', + collation='utf8mb3_general_ci') + is_logged_in_dogs = IntegerField(null=True, help_text='是否绑定了dogs') + logged_in_dogs_time = CharField(max_length=255, null=True, help_text='绑定dogs时间', + collation='utf8mb3_general_ci') + is_logged_rocket = IntegerField(null=True, help_text='是否绑定小火箭 1.绑钱包 ,2.做任务 3.点击小火箭') + logged_rocket_time = CharField(max_length=255, null=True, help_text='小火箭绑定时间', + collation='utf8mb3_general_ci') + rocket_click_integral = CharField(max_length=255, null=True, help_text='小火箭积分', + collation='utf8mb4_0900_ai_ci') + rocket_invitation_code = CharField(max_length=255, null=True, help_text='小火箭邀请码', + collation='utf8mb3_general_ci') + check_out_device_time = CharField(max_length=255, null=True, help_text='踢设备时间', + collation='utf8mb3_general_ci') + mailbox = CharField(max_length=255, null=True, help_text='设备保存邮箱', collation='utf8mb3_general_ci') + error_text = TextField(null=True, help_text='错误信息', collation='utf8mb3_general_ci') + evm_privateKey = CharField(max_length=255, null=True, help_text='evm私钥', collation='utf8mb3_general_ci') + evm_address = CharField(max_length=255, null=True, help_text='evm地址', collation='utf8mb3_general_ci') + roketocoin_code = CharField(max_length=255, null=True, help_text='太空人邀请链接', + collation='utf8mb3_general_ci') + roketocoin_start_time = CharField(max_length=255, null=True, help_text='太空人开始时间', + collation='utf8mb3_general_ci') + roketocoin_stop_time = CharField(max_length=255, null=True, help_text='太空人结束时间', + collation='utf8mb3_general_ci') + upgrade_type = IntegerField(null=True, help_text='太空人升级类型') + hk_url = CharField(max_length=255, null=True, help_text='仓鼠邀请连接') + cats_url = CharField(max_length=255, null=True, help_text='cats邀请码') + cats_integral = CharField(max_length=255, null=True, help_text='cats积分') + cats_task = IntegerField(null=True, help_text='cats任务状态') + login_email = CharField(max_length=255, null=True, help_text='登录邮箱') + login_email_type = IntegerField(null=True, help_text='0:没有绑上,1:绑上了') + bit_id = CharField(max_length=255, null=True, help_text='比特浏览器的id', collation='utf8mb4_0900_ai_ci') + bit_type = CharField(max_length=255, null=True) + blum_info = TextField(null=True, collation='utf8mb4_0900_ai_ci') + depin_info = CharField(max_length=100, null=True) + cs_info = TextField(null=True, collation='utf8mb4_0900_ai_ci') + hk_wallet = IntegerField(null=True) + + class Meta: + database = db # 使用指定的数据库 + table_name = 'server_info' # 表名 + + +# 示例操作 +if __name__ == "__main__": + + data = TelegramAccount.select().where(TelegramAccount.is_logged_in_telegram == 1) + for i in data: + print(i.id) diff --git a/models/tg_phone_devices.py b/models/tg_phone_devices.py new file mode 100644 index 000000000..1f020fe0d --- /dev/null +++ b/models/tg_phone_devices.py @@ -0,0 +1,64 @@ +from datetime import datetime + +from models import db +from peewee import * + + +class TgPhoneDevices(Model): + id = AutoField() # 自动递增的主键 + area_code = CharField(null=True, max_length=255, help_text='电话号码区号') # 区号 + phone_number = CharField(null=True, max_length=255, help_text='电话号码') # 电话号码 + device_model = CharField(null=True, max_length=255, help_text='设备型号') # 设备型号 + system_version = CharField(null=True, max_length=255, help_text='系统版本') # 系统版本 + app_version = CharField(null=True, max_length=255, help_text='应用版本') # 应用版本 + lang_code = CharField(null=True, max_length=255, help_text='语言代码') # 语言代码 + system_lang_code = CharField(null=True, max_length=255, help_text='系统语言代码') # 系统语言代码 + is_valid_session = IntegerField(null=True, help_text='Session 状态') # Session 状态 + api_id = IntegerField(null=True, help_text='API ID') # API ID + kick_status = IntegerField(null=True, help_text='API ID') # API ID + api_hash = CharField(null=True, max_length=255, help_text='API Hash') # API Hash + phone = CharField(null=True, max_length=255, help_text='完整电话号码') # 电话号码 + create_time = DateTimeField(default=datetime.now, help_text='记录创建时间') + code = CharField(null=True, ) # 电话号码 + to_code = CharField(null=True, ) # 电话号码 + server_ip = CharField(null=True, ) # 电话号码 + proxy_type = CharField(null=True, ) # 电话号码 + addr = CharField(null=True, ) # 电话号码 + port = CharField(null=True, ) # 电话号码 + user = CharField(null=True, ) # 电话号码 + pwd = CharField(null=True, ) # 电话号码 + device_start = IntegerField(null=True, ) # API ID + + class Meta: + database = db # 指定数据库 + table_name = 'tg_phone_devices' # 指定表名称 + + +class TgPhoneDevices1(Model): + id = AutoField() # 自动递增的主键 + area_code = CharField(null=True, max_length=255, help_text='电话号码区号') # 区号 + phone_number = CharField(null=True, max_length=255, help_text='电话号码') # 电话号码 + device_model = CharField(null=True, max_length=255, help_text='设备型号') # 设备型号 + system_version = CharField(null=True, max_length=255, help_text='系统版本') # 系统版本 + app_version = CharField(null=True, max_length=255, help_text='应用版本') # 应用版本 + lang_code = CharField(null=True, max_length=255, help_text='语言代码') # 语言代码 + system_lang_code = CharField(null=True, max_length=255, help_text='系统语言代码') # 系统语言代码 + is_valid_session = IntegerField(null=True, help_text='Session 状态') # Session 状态 + api_id = IntegerField(null=True, help_text='API ID') # API ID + kick_status = IntegerField(null=True, help_text='API ID') # API ID + api_hash = CharField(null=True, max_length=255, help_text='API Hash') # API Hash + phone = CharField(null=True, max_length=255, help_text='完整电话号码') # 电话号码 + create_time = DateTimeField(default=datetime.now, help_text='记录创建时间') + code = CharField(null=True, ) # 电话号码 + to_code = CharField(null=True, ) # 电话号码 + server_ip = CharField(null=True, ) # 电话号码 + proxy_type = CharField(null=True, ) # 电话号码 + addr = CharField(null=True, ) # 电话号码 + port = CharField(null=True, ) # 电话号码 + user = CharField(null=True, ) # 电话号码 + pwd = CharField(null=True, ) # 电话号码 + device_start = IntegerField(null=True, ) # API ID + + class Meta: + database = db # 指定数据库 + table_name = 'tg_phone_devices_copy1' # 指定表名称 diff --git a/test111.py b/test111.py index 9cc1cdac3..6068b20ba 100644 --- a/test111.py +++ b/test111.py @@ -1,43 +1,10 @@ -import random -import time - -import requests -from tonutils.utils import to_amount - - -def get_ton_num(address): - headers = { - 'accept': '*/*', - 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', - 'authorization': 'Bearer AFPJTKEBPOX3AIYAAAAKA2HWOTRNJP5MUCV5DMDCZAAOCPSAYEYS3CILNQVLF2HWKED6USY', - 'cache-control': 'no-cache', - 'content-type': 'application/json', - 'dnt': '1', - 'origin': 'https://tonviewer.com', - 'pragma': 'no-cache', - 'priority': 'u=1, i', - 'referer': 'https://tonviewer.com/', - 'sec-ch-ua': '"Not A(Brand";v="8", "Chromium";v="132", "Microsoft Edge";v="132"', - 'sec-ch-ua-mobile': '?0', - 'sec-ch-ua-platform': '"Windows"', - 'sec-fetch-dest': 'empty', - 'sec-fetch-mode': 'cors', - 'sec-fetch-site': 'cross-site', - 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0', - } - - for i in range(3): - try: - response = requests.get( - f'https://tonapi.io/v2/accounts/{address}', - headers=headers, - ) - - return to_amount(int(response.json()["balance"])) - except: - time.sleep(random.random()) - - return False +from models.tg_phone_devices import TgPhoneDevices1, TgPhoneDevices if __name__ == '__main__': - print(get_ton_num(address="EQD-8WpOhknZ6Wip9EN-jz5Tw-SJvYgu_x2FSDFlXH1kSo2O")) \ No newline at end of file + for i in TgPhoneDevices1.select(): + tg_info = TgPhoneDevices.get_or_none( + phone=i.phone, + ) + + i.port = tg_info.port + i.save() diff --git a/tg/text.py b/tg/text.py new file mode 100644 index 000000000..355e3e871 --- /dev/null +++ b/tg/text.py @@ -0,0 +1,312 @@ +import asyncio +import csv +import random +import re +from urllib.parse import unquote + +from loguru import logger +from telethon import TelegramClient, functions +from telethon.errors import NewSaltInvalidError, NewSettingsInvalidError, PasswordHashInvalidError, FloodWaitError, \ + PeerFloodError, UserPrivacyRestrictedError, ChatAdminRequiredError, UserAlreadyParticipantError, UserKickedError, \ + ChannelsTooMuchError, UsersTooMuchError, ChatWriteForbiddenError, BadRequestError, RPCError +from telethon.tl import types +from telethon.tl.functions.account import GetAuthorizationsRequest, ResetAuthorizationRequest +from telethon.tl.functions.channels import JoinChannelRequest, InviteToChannelRequest, GetFullChannelRequest +from telethon.tl.functions.messages import RequestAppWebViewRequest, StartBotRequest, ExportChatInviteRequest, \ + AddChatUserRequest, ImportChatInviteRequest +from telethon.tl.types import InputBotAppShortName, ChannelParticipantsSearch, Chat, Channel, User + +from models.tg_phone_devices import TgPhoneDevices + + +async def create_telegram_client(server): + """ + 创建并配置 Telegram 客户端 + """ + + proxy = { + 'proxy_type': server.proxy_type, # 或 'socks4',具体看你的代理类型 + 'addr': "192.168.1.79", # 代理服务器地址 + 'port': int(server.port), # 代理服务器端口 + 'username': server.user if server.user else "", # 如果有用户名,填写 + 'password': server.pwd if server.pwd else "" # 如果有密码,填写 + } + + client = TelegramClient( + fr"C:\Users\27942\Desktop\session\sessions\{server.phone}", + api_id=server.api_id, + api_hash=server.api_hash, + device_model=server.device_model, + system_version=server.system_version, + app_version=server.app_version, + system_lang_code=server.system_lang_code, + lang_code=server.lang_code, + proxy=proxy + ) + return client + + +async def main1111(phone=None): + server, server_type = TgPhoneDevices().get_or_create( + phone=phone, + ) + + client = await create_telegram_client(server) + + await client.connect() + + # await client.log_out() + + # if await client.is_user_authorized(): + # me = await client.get_me() + # logger.info(f'账号 {8617882004254} -- {me.username} 登录成功!') + # + # print(me.first_name) + # print(me.last_name) + # else: + # logger.error(f'账号 {8617882004254} 登录失败!') + + # =========================================================================================================== + # await client.send_message('dockerse', 'hrhrerhrhrhrhml2') + + # -------------------------------------------------------------------------------- + # # 查询所有聊天 + # bot_username = "pengu_clash_bot" + # async for dialog in client.iter_dialogs(): + # # print(dialog) + # try: + # for i in dialog.entity.usernames: + # if i.username == bot_username: + # logger.info(f'已与机器人交互: @{bot_username}') + # return True + # except: + # pass + # if dialog.is_user and dialog.entity.username == bot_username: + # logger.info(f'已与机器人交互: @{bot_username}') + # return True + # logger.info(f'尚未与机器人交互: @{bot_username}') + + # bot_username = "BlumCryptoBot" + # + # # 获取目标 Bot 的实体信息 + # bot_entity = await client.get_input_entity(bot_username) + # print(bot_entity) + + # # 获取用户的所有对话列表 + # dialogs = await client.get_dialogs() + # + # # 遍历对话列表,检查是否存在该 Bot 的私聊 + # for dialog in dialogs: + # print(dialog) + # if dialog.entity.id == bot_entity.id: + # print(1) + + # ------------------------------------------------------------------------------ + # ###点击 confirm + # # 获取最近5条消息(避免漏掉) + # messages = await client.get_messages(777000, limit=5) + # if not messages: + # print("未找到验证消息") + # return + # + # # 遍历消息,寻找包含按钮的验证消息 + # for message in messages: + # if message.buttons: + # for row in message.buttons: + # for button in row: + # if 'confirm' in button.text.lower(): + # try: + # await button.click() + # print(f"已点击消息 {message.id} 的 Confirm 按钮") + # except: + # pass + # + + # --------------------------------------------------------- + # # 获取所有登录设别信息 + # # 发送请求以获取授权信息 + # authorizations = await client(GetAuthorizationsRequest()) + # + # # 打印每个授权会话的信息 + # for authorization in authorizations.authorizations: + # print(f"授权ID: {authorization.hash}") + # print(f"设备模型: {authorization.device_model}") + # print(f"平台: {authorization.platform}") + # print(f"系统版本: {authorization.system_version}") + # print(f"应用名称: {authorization.app_name}") + # print(f"应用版本: {authorization.app_version}") + # print(f"IP 地址: {authorization.ip}") + # print(f"国家: {authorization.country}") + # print(f"创建时间: {authorization.date_created}") + # print(f"最后活跃时间: {authorization.date_active}") + # print(f"是否官方应用: {'是' if authorization.official_app else '否'}") + # print(f"是否当前设备: {'是' if authorization.current else '否'}") + # print('-' * 40) + + # ---------------------------------------------------------------------------------------- + # # 踢出指定设备名的设备 + # + # # 发送请求以获取授权信息 + # authorizations = await client(GetAuthorizationsRequest()) + # + # # 设定你要踢出的设备名 + # target_device_model = 'Microsoft Edge 121' + # + # # 遍历所有授权会话 + # for authorization in authorizations.authorizations: + # if authorization.device_model == target_device_model and not authorization.current: + # # 踢出指定设备 + # await client(ResetAuthorizationRequest(hash=authorization.hash)) + # print(f"已踢出设备: {authorization.device_model} (授权ID: {authorization.hash})") + # else: + # print(f"未找到或跳过当前设备: {authorization.device_model} (授权ID: {authorization.hash})") + + # # --------------------------------------------------------------------------------------------- + # try: + # await client.edit_2fa(current_password="Haxi@123456@", new_password="123456qwe") + # except NewSettingsInvalidError: + # print(1) + # except PasswordHashInvalidError: + # print(2) + + # --------------------------------------------------------------------------------------------------- + # 使用邀请码启动bot + # 使用邀请码启动bot + + # bot_name = "BlumCryptoBot" + # invite_code = "ref_H21tvNwu3n" + # + # result = await client(StartBotRequest( + # bot=bot_name, + # peer=bot_name, + # start_param=invite_code + # )) + # + # + # logger.info(result) + + # ------------------------------------------------------------------------------------------------- + # 获取bot实体 + # 使用start_params请求WebApp + + # bot_name = "BlumCryptoBot" + # invite_code = "ref_H21tvNwu3n" + # + # await client.get_input_entity(bot_name) + # + # app_info = await client(RequestAppWebViewRequest( + # 'me', + # InputBotAppShortName(await client.get_input_entity(bot_name), "app"), + # platform="web", + # start_param=invite_code if invite_code else None + # )) + # + # tgData = unquote(app_info.url.split('tgWebAppData=')[1].split('&tgWebAppVersion')[0]) + # print(tgData) + + # ------------------------------------------------------------------------------------------------ + + # a = await client(JoinChannelRequest('webseaml2')) + # print(a) + + # messages = await client.get_messages('webseaml2', 100) + # for line in messages: + # print(line) + + # # ✅ 用链接获取群实体 + # group = await client.get_entity('https://t.me/webseaml2') + # + # # ✅ 获取目标用户实体(可以是用户名或 user_id) + # user = await client.get_entity('dockerse') + # + # # ✅ 邀请(必须是群管理员) + # await client(InviteToChannelRequest( + # channel=group, + # users=[user] + # )) + + # user = await client.get_entity('dockerse') + # print(user.id) # 打印用户 ID + + # messages = await client.get_messages(bot, limit=1) + # # print(messages[0].Message.data.message) + # + # # if not messages: + # # print("未找到验证消息") + # # return + # + # # # 遍历消息,寻找包含按钮的验证消息 + # for message in messages: + # print(message.message) + # # if message.buttons: + # # for row in message.buttons: + # # for button in row: + # # if 'now' in button.text.lower(): + # # try: + # # await button.click() + # # print(f"已点击消息 {message.id} 的 Confirm 按钮") + # # except: + # # pass + + # ============================================================================= + # 拉人进群 + # target_group = await client.get_entity("webseaml2") + # users_to_add = [ + # await client.get_entity("pantakill"), + # # 可放更多用户 + # ] + # await client(InviteToChannelRequest(target_group, users_to_add)) + + # # 2️⃣ 发送消息 + # update = await client(ImportChatInviteRequest("+E6E4i3svka81MGY1")) + # chat = update.chats[0] + # try: + # await client.send_message(chat.id, "你好,这是一条来自 Telethon 的测试消息!") + # print("消息已发送!") + # except Exception as e: + # print(f"发送失败: {e}") + + # #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + # print("正在获取对话列表...") + # # 获取所有对话 + # dialogs = await client.get_dialogs() + # + # # 退出所有群聊 + # for dialog in dialogs: + # if dialog.is_group or dialog.is_channel: + # try: + # await client.delete_dialog(dialog.entity) + # print(f"已退出群聊/频道: {dialog.title}") + # except Exception as e: + # print(f"退出群聊/频道 {dialog.title} 时出错: {e}") + # + # # 取消关注所有机器人 + # for dialog in dialogs: + # if hasattr(dialog.entity, 'bot') and dialog.entity.bot: + # try: + # await client.delete_dialog(dialog.entity) + # print(f"已取消关注机器人: {dialog.title}") + # except Exception as e: + # print(f"取消关注机器人 {dialog.title} 时出错: {e}") + + # ============================================================================================ + # 获取验证码 + messages = await client.get_messages(777000, 1) + message_text = messages[0].text + + try: + code = re.findall(r'\d{6}', message_text)[0] + logger.info(f"当前验证码:{code}") + + await client.disconnect() + + return code + + except: + logger.error("获取验证码失败!!!") + + +# if __name__ == '__main__': +# asyncio.run(main()) + +# .\xray.exe -c .\1_3078_client_liu_http_ip_1v1.json diff --git a/tg/查询所有号存活状态.py b/tg/查询所有号存活状态.py new file mode 100644 index 000000000..ecf6f1d7e --- /dev/null +++ b/tg/查询所有号存活状态.py @@ -0,0 +1,188 @@ +import asyncio +import os.path +import random +import threading +import time +import traceback + +from urllib.parse import unquote + +from loguru import logger +from telethon import TelegramClient +from telethon.errors import PhoneNumberBannedError +from telethon.tl.functions.account import GetAuthorizationsRequest +from telethon.tl.functions.messages import RequestAppWebViewRequest +from telethon.tl.types import InputBotAppShortName + +from models.tg_phone_devices import TgPhoneDevices + + +async def create_telegram_client(server_type): + """ + 创建并配置 Telegram 客户端 + """ + + proxy = { + 'proxy_type': server_type.proxy_type, # 或 'socks4',具体看你的代理类型 + # 'addr': server_type.addr, # 代理服务器地址 + 'addr': "192.168.1.79", # 代理服务器地址 + 'port': int(server_type.port), # 代理服务器端口 + 'username': server_type.user if server_type.user else "", # 如果有用户名,填写 + 'password': server_type.pwd if server_type.pwd else "" # 如果有密码,填写 + } + + try: + client = TelegramClient( + fr"C:\Users\27942\Desktop\session\sessions\{server_type.phone}", + api_id=server_type.api_id, + api_hash=server_type.api_hash, + system_lang_code=server_type.system_lang_code, + lang_code=server_type.lang_code, + + device_model=server_type.device_model, + system_version=server_type.system_version, + app_version=server_type.app_version, + + proxy=proxy, + auto_reconnect=False, + ) + return client + except Exception as e: + print(e) + traceback.print_stack() + logger.error(f"当前电话号码:{server_type.phone},有问题!!!") + + +async def login_and_validate(server): + client = await create_telegram_client(server) + + try: + + try: + await client.connect() + except Exception as e: + server.is_valid_session = 4 + server.save(only=[TgPhoneDevices.is_valid_session]) + + return + + if await client.is_user_authorized(): + me = await client.get_me() + logger.info(f'账号 {me.phone} -- {me.first_name} 登录成功!!!') + + server.is_valid_session = 1 + + time.sleep(random.randint(3, 8)) + + # 获取设备数 + authorizations = await client(GetAuthorizationsRequest()) + server.device_start = len(authorizations.authorizations) + + time.sleep(random.randint(3, 8)) + + # 判断是否被冻结了 + bot_username = "BlumCryptoBot" + start = 0 + async for dialog in client.iter_dialogs(): + try: + for i in dialog.entity.usernames: + if i.username == bot_username: + logger.info(f'账号 {server.phone},已与机器人交互: @{bot_username}') + start = 1 + break + + if start: + break + except: + pass + if dialog.is_user and dialog.entity.username == bot_username: + logger.info(f'账号 {server.phone},已与机器人交互: @{bot_username}') + start = 1 + break + + try: + if not start: + logger.info(f'账号 {server.phone},尚未与机器人交互: @{bot_username}') + bot = await client.get_entity(bot_username) # 获取bot实体 + await client.send_message(bot, '/start') + + invite_code = "ref_H21tvNwu3n" + + await client.get_input_entity(bot_username) + + app_info = await client(RequestAppWebViewRequest( + 'me', + InputBotAppShortName(await client.get_input_entity(bot_username), "app"), + platform="web", + start_param=invite_code if invite_code else None + )) + + tgData = unquote(app_info.url.split('tgWebAppData=')[1].split('&tgWebAppVersion')[0]) + print(tgData) + except Exception as e: + print(e) + server.is_valid_session = 3 + + else: + logger.error(f'账号 {server.phone} 授权失败!!!') + server.is_valid_session = 0 + except PhoneNumberBannedError: + logger.error(f"账号 {server.phone},账号以死!!!") + + server.is_valid_session = -1 + + server.save(only=[TgPhoneDevices.is_valid_session, TgPhoneDevices.device_start]) + logger.success('数据已更新') + client.disconnect() + + +async def start_task(server): + try: + status = check_exist_session_file(server.phone) + if not status: + server.is_valid_session = -1 + server.save(only=[TgPhoneDevices.is_valid_session]) + return + + await login_and_validate(server) + except Exception as e: + a = f"1{e}" + if a == "1Connection to Telegram failed 5 time(s)": + server.is_valid_session = 4 + server.save(only=[TgPhoneDevices.is_valid_session]) + + logger.error(f"当前电话号码:{server.phone},有问题!!!") + + +def check_exist_session_file(phone): + path = fr"C:\Users\27942\Desktop\session\sessions\{phone}.session" + is_exist_session_file = os.path.isfile(path) + if not is_exist_session_file: + logger.error(f'未找到session文件:{path}') + return False + + return True + + +def main1(server): + asyncio.run(start_task(server=server)) + + +def main(): + devices = TgPhoneDevices.select().where( + TgPhoneDevices.is_valid_session.is_null(False), + # TgPhoneDevices.phone.is_null(False) + # TgPhoneDevices.device_start.is_null() + # TgPhoneDevices.kick_status.is_null() + ) + logger.info(f'本轮需要检查:{len(devices)}') + + for _, server in enumerate(devices): + logger.info(f'正在检测,第{_},账号:{server.phone}') + # main1(server=server) + threading.Thread(target=main1, args=(server,)).start() + time.sleep(0.3) + + +if __name__ == '__main__': + main() diff --git a/tg/查询所有号存活状态1.py b/tg/查询所有号存活状态1.py new file mode 100644 index 000000000..89c56f3fc --- /dev/null +++ b/tg/查询所有号存活状态1.py @@ -0,0 +1,189 @@ +import asyncio +import os.path +import random +import threading +import time +import traceback + +from urllib.parse import unquote + +from loguru import logger +from telethon import TelegramClient +from telethon.errors import PhoneNumberBannedError +from telethon.tl.functions.account import GetAuthorizationsRequest +from telethon.tl.functions.messages import RequestAppWebViewRequest +from telethon.tl.types import InputBotAppShortName + +from models.tg_phone_devices import TgPhoneDevices1 + + +async def create_telegram_client(server_type): + """ + 创建并配置 Telegram 客户端 + """ + + proxy = { + 'proxy_type': server_type.proxy_type, # 或 'socks4',具体看你的代理类型 + # 'addr': server_type.addr, # 代理服务器地址 + 'addr': "192.168.1.79", # 代理服务器地址 + 'port': int(server_type.port), # 代理服务器端口 + 'username': server_type.user if server_type.user else "", # 如果有用户名,填写 + 'password': server_type.pwd if server_type.pwd else "" # 如果有密码,填写 + } + + try: + client = TelegramClient( + fr"C:\sessions\{server_type.phone}", + api_id=server_type.api_id, + api_hash=server_type.api_hash, + system_lang_code=server_type.system_lang_code, + lang_code=server_type.lang_code, + + device_model=server_type.device_model, + system_version=server_type.system_version, + app_version=server_type.app_version, + + proxy=proxy, + # auto_reconnect=False, + ) + return client + except Exception as e: + print(e) + traceback.print_stack() + logger.error(f"当前电话号码:{server_type.phone},有问题!!!") + + +async def login_and_validate(server): + client = await create_telegram_client(server) + + try: + + try: + await client.connect() + except Exception as e: + server.is_valid_session = 4 + server.save(only=[TgPhoneDevices1.is_valid_session]) + + return + + if await client.is_user_authorized(): + me = await client.get_me() + logger.info(f'账号 {me.phone} -- {me.first_name} 登录成功!!!') + + server.is_valid_session = 1 + + time.sleep(random.randint(3, 8)) + + # 获取设备数 + authorizations = await client(GetAuthorizationsRequest()) + server.device_start = len(authorizations.authorizations) + + time.sleep(random.randint(3, 8)) + + # 判断是否被冻结了 + bot_username = "BlumCryptoBot" + start = 0 + async for dialog in client.iter_dialogs(): + try: + for i in dialog.entity.usernames: + if i.username == bot_username: + logger.info(f'账号 {server.phone},已与机器人交互: @{bot_username}') + start = 1 + break + + if start: + break + except: + pass + if dialog.is_user and dialog.entity.username == bot_username: + logger.info(f'账号 {server.phone},已与机器人交互: @{bot_username}') + start = 1 + break + + try: + if not start: + logger.info(f'账号 {server.phone},尚未与机器人交互: @{bot_username}') + bot = await client.get_entity(bot_username) # 获取bot实体 + await client.send_message(bot, '/start') + + invite_code = "ref_H21tvNwu3n" + + await client.get_input_entity(bot_username) + + app_info = await client(RequestAppWebViewRequest( + 'me', + InputBotAppShortName(await client.get_input_entity(bot_username), "app"), + platform="web", + start_param=invite_code if invite_code else None + )) + + tgData = unquote(app_info.url.split('tgWebAppData=')[1].split('&tgWebAppVersion')[0]) + print(tgData) + except Exception as e: + print(e) + server.is_valid_session = 3 + + else: + logger.error(f'账号 {server.phone} 授权失败!!!') + server.is_valid_session = 0 + except PhoneNumberBannedError: + logger.error(f"账号 {server.phone},账号以死!!!") + + server.is_valid_session = -1 + + server.save(only=[TgPhoneDevices1.is_valid_session, TgPhoneDevices1.device_start]) + logger.success('数据已更新') + client.disconnect() + + +async def start_task(server): + try: + status = check_exist_session_file(server.phone) + if not status: + server.is_valid_session = -1 + server.save(only=[TgPhoneDevices1.is_valid_session]) + return + + await login_and_validate(server) + except Exception as e: + a = f"1{e}" + if a == "1Connection to Telegram failed 5 time(s)": + server.is_valid_session = 4 + server.save(only=[TgPhoneDevices1.is_valid_session]) + + logger.error(f"当前电话号码:{server.phone},有问题!!!") + + +def check_exist_session_file(phone): + path = fr"C:\sessions\{phone}.session" + is_exist_session_file = os.path.isfile(path) + if not is_exist_session_file: + logger.error(f'未找到session文件:{path}') + return False + + return True + + +def main1(server): + asyncio.run(start_task(server=server)) + + +def main(): + devices = TgPhoneDevices1.select().where( + TgPhoneDevices1.is_valid_session.is_null(False), + # TgPhoneDevices1.phone.is_null(False) + # TgPhoneDevices1.device_start.is_null() + # TgPhoneDevices1.kick_status.is_null() + ) + + logger.info(f'本轮需要检查:{len(devices)}') + + for _, server in enumerate(devices): + logger.info(f'正在检测,第{_},账号:{server.phone}') + # main1(server=server) + threading.Thread(target=main1, args=(server,)).start() + time.sleep(0.3) + + +if __name__ == '__main__': + main() diff --git a/tg/登录账号.py b/tg/登录账号.py new file mode 100644 index 000000000..4c5392ccf --- /dev/null +++ b/tg/登录账号.py @@ -0,0 +1,174 @@ +import asyncio +import random +import threading +import time + +from loguru import logger +from opentele.api import API +from telethon import TelegramClient +from telethon.errors import SessionPasswordNeededError, PhoneCodeInvalidError, RPCError + +from models.tg_phone_devices import TgPhoneDevices, TgPhoneDevices1 +from tg.text import main1111 + + +async def get_device_info(): + """ + 获取设备信息 + """ + NewApi = API.TelegramDesktop.Generate(system="windows") + return { + "api_id": NewApi.api_id, + "api_hash": NewApi.api_hash, + "device_model": NewApi.device_model, + 'system_version': 'Windows 10', + "app_version": "6.3.4 x64", + "lang_code": NewApi.lang_code, + "system_lang_code": NewApi.system_lang_code + } + + +async def create_telegram_client(api_id, api_hash, phone_num, server_type1, server): + """ + 创建并配置 Telegram 客户端 + """ + + # 定义代理 + proxy = { + 'proxy_type': server.proxy_type, # 或 'socks4',具体看你的代理类型 + 'addr': "192.168.1.79", # 代理服务器地址 + 'port': int(server.port), # 代理服务器端口 + 'username': server.user if server.user else "", # 如果有用户名,填写 + 'password': server.pwd if server.pwd else "" # 如果有密码,填写 + } + + client = TelegramClient( + fr"C:\sessions\{phone_num}", + api_id=api_id, + api_hash=api_hash, + device_model=server_type1.device_model, + system_version=server_type1.system_version, + app_version=server_type1.app_version, + system_lang_code=server_type1.system_lang_code, + lang_code=server_type1.lang_code, + proxy=proxy + ) + return client + + +async def login_telegram(client, phone_num): + """ + 处理登录流程 + """ + try: + + sent_code_info = await client.send_code_request(phone_num) + # code = input("请输入验证码:") + + time.sleep(3) + code = await main1111(phone=phone_num) + + try: + await client.sign_in(phone=phone_num, code=code) + except PhoneCodeInvalidError: + logger.error("验证码无效,请重试") + return False + except SessionPasswordNeededError: + # password = input("请输入密码:") + await client.sign_in(password="Haxi@123456@") + + me = await client.get_me() + logger.info(f'账号 {phone_num} -- {me.first_name} 登录成功!') + + return True + + except (RPCError, Exception) as e: + logger.error(f'登录失败,错误信息:{e}') + return False + + finally: + await client.disconnect() + + +async def main(device): + # 读取设备信息和 API 参数 + device_info = await get_device_info() + api_id = device_info["api_id"] + api_hash = device_info["api_hash"] + + # area_code = input("请输入区号:") + # phone_number = input("请输入电话号码:") + + area_code = device.area_code + phone_number = device.phone_number + + server, server_type = TgPhoneDevices().get_or_create( + phone_number=phone_number, + ) + + server1, server_type = TgPhoneDevices1().get_or_create( + phone_number=phone_number, + ) + + server1.area_code = area_code + server1.api_id = api_id + server1.api_hash = api_hash + # 这里我加了一行代码 by rachel 成功默认为1 + server1.is_valid_session = '1' + server1.device_model = device_info["device_model"] + server1.system_version = device_info["system_version"] + server1.app_version = device_info["app_version"] + server1.system_lang_code = device_info["system_lang_code"] + server1.lang_code = device_info["lang_code"] + server1.phone = area_code + phone_number + + server1.proxy_type = server.proxy_type + server1.addr = server.addr + server1.port = server.port + + server1.save() + + # 创建 Telegram 客户端 + phone = area_code + phone_number + client = await create_telegram_client(api_id, api_hash, phone, server1, server) + + await client.connect() + + if await client.is_user_authorized(): + me = await client.get_me() + logger.info(f'账号 {phone_number} -- {me.first_name} 登录成功!') + else: + + # 登录 Telegram + if await login_telegram(client, phone): + logger.info("Telegram 客户端操作完成") + + server1.is_valid_session = 1 + server1.save() + + + else: + logger.error("Telegram 登录失败") + + server1.is_valid_session = 0 + server1.save() + + +def run_main(device): + asyncio.run(main(device)) + + +if __name__ == '__main__': + # 筛选出 is_valid_session 为 1 的记录 + valid_devices = TgPhoneDevices.select().where(TgPhoneDevices.is_valid_session == 1) + + # 将查询结果转换为列表 + valid_devices_list = list(valid_devices) + + # 随机选择 100 条记录,如果记录总数不足 100 条,则选择全部记录 + random_devices = random.sample(valid_devices_list, min(1524, len(valid_devices_list))) + + # 输出结果 + for device in random_devices: + threading.Thread(target=run_main, args=(device,)).start() + time.sleep(0.5) diff --git a/tg/获取验证码.py b/tg/获取验证码.py new file mode 100644 index 000000000..aba91d909 --- /dev/null +++ b/tg/获取验证码.py @@ -0,0 +1,125 @@ +import asyncio +import re + +from loguru import logger +from opentele.api import API +from telethon.errors import SessionPasswordNeededError, PhoneCodeInvalidError, RPCError +from telethon import TelegramClient +from models.tg_phone_devices import TgPhoneDevices + + +async def get_device_info(): + """ + 获取设备信息 + """ + + PROXY_CONFIG = { + 'proxy_type': 'http', # 或 'socks4',具体看你的代理类型 + 'addr': '192.168.50.220', # 代理服务器地址 + 'port': 10809, # 代理服务器端口 + 'username': '', # 如果有用户名,填写 + 'password': '' # 如果有密码,填写 + } + + NewApi = API.TelegramDesktop.Generate(system="macos") + return { + "api_id": NewApi.api_id, + "api_hash": NewApi.api_hash, + "device_model": NewApi.device_model, + "system_version": NewApi.system_version, + "app_version": NewApi.app_version, + "lang_code": NewApi.lang_code, + "system_lang_code": NewApi.system_lang_code + } + + +async def create_telegram_client(server_type): + """ + 创建并配置 Telegram 客户端 + """ + + # gw.dataimpulse.com:824:14fa7e7aa8280a914611__cr.gb:f1c1501b6b535c19 + # 定义代理 + + proxy = { + 'proxy_type': server_type.proxy_type, # 或 'socks4',具体看你的代理类型 + 'addr': server_type.addr, # 代理服务器地址 + 'port': int(server_type.port), # 代理服务器端口 + 'username': server_type.user if server_type.user else "", # 如果有用户名,填写 + 'password': server_type.pwd if server_type.pwd else "" # 如果有密码,填写 + } + + client = TelegramClient( + fr"C:\sessions\{server_type.phone}", + api_id=server_type.api_id, + api_hash=server_type.api_hash, + device_model=server_type.device_model, + system_version=server_type.system_version, + app_version=server_type.app_version, + system_lang_code=server_type.system_lang_code, + lang_code=server_type.lang_code, + proxy=proxy + ) + return client + + +async def login_telegram(client, phone_num): + """ + 处理登录流程 + """ + try: + + sent_code_info = await client.send_code_request(phone_num) + code = input("请输入验证码:") + try: + await client.sign_in(phone=phone_num, code=code) + except PhoneCodeInvalidError: + logger.error("验证码无效,请重试") + return False + except SessionPasswordNeededError: + password = input("请输入密码:") + await client.sign_in(password=password) + + me = await client.get_me() + logger.info(f'账号 {phone_num} -- {me.first_name} 登录成功!') + return True + + except (RPCError, Exception) as e: + logger.error(f'登录失败,错误信息:{e}') + return False + + finally: + await client.disconnect() + + +async def main(): + phone_num = input("请输入电话号码:") + + server = TgPhoneDevices().get_or_none( + TgPhoneDevices.phone == phone_num, + ) + + # 创建 Telegram 客户端 + + client = await create_telegram_client(server) + + try: + await client.connect() + messages = await client.get_messages(777000, 1) + message_text = messages[0].text + print(message_text) + + try: + code = re.findall(r'\d{6}', message_text)[0] + logger.info(f"当前验证码:{code}") + + except: + logger.error("获取验证码失败!!!") + except: + logger.error("账号已死!!!") + finally: + await client.disconnect() + + +if __name__ == '__main__': + asyncio.run(main()) diff --git a/wallet_log_2025-11-28.log b/wallet_log_2025-11-28.log new file mode 100644 index 000000000..e69de29bb diff --git a/wallet_log_2025-12-01.log b/wallet_log_2025-12-01.log new file mode 100644 index 000000000..e69de29bb