微信短链接怎么还原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; ?>
】
相关推荐
- 如何自定义Windows终端的默认配置文件?(Po
- LINUX怎么查看进程_LINUX ps命令查看运
- C#怎么创建控制台应用 C# Console Ap
- Linux如何挂载新硬盘_Linux磁盘分区格式化
- Win11怎么设置虚拟内存最佳大小_Windows
- Python如何创建带属性的XML节点
- Python数据抓取合法性_合规说明【指导】
- php转mp4怎么保留字幕_php处理带字幕视频转
- Mac如何整理桌面文件_Mac使用堆栈功能一键整理
- Win11怎么忘记WiFi网络_Win11删除已保
- C#如何序列化对象为XML XmlSerializ
- 如何在JavaScript中动态拼接PHP的bas
- 如何使用正则表达式精确匹配最多含一个换行符的 st
- Windows系统被恶意软件破坏后的恢复策略_错误
- 如何在 Go 中创建包含映射(map)的切片(sl
- php做exe支持多线程吗_并发处理实现方式【详解
- 如何使用Golang反射创建map对象_动态生成键
- c++如何使用std::bind绑定函数参数_c+
- Python数据挖掘进阶教程_分类回归与聚类案例解
- c++怎么实现大文件的分块读写_c++ 文件指针s
- 如何在 Pandas 中按元素交集合并两列字符串
- 如何使用Golang实现错误包装与传递_Golan
- Go 中 defer 语句在 goroutine
- 如何使用Golang实现微服务状态监控_Golan
- c# 服务器GC和工作站GC的区别和设置
- 一文教你快速开通网站LOGO图
- 如何在Golang中使用encoding/gob序
- Windows 11如何查看系统激活密钥_Wind
- Python性能剖析高级教程_cProfileLi
- Windows怎样关闭锁屏广告_Windows关闭
- LINUX如何删除用户和用户组_Linux use
- Win11怎么关闭键盘按键音_Win11禁用打字声
- 如何在Golang中使用内置函数_Golangle
- 如何在Golang中实现并发消息队列消费者_Gol
- Win11开机自检怎么关闭_跳过Win11开机磁盘
- Mac如何设置动态壁纸?(让桌面动起来)
- c++怎么用jemalloc c++替换默认内存分
- Windows10如何查看蓝屏日志_Win10使用
- 微信企业付款回调PHP怎么接收_处理企业付款异步通
- Win11怎么打开旧版计算器_Win11恢复传统计
- Win11怎么更改管理员名字 Win11修改账户名
- Flask 表单数据通过 SMTP 发送邮件的完整
- 如何用::实现单例模式_php静态方法与作用域操作
- WindowsUSB驱动安装异常怎么办_USB驱动
- php中::能用于接口静态方法吗_接口静态方法调用
- Win11怎么恢复旧版开始菜单_通过软件还原Win
- Mac自带的词典App怎么用_Mac添加和使用多语
- Win11资源管理器卡顿怎么办 Win11文件资源
- PHP 中如何在函数内持久修改引用变量所指向的目标
- Win11怎么制作U盘启动盘_Win11原版系统安

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客服