微信短链接怎么还原php_用浏览器开发者工具抓包获取【方法】
技术百科
星夢妙者
发布时间:2026-01-01
浏览: 次 微信短链无法用PHP直接还原,因其采用服务端302跳转+前端JS混淆双重保护,cURL不执行JS且受UA、Cookie限制,仅能处理
微信短链接无法直接用 PHP 解析还原,因为 weixin.qq.com 类短链(如 https://w.url.cn/s/AbCdEfG)是服务端 302 跳转 + 前端 JS 混淆双重保护,PHP 的 get_headers() 或 cURL 默认拿不到最终 URL —— 它们会被重定向拦截,且部分跳转还依赖微信客户端 UA 和 Cookie。
为什么 curl_getinfo($ch, CURLINFO_EFFECTIVE_URL) 失败
微信短链的跳转链路通常是:短链 → 中间页(含 JS 跳转)→ 目标页。cURL 默认不执行 JS,所以即使开启 CURLOPT_FOLLOWLOCATION,也只走到中间 HTML 页面,CURLINFO_EFFECTIVE_URL 返回的是中间页地址(如 https://mp.weixin.qq.com/s?__biz=xxx 的壳页面),不是真实目标 URL。
- 中间页响应头通常不含
Location,而是返回一段含window.location.href = "..."或 Base64 混淆字符串的 HTML - 微信会校验
User-Agent,非微信 UA(如 cURL 默认值)可能被返回 403 或降级为二维码页 - 部分短链还依赖
cookie(如pgv_pvi、mm_lang),空 cookie 会导致跳转中断
用浏览器开发者工具抓包的真实流程
这不是“打开 F12 看一眼就完事”,关键在于捕获**首次跳转后的那个带 Location 响应头的请求**,它往往藏在 XHR 或 Fetch 请求里,或由前端 JS 触发的隐藏 iframe 加载中。
- 在 Chrome 打开微信短链(需用微信内置浏览器或通过「微信开发者工具」模拟,普通 Chrome 会跳转失败)
- F12 → Network → 勾选「Preserve log」→ 刷新页面
- 过滤
XHR和Doc,找到第一个返回 302 的请求(响应头含Location: https://mp.weixin.qq.com/...) - 右键该请求 → 「Copy」→ 「Copy as cURL (bash)」,粘贴到终端可验证是否能复现跳转
- 若没看到 302,点开任意一个 HTML 响应 → 查看 Response → 搜索
location.href或base64字符串,手动解码
PHP 中模拟可行但有限的还原方式
只能处理「纯服务端 302 跳转」的极少数微信短链(实际占比<5%),对主流 w.url.cn 无效。必须严格设置请求头和 Cookie,并禁用自动跳转以便逐层检查。
function resolveWechatShortUrl($shortUrl) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $shortUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); // 关键:不能自动跳
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_USERAGENT, '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.49(0x18003133) NetType/WIFI Language/zh_CN');
curl_setopt($ch, CURLOPT_COOKIE, 'mm_lang=zh_CN; pgv_pvi=1234567890;');
$response = curl_exec($ch);
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$headers = substr($response, 0, $headerSize);
$body = substr($response, $headerSize);
if (preg_match('/Location:\s*(.+)/i', $he
aders, $matches)) {
return trim($matches[1]);
}
// 若无 Location,尝试从 body 提取 JS 跳转(简单匹配,不保证 100%)
if (preg_match('/window\.location\.href\s*=\s*[\'"]([^\'"]+)[\'"]/i', $body, $matches)) {
return $matches[1];
}
curl_close($ch);
return null;
}
这个函数对大部分 w.url.cn 返回 null,因为它的 body 是加密 script 标签或 canvas 渲染页 —— 这正是为什么必须依赖浏览器抓包,而不是幻想 PHP 单独搞定。
真正稳定还原微信短链,唯一可靠路径是:用 Puppeteer 或 Playwright 启动真实 Chromium,注入微信 UA,等 JS 执行完再读 window.location.href;或者,直接信任抓包拿到的那条 302 响应头 —— 其他所有“PHP 解密算法”“Base64 反混淆”都是针对过期样本的无效尝试。
# 微信
# 浏览器
# app
# mac
# 工具
# js
# curl
# html
# chrome
# qq
# NULL
# 前端
# php
# bash
# wifi
# cookie
# iphone
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11怎么设置系统还原_Windows11系统
- Windows10如何更改系统字体大小_Win10
- Win11怎么设置声音输出设备_Windows11
- c++ unordered_map怎么用 c++哈
- LINUX如何开放防火墙端口_Linux fire
- php485在macos下怎么配置_php485
- c++中如何使用虚函数实现多态_c++多态性实现原
- Avalonia如何实现跨窗口通信 Avaloni
- 如何在Golang中实现自定义Benchmark_
- 如何在Golang中配置代码格式化工具_使用gof
- windows如何禁用驱动程序强制签名_windo
- Win10怎么限制单程序CPU占用上限_Win10
- Win11如何卸载OneDrive_Win11卸载
- Python与OpenAI接口集成实战_生成式AI
- Windows10系统怎么查看IP地址_Win10
- Win11怎样安装网易云音乐_Win11安装网易云
- php串口通信波特率怎么选_根据硬件手册设置正确波
- Win11怎样彻底卸载自带应用_Win11彻底卸载
- Win11输入法选字框不见了怎么办_Win11输入
- Win11如何设置系统声音_Win11系统声音调整
- VSC里PHP变量未定义报错怎么解决_错误抑制技巧
- php8.4新语法match怎么用_php8.4m
- Win11怎么关闭应用权限_Windows11相机
- c++怎么使用std::filesystem遍历文
- 如何开启Windows的远程服务器管理工具(RSA
- Win11怎么设置屏保_Windows 11屏幕保
- 如何在Golang中处理云原生事件_使用Event
- Win11时间不对怎么同步_Win11自动校准互联
- Windows系统文件被保护机制阻止怎么办_权限不
- 为什么Go建议使用error接口作为错误返回_Go
- Python文件操作优化_大文件与流处理解析【教程
- Python 模块的 __name__ 属性如何由
- Windows10系统怎么查看系统版本_Win10
- Windows10如何更改日期格式_Win10区域
- Win11时间怎么同步到原子钟 Win11高精度时
- Win11怎么关闭小组件_Win11禁用任务栏天气
- 微信里的php文件怎么变mp4_微信接收php转m
- PHP cURL GET请求:正确设置请求头与身份
- C++中引用和指针有什么区别?(代码说明)
- C++如何解析JSON数据?(nlohmann/j
- Win11怎么更改电脑密码_Windows 11修
- Win11更新后变慢怎么办_Win11系统更新后卡
- Win11怎么关闭防火墙通知_屏蔽Win11安全中
- Win11怎么关闭自动维护 Win11禁用系统自动
- LINUX的SELinux是什么_详解LINUX强
- 本地php环境出现502错误_nginx或apac
- 如何在 PHP 单元测试中正确模拟带方法的图像处理
- Windows10如何删除恢复分区_Win10 D
- Win10怎么卸载金山毒霸_Win10彻底卸载金山
- Win10系统怎么查看网络连接状态_Windows

aders, $matches)) {
return trim($matches[1]);
}
// 若无 Location,尝试从 body 提取 JS 跳转(简单匹配,不保证 100%)
if (preg_match('/window\.location\.href\s*=\s*[\'"]([^\'"]+)[\'"]/i', $body, $matches)) {
return $matches[1];
}
curl_close($ch);
return null;
}
QQ客服