简介:这是一款面向轻度办公用户的免费开源浏览器插件,专门解决微信网页版登录受限的问题,支持 Edge、Chrome 等 Chromium 内核浏览器。安装后即可在电脑上直接使用 wx.qq.com 网页版微信,免安装客户端、随开随关,几乎不占磁盘空间,适合只需基础聊天功能的用户。功能上覆盖文字、图片、表情包发送,以及截图、文件传输助手、新消息声音提醒、查找联系人与群聊等常用办公操作,界面简洁清爽。资源包共 7 个文件,以 4 个 png 图标资源、2 个 json 配置文件和 1 个规则集文件为主,压缩包仅 22KB,解压后将 wechat-need-web v1.1.1 文件夹拖入扩展安装页即可完成部署。目前已有 5638 人学习下载,适合希望轻量化使用微信网页端、又不想安装完整客户端的用户参考使用。
1. 微信网页版在桌面浏览器里为什么总被拦:Wechat-need-web 要解决的真实问题
很多人第一次遇到这个场景,是在 Edge 或 Chrome 里打开微信网页版,页面刚加载出来就提示「请在微信客户端打开链接」,或者二维码区域直接空白。换浏览器、清缓存、开无痕,折腾一圈还是不行。Wechat-need-web 这个插件方向,针对的就是这件事:让基于 Chromium 内核的桌面浏览器(Edge、Chrome、以及各种 Chromium 套壳)在访问微信网页版时,表现得像是微信内置浏览器,从而绕过页面侧对运行环境的判断。
它适合三类人:一是需要在电脑上长期挂着微信网页版收发消息、又不想装客户端的;二是做前端或自动化,需要研究页面在特定 UA 与运行环境下如何分支的;三是手里有 Edge、Chrome,想用插件方式一次性配置、长期生效的普通用户。核心逻辑不复杂,难的是把「改哪些头、改到什么程度、改完为什么还是白屏」这几件事讲清楚。下面按选型、实现、参数、排查一路拆开。
2. 拆开「伪装微信内置浏览器」这件事:UA、请求头与页面分支
2.1 页面到底靠什么判断你是不是微信
微信网页版在加载时会做多层环境探测,常见的有这几类信号。第一层是 User-Agent,微信内置浏览器的 UA 里带有MicroMessenger标识,桌面 Chrome 的 UA 里没有,这是最容易被识破的一层。第二层是请求头里的Referer和自定义头,部分接口会检查来源是否来自微信域。第三层是页面内 JS 的能力探测,比如window.navigator.userAgent、window.WeixinJSBridge是否存在、以及一些微信客户端注入的全局对象。
Wechat-need-web 这类插件的思路,是在请求发出前用声明式规则改写请求头,把 UA 换成带MicroMessenger的字符串,同时补齐页面依赖的其它头。它不注入微信客户端的原生能力,所以对强依赖WeixinJSBridge的功能(比如某些支付、分享回调)无能为力,但对「打开网页版、扫码登录、收发基础消息」这条主线通常够用。理解这个边界很重要,否则你会误以为装上插件就万事大吉。
2.2 为什么选浏览器插件而不是改系统代理或改 hosts
常见做法有三条路:改系统级 UA(部分浏览器支持启动参数)、用代理工具改写请求、装浏览器插件。前两条要么粒度太粗(影响所有站点),要么配置重、跨平台麻烦。插件方案的优势是作用域可控——只在匹配微信域名的请求上生效,Edge 和 Chrome 都能装,Chromium 内核通用。
这里要区分 Manifest V2 和 V3。V3 用declarativeNetRequest做请求头改写,规则是声明式的,浏览器层面执行,比 V2 的webRequest阻塞式监听更省资源,也更符合现在 Chrome、Edge 的扩展规范。Wechat-need-web 方向要落地,建议直接按 V3 写,避免以后被商店下架或本地加载受限。下面给出一份可直接加载的最小实现。
2.3 一份能直接加载的最小插件结构
先建目录,三个文件即可跑通:manifest.json、rules.json、以及一个可选的background.js。
{ "manifest_version": 3, "name": "wechat-need-web-min", "version": "1.0.0", "description": "让 Chromium 内核浏览器以微信内置浏览器身份访问微信网页版", "permissions": [ "declarativeNetRequest", "declarativeNetRequestFeedback" ], "host_permissions": [ "*://*.weixin.qq.com/*", "*://*.qq.com/*" ], "declarative_net_request": { "rule_resources": [ { "id": "wechat_rules", "enabled": true, "path": "rules.json" } ] } }manifest_version固定为 3,这是当前 Edge、Chrome 都支持且推荐的版本。permissions里declarativeNetRequest是改写请求头的前提,declarativeNetRequestFeedback用于调试时在扩展页看到规则命中情况,正式发布可以去掉。host_permissions限定作用域,只对微信和 QQ 域生效,避免污染其它站点。rule_resources指向规则文件,enabled: true表示默认启用。
[ { "id": 1, "priority": 1, "action": { "type": "modifyHeaders", "requestHeaders": [ { "header": "user-agent", "operation": "set", "value": "Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36 MicroMessenger/8.0.40.2420(0x28002837) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64" }, { "header": "referer", "operation": "set", "value": "https://wx.qq.com/" } ] }, "condition": { "urlFilter": "||weixin.qq.com", "resourceTypes": ["main_frame", "sub_frame", "xmlhttprequest"] } } ]这条规则做了两件事:把user-agent设成带MicroMessenger的安卓微信 UA,把referer设成微信网页版主域。urlFilter用||weixin.qq.com匹配该域及其子域,resourceTypes覆盖主文档、iframe 和 XHR,因为登录二维码和消息接口往往走异步请求。priority数值越大优先级越高,多条规则冲突时按它裁决。
2.4 在 Edge 和 Chrome 里加载并验证
打开edge://extensions/或chrome://extensions/,右上角开启「开发者模式」,点「加载解压缩的扩展」,选中刚才的目录。加载成功后,扩展卡片上会显示名称和版本。此时访问微信网页版,按 F12 打开开发者工具,切到 Network,刷新页面,点任意一个weixin.qq.com的请求,看 Request Headers 里的user-agent是否已经变成带MicroMessenger的值。
如果没生效,先确认规则文件路径和manifest.json里的path一致,再确认host_permissions覆盖了目标域。Edge 和 Chrome 对 V3 规则的支持基本一致,但 Edge 在部分版本里对declarativeNetRequestFeedback的日志展示位置不同,调试时以 Network 面板的实际请求头为准,别只信扩展页的提示。
3. 把规则做扎实:UA 字符串、匹配范围与多浏览器兼容
3.1 UA 字符串怎么选才不容易翻车
UA 不是随便拼一个带MicroMessenger的字符串就行。微信网页版会解析 UA 里的版本号、平台、NetType等字段,字段缺失或格式不对,可能触发降级逻辑。常见做法是直接取一段真实微信内置浏览器的 UA,保持结构完整。上面示例用的是安卓微信 8.0.40 的形态,包含MicroMessenger/8.0.40.2420、WeChat/arm64、NetType/WIFI、Language/zh_CN这些段。
如果你在 Windows 桌面环境,用安卓 UA 有时会让页面返回移动端布局,扫码登录区域变窄。这时可以换成 iOS 微信 UA,或者保留桌面平台标识但只把MicroMessenger段插进去。没有万能值,建议先用安卓 UA 跑通登录,再根据页面布局微调。改完 UA 一定要重新加载扩展,规则不会热更新。
3.2 匹配范围:别把整个 qq.com 都改了
host_permissions和urlFilter的范围要克制。微信网页版主域是wx.qq.com和weixin.qq.com,登录相关接口可能落在login.wx.qq.com、long.open.weixin.qq.com这类子域。把*://*.qq.com/*全放进来,会顺带改写 QQ 邮箱、QQ 空间等无关站点的请求头,可能引发登录态异常。
更稳的做法是列白名单式的子域匹配。declarativeNetRequest的urlFilter支持||前缀匹配域,也支持|精确匹配开头。可以写多条规则,分别针对wx.qq.com、weixin.qq.com、login.wx.qq.com,而不是一条大范围规则。规则条数在 V3 里有上限(静态规则通常几千条量级),日常用几十条完全够。
3.3 多浏览器兼容:Edge、Chrome、Chromium 套壳的差异
Edge 和 Chrome 都基于 Chromium,V3 扩展 API 基本一致,同一份代码两边都能加载。差异主要在扩展管理页地址(edge://extensions/vschrome://extensions/)和部分企业策略上。Chromium 套壳浏览器(比如一些国产内核浏览器)如果内核版本较老,可能只支持 V2,这时declarativeNetRequest会失效,需要退回webRequest方案,但 V2 在新版 Chrome 已逐步停用,长期看还是以 V3 为主。
一个实用技巧:把 UA 字符串和匹配域抽成配置,放在rules.json里集中管理,换浏览器或换 UA 时只改一处。下面是一个用脚本批量生成规则的例子,方便你维护多个 UA 变体。
import json # 不同平台的微信内置浏览器 UA 模板 UA_TEMPLATES = { "android": "Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 " "(KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36 " "MicroMessenger/8.0.40.2420(0x28002837) WeChat/arm64 " "Weixin NetType/WIFI Language/zh_CN ABI/arm64", "ios": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) " "AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 " "MicroMessenger/8.0.40(0x18002832) NetType/WIFI Language/zh_CN", } # 需要改写的目标子域 TARGET_HOSTS = ["wx.qq.com", "weixin.qq.com", "login.wx.qq.com"] def build_rules(platform="android"): rules = [] for idx, host in enumerate(TARGET_HOSTS, start=1): rules.append({ "id": idx, "priority": 1, "action": { "type": "modifyHeaders", "requestHeaders": [ {"header": "user-agent", "operation": "set", "value": UA_TEMPLATES[platform]}, {"header": "referer", "operation": "set", "value": "https://wx.qq.com/"}, ], }, "condition": { "urlFilter": f"||{host}", "resourceTypes": ["main_frame", "sub_frame", "xmlhttprequest"], }, }) return rules if __name__ == "__main__": with open("rules.json", "w", encoding="utf-8") as f: json.dump(build_rules("android"), f, ensure_ascii=False, indent=2) print("rules.json 已生成")这段脚本把 UA 模板和目标子域分离,build_rules按平台生成规则列表,id从 1 递增保证唯一。ensure_ascii=False让中文正常写入,indent=2方便人工检查。改平台只需传"ios",改目标域只需动TARGET_HOSTS。生成后覆盖原rules.json,回扩展页点「重新加载」即可。
3.4 参数速查表
| 参数 | 作用 | 建议值 |
|---|---|---|
manifest_version | 扩展规范版本 | 3 |
priority | 规则优先级 | 1,多条冲突时调大 |
urlFilter | 匹配的 URL 模式 | ` |
resourceTypes | 生效的请求类型 | main_frame / sub_frame / xmlhttprequest |
operation | 请求头操作 | set(覆盖)或 append |
| UA 版本段 | 伪装身份 | 与真实微信版本接近,别乱编 |
operation用set是覆盖原值,用append是追加。UA 一般用set,避免出现两个 UA 段。resourceTypes漏掉xmlhttprequest是常见错误,会导致页面能打开但接口请求仍被识别。
4. 避坑与排查:装上了还是白屏、登录失败怎么办
4.1 现象:扩展已加载,页面仍提示「请在微信中打开」
原因通常是规则没命中。可能是urlFilter写错、host_permissions没覆盖目标域,或者请求类型不在resourceTypes里。解决:打开开发者工具 Network,找到那个被拦的请求,看它的域名和类型,对照规则逐项核对。临时把declarativeNetRequestFeedback打开,在扩展页看规则命中日志,比盲猜快。
4.2 现象:二维码能出,扫码后一直转圈
原因多半是登录后的长连接或轮询接口走了别的子域,没被规则覆盖。微信登录后会连long.open.weixin.qq.com之类的长连接域。解决:在 Network 里按域名过滤,把登录后新出现的微信子域补进TARGET_HOSTS,重新生成规则并重载扩展。别一次性把所有qq.com加进去,按实际出现的域逐个补。
4.3 现象:Edge 里正常,Chrome 里失效
原因可能是两个浏览器的扩展没同步加载,或者 Chrome 版本较老不支持某些 V3 字段。解决:分别在edge://extensions/和chrome://extensions/确认扩展已启用且无报错。如果 Chrome 报规则解析失败,检查rules.json是否是合法 JSON(多余逗号、中文引号都会导致解析失败)。用python -m json.tool rules.json校验一遍最省事。
4.4 现象:改完 UA 后页面布局错乱、按钮点不到
原因是用移动端 UA 触发了移动布局,而桌面窗口宽度又不匹配。解决:换 iOS UA 试试,或者保留桌面 UA 只插入MicroMessenger段。也可以在开发者工具里用设备模拟调宽度,找到能正常显示的 UA 与视口组合。这是玄学重灾区,多试几组比死磕一组快。
4.5 现象:更新扩展后规则不生效
原因是没有重新加载扩展,或者浏览器缓存了旧规则。解决:在扩展页点「重新加载」,然后强制刷新页面(Windows 用 Ctrl+F5,Mac 用 Cmd+Shift+R)。如果还不行,禁用再启用扩展,或者删掉重新加载目录。规则文件改动不会自动热更新,这一步不能省。
5. 进阶:把伪装做成可维护的配置,并用最小验证闭环确认
走到这里,你已经能跑通基本流程。真正拉开差距的是可维护性和验证方法。我一般会把 UA、目标域、请求类型全部抽到一个config.json,用脚本生成rules.json,这样换微信版本、加子域、切平台都只改配置。下面是一个验证闭环的写法:加载扩展后,用页面内的fetch打一个已知会被识破的接口,对比改头前后的响应。
// 在微信网页版页面控制台执行,验证请求头是否已被改写 fetch("https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit", { method: "POST", credentials: "include", }) .then((res) => res.json()) .then((data) => console.log("接口返回:", data)) .catch((err) => console.error("请求失败:", err));这段代码在页面上下文里发起一个带 cookie 的请求,如果扩展生效,请求头里会带上伪装 UA,接口返回正常数据结构;如果没生效,通常返回错误码或重定向到提示页。注意在控制台执行时要确保当前就在微信域下,跨域请求会被浏览器拦截。
验证通过后,把配置固化成版本管理:config.json记录 UA 模板和域列表,生成脚本负责产出rules.json,扩展目录只放生成物。这样下次微信改版,你只需要更新 UA 版本段,跑一遍脚本,重载扩展,三分钟搞定。我踩过最深的坑,是早期把 UA 硬编码在规则里,微信一升级就得手动翻文件改,后来抽成配置才省心。另一个习惯是每次改完先在 Network 面板确认请求头,再去看页面表现,顺序反了容易把布局问题误判成规则问题。希望帮到你。
本文还有配套的精品资源,点击获取