一、解析快手无水印视频链接原理

共分三个步骤:

1.通过视频分享获得视频地址短链接;如:

https://www.kuaishou.com/f/X7tIV0jIivYUyTk

2.通过TNetHTTPClient重定向获得视频地址长链接;如:

https://www.kuaishou.com/short-video/3xvx3jg7ffi3xrs?authorId=3xcjmgxvqvwr65y&streamSource=profile&area=profilexxnull

3.通过地址长链接得到视频ID;如:

本视频的ID为:3xvx3jg7ffi3xrs

4.通过TNetHTTPClient发送一个包含视频ID的post请求。请求成功服务器返回(response)一个包含无水印视频地址,封面,标题等信息的JSON数据;

5.解析response的JSON数据,得到无水印视频地址,就可以下载了。

二、解析无水印视频代码

介绍了原理,废话不多说,直接上代码:

unit uKuaishou;interface
useswindows,classes,System.Net.URLClient, System.Net.HttpClient, System.Net.HttpClientComponent,System.SysUtils,strutils,System.RegularExpressions,system.JSON;
constwm_user=$0400;wm_downfile=wm_user+100+1;//定义UserAgent为计算机操作系统:USER_AGENT='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36';//定义Cookies为你本人的Cookies,可以从浏览器的取得;不懂的+V:byc6352KUAISHOU_COOKIES='你本人的Cookies';//这个API_URL为发送post请求的服务器地址:API_URL='https://video.kuaishou.com/graphql';//KUAISHOU_ARGS为发送post请求的数据体,其中 photoId为视频唯一ID;KUAISHOU_ARGS='{"operationName":"visionVideoDetail","variables":{"photoId":"%s","page":"detail","webPageArea":"profilexxnull"},'+'"query":"query visionVideoDetail($photoId: String, $type: String, $page: String, $webPageArea: String) {visionVideoDetail(photoId: $photoId, type: $type, page: $page, webPageArea: $webPageArea) {photo{id duration timestamp caption coverUrl photoUrl}}}"}';typeTKuaishou=class(TThread)privateFId:cardinal;            //线程编号;Furl:string;             //视频分享地址(短地址);FRedirectedUrl:string;   //重定向后的地址(长地址);Fvideourl:string;        //解析成功后的视频地址;FvideoId:string;         //视频ID;Ffilename:string;        //保存到本机的视频文件名;FvideoTitle:string;      //视频标题;FcoverUrl:string;        //视频封面地址;Fmsg:string;             //解析成功与否的消息;class var Fform: HWND;   //发送数据到窗体的HWND;procedure SetId(id:cardinal);    //设置线程编号;class procedure SetForm(const hForm: HWND); static;   //设置窗体句柄;protectedprocedure Execute; override;public//id:为线程编号;url为视频分享短链接地址;constructor Create(id:cardinal;url:string);   destructor Destroy;property id:cardinal read FId write SetId;property url:string read Furl;property msg:string read Fmsg;property filename:string read Ffilename;property videourl:string read Fvideourl;property videoTitle:string read FvideoTitle;property RedirectedUrl:string read FRedirectedUrl;property videoId:string read FvideoId;property coverUrl:string read FcoverUrl;//向服务器发送post请求,返回视频信息的JSON数据;function getPostResult(data:string):string;//向服务器发送GET请求,获取重定向长链接地址;function getRedirectedUrl(url:string):string;//从长链接解析出视频ID;function getVideoId(txt:string):string;//获取无水印视频地址,封面链接,视频标题;function getVideoUrl():string;//解析服务器返回的JSON数据function parseJson(jo:string):string;class property form: HWND read Fform write SetForm;end;implementation
constructor TKuaishou.Create(id:cardinal;url:string);
begininherited Create(True);FId:=id;Furl:=url;
end;
destructor TKuaishou.Destroy;
begininherited Destroy;
end;//放在线程中执行,不影响主窗体响应;
procedure TKuaishou.Execute;
begingetVideoUrl();
end;//获取无水印视频地址,封面链接,视频标题;
function TKuaishou.getVideoUrl():string;
varargs,jo:string;
beginresult:='';//向服务器发送GET请求,获取重定向长链接地址;FRedirectedUrl:=getRedirectedUrl(Furl);if(FRedirectedUrl)='' then exit;//从长链接解析出视频ID;FvideoId:=getVideoId(FRedirectedUrl);if(FvideoId)='' then exit;//构造post请求的data数据体;args:=format(KUAISHOU_ARGS,[FvideoId]);//向服务器发送post请求,获得视频信息的json;jo:=getPostResult(args);if(jo)='' then exit;Fmsg:=jo;//解析json获取无水印地址;result:=parseJson(jo);
end;//解析服务器返回的JSON数据
function TKuaishou.parseJson(jo:string):string;
varjson,j1: TJSONObject;
beginresult:='';if(pos('errors',jo)>0)then exit;
tryjson := TJSONObject.ParseJSONValue(jo) as TJSONObject;if json = nil then exit;j1:=json.GetValue('data') as TJSONObject;j1:=j1.GetValue('visionVideoDetail') as TJSONObject;j1:=j1.GetValue('photo') as TJSONObject;FvideoTitle:=j1.GetValue('caption').Value;FcoverUrl:=j1.GetValue('coverUrl').Value;FvideoUrl:=j1.GetValue('photoUrl').Value;result:='#100#'+FvideoUrl+'#'+FcoverUrl+'#'+FvideoTitle;
finallyif json <> nil then json.Free;
end;
end;//向服务器发送post请求,返回视频信息的JSON数据;
function TKuaishou.getPostResult(data:string):string;
varclient: TNetHTTPClient;ss,args: TStringStream;
beginresult:='';
tryclient := TNetHTTPClient.Create(nil);SS := TStringStream.Create('', TEncoding.UTF8);ss.Clear;args := TStringStream.Create(data, TEncoding.UTF8);with client dobeginConnectionTimeout := 10000; // 10秒ResponseTimeout := 10000; // 10秒AcceptCharSet := 'utf-8';UserAgent := USER_AGENT; //1client.AllowCookies:=true;client.HandleRedirects:=true;Accept:='*/*';client.ContentType:='application/json'; //2//这儿写入你电脑的cookies,技术支持:+V:byc6352client.CustomHeaders['Cookie'] := KUAISHOU_COOKIES;client.CustomHeaders['Referer'] := Furl;//发送post请求:client.Post(API_URL,args,ss);result:=ss.DataString;end;
finallyss.Free;args.Free;client.Free;
end;
end;//向服务器发送GET请求,获取重定向长链接地址;
function TKuaishou.getRedirectedUrl(url:string):string;
varclient: TNetHTTPClient;ss: TStringStream;s,id:string;AResponse:IHTTPResponse;i:integer;
begin
tryclient := TNetHTTPClient.Create(nil);SS := TStringStream.Create('', TEncoding.UTF8);ss.Clear;with client dobeginConnectionTimeout := 2000; // 2秒ResponseTimeout := 2000; // 2秒AcceptCharSet := 'utf-8';UserAgent := USER_AGENT;client.AllowCookies:=true;client.HandleRedirects:=false;   //这儿一定要设置不允许重定向;Accept:='*/*';tryAResponse:=Get(url, ss);s:=AResponse.HeaderValue['Location'];   //重定向地址在Location头中;if(s='')then exit;result:=s;excepton E: Exception doLog(e.Message);end;end;
finallyss.Free;client.Free;
end;
end;//从长地址获取视频ID;
function TKuaishou.getVideoId(txt:string):string;
varm:TMatch;i:integer;
beginresult:='';if(length(txt)<15)then exit;result:=midstr(txt,14,15);
end;//------------------------------------------属性方法-------------------------------------procedure TKuaishou.SetId(Id:cardinal);beginFId:=Id;end;class procedure TKuaishou.SetForm(const hForm: HWND);beginFform:=hForm;end;
end.

以上类TKuaishou可以直接使用;

三、解析类使用方法:

procedure TfMain.btnParseClick(Sender: TObject);
varkuaishou:TKuaishou;url,result:string;
beginurl:=trim(edtUrl.Text);kuaishou:=TKuaishou.Create(1,url);//为了演示简单,这儿没有使用线程解析。result:=kuaishou.getVideoUrl();if(result='')thenbeginmemo1.Text:=kuaishou.msg;edit3.Text:='';showmessage('解析失败!');exit;end;//视频连接edit1.Text:=kuaishou.videourl;//封面链接edit2.Text:=kuaishou.coverurl;edit3.Text:=result;memo1.Text:=kuaishou.msg;
end;

四、解析程序

1、解析后无水印视频链接地址

https://txmov2.a.kwimgs.com/upic/2023/01/30/05/BMjAyMzAxMzAwNTAwNDZfMjQ2NzExNzg0N185NDk2MTQ0MDk0NF8wXzM=_b_B8055d1d7054f2de85f9bc56e6f73e335.mp4?pkey=AAXY4734ntsAaSz82LuzbXlFNObOF_zOPnH7puUnD1DaNrANsUUAjmGa6Yxz7jAnAszT2e4PdnlBWHxl2dwkhMMGOIZ9qkKliU3yDy_BXQZmJbdV2d6F7_9sEiwpTA9U8gk&tag=1-1675240486-unknown-0-tfsgzikc3z-de39f632a2a7c7cf&clientCacheKey=3xvx3jg7ffi3xrs_b.mp4&di=6a385727&bp=10004&tt=b&ss=vp

2、程序界面:

3、程序下载:

http://helpnow.top/ks

4、另外推荐一款(tubeget高清视频下载器),支持全球1000多个视频站点:

http://helpnow.top/tubeget/

Delphi 通过TNetHTTPClient访问http,最新解析快手无水印视频地址链接方法相关推荐

  1. php 浏览器能请求post_PHP解析微视无水印播放地址原理分析

    天涯乌鸦一般黑,微视短视频平台和快手一样,通过访问分享链接h5就能获取到无水印播放地址. 页面分析 先随便撸一个微视短视频分享链接,就勉强以下面这个为例吧 https://h5.weishi.qq.c ...

  2. PHP 获取微视无水印源地址_最新PHP解析抖音获取无水印视频代码

    用户从抖音中复制链接,出来的地址,打开是带有水印的,要想通过复制的链接解析获取无水印的视频地址,可以看如下代码 PHP源码 $content = newCurlGet($url, $userAgent ...

  3. 最新抖音无水印解析PHP源码

    源码介绍: 最新抖音无水印解析PHP源码 网盘下载地址: http://www.bytepan.com/hQuJxMu7aaG 图片:

  4. 试验解析抖音无水印视频【PHP版】

    试验了网上很多抖音解析无水印视频的API,发现很多都是不稳定的.连今天要分享的这个api也是,总是那么不稳定.不过还好,总算是解析出了无水印视频.很多东西还是要自己调试一下才会知道哪里出bug了! 看 ...

  5. java开发最新获取抖音无水印视频和背景音乐

    java版最新获取抖音无水印视频和背景音乐, 这个工具已经被我放到我的网站上做成了在线抖音无水印获取工具: 在线演示地址:http://www.yzcopen.com/video/dywsy 废话不多 ...

  6. 抖音提取封面php,PHP 解析抖音无水印视频

    PHP解析抖音无水印视频后端代码 QQ截图20190329052258.png 20190329052336.png /* author 刘明野 site www.liumingye.cn */ fu ...

  7. 小红书去水印代码_小红书无水印图片,无水印视频解析下载,小红书视频图片去水印代码实现...

    以从小红书"复制链接"出来的一个地址为例,例如: http://xhslink.com/JDk1s 下面用PHP代码来实现提取图集,具体代码如下: $userAgent = &qu ...

  8. curl取跳转地址 php_用PHP如何实现解析抖音无水印视频

    很多时候你在douyin里看到了一个短视频,想复制下来自己编辑文字来发布,可是视频里的水印却是原者的.这个时候你想把水印去掉,你要如何做呢?这里提供PHP实现去除水印的主要方法,其实很简单. 使用方法 ...

  9. 抖音无水印视频解析源码

    原理如下: <?php /* Author 5G云源码分享网 DateTime 2019-12-26 */function GetVideos($url) {$ch = curl_init(); ...

最新文章

  1. [经验总结]源代码管理=Ubuntu+Apache+SVN
  2. 明晚直播 | 做持有专利的程序员很难吗?专家教你如何申请!
  3. 【感想文】感情经历,是否给你我带来的些许提升?我想,有。
  4. 以太坊—JSON RPC API
  5. 构建REST风格的Web Service (转)
  6. 从零开始的车牌识别课题设计(一)
  7. 计算机系统论文题目,计算机系统维护毕业论文题目(572个).doc
  8. 在Chrome上安装ie tab插件
  9. Linux at命令使用介绍
  10. React项目中提示caniuse-lite已过时,建议更新
  11. DSPE-PEG10-Mal可以提供不同分子量的PEG衍生物
  12. element 表格全局筛选(筛选结果请求后端接口)
  13. 以太网MII接口类型大全-MII、RMII、SMII、GMII、RGMII、SGMII、XGMII、XAUI、RXAUI
  14. htpc派_您应该为HTPC使用PCI,USB或基于网络的电视调谐器吗?
  15. Android手机靠近蓝牙模块自动连接蓝牙模块,断后自动重连。也可以手机靠近手机自动连接。连接成功率百分之百,可后台运行
  16. 视野中人与月球的透视比例关系
  17. 小刀学习flink 之入门 hello word
  18. C. Tyler and Strings(组合数学,树状数组维护前缀和)(Codeforces Round #775 (Div. 1, based on Moscow Open Olympiad i)
  19. 军工电子盘与普通消费类固态硬盘的区别是什么?
  20. 编写Android.mk把Android studio项目编译到AOSP源码中

热门文章

  1. uniapp一张图片在另一张图片上面
  2. 2021年,用更现代的方法使用PGP(下)
  3. 【Linux】【问题处理】insmod: ERROR: could not insert module xxx.ko: Unkown symbol in module问题的分析思路及解决方案
  4. 维深集团荣获2004年物流与采购信息化优秀方案大奖
  5. TensorRT教程18:使用DLA(深学习加速器)
  6. 简单解析 兼顾高效与安全的ConcyrrentHashmap
  7. Java8函数式编程之一: 行为参数化
  8. Windows 使用QT读取IP地址并修改IP地址
  9. 浅谈大型互联网企业入侵检测及防护策略
  10. 百度搜索引擎推广的方式和优势有哪些呢?