fix(collect): recognize short Shopee product titles
This commit is contained in:
+216
-59
@@ -18,8 +18,19 @@ from .cdp import (
|
||||
|
||||
|
||||
DEFAULT_REGION_HOST = "seller.shopee.tw"
|
||||
TITLE_XPATH = "//input[@class='eds-input__input' and string-length(@modelvalue)>24]"
|
||||
TITLE_FIELD_SELECTOR = '[data-product-edit-field-unique-id="name"]'
|
||||
IMAGE_FIELD_SELECTOR = '[data-product-edit-field-unique-id="images"]'
|
||||
TITLE_XPATH = (
|
||||
"//*[@data-product-edit-field-unique-id='name']"
|
||||
"//input[contains(concat(' ', normalize-space(@class), ' '), ' eds-input__input ')]"
|
||||
)
|
||||
LEGACY_TITLE_XPATH = "//input[@class='eds-input__input' and string-length(@modelvalue)>24]"
|
||||
ITEMBOX_XPATH = (
|
||||
"//*[@data-product-edit-field-unique-id='images']"
|
||||
"//div[contains(concat(' ', normalize-space(@class), ' '), "
|
||||
"' shopee-image-manager__itembox ') and @data-draggable='true']"
|
||||
)
|
||||
LEGACY_ITEMBOX_XPATH = (
|
||||
"//div[@class='container']/div[@class='can-drag shopee-image-manager__itembox' "
|
||||
"and @data-draggable='true']"
|
||||
)
|
||||
@@ -35,22 +46,67 @@ LOGIN_PATH_MARKERS = (
|
||||
"seller/accounts/signin",
|
||||
)
|
||||
|
||||
JS_EDITOR_FIELD_HELPERS = "".join(
|
||||
(
|
||||
"function cmVisible(e){if(!e)return false;var r=e.getBoundingClientRect();"
|
||||
"var s=getComputedStyle(e);return r.width>0&&r.height>0&&"
|
||||
"s.visibility!=='hidden'&&s.display!=='none';}",
|
||||
"function cmTitleCandidate(){",
|
||||
f"var root=document.querySelector({json.dumps(TITLE_FIELD_SELECTOR)});",
|
||||
"if(root){var primary=[].slice.call(root.querySelectorAll('input.eds-input__input'))"
|
||||
".filter(cmVisible);return {node:primary.length===1?primary[0]:null,count:primary.length,"
|
||||
"source:'business',root_exists:true};}",
|
||||
f"var snap=document.evaluate({json.dumps(LEGACY_TITLE_XPATH)},document,null,"
|
||||
"XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);",
|
||||
"var legacy=[];for(var i=0;i<snap.snapshotLength;i++){var item=snap.snapshotItem(i);"
|
||||
"if(cmVisible(item))legacy.push(item);}",
|
||||
"return {node:legacy.length===1?legacy[0]:null,count:legacy.length,"
|
||||
"source:'legacy',root_exists:false};}",
|
||||
"function cmMainImageContext(){",
|
||||
f"var root=document.querySelector({json.dumps(IMAGE_FIELD_SELECTOR)});",
|
||||
"if(root)return {node:root.querySelector('.shopee-image-manager'),"
|
||||
"source:'business',root_exists:true};",
|
||||
"return {node:document.querySelector('.shopee-image-manager'),"
|
||||
"source:'legacy',root_exists:false};}",
|
||||
"function cmMainImageItems(context){",
|
||||
"if(context&&context.root_exists){var manager=context.node;return manager?"
|
||||
"[].slice.call(manager.querySelectorAll("
|
||||
"'.shopee-image-manager__itembox.can-drag[data-draggable=\"true\"]')):[];}",
|
||||
f"var snap=document.evaluate({json.dumps(LEGACY_ITEMBOX_XPATH)},document,null,"
|
||||
"XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);",
|
||||
"var items=[];for(var i=0;i<snap.snapshotLength;i++)items.push(snap.snapshotItem(i));"
|
||||
"return items;}",
|
||||
"function cmMainUploadInput(context){var manager=context&&context.node;return manager?"
|
||||
"manager.querySelector('.shopee-image-manager__upload input[type=file]'):null;}",
|
||||
"function cmMainUploadBox(context){var manager=context&&context.node;return manager?"
|
||||
"manager.querySelector('.shopee-image-manager__upload,[class*=image-manager__upload]'):null;}",
|
||||
)
|
||||
)
|
||||
|
||||
JS_READY = (
|
||||
"(function(){"
|
||||
f"var s=document.evaluate({json.dumps(ITEMBOX_XPATH)},document,null,"
|
||||
"XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);"
|
||||
f"var r=document.evaluate({json.dumps(TITLE_XPATH)},document,null,"
|
||||
"XPathResult.FIRST_ORDERED_NODE_TYPE,null);"
|
||||
"var up=document.querySelector('.shopee-image-manager__upload input[type=file]');"
|
||||
"return (s.snapshotLength>0 && !!r.singleNodeValue && !!up);})()"
|
||||
+ JS_EDITOR_FIELD_HELPERS
|
||||
+ "var title=cmTitleCandidate();var image=cmMainImageContext();"
|
||||
"var items=cmMainImageItems(image);var up=cmMainUploadInput(image);"
|
||||
"var uploads=image.node?image.node.querySelectorAll("
|
||||
"'.shopee-image-manager__upload input[type=file]'):[];"
|
||||
"var srcs=items.map(function(item){var img=item.querySelector('img');return img?img.src:null;})"
|
||||
".filter(Boolean);"
|
||||
"var ready=title.count===1&&items.length>0&&uploads.length===1;"
|
||||
"return JSON.stringify({ready:ready,title_count:title.count,title_source:title.source,"
|
||||
"title_field_exists:title.root_exists,title_ambiguous:title.count>1,"
|
||||
"image_field_exists:image.root_exists,image_manager_exists:!!image.node,"
|
||||
"image_count:items.length,cdn_count:srcs.filter(function(s){return /susercontent/.test(s);}).length,"
|
||||
"blob_count:srcs.filter(function(s){return /^blob:/.test(s);}).length,"
|
||||
"upload_input_exists:!!up,upload_input_count:uploads.length,current_url:location.href});})()"
|
||||
)
|
||||
|
||||
JS_RECTS = (
|
||||
"(function(){"
|
||||
f"var s=document.evaluate({json.dumps(ITEMBOX_XPATH)},document,null,"
|
||||
"XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);"
|
||||
"var a=[];for(var i=0;i<s.snapshotLength;i++){"
|
||||
"var el=s.snapshotItem(i);var r=el.getBoundingClientRect();var im=el.querySelector('img');"
|
||||
+ JS_EDITOR_FIELD_HELPERS
|
||||
+ "var image=cmMainImageContext();var items=cmMainImageItems(image);"
|
||||
"var a=[];for(var i=0;i<items.length;i++){"
|
||||
"var el=items[i];var r=el.getBoundingClientRect();var im=el.querySelector('img');"
|
||||
"a.push({i:i,x:r.left+r.width/2,y:r.top+r.height/2,left:r.left,top:r.top,"
|
||||
"w:r.width,h:r.height,src:im?im.src:null});}"
|
||||
"return JSON.stringify(a);})()"
|
||||
@@ -59,14 +115,12 @@ JS_RECTS = (
|
||||
|
||||
JS_UPLOAD_STATE = (
|
||||
"(function(){"
|
||||
"function visible(e){if(!e)return false;var r=e.getBoundingClientRect();var s=getComputedStyle(e);"
|
||||
"return r.width>0&&r.height>0&&s.visibility!=='hidden'&&s.display!=='none';}"
|
||||
+ JS_EDITOR_FIELD_HELPERS
|
||||
+ "function visible(e){return cmVisible(e);}"
|
||||
"function text(e){return ((e&&((e.innerText||e.textContent)||''))||'').trim();}"
|
||||
"var manager=document.querySelector('.shopee-image-manager');"
|
||||
"var items=manager?[].slice.call(manager.querySelectorAll('.shopee-image-manager__itembox,[class*=image-manager__itembox]')):[];"
|
||||
"var image=cmMainImageContext();var manager=image.node;var items=cmMainImageItems(image);"
|
||||
"var imgs=items.map(function(item){var img=item.querySelector('img');return img?img.src:null;}).filter(Boolean);"
|
||||
"var upload=manager?manager.querySelector('.shopee-image-manager__upload input[type=file]'):null;"
|
||||
"var uploadBox=manager?manager.querySelector('.shopee-image-manager__upload,[class*=image-manager__upload]'):null;"
|
||||
"var upload=cmMainUploadInput(image);var uploadBox=cmMainUploadBox(image);"
|
||||
"var busy=manager?[].slice.call(manager.querySelectorAll('[class*=loading],[class*=Loading],[class*=spinner],[class*=Spinner],[class*=progress],[class*=Progress],[class*=uploading],[class*=Uploading]')).filter(visible):[];"
|
||||
"var errRe=/(失敗|失败|錯誤|错误|不支援|不支持|格式|大小|尺寸|超過|超过|重複|重复|duplicate|error|fail|invalid|unsupported)/i;"
|
||||
"var uploadRe=/(圖片|图片|封面|照片|相片|圖像|图像|image|photo|cover|upload|上傳|上传|檔案|文件|file|格式|大小|尺寸|像素|解析度|分辨率|超過|超过|重複|重复|duplicate)/i;"
|
||||
@@ -80,11 +134,13 @@ JS_UPLOAD_STATE = (
|
||||
"var errorToasts=pageErrorToasts.filter(function(t){return uploadRe.test(t);}).slice(0,8);"
|
||||
"return JSON.stringify({"
|
||||
"manager_exists:!!manager,"
|
||||
"image_field_exists:image.root_exists,"
|
||||
"count:items.length,"
|
||||
"srcs:imgs.slice(0,12),"
|
||||
"blob_count:imgs.filter(function(s){return /^blob:/.test(s);}).length,"
|
||||
"cdn_count:imgs.filter(function(s){return /susercontent/.test(s);}).length,"
|
||||
"upload_input_exists:!!upload,"
|
||||
"upload_input_count:manager?manager.querySelectorAll('.shopee-image-manager__upload input[type=file]').length:0,"
|
||||
"upload_input_disabled:!!(upload&&(upload.disabled||upload.getAttribute('aria-disabled')==='true')),"
|
||||
"upload_tile_visible:visible(uploadBox),"
|
||||
"busy_count:busy.length,"
|
||||
@@ -99,10 +155,9 @@ JS_UPLOAD_STATE = (
|
||||
|
||||
JS_CLICK_UPLOAD_TILE = (
|
||||
"(function(){"
|
||||
"function visible(e){if(!e)return false;var r=e.getBoundingClientRect();var s=getComputedStyle(e);"
|
||||
"return r.width>0&&r.height>0&&s.visibility!=='hidden'&&s.display!=='none';}"
|
||||
"var manager=document.querySelector('.shopee-image-manager');"
|
||||
"var box=manager?manager.querySelector('.shopee-image-manager__upload,[class*=image-manager__upload]'):null;"
|
||||
+ JS_EDITOR_FIELD_HELPERS
|
||||
+ "function visible(e){return cmVisible(e);}"
|
||||
"var image=cmMainImageContext();var box=cmMainUploadBox(image);"
|
||||
"if(!box)return JSON.stringify({clicked:false,reason:'NO_UPLOAD_TILE'});"
|
||||
"if(!visible(box))return JSON.stringify({clicked:false,reason:'UPLOAD_TILE_HIDDEN'});"
|
||||
"box.scrollIntoView({block:'center',inline:'center'});"
|
||||
@@ -112,18 +167,41 @@ JS_CLICK_UPLOAD_TILE = (
|
||||
)
|
||||
JS_TITLE_STATE = (
|
||||
"(function(){"
|
||||
f"var r=document.evaluate({json.dumps(TITLE_XPATH)},document,null,"
|
||||
"XPathResult.FIRST_ORDERED_NODE_TYPE,null);"
|
||||
"var el=r.singleNodeValue;if(!el)return null;"
|
||||
"return JSON.stringify({value:el.value,modelvalue:el.getAttribute('modelvalue')});})()"
|
||||
+ JS_EDITOR_FIELD_HELPERS
|
||||
+ "var title=cmTitleCandidate();var el=title.node;"
|
||||
"return JSON.stringify({found:!!el,candidate_count:title.count,source:title.source,"
|
||||
"field_exists:title.root_exists,value:el?el.value:null,"
|
||||
"modelvalue:el?el.getAttribute('modelvalue'):null});})()"
|
||||
)
|
||||
|
||||
JS_FIRST_COVER = (
|
||||
"(function(){"
|
||||
f"var s=document.evaluate({json.dumps(ITEMBOX_XPATH)},document,null,"
|
||||
"XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);"
|
||||
"if(!s.snapshotLength)return null;"
|
||||
"var img=s.snapshotItem(0).querySelector('img');return img?img.src:null;})()"
|
||||
+ JS_EDITOR_FIELD_HELPERS
|
||||
+ "var image=cmMainImageContext();var items=cmMainImageItems(image);"
|
||||
"if(!items.length)return null;"
|
||||
"var img=items[0].querySelector('img');return img?img.src:null;})()"
|
||||
)
|
||||
|
||||
JS_SCROLL_MAIN_IMAGE_MANAGER = (
|
||||
"(function(){"
|
||||
+ JS_EDITOR_FIELD_HELPERS
|
||||
+ "var image=cmMainImageContext();var manager=image.node;"
|
||||
"if(manager)manager.scrollIntoView({block:'center'});return !!manager;})()"
|
||||
)
|
||||
|
||||
JS_MAIN_UPLOAD_INPUT = (
|
||||
"(function(){"
|
||||
+ JS_EDITOR_FIELD_HELPERS
|
||||
+ "var image=cmMainImageContext();return cmMainUploadInput(image);})()"
|
||||
)
|
||||
|
||||
JS_DISPATCH_MAIN_UPLOAD_INPUT_EVENTS = (
|
||||
"(function(){"
|
||||
+ JS_EDITOR_FIELD_HELPERS
|
||||
+ "var image=cmMainImageContext();var up=cmMainUploadInput(image);"
|
||||
"if(!up)return false;"
|
||||
"up.dispatchEvent(new Event('input',{bubbles:true}));"
|
||||
"up.dispatchEvent(new Event('change',{bubbles:true}));return true;})()"
|
||||
)
|
||||
|
||||
JS_FIND_UPDATE = (
|
||||
@@ -229,7 +307,11 @@ JS_PAGE_TOASTS = (
|
||||
"function record(e){var root=rootOf(e);var value=text(root)||text(e);if(!value)return null;return {text:value,html:((root.outerHTML||e.outerHTML)||'').slice(0,2000),url:location.href,visible:visible(root)||visible(e),created_at:(new Date()).toISOString()};}"
|
||||
"var cached=(window.__cmshopee_toasts||[]).slice(-10);"
|
||||
"var current=Array.from(document.querySelectorAll('.eds-toasts .eds-toast,.eds-toast,.eds-toast__content,[role=alert],[class*=toast],[class*=Toast],[class*=message],[class*=Message],[class*=notice]')).map(record).filter(Boolean);"
|
||||
"var seen={};var out=[];cached.concat(current).forEach(function(item){var key=[item.text,item.html,item.url].join('|');if(seen[key])return;seen[key]=true;out.push(item);});"
|
||||
"var positions={};var out=[];"
|
||||
"cached.forEach(function(item){var copy=Object.assign({},item,{visible:false});var key=[copy.text,copy.url].join('|');"
|
||||
"if(positions[key]!==undefined){out[positions[key]]=copy;return;}positions[key]=out.length;out.push(copy);});"
|
||||
"current.forEach(function(item){var key=[item.text,item.url].join('|');"
|
||||
"if(positions[key]!==undefined){out[positions[key]]=item;return;}positions[key]=out.length;out.push(item);});"
|
||||
"return JSON.stringify(out.slice(-10));"
|
||||
"})()"
|
||||
)
|
||||
@@ -255,10 +337,10 @@ JS_POST_UPDATE_STATE = (
|
||||
|
||||
JS_CLICK_FIRST_DELETE = (
|
||||
"(function(){"
|
||||
f"var s=document.evaluate({json.dumps(ITEMBOX_XPATH)},document,null,"
|
||||
"XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);"
|
||||
"if(!s.snapshotLength)return JSON.stringify({clicked:false,reason:'NO_IMAGE'});"
|
||||
"var item=s.snapshotItem(0);"
|
||||
+ JS_EDITOR_FIELD_HELPERS
|
||||
+ "var image=cmMainImageContext();var items=cmMainImageItems(image);"
|
||||
"if(!items.length)return JSON.stringify({clicked:false,reason:'NO_IMAGE'});"
|
||||
"var item=items[0];"
|
||||
"['mouseover','mouseenter','mousemove'].forEach(function(n){"
|
||||
"item.dispatchEvent(new MouseEvent(n,{bubbles:true,view:window}));});"
|
||||
"var selectors=['.shopee-image-manager__icon--delete','[class*=\"icon--delete\"]','[class*=\"delete\"]'];"
|
||||
@@ -456,15 +538,29 @@ def _product_unavailable_toast_text(toasts):
|
||||
return None
|
||||
|
||||
|
||||
def _open_product_ready_error(cdp, fallback):
|
||||
def _same_page_url(left, right):
|
||||
try:
|
||||
left_url = urlparse(str(left or ""))
|
||||
right_url = urlparse(str(right or ""))
|
||||
except Exception:
|
||||
return False
|
||||
return bool(
|
||||
left_url.netloc
|
||||
and left_url.netloc == right_url.netloc
|
||||
and left_url.path.rstrip("/") == right_url.path.rstrip("/")
|
||||
)
|
||||
|
||||
|
||||
def _open_product_ready_error(cdp, fallback, current_url=""):
|
||||
toasts = read_page_toasts(cdp)
|
||||
invalid_text = _product_unavailable_toast_text(toasts)
|
||||
if invalid_text:
|
||||
return product_unavailable_error_message(invalid_text)
|
||||
page_url = str(current_url or _current_url(cdp) or "")
|
||||
for toast in reversed(toasts):
|
||||
text = str(toast.get("text") or "").strip()
|
||||
if text:
|
||||
return f"{fallback}:{text}"
|
||||
if text and toast.get("visible") and _same_page_url(toast.get("url"), page_url):
|
||||
return f"{fallback};页面提示(可能无关):{text}"
|
||||
return fallback
|
||||
|
||||
|
||||
@@ -472,6 +568,58 @@ def _title_state(cdp):
|
||||
return _json_value(cdp, JS_TITLE_STATE, default={}) or {}
|
||||
|
||||
|
||||
def _ready_state(cdp):
|
||||
raw = cdp.val(JS_READY)
|
||||
if isinstance(raw, bool):
|
||||
return {"ready": raw}
|
||||
if isinstance(raw, dict):
|
||||
return raw
|
||||
if raw in (None, ""):
|
||||
return {}
|
||||
parsed = json.loads(raw)
|
||||
return parsed if isinstance(parsed, dict) else {}
|
||||
|
||||
|
||||
def _ready_error_message(fallback, state):
|
||||
if not state:
|
||||
return fallback
|
||||
|
||||
details = []
|
||||
title_count = state.get("title_count")
|
||||
if title_count == 1:
|
||||
details.append("商品名称输入框正常")
|
||||
elif isinstance(title_count, int) and title_count > 1:
|
||||
details.append(f"商品名称输入框匹配到{title_count}个,无法确定唯一字段")
|
||||
elif title_count is not None:
|
||||
details.append("未识别商品名称输入框")
|
||||
|
||||
image_count = state.get("image_count")
|
||||
if not state.get("image_manager_exists") and "image_manager_exists" in state:
|
||||
details.append("未识别商品主图区域")
|
||||
elif isinstance(image_count, int) and image_count > 0:
|
||||
details.append(f"商品图片{image_count}张")
|
||||
elif image_count is not None:
|
||||
details.append("商品图片尚未加载")
|
||||
|
||||
upload_count = state.get("upload_input_count")
|
||||
if upload_count == 1:
|
||||
details.append("主图上传入口正常")
|
||||
elif isinstance(upload_count, int) and upload_count > 1:
|
||||
details.append(f"主图上传入口匹配到{upload_count}个,无法确定唯一入口")
|
||||
elif "upload_input_exists" in state or upload_count is not None:
|
||||
details.append("主图上传入口尚未加载")
|
||||
|
||||
current_url = str(state.get("current_url") or "")
|
||||
if current_url:
|
||||
try:
|
||||
parsed = urlparse(current_url)
|
||||
current_url = f"{parsed.scheme}://{parsed.netloc}{parsed.path}"
|
||||
except Exception:
|
||||
pass
|
||||
details.append(f"当前页面:{current_url}")
|
||||
return f"{fallback}:{';'.join(details)}" if details else fallback
|
||||
|
||||
|
||||
def _image_rects(cdp):
|
||||
return _json_value(cdp, JS_RECTS, default=[]) or []
|
||||
|
||||
@@ -644,13 +792,14 @@ def _cover_upload_error_message(result):
|
||||
|
||||
def _wait_ready(cdp, timeout=60):
|
||||
end = time.time() + timeout
|
||||
while time.time() < end:
|
||||
last_state = {}
|
||||
first_probe = True
|
||||
while first_probe or time.time() < end:
|
||||
first_probe = False
|
||||
try:
|
||||
if cdp.val(JS_READY):
|
||||
cdp.val(
|
||||
"(function(){var m=document.querySelector('.shopee-image-manager');"
|
||||
"if(m)m.scrollIntoView({block:'center'});return 1;})()"
|
||||
)
|
||||
last_state = _ready_state(cdp)
|
||||
if last_state.get("ready"):
|
||||
cdp.val(JS_SCROLL_MAIN_IMAGE_MANAGER)
|
||||
time.sleep(0.5)
|
||||
return True
|
||||
except Exception:
|
||||
@@ -658,8 +807,17 @@ def _wait_ready(cdp, timeout=60):
|
||||
invalid_text = _product_unavailable_toast_text(read_page_toasts(cdp))
|
||||
if invalid_text:
|
||||
raise EditorError(product_unavailable_error_message(invalid_text))
|
||||
if time.time() >= end:
|
||||
break
|
||||
time.sleep(1)
|
||||
raise EditorError(_open_product_ready_error(cdp, "等待蝦皮商品编辑器就绪超时"))
|
||||
fallback = _ready_error_message("等待蝦皮商品编辑器就绪超时", last_state)
|
||||
raise EditorError(
|
||||
_open_product_ready_error(
|
||||
cdp,
|
||||
fallback,
|
||||
current_url=last_state.get("current_url") if last_state else "",
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def _ensure_page_domains(cdp):
|
||||
@@ -1073,9 +1231,9 @@ def change_title(cdp, new_title) -> dict:
|
||||
|
||||
expr = (
|
||||
"(function(){"
|
||||
f"var r=document.evaluate({json.dumps(TITLE_XPATH)},document,null,"
|
||||
"XPathResult.FIRST_ORDERED_NODE_TYPE,null);var el=r.singleNodeValue;"
|
||||
"if(!el)return 'NO_INPUT';"
|
||||
+ JS_EDITOR_FIELD_HELPERS
|
||||
+ "var title=cmTitleCandidate();var el=title.node;"
|
||||
"if(!el)return title.count>1?'AMBIGUOUS_INPUT':'NO_INPUT';"
|
||||
"var s=Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,'value').set;"
|
||||
f"el.focus();s.call(el,{json.dumps(str(new_title))});"
|
||||
"el.dispatchEvent(new Event('input',{bubbles:true}));"
|
||||
@@ -1087,7 +1245,14 @@ def change_title(cdp, new_title) -> dict:
|
||||
value = state.get("value")
|
||||
modelvalue = state.get("modelvalue")
|
||||
ok = value == str(new_title) and modelvalue == str(new_title)
|
||||
return {"ok": ok, "written": written, "value": value, "modelvalue": modelvalue}
|
||||
return {
|
||||
"ok": ok,
|
||||
"written": written,
|
||||
"value": value,
|
||||
"modelvalue": modelvalue,
|
||||
"candidate_count": state.get("candidate_count"),
|
||||
"source": state.get("source"),
|
||||
}
|
||||
|
||||
|
||||
def replace_cover(cdp, image_win_path, old_cover_path=None, timeout=180) -> dict:
|
||||
@@ -1101,10 +1266,7 @@ def replace_cover(cdp, image_win_path, old_cover_path=None, timeout=180) -> dict
|
||||
if not os.path.exists(image_win_path):
|
||||
raise FileNotFoundError(f"封面图片不存在: {image_win_path}")
|
||||
|
||||
cdp.val(
|
||||
"(function(){var m=document.querySelector('.shopee-image-manager');"
|
||||
"if(m)m.scrollIntoView({block:'center'});return !!m;})()"
|
||||
)
|
||||
cdp.val(JS_SCROLL_MAIN_IMAGE_MANAGER)
|
||||
time.sleep(0.5)
|
||||
stable = _wait_image_manager_stable(
|
||||
cdp,
|
||||
@@ -1172,7 +1334,7 @@ def replace_cover(cdp, image_win_path, old_cover_path=None, timeout=180) -> dict
|
||||
"upload_state": _upload_state(cdp),
|
||||
}
|
||||
time.sleep(1)
|
||||
oid = cdp.object_id("document.querySelector('.shopee-image-manager__upload input[type=file]')")
|
||||
oid = cdp.object_id(JS_MAIN_UPLOAD_INPUT)
|
||||
if not oid:
|
||||
return {
|
||||
"ok": False,
|
||||
@@ -1184,12 +1346,7 @@ def replace_cover(cdp, image_win_path, old_cover_path=None, timeout=180) -> dict
|
||||
}
|
||||
|
||||
cdp.send("DOM.setFileInputFiles", {"objectId": oid, "files": [image_win_path]})
|
||||
changed = cdp.val(
|
||||
"(function(){var up=document.querySelector('.shopee-image-manager__upload input[type=file]');"
|
||||
"if(!up)return false;"
|
||||
"up.dispatchEvent(new Event('input',{bubbles:true}));"
|
||||
"up.dispatchEvent(new Event('change',{bubbles:true}));return true;})()"
|
||||
)
|
||||
changed = cdp.val(JS_DISPATCH_MAIN_UPLOAD_INPUT_EVENTS)
|
||||
time.sleep(2)
|
||||
new_src = None
|
||||
last_state = _upload_state(cdp)
|
||||
|
||||
Reference in New Issue
Block a user