modified: amazon/__pycache__/detail_spider.cpython-39.pyc

modified:   amazon/__pycache__/price_match.cpython-39.pyc
	modified:   amazon/detail_spider.py
	modified:   amazon/price_match.py
	modified:   blueprints/__pycache__/admin.cpython-39.pyc
	modified:   blueprints/__pycache__/brand.cpython-39.pyc
	modified:   blueprints/__pycache__/main.cpython-39.pyc
	modified:   brand_spider/__pycache__/main.cpython-39.pyc
	modified:   main.py
	modified:   web_source/brand.html
This commit is contained in:
铭坤
2026-04-28 21:11:48 +08:00
parent 9760d1171c
commit ee6fb5d33a
10 changed files with 7965 additions and 131 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -625,7 +625,7 @@ class AmzonePriceMatch(AmamzonBase):
if len(page_pamel) > 0: if len(page_pamel) > 0:
current_page = page_pamel[0].sr('xpath:.//ul[@class="pages"]//li[@aria-current="true"]').text current_page = page_pamel[0].sr('xpath:.//ul[@class="pages"]//li[@aria-current="true"]').text
#测试===== #测试=====
# if int(current_page) > 3: # if int(current_page) > 3:c
# break # break
# 测试=========== # 测试===========
@@ -790,7 +790,7 @@ class AmzonePriceMatch(AmamzonBase):
"cartShopName" : cartShopName, "cartShopName" : cartShopName,
"shippingFee" : f"{shipping_fee}", "shippingFee" : f"{shipping_fee}",
"priceChangeStatus" : f"{adjust_prices}", "priceChangeStatus" : f"{adjust_prices}",
"modifyCount" : "1", "priceChangeStatus" : "改价成功",
}) })
else: else:
recommendedPrice = recommend_price + shipping_fee recommendedPrice = recommend_price + shipping_fee
@@ -808,8 +808,7 @@ class AmzonePriceMatch(AmamzonBase):
"secondPlace": price_2, "secondPlace": price_2,
"cartShopName": cartShopName, "cartShopName": cartShopName,
"shippingFee": f"{shipping_fee}", "shippingFee": f"{shipping_fee}",
"priceChangeStatus": "", "priceChangeStatus": "跳过,无需改价",
"modifyCount": "0",
}) })
already_asin.add(asin) already_asin.add(asin)
@@ -1333,13 +1332,15 @@ class PriceTask:
""" """
url = f"{DELETE_BRAND_API_BASE}/api/price-track/tasks/{task_id}/result" url = f"{DELETE_BRAND_API_BASE}/api/price-track/tasks/{task_id}/result"
country_aliases = {name: code for code, name in self.country_info.items()} country_aliases = {name: code for code, name in self.country_info.items()}
country_key = country_aliases.get(str(country_code).strip(), str(country_code).strip()) country_key = country_aliases.get(str(country_code).strip(), str(country_code).strip())
countries = {} payload = {
if asin or status: "shops": [
countries[country_key] = [ {
"shopName": shop_name,
"countries": {
country_key : [
{ {
"shopMallName": shopMallName, "shopMallName": shopMallName,
"asin": asin, "asin": asin,
@@ -1349,20 +1350,16 @@ class PriceTask:
"firstPlace": status.get("firstPlace") if status.get("firstPlace") else "", "firstPlace": status.get("firstPlace") if status.get("firstPlace") else "",
"secondPlace": status.get("secondPlace") if status.get("secondPlace") else "", "secondPlace": status.get("secondPlace") if status.get("secondPlace") else "",
"cartShopName": status.get("cartShopName") if status.get("cartShopName") else "", "cartShopName": status.get("cartShopName") if status.get("cartShopName") else "",
"priceChangeStatus": status.get("priceChangeStatus") if status.get("priceChangeStatus") else "", "priceChangeStatus": "UPDATED",
"deleteSkipAsin": status.get("deleteSkipAsin", False), "deleteSkipAsin": status.get("deleteSkipAsin",False),
"removeAsin": status.get("removeAsin") if status.get("removeAsin") else "", "removeAsin": status.get("removeAsin") if status.get("removeAsin") else "",
"modifyCount": status.get("modifyCount") if status.get("modifyCount") else "", "modifyCount": "1",
"shippingFee": status.get("shippingFee") if status.get("shippingFee") else "", "shippingFee" : status.get("shippingFee") if status.get("shippingFee") else "",
"status": status.get("statu") "status": status.get("statu"),
"priceChangeStatus" : status.get("priceChangeStatus") if status.get("priceChangeStatus") else "",
} }
] ]
},
payload = {
"shops": [
{
"shopName": shop_name,
"countries": countries,
"error": "" "error": ""
} }
] ]

View File

@@ -21,6 +21,9 @@ import requests
import subprocess import subprocess
from amazon.del_brand import kill_process from amazon.del_brand import kill_process
with open("version.txt","w",encoding="utf-8") as file: with open("version.txt","w",encoding="utf-8") as file:
file.write(json.dumps({"version":version})) file.write(json.dumps({"version":version}))
@@ -50,8 +53,8 @@ class WindowAPI:
def __init__(self, window): def __init__(self, window):
self._window = window self._window = window
self._is_maximized = False self._is_maximized = False
window.events.maximized += lambda *args: setattr(self, '_is_maximized', True) window.events.maximized += lambda _: setattr(self, '_is_maximized', True)
window.events.restored += lambda *args: setattr(self, '_is_maximized', False) window.events.restored += lambda _: setattr(self, '_is_maximized', False)
def close(self): def close(self):
"""关闭窗口,异步执行清理逻辑""" """关闭窗口,异步执行清理逻辑"""
@@ -334,10 +337,14 @@ class WindowAPI:
# if payload.get("type") == "delete-brand-run" and payload.get("data").get("taskId") in runing_task: # if payload.get("type") == "delete-brand-run" and payload.get("data").get("taskId") in runing_task:
# return {'success': False, 'error': '已存在正在执行的删除品牌任务'} # return {'success': False, 'error': '已存在正在执行的删除品牌任务'}
# 判断当前店铺是否正在运行中 # 判断当前店铺是否正在运行中
if payload.get("data",{}).get("shop_name"):
shop_name = payload.get("data",{}).get("shop_name")
if shop_name in runing_shop:
return {'success': False, 'error': f'当前店铺 {shop_name} 正在执行中,请等待店铺完成之后重试'}
if payload.get("data").get("items"): if payload.get("data").get("items"):
shop_name = payload["data"]["items"][0]["shopName"] shop_name = payload["data"]["items"][0]["shopName"]
if shop_name in runing_shop: if shop_name in runing_shop:
return {'success': False, 'error': '当前店铺正在执行中,请等待店铺完成之后重试'} return {'success': False, 'error': f'当前店铺 {shop_name} 正在执行中,请等待店铺完成之后重试'}
JSON_TASK_QUEUE.put(payload) JSON_TASK_QUEUE.put(payload)
return {'success': True, 'queue_size': JSON_TASK_QUEUE.qsize()} return {'success': True, 'queue_size': JSON_TASK_QUEUE.qsize()}
except Exception as e: except Exception as e:
@@ -431,7 +438,7 @@ def main():
window.expose(api.close, api.minimize, api.maximize, api.toggle_maximize, generate_images, api.save_image, api.save_image_to_folder, api.select_folder, api.select_brand_xlsx_files, api.select_brand_folder, window.expose(api.close, api.minimize, api.maximize, api.toggle_maximize, generate_images, api.save_image, api.save_image_to_folder, api.select_folder, api.select_brand_xlsx_files, api.select_brand_folder,
api.save_file_from_url, api.save_template_xlsx,api.save_template_zip,api.upload_file_to_java,api.open_external_url,api.enqueue_json,api.get_detail_del,api.save_file_from_url_new) api.save_file_from_url, api.save_template_xlsx,api.save_template_zip,api.upload_file_to_java,api.open_external_url,api.enqueue_json,api.get_detail_del,api.save_file_from_url_new)
webview.start( webview.start(
debug=True, debug=False,
storage_path=cache_path, storage_path=cache_path,
private_mode=False private_mode=False
) )

View File

@@ -414,7 +414,7 @@
<a class="nav-item" href="/new_web_source/product-risk.html">商品风险解决</a> <a class="nav-item" href="/new_web_source/product-risk.html">商品风险解决</a>
<a class="nav-item" href="/new_web_source/shop-match.html">定时匹配</a> <a class="nav-item" href="/new_web_source/shop-match.html">定时匹配</a>
<a class="nav-item" href="/new_web_source/price-track.html">跟价</a> <a class="nav-item" href="/new_web_source/price-track.html">跟价</a>
<a class="nav-item" href="/new_web_source/patrol-delete.html"巡店删除</a> <a class="nav-item" href="/new_web_source/patrol-delete.html">巡店删除</a>
<a class="nav-item" href="/new_web_source/query-asin.html">查询ASIN</a> <a class="nav-item" href="/new_web_source/query-asin.html">查询ASIN</a>
<span class="nav-item disabled">取款</span> <span class="nav-item disabled">取款</span>
<span class="nav-item disabled">店铺状态查询</span> <span class="nav-item disabled">店铺状态查询</span>
@@ -785,23 +785,6 @@
else if (status === 'cancelled') showToast('已取消'); else if (status === 'cancelled') showToast('已取消');
} }
function verifyTerminalTaskStatus(taskId, expectedStatus) {
return fetch('/api/brand/tasks/' + taskId, {
credentials: 'include',
headers: withUidHeaders({ 'X-Requested-With': 'XMLHttpRequest' })
})
.then(function(r) { return r.json(); })
.then(function(res) {
if (!res.success || !res.task) return null;
var actualStatus = (res.task.status || '').toLowerCase();
if (actualStatus === 'success' || actualStatus === 'failed' || actualStatus === 'cancelled') {
return actualStatus;
}
return null;
})
.catch(function() { return null; });
}
function pollRunTask(taskId) { function pollRunTask(taskId) {
pollTaskId = taskId; pollTaskId = taskId;
var runProgressFill = document.getElementById('runProgressFill'); var runProgressFill = document.getElementById('runProgressFill');
@@ -868,15 +851,12 @@
} }
if (terminalStatus) { if (terminalStatus) {
var verifiedStatus = await verifyTerminalTaskStatus(taskId, terminalStatus);
if (verifiedStatus) {
try { runTaskEventAbortController.abort(); } catch (e2) {} try { runTaskEventAbortController.abort(); } catch (e2) {}
runTaskEventAbortController = null; runTaskEventAbortController = null;
onRunTaskFinished(verifiedStatus); onRunTaskFinished(terminalStatus);
return; return;
} }
} }
}
} catch (err) {} } catch (err) {}
})(); })();
@@ -938,7 +918,7 @@
}); });
} }
tick(); tick();
pollTimer = setInterval(tick, 3000); pollTimer = setInterval(tick, 10000);
} }
document.getElementById('btnRun').onclick = function() { document.getElementById('btnRun').onclick = function() {
@@ -1148,11 +1128,7 @@
}); });
loadTasks(); loadTasks();
setInterval(function() { // setInterval(loadTasks, 10000);
if (cachedTasks.some(function(t) { return (t.status || '').toLowerCase() === 'running'; })) {
loadTasks();
}
}, 3000);
if (window.addEventListener) { if (window.addEventListener) {
window.addEventListener('pywebviewready', function() { window.addEventListener('pywebviewready', function() {