@lucasygu/redbook 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts +17 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +377 -0
- package/dist/cli.js.map +1 -0
- package/dist/lib/client.d.ts +60 -0
- package/dist/lib/client.d.ts.map +1 -0
- package/dist/lib/client.js +342 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/cookies.d.ts +21 -0
- package/dist/lib/cookies.d.ts.map +1 -0
- package/dist/lib/cookies.js +32 -0
- package/dist/lib/cookies.js.map +1 -0
- package/dist/lib/creator-signing.d.ts +23 -0
- package/dist/lib/creator-signing.d.ts.map +1 -0
- package/dist/lib/creator-signing.js +52 -0
- package/dist/lib/creator-signing.js.map +1 -0
- package/dist/lib/fingerprint-data.d.ts +14 -0
- package/dist/lib/fingerprint-data.d.ts.map +1 -0
- package/dist/lib/fingerprint-data.js +35 -0
- package/dist/lib/fingerprint-data.js.map +1 -0
- package/dist/lib/signing.d.ts +30 -0
- package/dist/lib/signing.d.ts.map +1 -0
- package/dist/lib/signing.js +505 -0
- package/dist/lib/signing.js.map +1 -0
- package/package.json +53 -0
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* redbook CLI — Xiaohongshu (Red Note) from the command line
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* redbook whoami --cookie-source chrome
|
|
7
|
+
* redbook search "Claude Code" --cookie-source chrome --json
|
|
8
|
+
* redbook read <url> --cookie-source chrome --json
|
|
9
|
+
* redbook comments <url> --cookie-source chrome --json
|
|
10
|
+
* redbook user <user-id> --cookie-source chrome --json
|
|
11
|
+
* redbook user-posts <user-id> --cookie-source chrome --json
|
|
12
|
+
* redbook feed --cookie-source chrome --json
|
|
13
|
+
* redbook post --title "..." --body "..." --images img1.jpg --cookie-source chrome
|
|
14
|
+
* redbook topics "keyword" --cookie-source chrome
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;GAaG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* redbook CLI — Xiaohongshu (Red Note) from the command line
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* redbook whoami --cookie-source chrome
|
|
7
|
+
* redbook search "Claude Code" --cookie-source chrome --json
|
|
8
|
+
* redbook read <url> --cookie-source chrome --json
|
|
9
|
+
* redbook comments <url> --cookie-source chrome --json
|
|
10
|
+
* redbook user <user-id> --cookie-source chrome --json
|
|
11
|
+
* redbook user-posts <user-id> --cookie-source chrome --json
|
|
12
|
+
* redbook feed --cookie-source chrome --json
|
|
13
|
+
* redbook post --title "..." --body "..." --images img1.jpg --cookie-source chrome
|
|
14
|
+
* redbook topics "keyword" --cookie-source chrome
|
|
15
|
+
*/
|
|
16
|
+
import { Command } from "commander";
|
|
17
|
+
import kleur from "kleur";
|
|
18
|
+
import { extractCookies } from "./lib/cookies.js";
|
|
19
|
+
import { XhsClient, XhsApiError } from "./lib/client.js";
|
|
20
|
+
const program = new Command();
|
|
21
|
+
program
|
|
22
|
+
.name("redbook")
|
|
23
|
+
.description("CLI tool for Xiaohongshu (Red Note)")
|
|
24
|
+
.version("0.1.0");
|
|
25
|
+
// Global option for cookie source
|
|
26
|
+
function addCookieOption(cmd) {
|
|
27
|
+
return cmd.option("--cookie-source <browser>", "Browser to read cookies from (chrome, safari, firefox)", "chrome");
|
|
28
|
+
}
|
|
29
|
+
function addJsonOption(cmd) {
|
|
30
|
+
return cmd.option("--json", "Output as JSON");
|
|
31
|
+
}
|
|
32
|
+
async function getClient(cookieSource) {
|
|
33
|
+
const cookies = await extractCookies(cookieSource);
|
|
34
|
+
return new XhsClient(cookies);
|
|
35
|
+
}
|
|
36
|
+
function output(data, json) {
|
|
37
|
+
if (json) {
|
|
38
|
+
console.log(JSON.stringify(data, null, 2));
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
console.log(data);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function handleError(err) {
|
|
45
|
+
if (err instanceof XhsApiError) {
|
|
46
|
+
console.error(kleur.red(`Error: ${err.message}`));
|
|
47
|
+
if (err.code)
|
|
48
|
+
console.error(kleur.dim(`Code: ${err.code}`));
|
|
49
|
+
}
|
|
50
|
+
else if (err instanceof Error) {
|
|
51
|
+
console.error(kleur.red(`Error: ${err.message}`));
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
console.error(kleur.red("Unknown error"));
|
|
55
|
+
}
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
// ─── whoami ─────────────────────────────────────────────────────────────────
|
|
59
|
+
const whoamiCmd = program.command("whoami").description("Check connection and show current user info");
|
|
60
|
+
addCookieOption(whoamiCmd);
|
|
61
|
+
addJsonOption(whoamiCmd);
|
|
62
|
+
whoamiCmd.action(async (opts) => {
|
|
63
|
+
try {
|
|
64
|
+
const client = await getClient(opts.cookieSource);
|
|
65
|
+
const info = await client.getSelfInfo();
|
|
66
|
+
if (opts.json) {
|
|
67
|
+
output(info, true);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
const user = info;
|
|
71
|
+
console.log(kleur.green("Connected to Xiaohongshu"));
|
|
72
|
+
console.log(` User: ${kleur.bold(String(user.nickname ?? user.nick_name ?? "unknown"))}`);
|
|
73
|
+
console.log(` ID: ${user.user_id ?? "unknown"}`);
|
|
74
|
+
if (user.red_id)
|
|
75
|
+
console.log(` RedID: ${user.red_id}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
handleError(err);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
// ─── search ─────────────────────────────────────────────────────────────────
|
|
83
|
+
const searchCmd = program
|
|
84
|
+
.command("search <keyword>")
|
|
85
|
+
.description("Search notes by keyword")
|
|
86
|
+
.option("--page <n>", "Page number", "1")
|
|
87
|
+
.option("--sort <type>", "Sort: general, popular, latest", "general")
|
|
88
|
+
.option("--type <type>", "Note type: all, video, image", "all");
|
|
89
|
+
addCookieOption(searchCmd);
|
|
90
|
+
addJsonOption(searchCmd);
|
|
91
|
+
searchCmd.action(async (keyword, opts) => {
|
|
92
|
+
try {
|
|
93
|
+
const client = await getClient(opts.cookieSource);
|
|
94
|
+
const sortMap = {
|
|
95
|
+
general: "general",
|
|
96
|
+
popular: "popularity_descending",
|
|
97
|
+
latest: "time_descending",
|
|
98
|
+
};
|
|
99
|
+
const typeMap = { all: 0, video: 1, image: 2 };
|
|
100
|
+
const result = await client.searchNotes(keyword, parseInt(opts.page), 20, sortMap[opts.sort] ?? "general", typeMap[opts.type] ?? 0);
|
|
101
|
+
if (opts.json) {
|
|
102
|
+
output(result, true);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
const data = result;
|
|
106
|
+
if (data.items) {
|
|
107
|
+
for (const item of data.items) {
|
|
108
|
+
const card = item.note_card;
|
|
109
|
+
if (!card)
|
|
110
|
+
continue;
|
|
111
|
+
console.log(`${kleur.bold(card.title ?? "(no title)")} — ${kleur.dim(`@${card.user?.nickname ?? "?"}`)}` +
|
|
112
|
+
` ${kleur.cyan(card.note_id ?? "")}`);
|
|
113
|
+
if (card.interact_info) {
|
|
114
|
+
const info = card.interact_info;
|
|
115
|
+
console.log(` ${kleur.dim(`♥ ${info.liked_count ?? 0} 💬 ${info.comment_count ?? 0} ⭐ ${info.collected_count ?? 0}`)}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
handleError(err);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
// ─── read ───────────────────────────────────────────────────────────────────
|
|
126
|
+
const readCmd = program
|
|
127
|
+
.command("read <url>")
|
|
128
|
+
.description("Read a note by URL (tries HTML fallback first)")
|
|
129
|
+
.option("--api", "Force API mode (requires xsec_token in URL)");
|
|
130
|
+
addCookieOption(readCmd);
|
|
131
|
+
addJsonOption(readCmd);
|
|
132
|
+
readCmd.action(async (url, opts) => {
|
|
133
|
+
try {
|
|
134
|
+
const client = await getClient(opts.cookieSource);
|
|
135
|
+
const { noteId, xsecToken } = parseNoteUrl(url);
|
|
136
|
+
let result;
|
|
137
|
+
if (opts.api || xsecToken) {
|
|
138
|
+
try {
|
|
139
|
+
const feedResult = (await client.getNoteById(noteId, xsecToken ?? ""));
|
|
140
|
+
result = feedResult?.items?.[0]?.note_card ?? feedResult;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// Fall back to HTML
|
|
144
|
+
result = await client.getNoteFromHtml(noteId, xsecToken ?? "");
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
result = await client.getNoteFromHtml(noteId, xsecToken ?? "");
|
|
149
|
+
}
|
|
150
|
+
if (opts.json) {
|
|
151
|
+
output(result, true);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
const note = result;
|
|
155
|
+
console.log(kleur.bold(String(note.title ?? "(no title)")));
|
|
156
|
+
console.log(kleur.dim(`by @${note.user?.nickname ?? "unknown"}`));
|
|
157
|
+
console.log();
|
|
158
|
+
console.log(String(note.desc ?? ""));
|
|
159
|
+
if (note.interact_info) {
|
|
160
|
+
const info = note.interact_info;
|
|
161
|
+
console.log();
|
|
162
|
+
console.log(`♥ ${info.liked_count ?? 0} 💬 ${info.comment_count ?? 0} ⭐ ${info.collected_count ?? 0} 📤 ${info.share_count ?? 0}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
handleError(err);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
// ─── comments ───────────────────────────────────────────────────────────────
|
|
171
|
+
const commentsCmd = program
|
|
172
|
+
.command("comments <url>")
|
|
173
|
+
.description("Get comments on a note")
|
|
174
|
+
.option("--all", "Fetch all pages of comments");
|
|
175
|
+
addCookieOption(commentsCmd);
|
|
176
|
+
addJsonOption(commentsCmd);
|
|
177
|
+
commentsCmd.action(async (url, opts) => {
|
|
178
|
+
try {
|
|
179
|
+
const client = await getClient(opts.cookieSource);
|
|
180
|
+
const { noteId, xsecToken } = parseNoteUrl(url);
|
|
181
|
+
const allComments = [];
|
|
182
|
+
let cursor = "";
|
|
183
|
+
let hasMore = true;
|
|
184
|
+
while (hasMore) {
|
|
185
|
+
const res = (await client.getComments(noteId, cursor, xsecToken ?? ""));
|
|
186
|
+
if (res.comments)
|
|
187
|
+
allComments.push(...res.comments);
|
|
188
|
+
hasMore = opts.all ? (res.has_more ?? false) : false;
|
|
189
|
+
cursor = res.cursor ?? "";
|
|
190
|
+
}
|
|
191
|
+
if (opts.json) {
|
|
192
|
+
output(allComments, true);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
for (const comment of allComments) {
|
|
196
|
+
const c = comment;
|
|
197
|
+
const user = c.user_info;
|
|
198
|
+
console.log(`${kleur.bold(`@${user?.nickname ?? "?"}`)} — ${String(c.content ?? "")}`);
|
|
199
|
+
if (c.like_count)
|
|
200
|
+
console.log(kleur.dim(` ♥ ${c.like_count}`));
|
|
201
|
+
}
|
|
202
|
+
console.log(kleur.dim(`\n${allComments.length} comments`));
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch (err) {
|
|
206
|
+
handleError(err);
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
// ─── user ───────────────────────────────────────────────────────────────────
|
|
210
|
+
const userCmd = program
|
|
211
|
+
.command("user <userId>")
|
|
212
|
+
.description("Get user profile info");
|
|
213
|
+
addCookieOption(userCmd);
|
|
214
|
+
addJsonOption(userCmd);
|
|
215
|
+
userCmd.action(async (userId, opts) => {
|
|
216
|
+
try {
|
|
217
|
+
const client = await getClient(opts.cookieSource);
|
|
218
|
+
const info = await client.getUserInfo(userId);
|
|
219
|
+
output(info, opts.json ?? false);
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
handleError(err);
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
// ─── user-posts ─────────────────────────────────────────────────────────────
|
|
226
|
+
const userPostsCmd = program
|
|
227
|
+
.command("user-posts <userId>")
|
|
228
|
+
.description("List a user's posted notes");
|
|
229
|
+
addCookieOption(userPostsCmd);
|
|
230
|
+
addJsonOption(userPostsCmd);
|
|
231
|
+
userPostsCmd.action(async (userId, opts) => {
|
|
232
|
+
try {
|
|
233
|
+
const client = await getClient(opts.cookieSource);
|
|
234
|
+
const result = await client.getUserNotes(userId);
|
|
235
|
+
if (opts.json) {
|
|
236
|
+
output(result, true);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
const data = result;
|
|
240
|
+
if (data.notes) {
|
|
241
|
+
for (const note of data.notes) {
|
|
242
|
+
console.log(`${kleur.bold(note.display_title ?? "(no title)")} ${kleur.dim(note.note_id ?? "")} [${note.type ?? "?"}]`);
|
|
243
|
+
}
|
|
244
|
+
console.log(kleur.dim(`\n${data.notes.length} notes`));
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
handleError(err);
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
// ─── feed ───────────────────────────────────────────────────────────────────
|
|
253
|
+
const feedCmd = program
|
|
254
|
+
.command("feed")
|
|
255
|
+
.description("Get homepage feed")
|
|
256
|
+
.option("--category <cat>", "Feed category", "homefeed_recommend");
|
|
257
|
+
addCookieOption(feedCmd);
|
|
258
|
+
addJsonOption(feedCmd);
|
|
259
|
+
feedCmd.action(async (opts) => {
|
|
260
|
+
try {
|
|
261
|
+
const client = await getClient(opts.cookieSource);
|
|
262
|
+
const result = await client.getHomeFeed(opts.category);
|
|
263
|
+
output(result, opts.json ?? false);
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
handleError(err);
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
// ─── post ───────────────────────────────────────────────────────────────────
|
|
270
|
+
const postCmd = program
|
|
271
|
+
.command("post")
|
|
272
|
+
.description("Publish an image note")
|
|
273
|
+
.requiredOption("--title <title>", "Note title")
|
|
274
|
+
.requiredOption("--body <body>", "Note body text")
|
|
275
|
+
.option("--images <paths...>", "Image file paths")
|
|
276
|
+
.option("--topic <keyword>", "Topic/hashtag keyword to search and attach")
|
|
277
|
+
.option("--private", "Publish as private note");
|
|
278
|
+
addCookieOption(postCmd);
|
|
279
|
+
addJsonOption(postCmd);
|
|
280
|
+
postCmd.action(async (opts) => {
|
|
281
|
+
try {
|
|
282
|
+
const client = await getClient(opts.cookieSource);
|
|
283
|
+
const imageFiles = opts.images ?? [];
|
|
284
|
+
if (imageFiles.length === 0) {
|
|
285
|
+
console.error(kleur.red("At least one image is required. Use --images <path>"));
|
|
286
|
+
process.exit(1);
|
|
287
|
+
}
|
|
288
|
+
// Upload images
|
|
289
|
+
console.log(kleur.dim("Uploading images..."));
|
|
290
|
+
const fileIds = [];
|
|
291
|
+
for (const filePath of imageFiles) {
|
|
292
|
+
const { fileId, token } = await client.getUploadPermit("image");
|
|
293
|
+
const ext = filePath.toLowerCase().split(".").pop();
|
|
294
|
+
const contentType = ext === "png" ? "image/png" : ext === "webp" ? "image/webp" : "image/jpeg";
|
|
295
|
+
await client.uploadFile(fileId, token, filePath, contentType);
|
|
296
|
+
fileIds.push(fileId);
|
|
297
|
+
console.log(kleur.dim(` Uploaded: ${filePath} → ${fileId}`));
|
|
298
|
+
}
|
|
299
|
+
// Search for topic if specified
|
|
300
|
+
let topics = [];
|
|
301
|
+
if (opts.topic) {
|
|
302
|
+
const topicResult = (await client.searchTopics(opts.topic));
|
|
303
|
+
if (topicResult.length > 0) {
|
|
304
|
+
topics = [topicResult[0]];
|
|
305
|
+
console.log(kleur.dim(` Topic: #${topicResult[0].name}`));
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
// Create the note
|
|
309
|
+
console.log(kleur.dim("Publishing note..."));
|
|
310
|
+
const result = await client.createImageNote(opts.title, opts.body, fileIds, {
|
|
311
|
+
topics,
|
|
312
|
+
isPrivate: opts.private ?? false,
|
|
313
|
+
});
|
|
314
|
+
if (opts.json) {
|
|
315
|
+
output(result, true);
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
console.log(kleur.green("Note published!"));
|
|
319
|
+
const r = result;
|
|
320
|
+
if (r.note_id) {
|
|
321
|
+
console.log(` URL: https://www.xiaohongshu.com/explore/${r.note_id}`);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
catch (err) {
|
|
326
|
+
handleError(err);
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
// ─── topics ─────────────────────────────────────────────────────────────────
|
|
330
|
+
const topicsCmd = program
|
|
331
|
+
.command("topics <keyword>")
|
|
332
|
+
.description("Search for topics/hashtags to use in posts");
|
|
333
|
+
addCookieOption(topicsCmd);
|
|
334
|
+
addJsonOption(topicsCmd);
|
|
335
|
+
topicsCmd.action(async (keyword, opts) => {
|
|
336
|
+
try {
|
|
337
|
+
const client = await getClient(opts.cookieSource);
|
|
338
|
+
const result = await client.searchTopics(keyword);
|
|
339
|
+
if (opts.json) {
|
|
340
|
+
output(result, true);
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
const data = result;
|
|
344
|
+
const topics = data.topic_info_dtos ?? (Array.isArray(result) ? result : []);
|
|
345
|
+
for (const topic of topics) {
|
|
346
|
+
console.log(`#${kleur.bold(topic.name ?? "?")} ${kleur.dim(`id:${topic.id ?? "?"}`)} ${kleur.dim(`views:${topic.view_num ?? "?"}`)}`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
catch (err) {
|
|
351
|
+
handleError(err);
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
355
|
+
function parseNoteUrl(url) {
|
|
356
|
+
// Handle full URLs like https://www.xiaohongshu.com/explore/abc123?xsec_token=xxx
|
|
357
|
+
// or https://www.xiaohongshu.com/discovery/item/abc123
|
|
358
|
+
// or just a note ID
|
|
359
|
+
let noteId;
|
|
360
|
+
let xsecToken = null;
|
|
361
|
+
if (url.includes("xiaohongshu.com")) {
|
|
362
|
+
const urlObj = new URL(url);
|
|
363
|
+
const pathParts = urlObj.pathname.split("/").filter(Boolean);
|
|
364
|
+
noteId = pathParts[pathParts.length - 1];
|
|
365
|
+
xsecToken = urlObj.searchParams.get("xsec_token");
|
|
366
|
+
}
|
|
367
|
+
else if (url.includes("xhslink.com")) {
|
|
368
|
+
// Short link — just use it as-is, would need redirect following
|
|
369
|
+
noteId = url;
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
noteId = url;
|
|
373
|
+
}
|
|
374
|
+
return { noteId, xsecToken };
|
|
375
|
+
}
|
|
376
|
+
program.parse();
|
|
377
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XHS API Client
|
|
3
|
+
*
|
|
4
|
+
* Handles all HTTP requests to edith.xiaohongshu.com and creator.xiaohongshu.com
|
|
5
|
+
* with proper signing, headers, and error handling.
|
|
6
|
+
*/
|
|
7
|
+
import { type XhsCookies } from "./cookies.js";
|
|
8
|
+
export declare class XhsApiError extends Error {
|
|
9
|
+
code?: number | string | undefined;
|
|
10
|
+
response?: unknown | undefined;
|
|
11
|
+
constructor(message: string, code?: number | string | undefined, response?: unknown | undefined);
|
|
12
|
+
}
|
|
13
|
+
export declare class NeedVerifyError extends XhsApiError {
|
|
14
|
+
verifyType: string;
|
|
15
|
+
verifyUuid: string;
|
|
16
|
+
constructor(verifyType: string, verifyUuid: string);
|
|
17
|
+
}
|
|
18
|
+
export declare class XhsClient {
|
|
19
|
+
private cookies;
|
|
20
|
+
constructor(cookies: XhsCookies);
|
|
21
|
+
private baseHeaders;
|
|
22
|
+
private mainApiGet;
|
|
23
|
+
private mainApiPost;
|
|
24
|
+
private creatorHost;
|
|
25
|
+
private creatorGet;
|
|
26
|
+
private creatorPost;
|
|
27
|
+
private handleResponse;
|
|
28
|
+
getSelfInfo(): Promise<unknown>;
|
|
29
|
+
getUserInfo(userId: string): Promise<unknown>;
|
|
30
|
+
getUserNotes(userId: string, cursor?: string): Promise<unknown>;
|
|
31
|
+
searchNotes(keyword: string, page?: number, pageSize?: number, sort?: "general" | "popularity_descending" | "time_descending", noteType?: 0 | 1 | 2): Promise<unknown>;
|
|
32
|
+
getNoteById(noteId: string, xsecToken: string, xsecSource?: string): Promise<unknown>;
|
|
33
|
+
getHomeFeed(category?: string): Promise<unknown>;
|
|
34
|
+
getComments(noteId: string, cursor?: string, xsecToken?: string): Promise<unknown>;
|
|
35
|
+
getSubComments(noteId: string, rootCommentId: string, num?: number, cursor?: string): Promise<unknown>;
|
|
36
|
+
postComment(noteId: string, content: string): Promise<unknown>;
|
|
37
|
+
getNoteFromHtml(noteId: string, xsecToken: string): Promise<unknown>;
|
|
38
|
+
getUploadPermit(fileType: "image" | "video", count?: number): Promise<{
|
|
39
|
+
fileId: string;
|
|
40
|
+
token: string;
|
|
41
|
+
}>;
|
|
42
|
+
uploadFile(fileId: string, token: string, filePath: string, contentType?: string): Promise<void>;
|
|
43
|
+
createImageNote(title: string, desc: string, imageFileIds: string[], options?: {
|
|
44
|
+
topics?: Array<{
|
|
45
|
+
id: string;
|
|
46
|
+
name: string;
|
|
47
|
+
type: string;
|
|
48
|
+
}>;
|
|
49
|
+
ats?: Array<{
|
|
50
|
+
userId: string;
|
|
51
|
+
nickname: string;
|
|
52
|
+
}>;
|
|
53
|
+
postTime?: string;
|
|
54
|
+
isPrivate?: boolean;
|
|
55
|
+
}): Promise<unknown>;
|
|
56
|
+
searchTopics(keyword: string): Promise<unknown>;
|
|
57
|
+
searchUsers(keyword: string): Promise<unknown>;
|
|
58
|
+
getCreatorNoteList(tab?: number, page?: number): Promise<unknown>;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"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"}
|