haha
This commit is contained in:
195
1.json
195
1.json
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
83
models/migrate_tg_phone_devices.py
Normal file
83
models/migrate_tg_phone_devices.py
Normal 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)
|
||||
@@ -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
81
test.py
@@ -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}")
|
||||
|
||||
145
test111.py
145
test111.py
@@ -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
|
||||
@@ -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())
|
||||
@@ -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
27485
tg_phone_devices.csv
Normal file
File diff suppressed because it is too large
Load Diff
48
tools.py
48
tools.py
@@ -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-Fi;macOS: 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: Ethernet;Linux: eth/enp;macOS: 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}")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user