<?php
namespace App\Services;
class DouYinClearWmService
{
private $get_aweme_info_url = 'https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/';
/**
* 获取无水印视频url
* @param $short_url
* @return string
* @author:joniding
* @date:2020/9/17 15:01
*/
public function getLocation($short_url)
{
$aweme_id = 0;
//获取重定向地址
$location = $this->get_redirect_url($short_url);
//截取视频ID
$temp_arr = explode('/',$location);
$aweme_id = $temp_arr[5];
//获取视频详细信息、带水印url
$result = $this->getAwemeInfo($aweme_id);
//带水印视频url
$aweme_wm_url = $result['aweme_url'];
//无水印视频url
$temp_aweme_url = str_replace('playwm','play',$aweme_wm_url);
$url = $this->get_redirect_url_by_header($temp_aweme_url);
unset($temp_arr,$temp_aweme_url);
return $url;
}
/**
* 获取视频详细信息
* @param $aweme_id
* @return array
* @author:joniding
* @date:2020/9/17 14:06
*/
private function getAwemeInfo($aweme_id)
{
$data = [];
$params = [
'item_ids' => $aweme_id
];
$result = $this->sendRequest('GET',$this->get_aweme_info_url,$params);
$result = json_decode($result,true);
$data['aweme_url'] = isset($result['item_list'][0]['video']['play_addr']['url_list'])?$result['item_list'][0]['video']['play_addr']['url_list'][0]:'';
$data['music_url'] = isset($result['item_list'][0]['music']['play_url']['uri'])?$result['item_list'][0]['music']['play_url']['uri']:'';
$data['cover_url'] = isset($result['item_list'][0]['video']['cover']['url_list'])?$result['item_list'][0]['video']['cover']['url_list'][0]:'';
return $data;
}
/**
* 获取url重定向地址
* @param $url url
* @param string $referer
* @param int $timeout 超时时间
* @return bool|mixed
* @author:joniding
* @date:2020/9/17 13:59
*/
private function get_redirect_url($url, $referer='', $timeout = 10)
{
$redirect_url = false;
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_NOBODY, TRUE);//不返回请求体内容
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);//允许请求的链接跳转
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Mobile/15E148 Safari/604.1',
'Accept-Language: zh-cn',
'Accept-Encoding: gzip, deflate, br'
));
if ($referer) {
curl_setopt($ch, CURLOPT_REFERER, $referer);//设置referer
}
curl_exec($ch);
if(!curl_errno($ch)) {
$redirect_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);//获取最终请求的url地址
}
return $redirect_url;
}
/**
* 模拟请求
* @author HappyGe 2017-05-24 17:40:27
*
* @param type $method get,post
* @param string $url 请求的地址
* @param array $params 请求的参数
* @param string $request_headers request_headers头参数
* @return type
*/
private function sendRequest($method, $url, $params, $request_headers = '',$is_json = false)
{
$method = strtoupper($method);
$method == 'GET' && $url .= '?' . http_build_query($params);
$curl = curl_init(); //初始化CURL句柄
$timeout = 15;
curl_setopt($curl, CURLOPT_URL, $url); //设置请求的URL
curl_setopt($curl, CURLOPT_HEADER, false); // 不要http header 加快效率
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //设为TRUE把curl_exec()结果转化为字串,而不是直接输出
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // https请求 不验证证书和hosts
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
$request_headers_arr = [];
if ($request_headers == '') {
$request_headers_arr[] = 'Accept-Language: zh-CN;q=0.8';
curl_setopt($curl, CURLOPT_HTTPHEADER, $request_headers_arr);
} else {
curl_setopt($curl, CURLOPT_HTTPHEADER, $request_headers);
}
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $timeout); //设置连接等待时间
switch ($method) {
case 'GET':
curl_setopt($curl, CURLOPT_HTTPGET, true);
break;
case 'POST':
curl_setopt($curl, CURLOPT_POST, true);
if ($is_json){
curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-type:application/json']);
}
curl_setopt($curl, CURLOPT_POSTFIELDS, is_array($params) ? http_build_query($params) : $params);
break;
case 'PATCH':
curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-type:application/json']);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($params));
break;
case 'DELETE':
curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-type:application/json']);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($params));
break;
}
$tmpInfo = curl_exec($curl); //执行预定义的CURL
curl_close($curl);
return $tmpInfo;
}
/**
* 通过 get_headers 获取重定向地址
* @param $url
* @return mixed
* @author:joniding
* @date:2020/9/17 15:00
*/
private function get_redirect_url_by_header($url)
{
$header = get_headers($url, 1);
if (strpos($header[0], '301') !== false || strpos($header[0], '302') !== false) {
if(is_array($header['location'])) {
return $header['location'][count($header['location'])-1];
}else{
return $header['location'];
}
}else {
return $url;
}
}
}