接入视频号踩坑记:自动分发平台开发实录,ShadowDOM 真XX恶心

背景
我在搞一个自动分发平台,目标就是把内容(文章、视频)一键分发到各个平台,省得手动复制粘贴。听起来挺普通的功能,没啥特别的。
直到轮到接入微信视频号,我以为小问题,结果差点没把我心态搞崩。
初次遇坑
一上手就是找输入框。正常流程:用 chromedp 定位到 input,然后塞文字。结果压根定位不到。仔细看了下 DOM 树才发现,这玩意居然嵌在 open 的 Shadow DOM 里。
我心想:open 就 open 啊,顶多多写点 .shadowRoot.querySelector
,还能怎样?结果一调试,直接傻眼:
- elem.value = "测试标题" —— UI 不更新
- dispatchEvent(new Event("input")) —— 页面完全无动静
- innerText 改了也等于没改
一句话:JS 操作全都不顶用。
当时我真是懵了:open 的 shadowRoot 啊兄弟,你这也能搞出这种反自动化手段?
开始乱拳出击
我一个人对着代码想了很久,决定来一波地毯式攻击。大概尝试了这么几种:
- 直接赋值 elem.value = "xxx",再加 dispatchEvent。UI 一点反应都没有,后台也没收到。失败。
- 模拟点击 把输入框点亮,再用 InsertText 注入文字。光标是出来了,但就是输不进去。失败。
- 触发各种事件 input、change、keyup、keydown……全都 dispatch 了一遍,页面像死了一样。失败。
- CDP 键盘输入 开始硬刚底层,调 Chrome DevTools Protocol 的 Input.insertText。结果发现焦点不对,字符打进了空气里。失败。
- 换库试试 puppeteer、selenium 都跑了一遍,效果一模一样,彻底崩溃。
说真的,那几天每天都觉得快搞定了,第二天一看日志:呵呵,还是老样子。
独自崩溃
一个人开发最难的点就是没人能分担。遇到这种变态页面,队友可能还能互相安慰一下,结果我只能自己骂自己:
“服了,这 Shadow DOM 真是恶心到家了。”
有那么一瞬间,我甚至怀疑是不是自己 Go 代码写错了。结果仔细排查后发现,代码没毛病,问题就在页面本身。那种无力感,真的搞心态。
突破口
后来我咬着牙继续研究 CDP,把 chromedp 的封装都扒了几遍,才摸到一些门道。最后通过一套「非常规的组合拳」,终于能把文字塞进输入框里,让页面识别出来。
那一刻我盯着页面上跳出来的标题,脑子里只冒出一句话:
“妈的,终于成了。”
心得和吐槽
这次经历给我几条深刻教训:
- 别轻视 open 的 Shadow DOM:就算是 open,它也能加一堆反自动化机制,把你卡死。
- JS 操作可能完全没用:别指望 value = xxx 能解决问题。
- chromedp 很强,但也有限:最终还是要深入 CDP 底层,自己琢磨调用。
- 一个人开发真心累:没人能给你背锅,也没人能帮你分摊调试,熬夜爆肝全是自个儿的。
最后吐槽一句:Shadow DOM 这种设计真的是反人类,开发体验烂到爆。要不是硬着头皮搞,我真想直接给需求打回去。
尾声
现在视频号的自动分发总算能跑了,但每次想到 Shadow DOM,还是会头皮发麻。
如果以后有人跟我说“open 的 Shadow DOM 不难搞”,我可能第一反应就是笑出声:
“兄弟,等你遇到视频号那套结构再说吧。”
这篇随笔就当是留个记录,也算帮后续想搞自动化发布的朋友们提个醒:遇到 Shadow DOM,早点准备咖啡,别抱侥幸心理。