演示地址:http://dy.kder.top/
一、原理
2020.03.24 使用有效,抖音视频是在下载的时候才加水印的,播放的时候无水印,所以原理就是利用PHP或其它语言去抓取这个用于播放的无水印的视频地址(大概走了 3 次重定向),具体参考:最新抖音无水印解析原理..
二、PHP 实现如下
<?php
// 测试地址
$url = "https://v.douyin.com/7J48Rf/";
// 模拟手机端浏览器
function http_get($url)
{
$ch = curl_init();
$opt = [];
$opt[CURLOPT_URL] = $url;
$opt[CURLOPT_RETURNTRANSFER] = true;
$opt[CURLOPT_FOLLOWLOCATION] = true;
$user_agent = "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Mobile Safari/537.36";
$opt[CURLOPT_USERAGENT] = $user_agent;
curl_setopt_array($ch, $opt);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
// 1.请求获取itemId、dytk
$dy_html = http_get($url);
preg_match('/itemId:\s\"([\s\S]*?)\"/i',$dy_html,$itemids_rs);
preg_match('/dytk:\s\"([\s\S]*?)\"/i',$dy_html,$dytk_rs);
$item_ids = $itemids_rs[1] ?? "获取item_ids失败";
$dytk = $dytk_rs[1] ?? "获取item_ids失败";
// 2.请求视频信息(这里所得视频地址还会被重定向到视频资源)
$url2 = "https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?" . http_build_query(compact('item_ids', 'dytk'));
$arr_data = json_decode(http_get($url2), 1);
$play_url = $arr_data["item_list"][0]["video"]["play_addr"]["url_list"][0] ?? "";
// 3.请求获取视频资源
$vedio_resources = http_get($play_url);
file_put_contents("./test.mp4", $vedio_resources);
echo "无水印视频地址:" . __DIR__ . "/test.mp4";
其它
空闲之余做了个 demo:http://dy.kder.top/,欢迎测试(前端代码是搞别人的,侵权请联系修改)