前言说明
最近一段时间在外旅游,所以更新也是停滞了很久,今天抽空给大家更新一下。前段时间一直在研究短视频去水印接口,也更新了短视频去水印小程序V1.1.1版本?与?短视频去水印接口贩卖机,这两套源码都是需要一个接口,鉴于此我就自己开始研究去水印接口了。
所需工具
这里我以快手为例
1、快手APP
2、电脑
3、浏览器
教程开始
1、获取链接,去快手获取视频的分享链接,这一点相信大家都会。
2、使用Edge浏览器打开我们获取的视频链接:
https://v.kuaishou.com/aU7PCz
(当然你也可以选择其他浏览器,我习惯使用Edge是因为他的开发者工具是中文 对小白友好 方便进行演示) 我们看到地址栏发生了变化 说明这个链接进行了一次跳转 此时的链接变成了
https://www.kuaishou.com/short-video/3xte53diytuu28g?fid=433527594&cc=share_copylink&followRefer=151&shareMethod=TOKEN&docId=10&kpn=KUAISHOU&subBiz=BROWSE_SLIDE_PHOTO&photoId=3xte53diytuu28g&shareId=16414084109664&shareToken=X1KCROiOhf2y1NY&shareResourceType=PHOTO_SELF&userId=3xe6mvxkxk8hrvc&shareType=2&et=1_a%2F2003086636508528529_p0&shareMode=APP&originShareId=16414084109664&appType=21&shareObjectId=5191243054590022521&shareUrlOpened=0×tamp=1630310980813&utm_source=app_share&utm_medium=app_share&utm_campaign=app_share&location=app_share
3、开始抓包,我们按下键盘的F12出开发者工具网络(network)选择保留日志(preserve log )然后按F5刷新页面 我们会抓到网页所有发送的请求。
4、按下键盘ctrl+F 搜索 标题,?我们会在响应中看到一大段的乱码。
5、点击乱码ctrl+a全选并复制乱码,?你会发现出现一堆JSON(一般官方接口大都是返回JSON格式) 大家可以去 https://www.bejson.com/jsonviewernew 格式化一下方便查看。
6、格式化之后我们可以按下键盘ctrl+F 搜索 mp4?这样我们就得到了没有水印的视频链接。
去水印链接如下:
https://v1.kwaicdn.com/upic/2021/08/30/15/BMjAyMTA4MzAxNTI0NTRfNDMzNTI3NTk0XzU2Mjc4MzczOTkyXzJfMw==_b_Bb399be45c609cbee38697a810b87aba5.mp4?pkey=AAUTdcbRxTfi7NdDHC3B_Iti4GkunwxeU-jvuee4Ud-9XysaH7mY53hGPZEj27LBoxC1PCO6uU7zObemeGu69xqlnw7Ii56y1hdCqQ90Nha8yqKJKlZfCjXAbfeqC8-kXSc&tag=1-1630311176-xpcwebdetail-0-qdg9js2xoq-b4ee34ca5bf0fa38&clientCacheKey=3xte53diytuu28g_b.mp4&tt=b&di=JA4DeUTZpQAN0A3KUfOZPg==&bp=10004
写成接口
1、新建“index.php”文件,复制下面请求代码
<?php
require '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.kuaishou.com':
return self::kuaishou($url);
break;
default:
return self::result(500, '抱歉,此url暂不支持!');
}
}
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 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);
}
}
3、将新建的两个文件:“index.php”、“qsy.php”上传至服务器。
测试方式
直接访问实例即可解析到无水印的视频链接了
如:(http://你的网址/?url=https://v.kuaishou.com/aU7PCz/)
本解析算法属于json解析模式,通过https://www.bejson.com/jsonviewernew?格式化后得到的链接与原来手动抓包的一致。
总结:其他短视频基本也是类似的,写去水印接口需要掌握php正则匹配规则,这样就能得心应手了
本篇文章来源于:陆大湿源码网
所发布的文章以及附件仅限用于学习和研究目的;不得将用于商业或者非法用途;否则由此产生的法律后果,本人概不负责。
本篇文章来源于微信公众号: 陆大湿
|