|
|
@@ -0,0 +1,89 @@
|
|
|
+"""用页面cookie调评论API获取每篇笔记的评论"""
|
|
|
+import json, time, websocket, urllib.request
|
|
|
+
|
|
|
+tabs = json.loads(urllib.request.urlopen("http://127.0.0.1:9222/json").read())
|
|
|
+ws_url = None
|
|
|
+for t in tabs:
|
|
|
+ if "creator.xiaohongshu.com" in t.get("url", ""):
|
|
|
+ ws_url = t["webSocketDebuggerUrl"]
|
|
|
+ break
|
|
|
+
|
|
|
+ws = websocket.create_connection(ws_url, timeout=30)
|
|
|
+msg_id = 0
|
|
|
+
|
|
|
+def send_cmd(method, params=None):
|
|
|
+ global msg_id
|
|
|
+ msg_id += 1
|
|
|
+ ws.send(json.dumps({"id": msg_id, "method": method, "params": params or {}}))
|
|
|
+ while True:
|
|
|
+ resp = json.loads(ws.recv())
|
|
|
+ if resp.get("id") == msg_id:
|
|
|
+ return resp.get("result", {})
|
|
|
+
|
|
|
+send_cmd("Page.navigate", {"url": "https://creator.xiaohongshu.com/new/note-manager"})
|
|
|
+time.sleep(5)
|
|
|
+
|
|
|
+# 拦截评论API
|
|
|
+send_cmd("Network.enable")
|
|
|
+
|
|
|
+# 导航到坦白局笔记详情(触发评论API加载)
|
|
|
+# 先尝试直接调评论API
|
|
|
+note_ids = [
|
|
|
+ ("坦白局", "6a82ca500000000025004062"),
|
|
|
+ ("D27教育博主", "6a81a53d000000000600738e"),
|
|
|
+]
|
|
|
+
|
|
|
+all_comments = {}
|
|
|
+for name, nid in note_ids:
|
|
|
+ js = f"""
|
|
|
+ (async function() {{
|
|
|
+ try {{
|
|
|
+ // 尝试多种评论API端点
|
|
|
+ var urls = [
|
|
|
+ '/api/galaxy/creator/note/comment?noteId={nid}&cursor=&num=20',
|
|
|
+ '/api/galaxy/v2/creator/note/comment?noteId={nid}&cursor=&num=20',
|
|
|
+ '/api/galaxy/creator/comment/list?noteId={nid}&cursor=&num=20',
|
|
|
+ '/api/galaxy/creator/note/comments?noteId={nid}&cursor=&num=20'
|
|
|
+ ];
|
|
|
+ var results = [];
|
|
|
+ for (var i = 0; i < urls.length; i++) {{
|
|
|
+ try {{
|
|
|
+ var r = await fetch(urls[i], {{credentials: 'include'}});
|
|
|
+ var text = await r.text();
|
|
|
+ if (text.indexOf('"success":true') >= 0 || text.indexOf('"code":0') >= 0) {{
|
|
|
+ results.push({{url: urls[i], data: text.substring(0, 5000)}});
|
|
|
+ }}
|
|
|
+ }} catch(e) {{}}
|
|
|
+ }}
|
|
|
+ if (results.length === 0) {{
|
|
|
+ // 也试试edith域名
|
|
|
+ var edith_urls = [
|
|
|
+ 'https://edith.xiaohongshu.com/api/sns/web/comment/page?note_id={nid}&cursor=&top_comment_id=&image_formats=jpg,webp,avif&xsec_token=YBieUL8uRjxi1dmXwcv1fHXDs3jL1VSMg8urb7O07P_uc='
|
|
|
+ ];
|
|
|
+ for (var j = 0; j < edith_urls.length; j++) {{
|
|
|
+ try {{
|
|
|
+ var r2 = await fetch(edith_urls[j], {{credentials: 'include'}});
|
|
|
+ var t2 = await r2.text();
|
|
|
+ results.push({{url: edith_urls[j], data: t2.substring(0, 5000)}});
|
|
|
+ }} catch(e) {{}}
|
|
|
+ }}
|
|
|
+ }}
|
|
|
+ return JSON.stringify(results);
|
|
|
+ }} catch(e) {{ return 'ERR:' + e.message; }}
|
|
|
+ }})()
|
|
|
+ """
|
|
|
+ ws.send(json.dumps({"id": 300 + note_ids.index((name, nid)), "method": "Runtime.evaluate", "params": {"expression": js, "returnByValue": True, "awaitPromise": True}}))
|
|
|
+
|
|
|
+for i in range(len(note_ids)):
|
|
|
+ for _ in range(30):
|
|
|
+ resp = json.loads(ws.recv())
|
|
|
+ rid = resp.get("id", 0)
|
|
|
+ if rid >= 300 and rid < 300 + len(note_ids):
|
|
|
+ val = resp.get("result", {}).get("result", {}).get("value", "")
|
|
|
+ name = note_ids[rid - 300][0]
|
|
|
+ with open(rf"C:\code\cfc\运营文案\小红书发布\_process_scripts\comments_{name}.txt", "w", encoding="utf-8") as f:
|
|
|
+ f.write(val)
|
|
|
+ print(f"Saved comments for {name}")
|
|
|
+ break
|
|
|
+
|
|
|
+ws.close()
|