374 lines
10 KiB
Python
374 lines
10 KiB
Python
|
|
import random
|
|||
|
|
import threading
|
|||
|
|
|
|||
|
|
from loguru import logger
|
|||
|
|
|
|||
|
|
import time
|
|||
|
|
|
|||
|
|
import requests
|
|||
|
|
#
|
|||
|
|
from models.device_info import DeviceInfo
|
|||
|
|
|
|||
|
|
from process.tools import split_phone_number
|
|||
|
|
|
|||
|
|
|
|||
|
|
def get_code(phone, device_model):
|
|||
|
|
import requests
|
|||
|
|
|
|||
|
|
url = "http://192.168.50.180:9696/login_code"
|
|||
|
|
json_data = {
|
|||
|
|
"phone": phone,
|
|||
|
|
"device_model": device_model
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
res = requests.post(url, json=json_data)
|
|||
|
|
code = res.json()["data"]["code"]
|
|||
|
|
return code
|
|||
|
|
except:
|
|||
|
|
pass
|
|||
|
|
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
|
|||
|
|
def get_socker_por():
|
|||
|
|
with open('socker5-ip.txt', 'r', encoding='utf-8') as f:
|
|||
|
|
content = f.read()
|
|||
|
|
|
|||
|
|
tasks = [] # 创建任务列表
|
|||
|
|
lines = content.split('\n')
|
|||
|
|
|
|||
|
|
por = random.choice(lines)
|
|||
|
|
# 解析代理信息
|
|||
|
|
proxy_parts = por.replace("socks5://", "").split(":")
|
|||
|
|
proxy_host = proxy_parts[0]
|
|||
|
|
proxy_port = int(proxy_parts[1])
|
|||
|
|
proxy_username = proxy_parts[2]
|
|||
|
|
proxy_password = proxy_parts[3]
|
|||
|
|
|
|||
|
|
tg_phone_infos = TgPhoneDevices.select().where(
|
|||
|
|
TgPhoneDevices.addr == proxy_parts[0]
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
if len(tg_phone_infos) > 6:
|
|||
|
|
get_socker_por()
|
|||
|
|
|
|||
|
|
return proxy_parts
|
|||
|
|
|
|||
|
|
|
|||
|
|
def get_http_ip():
|
|||
|
|
with open('http-ip.txt', 'r', encoding='utf-8') as f:
|
|||
|
|
content = f.read()
|
|||
|
|
|
|||
|
|
tasks = [] # 创建任务列表
|
|||
|
|
lines = content.split('\n')
|
|||
|
|
|
|||
|
|
por = random.choice(lines)
|
|||
|
|
# 解析代理信息
|
|||
|
|
proxy_parts = por.replace("socks5://", "").split(":")
|
|||
|
|
proxy_host = proxy_parts[0]
|
|||
|
|
proxy_port = int(proxy_parts[1])
|
|||
|
|
|
|||
|
|
tg_phone_infos = TgPhoneDevices.select().where(
|
|||
|
|
TgPhoneDevices.addr == proxy_parts[0]
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
if len(tg_phone_infos) > 6:
|
|||
|
|
get_socker_por()
|
|||
|
|
|
|||
|
|
return proxy_parts
|
|||
|
|
|
|||
|
|
|
|||
|
|
import os
|
|||
|
|
import time
|
|||
|
|
import asyncio
|
|||
|
|
|
|||
|
|
from loguru import logger
|
|||
|
|
from opentele.api import API
|
|||
|
|
from telethon import TelegramClient
|
|||
|
|
from telethon.errors import SessionPasswordNeededError, PhoneCodeInvalidError, RPCError, PhoneNumberBannedError
|
|||
|
|
|
|||
|
|
from models.tg_phone_devices import TgPhoneDevices
|
|||
|
|
|
|||
|
|
|
|||
|
|
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": 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):
|
|||
|
|
"""
|
|||
|
|
创建并配置 Telegram 客户端
|
|||
|
|
"""
|
|||
|
|
PROXY_CONFIG = {
|
|||
|
|
'proxy_type': server.proxy_type, # 或 'socks4',具体看你的代理类型
|
|||
|
|
'addr': server.addr, # 代理服务器地址
|
|||
|
|
'port': int(server.port), # 代理服务器端口
|
|||
|
|
'username': server.user if server.user else "", # 如果有用户名,填写
|
|||
|
|
'password': server.pwd if server.pwd else "" # 如果有密码,填写
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
client = TelegramClient(
|
|||
|
|
fr"C:\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_CONFIG
|
|||
|
|
)
|
|||
|
|
return client
|
|||
|
|
|
|||
|
|
|
|||
|
|
async def login_telegram(client, server, dev_info):
|
|||
|
|
"""
|
|||
|
|
处理登录流程
|
|||
|
|
"""
|
|||
|
|
try:
|
|||
|
|
sent_code_info = await client.send_code_request(server.phone)
|
|||
|
|
|
|||
|
|
logger.info(f"账号:{server.phone},发送验证码成功!!!")
|
|||
|
|
|
|||
|
|
time.sleep(5)
|
|||
|
|
|
|||
|
|
res = requests.get(f"http://192.168.50.180:9000/api/get_code?phone={dev_info.phone}")
|
|||
|
|
if res.status_code == 200:
|
|||
|
|
logger.info(f"账号:{server.phone},获取验证码成功!!!")
|
|||
|
|
else:
|
|||
|
|
logger.error(f"账号:{server.phone},获取验证码失败!!!")
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
code1 = res.json()["data"]["verification_code"]
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
await client.sign_in(phone=server.phone, code=code1)
|
|||
|
|
logger.info(f"账号:{server.phone},输入验证码成功》》》")
|
|||
|
|
|
|||
|
|
except PhoneCodeInvalidError:
|
|||
|
|
logger.error(f"账号 {server.phone},验证码无效,请重试")
|
|||
|
|
return 3
|
|||
|
|
except SessionPasswordNeededError:
|
|||
|
|
password = "Qasdasd123.0"
|
|||
|
|
if server.to_code:
|
|||
|
|
password = server.to_code
|
|||
|
|
await client.sign_in(password=password)
|
|||
|
|
|
|||
|
|
logger.info(f"账号:{server.phone},输入2fa成功》》》")
|
|||
|
|
|
|||
|
|
server.code = password
|
|||
|
|
server.save()
|
|||
|
|
|
|||
|
|
return 1
|
|||
|
|
except PhoneNumberBannedError:
|
|||
|
|
logger.error(f"账号 {server.phone},已被封禁!!!")
|
|||
|
|
return 4
|
|||
|
|
|
|||
|
|
except (RPCError, Exception) as e:
|
|||
|
|
logger.error(f'账号:{server.phone},登录失败,错误信息:{e}')
|
|||
|
|
return 0
|
|||
|
|
|
|||
|
|
|
|||
|
|
async def handle_login_failure(url, server):
|
|||
|
|
"""
|
|||
|
|
处理登录失败的情况
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
time.sleep(5)
|
|||
|
|
|
|||
|
|
session_file = fr"C:\sessions\{server.phone}.session"
|
|||
|
|
if os.path.exists(session_file):
|
|||
|
|
os.remove(session_file)
|
|||
|
|
print(f"文件 {session_file} 已删除")
|
|||
|
|
|
|||
|
|
# 更新服务器信息
|
|||
|
|
server.area_code = server.area_code
|
|||
|
|
server.api_id = server.api_id
|
|||
|
|
server.api_hash = server.api_hash
|
|||
|
|
server.device_model = server.device_model
|
|||
|
|
server.system_version = server.system_version
|
|||
|
|
server.app_version = server.app_version
|
|||
|
|
server.system_lang_code = server.system_lang_code
|
|||
|
|
server.lang_code = server.lang_code
|
|||
|
|
server.phone = server.phone
|
|||
|
|
server.save()
|
|||
|
|
|
|||
|
|
# 重新创建客户端并尝试登录
|
|||
|
|
client = await create_telegram_client(server)
|
|||
|
|
login_start = await login_telegram(client, url, server)
|
|||
|
|
|
|||
|
|
if login_start == 1:
|
|||
|
|
me = await client.get_me()
|
|||
|
|
logger.info(f'账号 {server.phone} -- {me.first_name} 登录成功!')
|
|||
|
|
server.is_valid_session = "1"
|
|||
|
|
server.save()
|
|||
|
|
elif login_start == 0:
|
|||
|
|
logger.error("Telegram 登录失败")
|
|||
|
|
server.is_valid_session = "0"
|
|||
|
|
server.save()
|
|||
|
|
|
|||
|
|
|
|||
|
|
async def main(_, country_code, local_number, semaphore, dev_info):
|
|||
|
|
# async with semaphore:
|
|||
|
|
|
|||
|
|
device_info = await get_device_info()
|
|||
|
|
area_code = country_code
|
|||
|
|
phone_number = local_number
|
|||
|
|
|
|||
|
|
server, created = TgPhoneDevices().get_or_create(
|
|||
|
|
phone=area_code + phone_number,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
if server.is_valid_session:
|
|||
|
|
logger.info(f"第{_},账号 {server.phone},登录成功!!!")
|
|||
|
|
|
|||
|
|
server.is_valid_session = 1
|
|||
|
|
server.save()
|
|||
|
|
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
if server.is_valid_session is None:
|
|||
|
|
server.area_code = area_code
|
|||
|
|
server.phone_number = phone_number
|
|||
|
|
server.api_id = device_info["api_id"]
|
|||
|
|
server.api_hash = device_info["api_hash"]
|
|||
|
|
server.device_model = device_info["device_model"]
|
|||
|
|
server.system_version = device_info["system_version"]
|
|||
|
|
server.app_version = device_info["app_version"]
|
|||
|
|
server.system_lang_code = device_info["system_lang_code"]
|
|||
|
|
server.lang_code = device_info["lang_code"]
|
|||
|
|
server.phone = area_code + phone_number
|
|||
|
|
server.save()
|
|||
|
|
|
|||
|
|
# 设置代理
|
|||
|
|
if not server.addr:
|
|||
|
|
pro_list = get_http_ip()
|
|||
|
|
|
|||
|
|
server.proxy_type = "http"
|
|||
|
|
server.addr = pro_list[0]
|
|||
|
|
server.port = pro_list[1]
|
|||
|
|
|
|||
|
|
# # 生成一个 0 到 1 之间的随机浮点数
|
|||
|
|
# random_num = random.random()
|
|||
|
|
#
|
|||
|
|
# # 判断随机数是否小于 0.5,如果小于 0.5,则表示概率为 50% 的事件发生
|
|||
|
|
# if random_num < 0.5:
|
|||
|
|
# pro_list = get_http_ip()
|
|||
|
|
#
|
|||
|
|
# server.proxy_type = "http"
|
|||
|
|
# server.addr = pro_list[0]
|
|||
|
|
# server.port = pro_list[1]
|
|||
|
|
#
|
|||
|
|
#
|
|||
|
|
# else:
|
|||
|
|
# pro_list = get_socker_por()
|
|||
|
|
#
|
|||
|
|
# server.proxy_type = "socks5"
|
|||
|
|
# server.addr = pro_list[0]
|
|||
|
|
# server.port = pro_list[1]
|
|||
|
|
# server.user = pro_list[2]
|
|||
|
|
# server.pwd = pro_list[3]
|
|||
|
|
|
|||
|
|
server.save()
|
|||
|
|
|
|||
|
|
logger.info(f"第{_},账号:{server.phone},开始登录。。。")
|
|||
|
|
|
|||
|
|
time.sleep(random.randint(1, 10))
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
client = await create_telegram_client(server)
|
|||
|
|
await client.connect()
|
|||
|
|
|
|||
|
|
if await client.is_user_authorized():
|
|||
|
|
me = await client.get_me()
|
|||
|
|
logger.info(f'第{_},账号:{server.phone} -- {me.first_name} 登录成功!')
|
|||
|
|
|
|||
|
|
server.is_valid_session = 1
|
|||
|
|
server.save()
|
|||
|
|
|
|||
|
|
await client.disconnect()
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
login_start = await login_telegram(client, server, dev_info)
|
|||
|
|
|
|||
|
|
if login_start == 1:
|
|||
|
|
me = await client.get_me()
|
|||
|
|
logger.info(f'第{_},账号 {server.phone} -- {me.first_name} 登录成功!')
|
|||
|
|
server.is_valid_session = "1"
|
|||
|
|
server.save()
|
|||
|
|
elif login_start == 0:
|
|||
|
|
logger.error(f"第{_},账号 {server.phone},Telegram 登录失败")
|
|||
|
|
server.is_valid_session = "0"
|
|||
|
|
server.save()
|
|||
|
|
elif login_start == 3:
|
|||
|
|
await client.disconnect()
|
|||
|
|
|
|||
|
|
# await handle_login_failure(server)
|
|||
|
|
elif login_start == 4:
|
|||
|
|
server.is_valid_session = -1
|
|||
|
|
server.save()
|
|||
|
|
|
|||
|
|
await client.disconnect()
|
|||
|
|
except:
|
|||
|
|
pass
|
|||
|
|
|
|||
|
|
|
|||
|
|
def main2(_, a1, a2, a3, a5):
|
|||
|
|
asyncio.run(main(_, a1, a2, a3, a5))
|
|||
|
|
|
|||
|
|
|
|||
|
|
async def main1():
|
|||
|
|
# 定义最大并发任务数
|
|||
|
|
max_concurrent_tasks = 10
|
|||
|
|
# 创建一个信号量对象
|
|||
|
|
semaphore = asyncio.Semaphore(max_concurrent_tasks)
|
|||
|
|
|
|||
|
|
dev_infos = DeviceInfo.select().where(
|
|||
|
|
DeviceInfo.is_valid_session == 1,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
tg_infos = TgPhoneDevices.select().where(
|
|||
|
|
TgPhoneDevices.is_valid_session == 1,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
dev_phones = []
|
|||
|
|
for i in dev_infos:
|
|||
|
|
dev_phones.append(i.phone)
|
|||
|
|
|
|||
|
|
tg_phones = []
|
|||
|
|
for i in tg_infos:
|
|||
|
|
tg_phones.append(i.phone)
|
|||
|
|
|
|||
|
|
tasks = []
|
|||
|
|
for _, dev_info in enumerate(dev_infos):
|
|||
|
|
if dev_info.phone not in tg_phones:
|
|||
|
|
print(dev_info.phone)
|
|||
|
|
country_code, local_number = split_phone_number(phone_number=dev_info.phone)
|
|||
|
|
if country_code and local_number:
|
|||
|
|
threading.Thread(target=main2, args=(_, country_code, local_number, semaphore, dev_info,)).start()
|
|||
|
|
|
|||
|
|
time.sleep(0.3)
|
|||
|
|
|
|||
|
|
# tasks.append(main(_, country_code, local_number, semaphore, dev_info))
|
|||
|
|
#
|
|||
|
|
# # 并发运行所有任务
|
|||
|
|
# await asyncio.gather(*tasks)
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == '__main__':
|
|||
|
|
asyncio.run(main1())
|