Loading... # 前言 [演示地址:][3] 之前将人人商城的抖音直播抓取做好后,就一直想写一个抓取抖音无水印视频的解析方法,github上最多的代码还是python源码多一些,php基本上没看到,在这里分享下我写抓取抖音无水印代码的经验。 ## 1、逻辑分析 一般涉及到抓取远程资源的项目,我都会模拟手机先去试包,一般手机的源码和接口相对来说比较简单,这次也不例外,PC代码直接略过。 一般涉及到远程资源返回,常见的都是前后端分离,由接口返回数据,所以只要分析好ajax请求,一般都不会太难。 ## 2. 代码阅读 首先祭出大杀器"chrome" F12模拟手机浏览器,直接打开手机分享过来的网址,发现一条ajax请求,点击进去发现视频路径、封面等参数都在这里,见下图: ![抖音抓取ajax分析.jpg][1] 十分清晰,现在就需要开始分析,ajax的请求参数都包含哪些,发现请求包含两个参数,其中一个还是空的,也就是一条参数就够了。 <pre> https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=\*\*\*\*&dytk= </pre> 查看源文件发现item_ids并未在代码中出现,而是网址中直接传递过来的。 ![抖音传递item_ids参数.jpg][2] 抖音原始网址301跳转到当前网址,所以直接用 `get_headers`读取headers中的 `location`获取当前网址,然后用正则提取出item_ids的值就可以了。 这段ajax请求返回的视频地址中包含真实播放地址获取方式也是用 `get_headers`获取,鉴于有三处需要用到 `get_headers`,我封装了个方法直接返回获取到的location。 无水印视频只要将ajax返回的播放地址中的 `playwm`替换成 `play`,用封装好的函数就可以获取到真实的下载地址了。 ## 3、编写代码 ```php <?php $url =$_GET['url']; //视频地址 $dyItem = get_location($url); //获取301跳转后地址 preg_match_all('/video\/(.*?)\//', $dyItem, $dyArr); //正则提取item_ids if (!empty($dyArr[1][0])) { $url = "https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={$dyArr[1][0]}&dytk="; $VideoTemp = curl_request($url); if (!empty($VideoTemp)) { $videoArr = json_decode($VideoTemp, true); $video = $videoArr['item_list'][0]['video']; $playUrl = $video['play_addr']['url_list'][0]; $play_url2 = get_location(str_replace("playwm", "play", $playUrl)); $data = array( 'desc' => $videoArr['item_list']['0']['desc'], 'cover' => $video['origin_cover']['url_list'][0], 'play_url' => get_location($playUrl) , 'play_url2' => $play_url2, ); echo "封面地址:".$data['cover']."<br/>"; echo "封面描述:".$data['desc']."<br/>"; echo "播放地址:".$data['play_url']."<br/>"; echo "无水印地址:".$data['play_url2']."<br/>"; } } else { echo "网址获取失败"; } function get_location($url) { $headers = get_headers($url, TRUE); if (!empty($headers['location'])) { return $headers['location']; } return ''; } function curl_request($url, $post = '', $cookie = '', $returnCookie = 0, $headers = '') { $curl = curl_init(); if (!empty($headers)) { curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); } curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Linux; Android 7.1.1; Mi Note 3 Build/NMF26X; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.98 Mobile Safari/537.36'); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($curl, CURLOPT_AUTOREFERER, 1); curl_setopt($curl, CURLOPT_REFERER, ""); if ($post) { curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post)); } if ($cookie) { curl_setopt($curl, CURLOPT_COOKIE, $cookie); } curl_setopt($curl, CURLOPT_ENCODING, 'gzip'); curl_setopt($curl, CURLOPT_HEADER, $returnCookie); curl_setopt($curl, CURLOPT_TIMEOUT, 10); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($curl); if (curl_errno($curl)) { return curl_error($curl); } curl_close($curl); if ($returnCookie) { list($header, $body) = explode("\r\n\r\n", $data, 2); preg_match_all("/Set\-Cookie:([^;]*);/", $header, $matches); $info['bodys'] = $matches; $info['cookie'] = substr($matches[1][0], 1); $info['content'] = $body; return $info; } else { return $data; } } ?> ``` 懒得复制粘贴的自己下载:https://wws.lanzous.com/iHUNgehtz7c [1]: https://img.jonasen.cn/blog/file/%E6%8A%96%E9%9F%B3%E6%8A%93%E5%8F%96ajax%E5%88%86%E6%9E%90.jpg [2]: https://img.jonasen.cn/blog/file/%E6%8A%96%E9%9F%B3%E4%BC%A0%E9%80%92item_ids%E5%8F%82%E6%95%B0.jpg [3]: http://demo.aw.ci/douyin.php?url=https://v.douyin.com/JNsFq2X/ "演示地址" 最后修改:2020 年 10 月 10 日 08 : 36 PM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信