我将长时间提供可运行的无水印视频下载开源代码。
🔭 预期
💻 正文
方法一:使用去水印平台
这些网站是针对短视频平台的,但需要付费解析的,可以考虑使用 Splinter。 将浏览器设置为无头浏览器 ,直接模拟请求解析,可以白嫖。
- 方法二:直接修改下载链接
public function main() {
// 视频播放地址, 通过抖音分享链接获取
$url = 'https://v.douyin.com/JKgS4Vp/'
$url = $this->getCurl($url);
preg_match('/video\/([0-9]+)\//i', $url, $matches);
$result = $this->video_url($matches[1]);
return $result;
}
/**
* 获取抖音接口视频信息
*/
private function video_url($dyid)
{
$getApi = 'https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=' . $dyid;
$data = $this->getCurl($getApi);
$json = json_decode($data, true);
//视频描述
$playUrl = null;
foreach ($json['item_list'] as $k => $v) {
//无水印URL
$playUrl = $list['play_url'] = $this->Url($v['video']['play_addr']['url_list']);
}
return [
'play_url' => urldecode($playUrl),
];
}
/**
* 修改下载链接
*/
public function Url($list) {
return $list[0].replace('playwm','play')
}
/**
* 发起请求
*/
public function getCurl($url, $options = [], $foll = 0)
{
//初始化
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); //访问的url
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //完全静默
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //忽略https
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //忽略https
curl_setopt($ch, CURLOPT_HTTPHEADER, array_merge([self::getRandomUserAgent()], $options)); //UA
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $foll); //默认为$foll=0,大概意思就是对照模块网页访问的禁止301 302 跳转。
$output = curl_exec($ch); //获取内容
curl_close($ch); //关闭
return $output; //返回
}
- 方法三:设置视频播放地址的 Referer 与 Host
public function main() {
// 视频播放地址, 通过抖音分享链接获取
$url = 'https://v.douyin.com/JKgS4Vp/'
$url = $this->getCurl($url);
preg_match('/video\/([0-9]+)\//i', $url, $matches);
$result = $this->videoUrl($matches[1]);
return $result;
}
/**
* 获取抖音接口视频信息
*/
private function videoUrl($dyid)
{
$getApi = 'https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=' . $dyid;
$data = $this->getCurl($getApi);
$json = json_decode($data, true);
//视频描述
$playUrl = null;
foreach ($json['item_list'] as $k => $v) {
//无水印URL
$playUrl = $list['play_url'] = $this->Url($v['video']['play_addr']['uri']);
}
return [
'play_url' => urldecode($playUrl),
];
}
/**
* 获取重定向视频地址
*/
public function Url($videoId)
{
$str = $this->getCurl("https://aweme.snssdk.com/aweme/v1/play/?video_id=" . $videoId . "&line=0", [
'Referer' => "https://www.iesdouyin.com",
'Host' => "www.iesdouyin.com",
], 0);
preg_match('#<a href="(.*?)">#', $str, $data);
$download_url = explode("//", $data[1]);
return isset($download_url[1]) ? 'https://' . $download_url[1] : '解析失败';
}
/**
* 发起请求
*/
public function getCurl($url, $options = [], $foll = 0)
{
//初始化
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); //访问的url
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //完全静默
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //忽略https
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //忽略https
curl_setopt($ch, CURLOPT_HTTPHEADER, array_merge([self::getRandomUserAgent()], $options)); //UA
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $foll); //默认为$foll=0,大概意思就是对照模块网页访问的禁止301 302 跳转。
$output = curl_exec($ch); //获取内容
curl_close($ch); //关闭
return $output; //返回
}
🎉 总结
获取抖音无水印视频,打开抓包工具就能找到规律,但是这个方法一般会留到最后。目前我最常用的方法是先去 github 上检索关键词,学习同行的思路。github 中一般可以总结出 2 ~ 3 种方案,再根据自己的上下文,选择最合适的方案。<br/>