This commit is contained in:
ddrwode
2026-02-03 13:09:01 +08:00
parent 71804dfb84
commit 984223c720
10 changed files with 27603 additions and 479 deletions

195
1.json
View File

@@ -1,195 +0,0 @@
{
"question": "XRP Up or Down - December 30, 12:00AM-12:15AM ET",
"slug": "xrp-updown-15m-1767070800",
"market_id": "1054552",
"up_pct": 71.0,
"down_pct": 29.0,
"up": {
"token_id": "88333223784817577260404788890543585618923977728870152454078834106487198357156",
"ask": 0.72,
"bid": 0.7,
"book": {
"bids": [
{
"price": "0.7",
"size": "22.66"
},
{
"price": "0.69",
"size": "25"
},
{
"price": "0.68",
"size": "424"
},
{
"price": "0.67",
"size": "60"
},
{
"price": "0.66",
"size": "50"
},
{
"price": "0.65",
"size": "50"
},
{
"price": "0.64",
"size": "50"
},
{
"price": "0.63",
"size": "50"
},
{
"price": "0.62",
"size": "90"
},
{
"price": "0.61",
"size": "90"
}
],
"asks": [
{
"price": "0.72",
"size": "25"
},
{
"price": "0.73",
"size": "10"
},
{
"price": "0.74",
"size": "65"
},
{
"price": "0.75",
"size": "60"
},
{
"price": "0.76",
"size": "424"
},
{
"price": "0.77",
"size": "50"
},
{
"price": "0.78",
"size": "50"
},
{
"price": "0.79",
"size": "50"
},
{
"price": "0.8",
"size": "50"
},
{
"price": "0.81",
"size": "79.79"
}
]
},
"mid": 0.71,
"spread": 0.020000000000000018
},
"down": {
"token_id": "63095634778460194511452398951690172781969352726093505852484059082082045238495",
"ask": 0.3,
"bid": 0.28,
"book": {
"bids": [
{
"price": "0.28",
"size": "25"
},
{
"price": "0.27",
"size": "10"
},
{
"price": "0.26",
"size": "65"
},
{
"price": "0.25",
"size": "60"
},
{
"price": "0.24",
"size": "424"
},
{
"price": "0.23",
"size": "50"
},
{
"price": "0.22",
"size": "50"
},
{
"price": "0.21",
"size": "50"
},
{
"price": "0.2",
"size": "50"
},
{
"price": "0.19",
"size": "79.79"
}
],
"asks": [
{
"price": "0.3",
"size": "22.66"
},
{
"price": "0.31",
"size": "25"
},
{
"price": "0.32",
"size": "424"
},
{
"price": "0.33",
"size": "60"
},
{
"price": "0.34",
"size": "50"
},
{
"price": "0.35",
"size": "50"
},
{
"price": "0.36",
"size": "50"
},
{
"price": "0.37",
"size": "50"
},
{
"price": "0.38",
"size": "90"
},
{
"price": "0.39",
"size": "90"
}
]
},
"mid": 0.29000000000000004,
"spread": 0.019999999999999962
},
"bucket_ts": 1767070800,
"fetched_at": 1767071095
}

View File

@@ -8,8 +8,8 @@ pymysql.install_as_MySQLdb()
db_config = {
'database': 'lm',
'user': 'lm',
'password': 'HhyAsGbrrbsJfpyy',
'host': '192.168.1.79',
'password': 'sAn5MfjKApiTBrx4',
'host': '172.16.197.130',
'port': 3306
}

View File

@@ -0,0 +1,83 @@
#!/usr/bin/env python3
"""
将 tg_phone_devices.py 中 TgPhoneDevices、TgPhoneDevices1 的数据SQLite haha.db
迁移到 tg_models.py 对应模型所在的数据库MySQL
"""
import sys
from pathlib import Path
# 确保项目根目录在 path 中
project_root = Path(__file__).resolve().parent.parent
if str(project_root) not in sys.path:
sys.path.insert(0, str(project_root))
# 先导入源模型SQLite
import models.tg_phone_devices as src_module
# 再导入目标模型MySQL
import models.tg_models as tgt_module
# 要迁移的 (源模型, 目标模型, 表名描述) 列表
MODEL_PAIRS = [
(src_module.TgPhoneDevices, tgt_module.TgPhoneDevices, 'tg_phone_devices'),
(src_module.TgPhoneDevices1, tgt_module.TgPhoneDevices1, 'tg_phone_devices_copy1'),
]
def get_data_fields(model):
"""获取需要迁移的字段名"""
return [f.name for f in model._meta.sorted_fields]
def migrate_one(SourceModel, TargetModel, table_label, batch_size=500, truncate_before=False):
"""
迁移单个模型的数据。
:param table_label: 表名描述,用于日志
"""
fields = get_data_fields(SourceModel)
total = SourceModel.select().count()
print(f"[{table_label}] 源表共 {total} 条记录,开始迁移...")
if truncate_before and total > 0:
TargetModel.delete().execute()
print(f" 已清空目标表 {table_label}")
migrated = 0
skipped = 0
errors = 0
for offset in range(0, total, batch_size):
batch = list(SourceModel.select().offset(offset).limit(batch_size))
for rec in batch:
try:
row = {f: getattr(rec, f) for f in fields}
TargetModel.insert(**row).execute()
migrated += 1
except Exception as e:
if "Duplicate" in str(e) or "1062" in str(e):
skipped += 1
else:
errors += 1
print(f" 插入失败 id={getattr(rec, 'id', '?')}: {e}")
if total > batch_size and (offset + batch_size) % (batch_size * 2) == 0 or offset + batch_size >= total:
print(f" 已处理 {min(offset + batch_size, total)}/{total}")
print(f"[{table_label}] 迁移完成: 成功 {migrated}, 跳过(重复) {skipped}, 错误 {errors}\n")
def migrate_all(batch_size=500, truncate_before=False):
"""迁移 TgPhoneDevices 和 TgPhoneDevices1。"""
tgt_module.db.connect()
for SourceModel, TargetModel, table_label in MODEL_PAIRS:
tgt_module.db.create_tables([TargetModel], safe=True)
migrate_one(SourceModel, TargetModel, table_label, batch_size=batch_size, truncate_before=truncate_before)
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser(description='TgPhoneDevices / TgPhoneDevices1 SQLite -> MySQL 数据迁移')
parser.add_argument('--batch-size', type=int, default=500, help='每批条数')
parser.add_argument('--truncate', action='store_true', help='迁移前清空目标表(两个表都会清空)')
args = parser.parse_args()
migrate_all(batch_size=args.batch_size, truncate_before=args.truncate)

View File

@@ -12,10 +12,10 @@ pymysql.install_as_MySQLdb()
# 数据库配置
db_config = {
'database': 'me',
'user': 'me',
'password': 'j3HDbra8eaicrNNS',
'host': '127.0.0.1',
'database': 'lm',
'user': 'lm',
'password': 'sAn5MfjKApiTBrx4',
'host': '172.16.197.130',
'port': 3306
}

81
test.py
View File

@@ -1,81 +0,0 @@
import socket
import psutil
import re
class NetworkIPGetter:
"""网络IP获取器"""
def __init__(self):
self.interfaces = psutil.net_if_addrs()
def get_wlan_ip(self):
"""获取无线网卡IP优先"""
return self._get_interface_ip(['WLAN', 'Wi-Fi', 'WiFi', 'Wireless'])
def get_ethernet_ip(self):
"""获取有线网卡IP"""
return self._get_interface_ip(['Ethernet', '以太网', 'eth', 'enp'])
def _get_interface_ip(self, keywords):
"""根据关键词查找接口IP"""
for iface_name, addrs in self.interfaces.items():
iface_lower = iface_name.lower()
if any(keyword.lower() in iface_lower for keyword in keywords):
for addr in addrs:
if addr.family == socket.AF_INET:
# 排除一些虚拟/私有地址
if not self._is_virtual_ip(addr.address):
return addr.address
return None
def _is_virtual_ip(self, ip):
"""判断是否为虚拟/私有IP"""
private_patterns = [
r'^127\.', # 回环地址
r'^192\.168\.', # 私有C类
r'^172\.(1[6-9]|2[0-9]|3[0-1])\.', # 私有B类
r'^10\.', # 私有A类
r'^169\.254\.', # 链路本地
]
for pattern in private_patterns:
if re.match(pattern, ip):
return False # 私有IP也是有效的WLAN地址
return False
def get_preferred_ip(self):
"""获取首选网络IP优先WLAN其次有线"""
ip = self.get_wlan_ip()
if not ip:
ip = self.get_ethernet_ip()
return ip or "127.0.0.1"
def get_all_ips(self):
"""获取所有网络接口的IPv4地址"""
result = {}
for iface_name, addrs in self.interfaces.items():
for addr in addrs:
if addr.family == socket.AF_INET:
if iface_name not in result:
result[iface_name] = []
result[iface_name].append({
'address': addr.address,
'netmask': addr.netmask,
'broadcast': addr.broadcast
})
return result
# 使用示例
if __name__ == "__main__":
getter = NetworkIPGetter()
# 获取WLAN IP
wlan_ip = getter.get_wlan_ip()
print(f"WLAN IPv4地址: {wlan_ip}")
# 获取首选IP
main_ip = getter.get_preferred_ip()
print(f"首选IP地址: {main_ip}")

View File

@@ -1,145 +0,0 @@
import time
import urllib.parse
import json
from concurrent.futures import ThreadPoolExecutor
from curl_cffi import requests
from models.tg_phone_devices import TgPhoneDevices
from test111111 import generate_evm_wallet
def get_user_data1(
phone,
bot_name,
url,
invite_code="",
platform="",
start_params="",
channel_name='',
device_model=""
):
# data = {
# "phone": phone, # 区号加号码
# "bot_name": bot_name, # 机器人名称
# "url": url,
# "platform": platform, # 平台 web_3 tdesktop
# "start_params": start_params,
# 'channel_name': channel_name, # 频道名称
# }
data = {
"phone": phone, # 区号加号码
"bot_name": bot_name, # 机器人名称
"url": url,
"invite_code": invite_code, # 邀请码
"platform": platform, # 平台 web_3 tdesktop
"start_params": start_params,
"channel_name": channel_name, # 频道名称
# 'device_model': device_model,
}
resp = requests.post("http://127.0.0.1:9001/api/get_token", json=data)
# print(resp.json())
if resp.status_code == 200:
return resp.json().get("data")
return False
def get_code(user_data1, dev_info1):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0',
'Accept': 'application/json, text/plain, */*',
# 'Accept-Encoding': 'gzip, deflate, br, zstd',
'Content-Type': 'application/json',
'sec-ch-ua-platform': '"Windows"',
'sec-ch-ua': '"Microsoft Edge WebView2";v="143", "Microsoft Edge";v="143", "Chromium";v="143", "Not A(Brand";v="24"',
'sec-ch-ua-mobile': '?0',
'Origin': 'https://app.depinsim.com',
'Sec-Fetch-Site': 'same-site',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://app.depinsim.com/',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
}
sessions = requests.Session()
sessions.proxies.update({
'http': f'http://192.168.1.20:{dev_info1.port}',
'https': f'http://192.168.1.20:{dev_info1.port}',
})
# 解析查询字符串
parsed_data = urllib.parse.parse_qs(user_data1)
# 获取 user 参数的值
user_data = parsed_data.get('user', [None])[0]
if user_data:
# 对 user 参数进行 URL 解码
decoded_user_data = urllib.parse.unquote(user_data)
# 解析 JSON 数据
user_json = json.loads(decoded_user_data)
# 获取 id 的值
user_id = user_json.get('id')
# print(user_id)
response = sessions.post(f'https://api.depinsim.com/base/tgUserStatus/{user_id}', headers=headers)
print(response.json())
json_data = {
'initData': user_data1,
'couponCode': '',
}
response = sessions.post('https://api.depinsim.com/base/tgLoginWithCoupon', headers=headers, json=json_data)
print(response.json())
dev_info1.dep_code = response.json()["data"]["verifyCode"]
dev_info1.save()
def main(dev_info):
# user_data = get_user_data1(
# phone=dev_info.phone,
# bot_name='DepinSimBot',
# url="https://app.depinsim.com",
# device_model=dev_info.device_model
# )
#
# # print(user_data)
# get_code(user_data1=user_data, dev_info1=dev_info)
mnemonic, address, privkey = generate_evm_wallet(num_words=12)
dev_info.mnemonic = mnemonic
dev_info.address = address
dev_info.privkey = privkey
dev_info.save()
if __name__ == '__main__':
with ThreadPoolExecutor(max_workers=20) as executor:
# dev_infos = list(
# TgPhoneDevices.select().where(TgPhoneDevices.is_valid_session == 1, TgPhoneDevices.dep_code.is_null()))
dev_infos = list(
TgPhoneDevices.select())
for dev_info in dev_infos[7150:]:
executor.submit(main, dev_info)
time.sleep(0.5) # 控制线程提交的频率
# Hello! Welcome to Depinsim.
#
# By signing this message, you confirm ownership of the wallet address: 0xADcA20376A6CdCBd232577ac830F4116eC863DcF
#
# Please note:
# - This signature does not incur any gas fees.
# - It will not initiate any blockchain transactions.
# - It is solely for authentication purposes.
#
# Thank you for choosing Depinsim! Together, let's explore the exciting possibilities of the Web3 world.
#
# Depinsim Team

View File

@@ -1,24 +0,0 @@
from curl_cffi import requests
headers = {
'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 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090a13) UnifiedPCWindowsWechat(0xf254162e) XWEB/18151',
'xweb_xhr': '1',
'Content-Type': 'application/json',
'Sec-Fetch-Site': 'cross-site',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://servicewechat.com/wx2efc0705600eb6db/550/page-frame.html',
'Accept-Language': 'zh-CN,zh;q=0.9',
}
params = {
'platform': 'wx',
'version': '2025.6.30.01',
'action': 'childDetail',
'id': '131',
'citycode': 'cd',
}
response = requests.get('https://wxapidg.bendibao.com/smartprogram/zhuanti.php', params=params, headers=headers)
print(response.json())

View File

@@ -37,9 +37,10 @@ async def create_telegram_client(server_type):
try:
base_dir = Path(__file__).parent.parent
session_path = base_dir / "sessions" / server_type.phone
client = TelegramClient(
fr"sessions\{server_type.phone}",
str(session_path),
api_id=server_type.api_id,
api_hash=server_type.api_hash,
system_lang_code=server_type.system_lang_code,
@@ -192,8 +193,8 @@ async def start_task(server):
def check_exist_session_file(phone):
base_dir = Path(__file__).parent.parent
path = fr"sessions\{phone}.session"
is_exist_session_file = os.path.isfile(path)
path = base_dir / "sessions" / f"{phone}.session"
is_exist_session_file = path.is_file()
if not is_exist_session_file:
logger.error(f'未找到session文件{path}')
return False
@@ -216,7 +217,7 @@ def main1(server_id):
def main():
devices = TgPhoneDevices1.select().where(
TgPhoneDevices1.is_valid_session.is_null(),
TgPhoneDevices1.is_valid_session.is_null(False),
# TgPhoneDevices.phone.is_null(False)
# TgPhoneDevices.device_start.is_null()
# TgPhoneDevices.kick_status.is_null()

27485
tg_phone_devices.csv Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -10,23 +10,23 @@ class NetworkIPGetter:
self.interfaces = psutil.net_if_addrs()
def get_wlan_ip(self):
"""获取无线网卡IP优先"""
return self._get_interface_ip(['WLAN', 'Wi-Fi', 'WiFi', 'Wireless'])
"""获取无线网卡IP优先。Windows: WLAN/Wi-FimacOS: en0/en1通常为 Wi-Fi"""
return self._get_interface_ip(['WLAN', 'Wi-Fi', 'WiFi', 'Wireless', 'en0', 'en1'])
def get_ethernet_ip(self):
"""获取有线网卡IP"""
return self._get_interface_ip(['Ethernet', '以太网', 'eth', 'enp'])
"""获取有线网卡IP。Windows: EthernetLinux: eth/enpmacOS: en2/en3 等"""
return self._get_interface_ip(['Ethernet', '以太网', 'eth', 'enp', 'en2', 'en3', 'en4'])
def _get_interface_ip(self, keywords):
"""根据关键词查找接口IP"""
for iface_name, addrs in self.interfaces.items():
iface_lower = iface_name.lower()
if any(keyword.lower() in iface_lower for keyword in keywords):
for addr in addrs:
if addr.family == socket.AF_INET:
# 排除一些虚拟/私有地址
if not self._is_virtual_ip(addr.address):
return addr.address
"""根据关键词查找接口IP(按 keywords 顺序优先匹配)"""
for keyword in keywords:
kw_lower = keyword.lower()
for iface_name, addrs in self.interfaces.items():
if kw_lower in iface_name.lower():
for addr in addrs:
if addr.family == socket.AF_INET:
if not self._is_virtual_ip(addr.address):
return addr.address
return None
def _is_virtual_ip(self, ip):
@@ -67,15 +67,15 @@ class NetworkIPGetter:
return result
# # 使用示例
# if __name__ == "__main__":
# getter = NetworkIPGetter()
#
# # 获取WLAN IP
# wlan_ip = getter.get_wlan_ip()
# print(f"WLAN IPv4地址: {wlan_ip}")
#
# # 获取首选IP
# main_ip = getter.get_preferred_ip()
# print(f"首选IP地址: {main_ip}")
# 使用示例
if __name__ == "__main__":
getter = NetworkIPGetter()
# 获取WLAN IP
wlan_ip = getter.get_wlan_ip()
print(f"WLAN IPv4地址: {wlan_ip}")
# 获取首选IP
main_ip = getter.get_preferred_ip()
print(f"首选IP地址: {main_ip}")