11
This commit is contained in:
+70
-39
@@ -66,18 +66,30 @@ def fetch_all_pages(base_url, initial_params, max_pages=None):
|
|||||||
return all_data
|
return all_data
|
||||||
|
|
||||||
|
|
||||||
def merge_item_data_by_itemid(price_items, item_list):
|
def merge_item_data_by_itemid(price_data, item_list_data):
|
||||||
"""
|
"""
|
||||||
根据ItemId和id字段将物品名称信息合并到价格数据中
|
根据ItemId和id字段将物品名称信息合并到价格数据中
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
price_data: 第一组数据,包含价格信息的字典
|
price_data: 第一组数据,包含价格信息的字典
|
||||||
item_list_data: 第二组数据,包含物品列表信息的字典
|
item_list_data: 第二组数据,可以是字典(包含"list"键)或直接是物品列表
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
dict: 合并后的数据,包含价格和名称信息
|
dict: 合并后的数据,包含价格和名称信息
|
||||||
"""
|
"""
|
||||||
|
# 提取价格数据中的物品信息
|
||||||
|
price_items = price_data.get("data", {})
|
||||||
|
|
||||||
|
# 处理不同类型的item_list_data输入
|
||||||
|
if isinstance(item_list_data, dict) and "list" in item_list_data:
|
||||||
|
# 如果是字典且包含"list"键
|
||||||
|
item_list = item_list_data.get("list", [])
|
||||||
|
elif isinstance(item_list_data, list):
|
||||||
|
# 如果直接是列表
|
||||||
|
item_list = item_list_data
|
||||||
|
else:
|
||||||
|
# 其他情况,使用空列表
|
||||||
|
item_list = []
|
||||||
|
|
||||||
# 创建一个字典用于快速查找物品名称,使用id作为键
|
# 创建一个字典用于快速查找物品名称,使用id作为键
|
||||||
item_name_map = {}
|
item_name_map = {}
|
||||||
@@ -88,7 +100,7 @@ def merge_item_data_by_itemid(price_items, item_list):
|
|||||||
item_name_map[item_id] = item_name
|
item_name_map[item_id] = item_name
|
||||||
|
|
||||||
# 创建一个新的结果字典
|
# 创建一个新的结果字典
|
||||||
merged_data = {"code": price_items.get("code", 0), "msg": price_items.get("msg", ""), "data": {}}
|
merged_data = {"code": price_data.get("code", 0), "msg": price_data.get("msg", ""), "data": {}}
|
||||||
|
|
||||||
# 遍历价格数据,添加名称信息
|
# 遍历价格数据,添加名称信息
|
||||||
for item_id, price_info in price_items.items():
|
for item_id, price_info in price_items.items():
|
||||||
@@ -111,49 +123,68 @@ def merge_item_data_by_itemid(price_items, item_list):
|
|||||||
#交易行数据查询函数
|
#交易行数据查询函数
|
||||||
def fetch_jx3_jiaoyihang(inserver="眉间雪", inname="武技殊影图"):
|
def fetch_jx3_jiaoyihang(inserver="眉间雪", inname="武技殊影图"):
|
||||||
|
|
||||||
# URL 编码
|
# 第一步:获取所有物品列表数据(处理分页)
|
||||||
custom_url = f"https://node.jx3box.com/item_merged/name/{quote(inname)}"
|
custom_url = f"https://node.jx3box.com/item_merged/name/{quote(inname)}"
|
||||||
params = {
|
initial_params = {
|
||||||
"client": "std", # 默认客户端
|
"client": "std",
|
||||||
"strict": "0" , # 默认模糊搜索
|
"strict": "0",
|
||||||
"page": "1", # 默认第一页
|
"per": "50" # 每页数量,可以根据需要调整
|
||||||
"per": "50" # 默认每页50条
|
}
|
||||||
}
|
|
||||||
|
|
||||||
#请求接口获取物品ID
|
# 获取所有页面的物品数据
|
||||||
data_item = fetch_jx3_data(custom_url,**params)
|
all_items = fetch_all_pages(custom_url, initial_params)
|
||||||
|
|
||||||
# 检查是否获取到数据
|
if not all_items:
|
||||||
if not data_item or "list" not in data_item:
|
|
||||||
logger.error(f"未找到物品: {inname}")
|
logger.error(f"未找到物品: {inname}")
|
||||||
return "无交易行数据"
|
return "无交易行数据"
|
||||||
|
|
||||||
# 创建一个空列表来存储结果
|
|
||||||
data_item_list = data_item.get("list", [])
|
|
||||||
|
|
||||||
# 提取所有ID
|
# 提取所有ID
|
||||||
ids = [item.get("id") for item in data_item_list]
|
ids = [item.get("id") for item in all_items if item.get("id")]
|
||||||
|
|
||||||
|
if not ids:
|
||||||
|
logger.error(f"物品 {inname} 没有有效的ID")
|
||||||
|
return "无交易行数据"
|
||||||
|
|
||||||
# 返回格式化结果
|
# 返回格式化结果
|
||||||
stringids = ",".join(ids) if ids else ""
|
stringids = ",".join(ids)
|
||||||
|
logger.info(f"搜索到物品: {inname}, 共找到 {len(ids)} 个物品\nIDs: {stringids}")
|
||||||
custom_url = f"https://next2.jx3box.com/api/item-price/list"
|
|
||||||
params = {
|
|
||||||
"server": "眉间雪", # 默认服务器
|
|
||||||
"itemIds": "5_47129" # 默认物品ID
|
|
||||||
}
|
|
||||||
|
|
||||||
# 接受传入的参数
|
# 第二步:获取价格数据
|
||||||
params["server"]=inserver
|
price_url = "https://next2.jx3box.com/api/item-price/list"
|
||||||
params["itemIds"]=stringids
|
price_params = {
|
||||||
|
"server": inserver,
|
||||||
#请求接口获取物品交易行数据
|
"itemIds": stringids
|
||||||
data_price = fetch_jx3_data(custom_url,**params)
|
}
|
||||||
|
|
||||||
merged_data = merge_item_data_by_itemid(data_price.get("data", []), data_item_list)
|
|
||||||
|
|
||||||
# 打印日志
|
|
||||||
logger.info(f"搜索到物品: \n{inname}\n{merged_data}\n{params}")
|
|
||||||
|
|
||||||
return merged_data.get("data", "无交易行数据")
|
price_data = fetch_jx3_data(price_url, **price_params)
|
||||||
|
|
||||||
|
if not price_data or "data" not in price_data:
|
||||||
|
return "无交易行数据"
|
||||||
|
|
||||||
|
# 第三步:合并数据
|
||||||
|
merged_data = merge_item_data_by_itemid(price_data, {"list": all_items})
|
||||||
|
|
||||||
|
# 处理合并后的数据
|
||||||
|
result_items = []
|
||||||
|
for item_id, item_info in merged_data.get("data", {}).items():
|
||||||
|
# 格式化价格(假设价格是以铜钱为单位,转换为金)
|
||||||
|
lowest_price = item_info.get("LowestPrice", 0)
|
||||||
|
bricks = lowest_price // 100000000 if lowest_price else 0
|
||||||
|
gold = (lowest_price % 100000000) // 10000 if lowest_price else 0
|
||||||
|
silver = (lowest_price % 10000) // 100 if lowest_price else 0
|
||||||
|
copper = lowest_price % 100 if lowest_price else 0
|
||||||
|
|
||||||
|
price_str = f"{bricks}砖{gold}金{silver}银{copper}铜" if lowest_price else "无价格"
|
||||||
|
|
||||||
|
result_items.append({
|
||||||
|
"name": item_info.get("Name", "未知物品"),
|
||||||
|
"price": price_str,
|
||||||
|
"avg_price": item_info.get("AvgPrice", 0),
|
||||||
|
"sample_size": item_info.get("SampleSize", 0)
|
||||||
|
})
|
||||||
|
|
||||||
|
# 按价格排序
|
||||||
|
result_items.sort(key=lambda x: x["avg_price"])
|
||||||
|
|
||||||
|
return result_items
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user