您现在的位置是:时尚 >>正文

二次万能JSON视频解析PHP代码

时尚3人已围观

简介 二次万能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:

相关文章

  • 蹭网男孩考666分

    时尚

    蹭网男孩考666分 河南淅川,一个叫全杰的男孩,高考考了666分。这分数够吉利,但他更出名的外号是“蹭网男孩”——疫情期间家里没网,他跑到邻居家屋檐下蹭WiFi上课,一蹭就是两个月。 那张照片我见过: ...

    【时尚】

    阅读更多
  • 大连网站开发公司

    时尚

    大连软件园十二号楼里,晚上九点还亮着灯的,多半是网站开发公司的工位。我认识一个叫老周的项目经理,他上周刚拒了一个做海参电商的单子,理由是对方预算只够做一个展示页,却要求“能跟抖音小程序打通,还要有分销 ...

    【时尚】

    阅读更多
  • 合同管理漏洞和问题清单

    时尚

    上个月,一家做建材贸易的老客户找我做合同体检。老板拍着胸脯说他们合同管理“很规范”,结果我翻出三份盖着公章的采购协议——里面连违约金条款都没写。他愣了几秒,说了句让我印象深刻的话:“这些年打官司的钱, ...

    【时尚】

    阅读更多


友情链接