文章目录

抖音获取无水印视频

由 xiao 发布
<?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;
        }
    }
}

暂无评论

发表评论