最新公告
  • 欢迎您光临陆大湿,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 前言说明

     

    最近一直很忙,所以没怎么更新内容了,今天抽空给大家更新一下。这段时间一直在修复短视频去水印一些接口问题,这篇介绍西瓜视频去水印接口解析。之前也是更新了快手、抖音去水印原理,鉴于此今天就在上次的基础上介绍下西瓜去水印接口解析的代码。

    去水印接口涉及内容,以下2套均要接口对接:

    独立后台去水印微信小程序V1.3.0版本短视频去水印接口平台个人修复版V2贩卖机

    如果不懂代码,可以直接对接API接口平台:

    https://qsy.ludeqi.com 更新后支持小红书

    接口代码

     

    1、新建“index.php”文件,复制下面请求代码

    <?phprequire 'qsy.php';echo getUrl();    function getUrl(){        $data = Ludeqi::qsy($_GET['url']);    return  $data;    }

     

    2、在同目录新建“qsy.php”文件,复制去水印算法代码

    
    <?php
    class Ludeqi {
       static public function qsy($url) {
        
            preg_match('/([\w-]+\.)+\w+(\:\d{2,6})?/', $url, $domain);
            switch ($domain[0]) {
                case '':
                    return self::result(500, '请传入解析url参数,例:https://qsy.ludeqi.com/?url= https://v.kuaishou.com/aU7PCz/');
                break;
                case 'v.douyin.com':
                    return self::douyin($url);
                break;
                case 'v.kuaishou.com':
                    return self::kuaishou($url);
                break;
                 case 'v.ixigua.com':
                    return self::xigua($url);
                break;
                default:
                    return self::result(500, '抱歉,此url暂不支持!');
            }
        }
      
        static public function douyin($url) {
        
            $url = self::httpRequest($url, 'GET');
            preg_match('/(?<=video\/)\d*(?=\/\?region)/', $url['location'], $matches);
            $item_ids = $matches[0];
            $vidoUrl = 'https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=' . $item_ids;
            $result = self::httpRequest($vidoUrl, 'GET');
            $vid = $result['response']['item_list'][0]['video']['play_addr']['uri'];
            if (isset($vid)) {
                $video_url = 'https://aweme.snssdk.com/aweme/v1/play/?video_id=' . $vid . '&ratio=720p&line=0';
                $music = $result['response']['item_list'][0]['music']['play_url']['uri'];
                $nickname = $result['response']['item_list'][0]['author']['nickname'];
                $return = array('nickname' =>
     $nickname, 'video_url' => $video_url, 'music' => $music);
                return self::result(200, $return);
            } else {
                return self::result(500, '解析出错!');
            }
        }
      
        static public function kuaishou($url) {
        
            $vurl = self::httpRequest($url, 'GET');
            preg_match('/(?<=video\/)\w*(?=\?fid)/', $vurl['location'], $matches);
            $str_qury1 = 'query visionVideoDetail($photoId: String, $type: String, $page: String, $webPageArea: String)';
            $str_qury2 = '(photoId: $photoId, type: $type, page: $page, webPageArea: $webPageArea)';
            $query = array("operationName" =>
     "visionVideoDetail", "variables" => array('photoId' => $matches[0], "page" => "detail"), "query" => $str_qury1 . "{\n visionVideoDetail" . $str_qury2 . "{\n photo {\n id\n duration\n caption\n likeCount\n realLikeCount\n coverUrl\n photoUrl\n }\n}\n}\n",);
            $query = json_encode($query, 320);
            $headers = array('content-type: application/json', 'Referer:' . $vurl['location']);
            $result = self::httpRequest('https://video.kuaishou.com/graphql', 'POST', $query, $headers);
            if (isset($result['response']['data']['visionVideoDetail']['photo']['photoUrl'])) {
                return self::result(200, $result['response']['data']['visionVideoDetail']['photo']);
            } else {
                return self::result(500, '解析出错!');
            }
        }
      static public function xigua($url) {
              $vurl = self::httpRequest($url, 'GET');
              preg_match('/video\/(.*)\//', $loc, $id);
              $url = 'https://www.ixigua.com/' . $id[1];
                $headers = [
                "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36 ",
                "cookie:你的cookie"
            ];
            $text = $this->curl($url, $headers);
            preg_match('/<script id=\"SSR_HYDRATED_DATA\">window._SSR_HYDRATED_DATA=(.*?)<\/script>/', $text, $jsondata);
            $data = json_decode(str_replace('undefined', 'null', $jsondata[1]), 1);
            $result = $data["anyVideo"]["gidInformation"]["packerData"]["video"];
            $video = $result["videoResource"]["dash"]["dynamic_video"]["dynamic_video_list"][2]["main_url"];
            preg_match('/(.*?)=&vr=/', base64_decode($video), $video_url);
            $music = $result["videoResource"]["dash"]["dynamic_video"]["dynamic_audio_list"][0]["main_url"];
            preg_match('/(.*?)=&vr=/', base64_decode($music), $music_url);
            $video_author = $result['user_info']['name'];
            $video_avatar = str_replace('300x300.image', '300x300.jpg', $result['user_info']['avatar_url']);
            $video_cover = $result ["poster_url"];
            $video_title = $result["title"];
            if ($url) {
                $arr = [
                    'code' => 200,
                    'msg'  => '解析成功',
                    'data' => [
                        'author' => $video_author,
                        'avatar' => $video_avatar,
                        'like'   => $result['video_like_count'],
                        'time'   => $result['video_publish_time'],
                        'title'  => $video_title,
                        'cover'  => $video_cover,
                        'url'    => $video_url[0],
                        'music'  => [
                            'url' => $music_url[0]
                        ]
                    ]
                ];
                return $arr;
            }
        }
      
        static public function httpRequest($url, $method = 'POST', $postfields = null, $headers = array()) {
        
            $method = strtoupper($method);
            $ci = curl_init();
            curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
            curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 60);
            curl_setopt($ci, CURLOPT_TIMEOUT, 30);
            curl_setopt($ci, CURLOPT_RETURNTRANSFER, 1);
            switch ($method) {
                case "POST":
                    curl_setopt($ci, CURLOPT_POST, true);
                    if (!empty($postfields)) {
                        $tmpdatastr = is_array($postfields) ? http_build_query($postfields) : $postfields;
                        curl_setopt($ci, CURLOPT_POSTFIELDS, $tmpdatastr);
                    }
                break;
                default:
                    curl_setopt($ci, CURLOPT_CUSTOMREQUEST, $method);
                break;
            }
            $ssl = preg_match('/^https:\/\//i', $url) ? TRUE : FALSE;
            curl_setopt($ci, CURLOPT_URL, $url);
            if ($ssl) {
                curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, FALSE);
                curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, FALSE);
            }
            curl_setopt($ci, CURLOPT_FOLLOWLOCATION, 1);
            curl_setopt($ci, CURLOPT_MAXREDIRS, 2);
            curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($ci, CURLINFO_HEADER_OUT, true);
            $response = json_decode(curl_exec($ci), true);
            $requestinfo = curl_getinfo($ci);
            $http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
            $location = curl_getinfo($ci, CURLINFO_EFFECTIVE_URL);
            curl_close($ci);
            return array('location' => $location, 'response' => $response, 'requestinfo' => $requestinfo);
        }
      
        static public function result($errno = 0, $data = '') {
        
            header("Content-type: application/json;charset=utf-8");
            $errno = intval($errno);
            $result = array('code' => $errno, 'message' => $data);
            return json_encode($result, 320);
        }
        static public function curl($url, $headers = []) {
        $header = ['User-Agent:Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1'];
            $con = curl_init((string)$url);
            curl_setopt($con, CURLOPT_HEADER, false);
            curl_setopt($con, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($con, CURLOPT_RETURNTRANSFER, true);
            if (!empty($headers)) {
                curl_setopt($con, CURLOPT_HTTPHEADER, $headers);
            } else {
                curl_setopt($con, CURLOPT_HTTPHEADER, $header);
            }
            curl_setopt($con, CURLOPT_TIMEOUT, 5000);
            $result = curl_exec($con);
            return $result;
           
        }
    }

    3、将新建的两个文件:“index.php”、“qsy.php”上传至服务器。

    注:如果上述代码不能运行,那就是我哪里写错了,如果上述代码不能去水印那就是官方调整了规则,上述代码仅供学习交流。

     

    解析原理

     

    1、获取链接,去西瓜获取视频的分享链接,这一点相信大家都会。

    2、使用Edge浏览器打开我们获取的视频链接:

    https://v.ixigua.com/NeVFXQy/

     

    (当然你也可以选择其他浏览器,我习惯使用Edge是因为他的开发者工具是中文 对小白友好 方便进行演示)
    我们看到地址栏发生了变化 说明这个链接进行了一次跳转 此时的链接变成了

     

    https://www.ixigua.com/7054573760854098439?app=video_article&timestamp=1646103322&utm_source=copy_link&utm_medium=android&utm_campaign=client_share&test_group=v1

     

    原理:首先我们一般获取到的是一个抖音短网址的分享链接,通过网页打开时会跳转到一个比较长的链接上去,通过这个长链接查看源代码,无水印的视频就在里面,这个其实与快手类似,只不过西瓜视频有进行base64位加密。

    接着通过ctrl+F来查找main_url,然后把后面的地址,通过

    https://tool.oschina.net/encrypt?type=3这个工具解析出来,解析出来的就是我们需要的无水印地址,只不过没有声音。声音的提取就是通过这个方法,这里就不介绍了,最后就是合并视频和音频就可以了。

    "main_url":“aHR0cD…=” (太长了,我就用…代替了)

    总结:有些其他短视频例如:快手短视频,会直接把真实地址输出在网页源代码里直接用正则匹配即可,抖音短视频则需要找到官方的接口,在进行正则匹配

    测试方式

     

    直接访问实例即可解析到无水印的视频链接了

    如:

    http://你的网址/?url=

    本解析算法属于json解析模式,通过https://www.bejson.com/jsonviewernew 格式化后得到的链接与原来手动抓包的一致。

    总结:其他短视频基本也是类似的,写去水印接口需要掌握php正则匹配规则,这样就能得心应手了。

     

    写在后面

     

    本文由陆大湿整理自网络,如有侵权请联系客服删除!

    如需转载请注明出处:陆大湿唯一官网:bbs.ludeqi.com

    1、本站所有资源均来源于互联网,不保证100%完整、不提供任何技术支持;

    2、本站所发布的文章以及附件仅限用于学习和研究目的;不得将用于商业或者非法用途;否则由此产生的法律后果,本站概不负责!谢谢大家的理解!感恩~

    本篇文章来源于微信公众号: 陆大湿


    © 版权声明
    版权声明 陆大湿原创,禁止转载!
    交流QQ群: 965272619
    注意 本站发布的文章及教程仅限用于学习和研究目的.请勿用于商业或违法用途,否则后果请用户自负。 本站所有资源不带技术支持,下载资源请24小时内删除,如用于违法用途,或者商业用途,一律使用者承担,本站不承担任何责任!
    本站资源多为网络收集,如涉及版权问题请及时与站长联系邮箱:1104115170@qq.com,我们会在第一时间内删除资源。

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    陆大湿源码解压密码
    https://bbs.ludeqi.com

    发表评论

    发表评论

    • 3447会员总数(位)
    • 230资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 918稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情
    升级SVIP尊享更多特权立即升级