您现在的位置是:百科 >>正文
二次万能JSON视频解析PHP代码
百科2986人已围观
简介 二次万能JSON视频解析PHP代码 先看个实际场景。你写了个采集站,目标站突然把播放器接口从XML换成了JSON。正则写死了,解析器全废。这时候你翻出三个月前写的代码,发现里面全是preg_matc ...
二次万能JSON视频解析PHP代码
先看个实际场景。次万你写了个采集站,频解目标站突然把播放器接口从XML换成了JSON。代码正则写死了,次万解析器全废。频解这时候你翻出三个月前写的代码代码,发现里面全是次万preg_match配死模板——改起来比重写还痛苦。
后来我学乖了。频解所有视频解析统一走JSON,代码不管对方返回什么结构,次万先转数组再递归找播放地址。频解这个思路救了我好几次,代码甚至有一次对方接口嵌套了七层数组,次万照样一把梭出来。频解
核心逻辑其实就三步:file_get_contents拿数据,代码json_decode转数组,然后递归遍历找url字段。但真做起来有几个坑得注意。
第一个坑是编码。有些站返回的JSON带BOM头,直接json_decode返回null。你得先trim($json, "\xEF\xBB\xBF"),或者干脆用preg_replace把不可见字符全干掉。第二个坑是接口带签名验证,直接file_get_contents会被403。这时候得模拟UA,带上Referer,必要时还得处理Cookie。
下面这段代码我用了两年,改过三版,现在基本稳定:
function parseVideo($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'); curl_setopt($ch, CURLOPT_REFERER, parse_url($url, PHP_URL_HOST)); $data = curl_exec($ch); curl_close($ch); // 去掉BOM和不可见字符 $data = preg_replace('/[^\x20-\x7E\x0A\x0D]/', '', $data); $arr = json_decode($data, true); if (!$arr) return false; // 递归搜索所有可能的视频地址 $result = []; array_walk_recursive($arr, function($value, $key) use (&$result) { if (in_array($key, ['url', 'src', 'playurl', 'video']) && is_string($value) && preg_match('/^https?:\/\//', $value)) { $result[] = $value; } }); return array_values(array_unique($result)); } 这段代码有个好处——不关心JSON结构长什么样。对方把url藏在data->list->[0]->play_info里也好,还是直接{ "video":"http://..."}平铺也好,都能挖出来。关键就是array_walk_recursive这个函数,递归遍历所有层级,把带url键的字符串全捞出来。
当然也有翻车的时候。有一次对方接口返回的是JSONP格式,外面包了个callback({ ...}),直接json_decode必然失败。处理办法是正则剥掉外层:preg_replace('/^\w+\(/', '', $data),再去掉结尾的)。还有一次对方把视频地址做了base64编码,得先解码才能用。这时候递归搜索就得加个判断,base64_decode后验证是不是合法URL。
还有个细节容易忽略。有些接口的url字段是相对路径,比如//cdn.example.com/video.mp4,没有协议头。这时候得补上https:前缀。我通常在正则匹配里加个判断,如果是双斜杠开头就拼上当前请求的协议。
这套方案的缺点也有。比如遇到动态加载的页面,接口是JS异步请求的,PHP这边拿不到。解决办法是分析JS文件找真正的接口地址,或者用无头浏览器渲染。但那是另一个话题了,至少对于90%的静态JSON接口,这段代码够用了。
最后说个实战案例。上个月帮朋友修一个影视站,对方用的某资源站接口,文档里写的返回格式和实际完全不一样。我直接用这段代码抓,发现它把视频地址放在result->list->[2]->extra->play_url里,而且这个字段名还是动态的,有时候叫play_url,有时候叫down_url。因为我的递归搜索是遍历所有键名,所以不管它叫什么,只要是URL就抓出来了。朋友当时看傻了眼,说这代码能通吃所有接口。
其实原理很简单,就是别把解析逻辑写死到具体字段上。JSON结构千变万化,但视频地址终归是个HTTP链接。你只要抓住这个本质,递归扫一遍数组,把看起来像URL的字符串全提出来,再按优先级排序就行。至于后面的防盗链、加密处理,那是另一个层面的事。
Tags:
相关文章
常见的网站Web服务器有哪些
百科常见的网站Web服务器有哪些 打开浏览器,敲入网址,页面秒开。你很少会去想背后那台机器叫什么名字——但它的确有个名字,而且不止一个。全球互联网上跑着的Web服务器,主流就那么几款,各有各的脾气。 Ap ...
【百科】
阅读更多漏洞扫描哪家好
百科漏洞扫描哪家好? 别急着听厂商吹牛,先看一个真实翻车现场。去年某金融公司买了某知名品牌的旗舰版扫描器,号称“零误报”,结果上线第一天就把自家测试环境的Spring Boot服务报成“高危RCE”,吓得 ...
【百科】
阅读更多七星配资官网登录入口
百科七星配资的官网登录入口,其实是个挺有意思的话题。多数人第一反应是“找个链接点进去”,但真到操作层面,问题就来了——你搜出来的那个“官网”,十有八九是仿冒的。 我见过最离谱的一次,是朋友老张在百度搜“七 ...
【百科】
阅读更多