您现在的位置是:百科 >>正文
二次万能JSON视频解析PHP代码
百科926人已围观
简介 二次万能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:
上一篇:海口龙华区链接网络科技工作室骗子
下一篇:弱口令漏洞是什么意思
相关文章
堵住漏洞 补齐短板
百科小区东门那条路,坑洼三年了。物业修了两次,每次都是填了又塌,塌了再填。今年雨季,一个骑电动车送孩子上学的妈妈,前轮卡进坑里,孩子摔出去,锁骨骨折。事后物业经理在业主群里道歉,说“会尽快处理”。处理的结 ...
【百科】
阅读更多问卷星网站登录
百科问卷星网站的登录页面,是我见过的最“分裂”的界面之一。左边是蓝白配色的清爽引导图,右边是三个赤裸裸的输入框:手机号、密码、登录按钮。没有花哨的动效,没有“欢迎回来”的温情问候,甚至连个默认勾选的“记住 ...
【百科】
阅读更多污词汇网络用语
百科网吧里一个十六岁的少年,屏幕上打出一串“草泥马”,对面回敬一串更长的“妈卖批”。旁边上网的中年人皱了皱眉,但没说话——他年轻时也这么骂过,只是那时候用方言,现在用拼音缩写。 污词和网络用语搅在一起,已 ...
【百科】
阅读更多