delphi/python 实现小红书xhs用户作品列表和图片/视频无水印解析

技术学习,请勿用与非法用途!!!

成品图

用户作品列表接口
/api/sns/web/v1/user_posted?num=30&cursor=&user_id=642bf0850000000011022c4e&image_scenes=
http Get方式,请求头需要带上x-s x-t签名验证

笔记明细接口
/api/sns/web/v1/feed
data = {"source_note_id":"64356527000000001303282b", "image_scenes":["CRD_PRV_WEBP","CRD_WM_WEBP"]}
http Post方式,请求头需要带上x-s x-t签名验证
x-s算法部分是js+python完成

unit ApiXHS;interface
usesWindows, Messages, SysUtils, Classes, Forms, OverbyteIcsWSocket,OverbyteIcsHttpProt, OverbyteIcsSuperObject, OverbyteIcsUtils, OverbyteIcsWndControl;type// 笔记信息PNoteItem = ^TNoteItem;TNoteItem = recorduser_id: string; //用户idnickname: string; //昵称avatar: string; //头像note_id: string;collected_count: Integer; //收藏数liked_count: Integer; //点赞数comment_count: Integer; //评论数share_count: Integer; //分享数create_time: TDateTime; //创建时间note_type: string; //类型   video -- 或 普通 normaltitle: string; //标题desc: string;image_list: TStrings; //图片列表或视频封面video_addr: string; //视频地址tag_list: TStrings;end;type// 小红书接口--仅学习交流 请勿用于非法用途TXHS = classprivatefunction GetCookie: string;procedure SetCookie(const Value: string);protectedhttp: TSslHttpCli;ssl: TSslContext;_a1: string;publicconstructor Create;destructor Destroy; override;function get_xs( 算法\/: jeomoo168 ): Boolean;function request(url, api, data: string; var json: ISuperObject; var s: string): Boolean; //请求function note_info(p: PNoteItem; var s: string): Boolean; //笔记信息function parse_noteId(url: string): string; //笔记链接->解析对于的笔记idfunction parse_userId(url: string): string; //作者主页链接->解析对于的用户idfunction user_posted(user_id: string;var cursor, s: string; var has_more: Boolean; items: TList): Boolean; //获取作者作品列表property cookie: string read GetCookie write SetCookie;property a1: string read _a1 write _a1;end;procedure InitProfileItem(pi: PProfileItem);
procedure InitNoteItem(p: PNoteItem);implementation
usesShellAPI;procedure InitProfileItem(pi: PProfileItem);
beginpi.user_id := '';pi.nickname := '';pi.avatar := '';pi.desc := '';pi.ipLocation := '';pi.follows := 0;pi.fans := 0;pi.interaction := 0;pi.gender := -1;
end;procedure InitNoteItem(p: PNoteItem);
beginif p = nil then exit;p.user_id := '';p.nickname := '';p.avatar := '';//  p.note_id := '';p.collected_count := 0;p.liked_count := 0;p.comment_count := 0;p.share_count := 0;p.create_time := Now;p.note_type := '';p.title := '';p.desc := '';p.video_addr := '';p.image_list := TStringList.Create;p.tag_list := TStringList.Create;
end;//******************************************************************************
{ TXHS }constructor TXHS.Create;
begininherited;_a1 := '';ssl := TSslContext.Create(nil);http := TSslHttpCli.Create(nil);http.SslContext := ssl;http.Agent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.188';http.Accept := 'application/json, text/plain, */*';http.AcceptLanguage := 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6';http.Reference := 'https://www.xiaohongshu.com';http.ContentTypePost := 'application/json;charset=UTF-8'; http.Timeout := 30; //默认30秒
end;destructor TXHS.Destroy;
beginssl.Free;http.Free;inherited;
end;function TXHS.GetCookie: string;
beginResult := http.Cookie;
end;procedure TXHS.SetCookie(const Value: string);
vark: Integer;
beginhttp.Cookie := Value;k := 1;_a1 := ParseTag(Value, 'a1=', ';', k);
end;function TXHS.get_xs(api, data: string; var xs, xt, s: string): Boolean;
varjson: ISuperObject;
beginResult := False;s := '';if a1 = '' then exit; //未设置cookieResult := js-get-xs('x-s生成算法\/: jeomoo168', s);tryjson := SO(s);exceptjson := SO('{}');end;xs := json.S['X-s'];xt := json.S['X-t'];
end;function TXHS.request(url, api, data: string; var json: ISuperObject; var s: string): Boolean;
varxs, xt: string; // , vbuf: UTF8String;
beginResult := False;json := SO('{}');s := '';xs := '';xt := '';data := StringReplace(data, ' ', '', [rfReplaceAll]); //data字符串中不要有空格!!! 不然会请求失败if api <> '' then //api不为空时 需要x-s x-tbeginResult := get_xs(api, EscapeChars(data), xs, xt, s);if not Result then exit;end;//  xs:=''; xt:='';http.URL := url + api;http.ExtraHeaders.Clear;//http.ExtraHeaders.Add('Accept-Encoding: gzip, deflate'); //!!! 不能加这个 加了 返回数据被压缩了http.ExtraHeaders.Add('authority: edith.xiaohongshu.com');http.ExtraHeaders.Add('origin: https://www.xiaohongshu.com');http.ExtraHeaders.Add('Content-Type: application/json;charset=UTF-8');http.ExtraHeaders.Add('x-s: ' + xs);http.ExtraHeaders.Add('x-t: ' + xt);//http.ExtraHeaders.Add('x-s-common: ');http.RcvdStream := TMemoryStream.Create; // For answertryif data = '' thenhttp.Getelsebegin//j2 := SO(data);//v := j2.S['keyword']; //搜索关键词//if v <> '' then//begin//  v := utf8encode(v); //关键词utf8编码// data := Format('{"keyword":"%s","note_type":0,"page":1,"page_size":20,"search_id":"2ci5066wl1gu6kr4q9apa","sort":"general","image_scenes":"FD_PRV_WEBP,FD_WM_WEBP"}',          [v]);//end;data := utf8encode(data);http.SendStream := TMemoryStream.Create;http.SendStream.Write(PChar(data)^, Length(data));http.SendStream.Position := 0; // Send from start!http.Post;end;excepton e: Exception dobegins := Format('%s', [Trim(e.Message)]);exit;end;end;if http.StatusCode <> 200 thenif not SameText(http.RequestDoneErrorStr, 'No Error') thenbegins := http.RequestDoneErrorStr;exit;end;SetLength(buf, http.RcvdStream.Size);Move((http.RcvdStream as TMemoryStream).Memory^, buf[1], http.RcvdStream.Size);http.RcvdStream.Free;http.RcvdStream := nil;if http.SendStream <> nil thenbeginhttp.SendStream.Free;http.SendStream := nil;end;s := Trim(Utf8ToStringA(buf)); //utf8解码   Utf8Decodetryjson := SO(s);Result := json.B['success'];exceptjson := SO('{}');end;//  if Pos('Not Acceptable',s)>0 then     s:=s+Format('  xs=%s',[xs]);
end;function TXHS.note_info(p: PNoteItem; var s: string): Boolean;
varurl, api, data: string;json, info, vi: ISuperObject;va: TSuperArray;i: Integer;
beginResult := False;s := '';if p = nil then exit;InitNoteItem(p);url := 'https://edith.xiaohongshu.com';api := '/api/sns/web/v1/feed';data := '{"source_note_id":"' + p.note_id + '","image_scenes":["CRD_PRV_WEBP","CRD_WM_WEBP"]}';Result := request(url, api, data, json, s); //'Not Acceptable'if not Result then exit;info := json.O['data'].A['items'][0].O['note_card'];if info=nil then exit; //解析失败 有可能接口更新了p.user_id := info.O['user'].S['user_id'];p.nickname := info.O['user'].S['nickname'];p.avatar := info.O['user'].S['avatar'];p.collected_count := info.O['interact_info'].I['collected_count'];p.comment_count := info.O['interact_info'].I['comment_count'];p.share_count := info.O['interact_info'].I['share_count'];p.liked_count := info.O['interact_info'].I['liked_count'];p.desc := info.S['desc'];p.create_time := GetTime_DateTime(info.I['time']);p.title := info.S['title'];p.note_type := info.S['type'];// image_listva := info.A['image_list'];for i := 0 to va.Length - 1 dobeginvi := va[i];p.image_list.Add(vi.A['info_list'][1].S['url']);end;// tag_listva := info.A['tag_list'];for i := 0 to va.Length - 1 dobeginvi := va[i];p.tag_list.Add(vi.S['name']);end;if p.note_type = 'video' thenp.video_addr := 'https://sns-video-bd.xhscdn.com/' + info.O['video'].O['consumer'].S['origin_video_key'];
end;// 笔记链接->解析对于的笔记id
function TXHS.parse_noteId(url: string): string;
vars: string;json: ISuperObject;k: Integer;
beginResult := '';if url = '' then exit;if Pos('xiaohongshu.com/explore/', url) > 0 thenbegink := Pos('?', url);if k > 0 thenurl := Copy(url, 1, k - 1);url := url + '/';k := 1;Result := ParseTag(url, '/explore/', '/', k);exit;end;// http://xhslink.com/xxxxx 格式tryhttp.FollowRelocation := False;request(url, '', '', json, s);finallyhttp.FollowRelocation := True;end;//<a href="https://www.xiaohongshu.com/discovery/item/6558d9300000000032xxxxx?app_platform=ios&amp;app_version=8.14.3&amp;share_from_user_hidden=true&amp;type=normal&amp;xhsshare=CopyLink&amp;appuid=5beaa1f00ac0a40001f2d248&amp;apptime=1700968043">Temporary Redirect</a>.//或//Redirecting to <a href="/discovery/item/6558d930000000003200698c">/discovery/item/6558d9300000000032xxxxx</a>.k := Pos('?', s);if k > 0 thens := Copy(s, 1, k - 1) + '"';k := 1;Result := ParseTag(s, 'discovery/item/', '"', k);
end;// 作者主页链接->解析对于的用户id
function TXHS.parse_userId(url: string): string;
vark: Integer;
begin
// https://www.xiaohongshu.com/user/profile/5565692bb7ba2219xxxxx
// https://www.xiaohongshu.com/user/profile/5565692bb7ba221xxxxxx?xhsshare=CopyLink&appuid=5beaa1f00ac0a40001f2d248&apptime=1700990774Result := '';if url = '' then exit;if Pos('xiaohongshu.com/user/profile/', url) = 0 then exit;k := Pos('?', url);if k > 0 thenurl := Copy(url, 1, k - 1);url := url + '/';k := 1;Result := ParseTag(url, '/profile/', '/', k);exit;
end;//获取作者作品列表
function TXHS.user_posted(user_id: string; var cursor, s: string; var has_more: Boolean; items: TList): Boolean;
varapi, data, url: string;json, vi: ISuperObject;va: TSuperArray;p: PNoteItem;i: Integer;
beginitems.Clear;has_more := False;url := 'https://edith.xiaohongshu.com';api := Format('/api/sns/web/v1/user_posted?num=30&cursor=%s&user_id=%s&image_scenes=',[cursor, user_id]);data := '';Result := request(url, api, data, json, s);if not Result then exit;if json.O['data'] = nil then exit;cursor := json.O['data'].S['cursor'];has_more := json.O['data'].B['has_more'];va := json.O['data'].A['notes'];for i := 0 to va.Length - 1 dobeginApplication.ProcessMessages;vi := va[i];New(p);InitNoteItem(p);Items.Add(p);p.user_id := vi.O['user'].S['user_id'];p.nickname := vi.O['user'].S['nickname'];p.avatar := vi.O['user'].S['avatar'];p.liked_count := vi.O['interact_info'].I['liked_count'];p.note_id := vi.S['note_id'];p.title := vi.S['display_title'];p.note_type := vi.S['type'];end;
end;end.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/207565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

直流负载箱的技术发展趋势和创新有哪些?

直流负载箱广泛应用于电子、通信、航空航天等领域&#xff0c;随着科技的不断发展&#xff0c;直流负载箱也在不断创新和改进&#xff0c;直流负载箱在负载电流和电压的测量方面要求高精度和高稳定性。未来的发展趋势是提高负载箱的测量精度和稳定性&#xff0c;以满足更高要求…

uniapp 使用 $emit和$on——$on中无法为data中的变量赋值

问题在于this的指向&#xff0c; 解决办法是使用变量保存$on&#xff0c;其次再为data中的值赋值 以下是具体代码&#xff1a; 1、html代码&#xff1a; <view class"form_picker" click"selePositionFun()"><view class""><inp…

Git

第1章 Git 概述 Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目。 Git 易于学习&#xff0c;占地面积小&#xff0c;性能极快。 它具有廉价的本地库&#xff0c;方便的暂存区域和多个工作流分支等特性。其性能优于 Subversi…

系统设计之数据库

为您的项目选择正确的数据库是一项复杂的任务。许多数据库选项都适合不同的用例&#xff0c;很快就会导致决策疲劳。 我们希望这份备忘单提供高级指导&#xff0c;以找到符合您项目需求的正确服务并避免潜在的陷阱。 注意&#xff1a;Google 关于其数据库用例的文档有限。尽管…

软件测试卷王的自述,我难道真的很卷?

前言 前段时间去面试了一个公司&#xff0c;成功拿到了offer&#xff0c;薪资也从12k涨到了18k&#xff0c;对于工作都还没两年的我来说&#xff0c;还是比较满意的&#xff0c;毕竟一些工作3、4年的可能还没我高。 我可能就是大家说的卷王&#xff0c;感觉自己年轻&#xff…

北邮22级信通院数电:Verilog-FPGA(12)第十二周实验(2)彩虹呼吸灯(bug已解决 更新至3.0)

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 1.1一些更新和讲解 1.2改正后的…

解密HubSpot CMS Hub:构建引人入胜的企业网站!

在数字化时代&#xff0c;网站是企业与客户互动的重要窗口。为了在竞争激烈的市场中脱颖而出&#xff0c;企业需要一个现代化、用户友好且高度可定制的网站。而HubSpot CMS Hub作为一款领先的内容管理系统&#xff0c;为企业提供了独特的优势&#xff0c;让网站建设变得更加轻松…

Private Set Intersection from Pseudorandom CorrelationGenerators 最快PSI!导览解读

目录 一、概述 二、相关介绍 三、性能对比 四、技术细节 1.KKRT 2.Pseudorandom Correlation Generators 3.A New sVOLE-Based BaRK-OPRF 4.BaRK-OPRF 五、总结 参考文献 一、概述 这篇文章的主要脉络和核心思想是探讨如何利用伪随机相关生成器&#xff08;PCG&#…

【AI】以大厂PaaS为例,看人工智能技术方案服务能力的方向(2/2)

目录 三、解决方案 3.1 人脸身份验证 3.2 图像审核&#xff08;暴恐、色情等&#xff09; 3.3 人脸会场签到 3.4 机器人视觉 3.5 视频审核 3.6 电商图文详情生成 3.7 智能客服 接上回&#xff1a; 【AI】以大厂PaaS为例&#xff0c;看人工智能技术方案服务能力的方向&…

麒麟系统进入救援模式或者是crtl D界面排查方法

如出现以下图片的情况可能需要修复磁盘&#xff1a; V10GFB-desktop&#xff1a; 开机后发现一致卡在此界面&#xff1a; 按esc键后有以下报错信息说明在/etc/fstab里面编写的外挂磁盘的命令有问题 解决方法如下&#xff1a;进入单用户模式对/etc/fstab进行修改&#xff1a; …

智能优化算法应用:基于侏儒猫鼬算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于侏儒猫鼬算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于侏儒猫鼬算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.侏儒猫鼬算法4.实验参数设定5.算法结果6.参考…

天津大数据培训机构品牌 数据分析师的发展方向

大数据专业还是有一定难度的&#xff0c;毕竟大数据开发技术所包含的编程技术知识是比较杂且多的如果是计算机专业的学生或者自身有一定基础的人学&#xff0c;相对来说会比较容易&#xff0c;但对于零基础小伙伴学习来说&#xff0c;想要学习大数据&#xff0c;难度还是很高的…

3D Web可视化平台助力Aras开发PLM系统:提供数据访问、可视化和发布功能

HOOPS中文网慧都科技是HOOPS全套产品中国地区指定授权经销商&#xff0c;提供3D软件开发工具HOOPS售卖、试用、中文试用指导服务、中文技术支持。http://techsoft3d.evget.com/ Aras是一个面向数字化工业应用的开放性平台&#xff0c;帮助世界领先的复杂互联产品制造商转变其产…

大三上实训内容

项目一&#xff1a;爬取天气预报数据 【内容】 在中国天气网(http://www.weather.com.cn)中输入城市的名称&#xff0c;例如输入信阳&#xff0c;进入http://www.weather.com.cn/weather1d/101180601.shtml#input 的网页显示信阳的天气预报&#xff0c;其中101180601是信阳的…

HttpComponents: 概述

文章目录 1. 概述2. 生态位 1. 概述 早期的Java想要实现HTTP客户端需要借助URL/URLConnection或者自己手动从Socket开始编码&#xff0c;需要处理大量HTTP协议的具体细节&#xff0c;不但繁琐还容易出错。 Apache Commons HttpClient的诞生就是为了解决这个问题&#xff0c;它…

高德地图画渐变线

高德地图画渐变线&#xff0c;思路是将线和颜色均分为多个小线段和小颜色&#xff0c;实现渐变&#xff0c;类似于下图。 如果需要多段线&#xff0c;自己循环拼一下就可以了&#xff0c;方法返回多个小线段组成的polyline数组。 /** 高德地图画渐变线* author: liyun* params…

【WPS】Excel表格数据透视表

数据少量还好&#xff0c;如果输数多起来就麻烦了&#xff0c;最近需要汇报一个情况。 描述 譬如&#xff1a;开发&#xff08;80.00%->91.16%&#xff09;&#xff1a;共计43项&#xff08;本周新增1项&#xff09;&#xff0c;本周新增已完成2项&#xff0c;共已完成36项…

RHEL8_Linux访问NFS存储及自动挂载

本章主要介绍NFS客户端的使用 创建FNS服务器并通过NFS共享一个目录在客户端上访问NFS共享的目录自动挂载的配置和使用 1.访问NFS存储 前面介绍了本地存储&#xff0c;本章就来介绍如何使用网络上的存储设备。NFS即网络文件系统&#xff0c;所实现的是 Linux 和 Linux 之间的共…

新手搭建知识付费平台必备攻略:如何以低成本实现高转化?

我有才知识付费平台 一、引言 随着知识经济的崛起&#xff0c;越来越多的知识提供者希望搭建自己的知识付费平台。然而&#xff0c;对于新手来说&#xff0c;如何以低成本、高效率地实现这一目标&#xff0c;同时满足自身需求并提高客户转化率&#xff0c;是一大挑战。本文将…

SPA, SEO, SSR总结

SPA单页面Web应用 SPA(Single page web application) 单页面Web应用 Web不再是一张张页面,而是一个整体的应用,一个由路由系统,数据系统,页面(组件)系统等等,组成的应用程序, 让用户不需要每次与服务器进行页面刷新来获得新的内容, 从而提供了更快,跟流畅的用户体验, 在SPA中…