@ozaiya/openclaw-channel 0.10.7 → 0.10.8

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.
@@ -0,0 +1,500 @@
1
+ /**
2
+ * Xueqiu (雪球) integration for fetching post content and top comments.
3
+ *
4
+ * Xueqiu uses Alibaba Cloud WAF which blocks direct Node.js HTTP requests
5
+ * (TLS fingerprint mismatch). Two modes are supported:
6
+ *
7
+ * 1. **CDP mode** (recommended): Executes fetch inside a real Chromium browser
8
+ * session via Chrome DevTools Protocol, reusing the browser's WAF-cleared
9
+ * session. Set `cdpEndpoint` to the browser's CDP endpoint (e.g.
10
+ * "ws://test-two-browser:9223") and `cdpPageUrl` to any already-loaded
11
+ * xueqiu.com page URL.
12
+ *
13
+ * 2. **Direct mode**: Uses Node.js fetch with cookies. Only works when WAF
14
+ * is not active (rare) or with a fresh acw_tc + xq_a_token combo.
15
+ */
16
+ import fs from "node:fs/promises";
17
+ import http from "node:http";
18
+ import net from "node:net";
19
+ const DEFAULT_MAX_COMMENTS = 10;
20
+ const DEFAULT_TIMEOUT_MS = 30_000;
21
+ async function loadCookies(config, log) {
22
+ if (config.cookies)
23
+ return config.cookies;
24
+ const cookiePath = config.cookieFile;
25
+ if (!cookiePath)
26
+ return null;
27
+ try {
28
+ const raw = await fs.readFile(cookiePath, "utf-8");
29
+ return raw.trim();
30
+ }
31
+ catch (err) {
32
+ log?.warn?.(`xueqiu: failed to read cookie file ${cookiePath}: ${err}`);
33
+ return null;
34
+ }
35
+ }
36
+ /**
37
+ * Extract post ID from a Xueqiu URL.
38
+ * Matches: https://xueqiu.com/{userId}/{postId}
39
+ */
40
+ function extractPostId(url) {
41
+ const match = url.match(/xueqiu\.com\/\d+\/(\d+)/);
42
+ return match ? match[1] : null;
43
+ }
44
+ /**
45
+ * Strip HTML tags from Xueqiu post text.
46
+ */
47
+ function stripHtml(html) {
48
+ return html
49
+ .replace(/<br\s*\/?>/gi, "\n")
50
+ .replace(/<[^>]+>/g, "")
51
+ .replace(/&nbsp;/g, " ")
52
+ .replace(/&lt;/g, "<")
53
+ .replace(/&gt;/g, ">")
54
+ .replace(/&amp;/g, "&")
55
+ .replace(/&quot;/g, '"')
56
+ .replace(/&#39;/g, "'")
57
+ .trim();
58
+ }
59
+ // ---------------------------------------------------------------------------
60
+ // Minimal CDP WebSocket client (no external dependencies)
61
+ // ---------------------------------------------------------------------------
62
+ function cdpConnect(host, port, path, originHost, originPort) {
63
+ return new Promise((resolve, reject) => {
64
+ const sock = net.createConnection(port, host, () => {
65
+ const key = Buffer.from(Array.from({ length: 16 }, () => Math.random() * 256 | 0)).toString("base64");
66
+ // Use origin host/port for Host header to satisfy CDP's host check
67
+ const hostHeader = `${originHost || host}:${originPort || port}`;
68
+ const req = `GET ${path} HTTP/1.1\r\nHost: ${hostHeader}\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Key: ${key}\r\nSec-WebSocket-Version: 13\r\n\r\n`;
69
+ sock.write(req);
70
+ let buf = Buffer.alloc(0);
71
+ const onData = (chunk) => {
72
+ buf = Buffer.concat([buf, chunk]);
73
+ if (buf.includes("\r\n\r\n")) {
74
+ sock.removeListener("data", onData);
75
+ resolve(sock);
76
+ }
77
+ };
78
+ sock.on("data", onData);
79
+ });
80
+ sock.on("error", reject);
81
+ });
82
+ }
83
+ function wsSend(sock, data) {
84
+ const payload = Buffer.from(data);
85
+ const frame = [0x81]; // text, fin
86
+ const maskKey = Buffer.from(Array.from({ length: 4 }, () => Math.random() * 256 | 0));
87
+ const len = payload.length;
88
+ if (len < 126) {
89
+ frame.push(0x80 | len);
90
+ }
91
+ else if (len < 65536) {
92
+ frame.push(0x80 | 126);
93
+ frame.push((len >> 8) & 0xff, len & 0xff);
94
+ }
95
+ else {
96
+ frame.push(0x80 | 127);
97
+ for (let i = 7; i >= 0; i--)
98
+ frame.push((len >> (i * 8)) & 0xff);
99
+ }
100
+ const masked = Buffer.alloc(len);
101
+ for (let i = 0; i < len; i++)
102
+ masked[i] = payload[i] ^ maskKey[i % 4];
103
+ sock.write(Buffer.from([...frame, ...maskKey, ...masked]));
104
+ }
105
+ function wsRecv(sock, timeoutMs) {
106
+ return new Promise((resolve, reject) => {
107
+ let buf = Buffer.alloc(0);
108
+ const timer = setTimeout(() => { cleanup(); reject(new Error("ws recv timeout")); }, timeoutMs);
109
+ const tryParse = () => {
110
+ if (buf.length < 2)
111
+ return false;
112
+ let payloadLen = buf[1] & 0x7f;
113
+ let offset = 2;
114
+ if (payloadLen === 126) {
115
+ if (buf.length < 4)
116
+ return false;
117
+ payloadLen = buf.readUInt16BE(2);
118
+ offset = 4;
119
+ }
120
+ else if (payloadLen === 127) {
121
+ if (buf.length < 10)
122
+ return false;
123
+ payloadLen = Number(buf.readBigUInt64BE(2));
124
+ offset = 10;
125
+ }
126
+ if (buf.length < offset + payloadLen)
127
+ return false;
128
+ const data = buf.subarray(offset, offset + payloadLen).toString();
129
+ cleanup();
130
+ resolve(data);
131
+ return true;
132
+ };
133
+ const onData = (chunk) => {
134
+ buf = Buffer.concat([buf, chunk]);
135
+ tryParse();
136
+ };
137
+ const cleanup = () => {
138
+ clearTimeout(timer);
139
+ sock.removeListener("data", onData);
140
+ };
141
+ sock.on("data", onData);
142
+ tryParse();
143
+ });
144
+ }
145
+ /**
146
+ * Find a xueqiu.com page tab in the browser via CDP /json/list,
147
+ * then use Runtime.evaluate to execute a fetch expression.
148
+ */
149
+ async function cdpFetch(cdpEndpoint, cdpPageUrl, jsExpression, timeoutMs, log, cdpOrigin) {
150
+ // Parse endpoint: "host:port" or "127.0.0.1:9223"
151
+ const [host, portStr] = cdpEndpoint.replace(/^wss?:\/\//, "").split(":");
152
+ const port = parseInt(portStr || "9222", 10);
153
+ // Parse optional origin for Host header spoofing (when connecting through a proxy)
154
+ let originHost;
155
+ let originPort;
156
+ if (cdpOrigin) {
157
+ const [oh, op] = cdpOrigin.replace(/^wss?:\/\//, "").split(":");
158
+ originHost = oh;
159
+ originPort = op ? parseInt(op, 10) : undefined;
160
+ }
161
+ // 1. List tabs to find a xueqiu page
162
+ // Use http.get with explicit Host header spoofing (fetch() blocks Host overrides)
163
+ const tabs = await new Promise((resolve, reject) => {
164
+ const req = http.get({
165
+ hostname: host,
166
+ port,
167
+ path: "/json/list",
168
+ headers: { Host: `${originHost || host}:${originPort || port}` },
169
+ }, (res) => {
170
+ let body = "";
171
+ res.on("data", (chunk) => { body += chunk.toString(); });
172
+ res.on("end", () => {
173
+ try {
174
+ resolve(JSON.parse(body));
175
+ }
176
+ catch (e) {
177
+ reject(e);
178
+ }
179
+ });
180
+ });
181
+ req.on("error", reject);
182
+ });
183
+ const tab = tabs.find((t) => t.type === "page" && t.url.startsWith(cdpPageUrl));
184
+ if (!tab) {
185
+ log?.warn?.(`xueqiu: no browser tab found matching ${cdpPageUrl}`);
186
+ return null;
187
+ }
188
+ // 2. Connect via WebSocket and evaluate
189
+ const wsPath = `/devtools/page/${tab.id}`;
190
+ const sock = await cdpConnect(host, port, wsPath, originHost, originPort);
191
+ try {
192
+ const msg = JSON.stringify({
193
+ id: 1,
194
+ method: "Runtime.evaluate",
195
+ params: { expression: jsExpression, awaitPromise: true, returnByValue: true },
196
+ });
197
+ wsSend(sock, msg);
198
+ const raw = await wsRecv(sock, timeoutMs);
199
+ const resp = JSON.parse(raw);
200
+ if (resp.result?.exceptionDetails) {
201
+ log?.warn?.(`xueqiu: CDP eval exception: ${JSON.stringify(resp.result.exceptionDetails)}`);
202
+ return null;
203
+ }
204
+ const value = resp.result?.result?.value;
205
+ return typeof value === "string" ? value : JSON.stringify(value);
206
+ }
207
+ finally {
208
+ sock.destroy();
209
+ }
210
+ }
211
+ // ---------------------------------------------------------------------------
212
+ // Build the JS expression that runs inside the browser page context
213
+ // ---------------------------------------------------------------------------
214
+ function buildBrowserFetchExpression(postId, maxComments) {
215
+ // This JS runs inside the browser's page context (xueqiu.com origin),
216
+ // so fetch uses the browser's own cookies and TLS fingerprint.
217
+ return `(async function() {
218
+ try {
219
+ var postResp = await fetch("/statuses/show.json?id=${postId}", {credentials:"include"});
220
+ var commentsResp = await fetch("/statuses/comments.json?id=${postId}&count=${maxComments}&page=1", {credentials:"include"});
221
+ var postText = await postResp.text();
222
+ var commentsText = await commentsResp.text();
223
+ return JSON.stringify({post: postText, comments: commentsText});
224
+ } catch(e) {
225
+ return JSON.stringify({error: e.message});
226
+ }
227
+ })()`;
228
+ }
229
+ // ---------------------------------------------------------------------------
230
+ // Format post + comments into readable text
231
+ // ---------------------------------------------------------------------------
232
+ function formatPost(postJson, commentsJson, log) {
233
+ // /statuses/show.json returns the post directly (not wrapped in "status")
234
+ let post;
235
+ try {
236
+ post = JSON.parse(postJson);
237
+ }
238
+ catch {
239
+ log?.warn?.(`xueqiu: failed to parse post JSON`);
240
+ return null;
241
+ }
242
+ if (!post || (!post.description && !post.text && !post.title)) {
243
+ log?.warn?.("xueqiu: empty post response");
244
+ return null;
245
+ }
246
+ const parts = [];
247
+ // Title line — many Xueqiu posts have no title, use description prefix
248
+ const title = post.title || "(无标题)";
249
+ const author = post.user?.screen_name || "未知";
250
+ const retweet = post.retweet_count ?? 0;
251
+ const reply = post.reply_count ?? 0;
252
+ const like = post.fav_count ?? post.like_count ?? 0;
253
+ parts.push(`标题: ${title}`);
254
+ parts.push(`作者: ${author} | 转发 ${retweet} | 评论 ${reply} | 点赞 ${like}`);
255
+ // Post text — prefer `text` (full HTML), fall back to `description` (plain text excerpt)
256
+ const rawContent = post.text || post.description;
257
+ if (rawContent) {
258
+ const plainText = stripHtml(rawContent);
259
+ if (plainText) {
260
+ parts.push("");
261
+ parts.push("正文:");
262
+ parts.push(plainText);
263
+ }
264
+ }
265
+ // Parse comments
266
+ try {
267
+ const commentsData = JSON.parse(commentsJson);
268
+ const comments = commentsData.comments;
269
+ if (comments && comments.length > 0) {
270
+ parts.push("");
271
+ parts.push(`热门评论 (${comments.length}条):`);
272
+ for (let i = 0; i < comments.length; i++) {
273
+ const c = comments[i];
274
+ const cAuthor = c.user?.screen_name || "匿名";
275
+ const cLikes = c.like_count ?? 0;
276
+ const cText = c.text ? stripHtml(c.text) : "";
277
+ if (cText) {
278
+ parts.push(`${i + 1}. @${cAuthor} (赞 ${cLikes}): ${cText}`);
279
+ }
280
+ }
281
+ }
282
+ }
283
+ catch {
284
+ log?.warn?.("xueqiu: failed to parse comments JSON");
285
+ }
286
+ return parts.join("\n");
287
+ }
288
+ function buildSearchExpression(query, count) {
289
+ // Runs inside the browser page context (xueqiu.com origin)
290
+ return `(async function() {
291
+ try {
292
+ var q = encodeURIComponent(${JSON.stringify(query)});
293
+ var r = await fetch("/query/v1/search/status.json?q=" + q + "&count=${count}&page=1", {credentials:"include"});
294
+ var t = await r.text();
295
+ return t;
296
+ } catch(e) {
297
+ return JSON.stringify({error: e.message});
298
+ }
299
+ })()`;
300
+ }
301
+ function formatSearchResults(items, query) {
302
+ const parts = [];
303
+ parts.push(`雪球搜索"${query}" — 共找到 ${items.length} 条结果:\n`);
304
+ for (let i = 0; i < items.length; i++) {
305
+ const item = items[i];
306
+ const author = item.user?.screen_name || "未知";
307
+ const fav = item.fav_count ?? item.like_count ?? 0;
308
+ const reply = item.reply_count ?? 0;
309
+ const retweet = item.retweet_count ?? 0;
310
+ const date = item.created_at ? new Date(item.created_at).toLocaleDateString("zh-CN") : "";
311
+ const url = item.target ? `https://xueqiu.com${item.target}` : "";
312
+ // Strip HTML highlight spans from description
313
+ const desc = item.description ? stripHtml(item.description).substring(0, 200) : "";
314
+ const title = item.title || "(无标题)";
315
+ parts.push(`${i + 1}. ${title}`);
316
+ parts.push(` 作者: @${author} | ${date} | 转发 ${retweet} 评论 ${reply} 点赞 ${fav}`);
317
+ if (desc)
318
+ parts.push(` 摘要: ${desc}`);
319
+ if (url)
320
+ parts.push(` 链接: ${url}`);
321
+ parts.push("");
322
+ }
323
+ return parts.join("\n");
324
+ }
325
+ /**
326
+ * Search Xueqiu posts by keyword, returning formatted results.
327
+ * Returns null if the operation fails or no results are found.
328
+ */
329
+ export async function searchXueqiuPosts(query, config, log, count = 5) {
330
+ const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;
331
+ log?.info?.(`xueqiu: searching for "${query}" (count=${count})`);
332
+ // --- CDP mode ---
333
+ if (config.cdpEndpoint) {
334
+ const cdpPageUrl = config.cdpPageUrl || "https://xueqiu.com";
335
+ const jsExpr = buildSearchExpression(query, count);
336
+ try {
337
+ const raw = await cdpFetch(config.cdpEndpoint, cdpPageUrl, jsExpr, timeoutMs, log, config.cdpOrigin);
338
+ if (!raw)
339
+ return null;
340
+ const data = JSON.parse(raw);
341
+ if (data.error) {
342
+ log?.warn?.(`xueqiu: search error: ${data.error}`);
343
+ return null;
344
+ }
345
+ if (!data.list || data.list.length === 0) {
346
+ log?.info?.(`xueqiu: no search results for "${query}"`);
347
+ return `雪球搜索"${query}" — 没有找到相关帖子。`;
348
+ }
349
+ const result = formatSearchResults(data.list.slice(0, count), query);
350
+ log?.info?.(`xueqiu: found ${data.list.length} results for "${query}" via CDP`);
351
+ return result;
352
+ }
353
+ catch (err) {
354
+ log?.warn?.(`xueqiu: CDP search failed: ${err}`);
355
+ return null;
356
+ }
357
+ }
358
+ // --- Direct mode ---
359
+ const cookies = await loadCookies(config, log);
360
+ if (!cookies) {
361
+ log?.warn?.("xueqiu: no cookies and no cdpEndpoint configured, skipping search");
362
+ return null;
363
+ }
364
+ const headers = {
365
+ Cookie: cookies,
366
+ "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
367
+ };
368
+ const controller = new AbortController();
369
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
370
+ try {
371
+ const q = encodeURIComponent(query);
372
+ const resp = await fetch(`https://xueqiu.com/query/v1/search/status.json?q=${q}&count=${count}&page=1`, { headers, signal: controller.signal });
373
+ if (!resp.ok) {
374
+ log?.warn?.(`xueqiu: search API error ${resp.status}`);
375
+ return null;
376
+ }
377
+ const text = await resp.text();
378
+ if (text.includes("_waf_")) {
379
+ log?.warn?.("xueqiu: WAF blocked search request");
380
+ return null;
381
+ }
382
+ const data = JSON.parse(text);
383
+ if (!data.list || data.list.length === 0) {
384
+ return `雪球搜索"${query}" — 没有找到相关帖子。`;
385
+ }
386
+ const result = formatSearchResults(data.list.slice(0, count), query);
387
+ log?.info?.(`xueqiu: found ${data.list.length} results for "${query}"`);
388
+ return result;
389
+ }
390
+ catch (err) {
391
+ if (err.name === "AbortError") {
392
+ log?.warn?.(`xueqiu: search timed out after ${timeoutMs}ms`);
393
+ }
394
+ else {
395
+ log?.warn?.(`xueqiu: search error: ${err}`);
396
+ }
397
+ return null;
398
+ }
399
+ finally {
400
+ clearTimeout(timer);
401
+ }
402
+ }
403
+ // ---------------------------------------------------------------------------
404
+ // Public API
405
+ // ---------------------------------------------------------------------------
406
+ /**
407
+ * Fetch a Xueqiu post and its top comments, returning formatted text.
408
+ * Returns null if the operation fails or no content is available.
409
+ */
410
+ export async function fetchXueqiuPost(url, config, log) {
411
+ const postId = extractPostId(url);
412
+ if (!postId) {
413
+ log?.warn?.(`xueqiu: could not extract post ID from URL: ${url}`);
414
+ return null;
415
+ }
416
+ const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;
417
+ const maxComments = config.maxComments ?? DEFAULT_MAX_COMMENTS;
418
+ log?.info?.(`xueqiu: fetching post ${postId} from ${url}`);
419
+ // --- CDP mode: proxy fetch through the browser ---
420
+ if (config.cdpEndpoint) {
421
+ const cdpPageUrl = config.cdpPageUrl || "https://xueqiu.com";
422
+ const jsExpr = buildBrowserFetchExpression(postId, maxComments);
423
+ try {
424
+ const raw = await cdpFetch(config.cdpEndpoint, cdpPageUrl, jsExpr, timeoutMs, log, config.cdpOrigin);
425
+ if (!raw)
426
+ return null;
427
+ const envelope = JSON.parse(raw);
428
+ if (envelope.error) {
429
+ log?.warn?.(`xueqiu: browser fetch error: ${envelope.error}`);
430
+ return null;
431
+ }
432
+ if (!envelope.post || envelope.post.includes("_waf_")) {
433
+ log?.warn?.("xueqiu: WAF blocked the request even in browser context");
434
+ return null;
435
+ }
436
+ const result = formatPost(envelope.post, envelope.comments || "{}", log);
437
+ if (result) {
438
+ log?.info?.(`xueqiu: got post content via CDP (${result.length} chars)`);
439
+ }
440
+ return result;
441
+ }
442
+ catch (err) {
443
+ log?.warn?.(`xueqiu: CDP fetch failed: ${err}`);
444
+ return null;
445
+ }
446
+ }
447
+ // --- Direct mode: use Node.js fetch with cookies ---
448
+ const cookies = await loadCookies(config, log);
449
+ if (!cookies) {
450
+ log?.warn?.("xueqiu: no cookies and no cdpEndpoint configured, skipping");
451
+ return null;
452
+ }
453
+ const headers = {
454
+ Cookie: cookies,
455
+ "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
456
+ };
457
+ const controller = new AbortController();
458
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
459
+ try {
460
+ const [postResp, commentsResp] = await Promise.all([
461
+ fetch(`https://xueqiu.com/statuses/show.json?id=${postId}`, {
462
+ headers,
463
+ signal: controller.signal,
464
+ }),
465
+ fetch(`https://xueqiu.com/statuses/comments.json?id=${postId}&count=${maxComments}&page=1`, {
466
+ headers,
467
+ signal: controller.signal,
468
+ }),
469
+ ]);
470
+ if (!postResp.ok) {
471
+ const body = await postResp.text().catch(() => "");
472
+ log?.warn?.(`xueqiu: post API error ${postResp.status}: ${body.slice(0, 500)}`);
473
+ return null;
474
+ }
475
+ const postText = await postResp.text();
476
+ if (postText.includes("_waf_")) {
477
+ log?.warn?.("xueqiu: WAF blocked direct request, consider using cdpEndpoint");
478
+ return null;
479
+ }
480
+ const commentsText = commentsResp.ok ? await commentsResp.text() : "{}";
481
+ const result = formatPost(postText, commentsText, log);
482
+ if (result) {
483
+ log?.info?.(`xueqiu: got post content (${result.length} chars)`);
484
+ }
485
+ return result;
486
+ }
487
+ catch (err) {
488
+ if (err.name === "AbortError") {
489
+ log?.warn?.(`xueqiu: request timed out after ${timeoutMs}ms`);
490
+ }
491
+ else {
492
+ log?.warn?.(`xueqiu: error: ${err}`);
493
+ }
494
+ return null;
495
+ }
496
+ finally {
497
+ clearTimeout(timer);
498
+ }
499
+ }
500
+ //# sourceMappingURL=xueqiu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xueqiu.js","sourceRoot":"","sources":["../../src/xueqiu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export interface YuanbaoConfig {
2
+ /** Path to cookie file (default: stateDir/yuanbao-cookies.txt) */
3
+ cookieFile?: string;
4
+ /** Inline cookie string (overrides cookieFile) */
5
+ cookies?: string;
6
+ /** Yuanbao agent ID (default: "naQivTmsDa") */
7
+ agentId?: string;
8
+ /** Chat model ID (default: "deep_seek_v3") */
9
+ chatModelId?: string;
10
+ }
11
+ interface YuanbaoLog {
12
+ info?: (...args: unknown[]) => void;
13
+ warn?: (...args: unknown[]) => void;
14
+ error?: (...args: unknown[]) => void;
15
+ }
16
+ /**
17
+ * Summarize a WeChat article URL using Yuanbao.
18
+ * Returns the summary text, or null if the operation fails (expired cookies, network error, etc.).
19
+ */
20
+ export declare function summarizeWithYuanbao(url: string, config: YuanbaoConfig, log?: YuanbaoLog): Promise<string | null>;
21
+ export {};