因為訂閱的知識星球的信息有點多,而且主要是研報為主,所以用OpenClaw自己每天到上面抓取,看看最新賣方同學們有沒有什么新關注的股票、行業會更加有效。
基于這個需求,我研究了下怎么去用AI抓知識星球內的東西。
主要是知識星球沒有正式的接口,用模擬瀏覽的方式也很耗費流量(關鍵是也有的時候被block),最終找到一個方式,用了一周感覺還可以,做個記錄。
當然不用自己看懂,讓自己的AI看懂就好了。
原理說明
知識星球提供了移動端API(`api.zsxq.com`),可以通過模擬移動端請求獲取數據。核心是:
認證方式:使用Cookie中的`zsxq access token`進行身份驗證
簽名機制:每個請求需要攜帶MD5簽名,防止請求被偽造
API端點:主要使用`/v2/groups`(星球列表)和`/v2/groups/{group_id}/topics`(主題列表)
獲取Cookie
方法:瀏覽器開發者工具
登錄知識星球網頁版:https://wx.zsxq.com
打開瀏覽器開發者工具(F12)
切換到「Network」標簽
刷新頁面,找到任意請求
在請求頭中找到`Cookie`字段,復制完整內容
Cookie關鍵字段
Cookie中最重要的字段是:
`zsxq access token`:身份令牌,格式如`XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX_XXXXXXXXXXXXXXXX`
` c WBKFRo`:設備標識(可選)
Cookie有效期
通常1-3個月有效
過期后需要重新獲取
建議定期檢查,避免數據抓取失敗
簽名算法
知識星球的API簽名算法如下:
import hashlib import time from urllib.parse import urlencode def generate_signature(path,params,secret="zsxqapi2020"): # 1. 構造公共參數 common_params={ "app_version":"3.11.0", "platform":"ios", "timestamp":str(int(time.time()*1000)) } # 2. 合并所有參數 all_params={**common_params,**params} # 3. 按參數名排序并拼接 sorted_params=sorted(all_params.items(),key=lambda x: x[0]) params_str=urlencode(sorted_params) # 4. 構造簽名字符串:path & params & secret sign_str=f"{path}&{params_str}&{secret}" # 5. MD5加密 signature=hashlib.md5(sign_str.encode()).hexdigest() return signature, common_params["timestamp"]簽名字符串示例:
/v2/groups&app_version=3.11.0&count=20&platform=ios×tamp=1713523200000&zsxqapi2020核心API接口
1. 獲取星球列表
GET https://api.zsxq.com/v2/groups?count=50請求頭:
Cookie: {你的Cookie} X-Signature: {簽名} X-Timestamp: {時間戳} User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X)...返回示例:
{ "succeeded":true, "resp_data": { "groups": [ { "group_id":5124251821488, "name":"示例星球名稱", "type":"paid" } ] } }2. 獲取星球主題
GET https://api.zsxq.com/v2/groups/{group_id}/topics?count=20&scope=all參數說明:
`group_id`:星球ID
`count`:返回數量(默認20,最大50)
`scope`:范圍(`all`=全部,`digg`=精華)
3. 獲取主題詳情
GET https://api.zsxq.com/v2/topics/{topic_id}完整代碼示例
import requests import hashlib import time from urllib.parse import urlencode class ZsxqApiSpider: def __init__(self,cookie): self.base_url="https://api.zsxq.com" self.secret="zsxqapi2020" self.cookie=cookie self.headers={ "User-Agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15", "Accept":"application/json", "Cookie":self.cookie, "Origin":"https://wx.zsxq.com", "Referer":"https://wx.zsxq.com/" } def generate_signature(self,path,params=None): common_params={ "app_version":"3.11.0", "platform":"ios", "timestamp":str(int(time.time()*1000)) } all_params={**common_params,**(paramsor{})} sorted_params=sorted(all_params.items(),key=lambda x: x[0]) params_str=urlencode(sorted_params) sign_str=f"{path}&{params_str}&{self.secret}" signature=hashlib.md5(sign_str.encode()).hexdigest() return signature, common_params["timestamp"] def request(self,path,params=None): signature, timestamp=self.generate_signature(path, params) headers=self.headers.copy() headers["X-Signature"]=signature headers["X-Timestamp"]=timestamp url=f"{self.base_url}{path}" response=requests.get(url,headers=headers,params=params,timeout=15) return response.json() def get_groups(self): """獲取我加入的星球列表""" data=self.request("/v2/groups", {"count":50}) if data.get("succeeded"): return data["resp_data"]["groups"] return [] def get_topics(self,group_id,count=20): """獲取星球的最新主題""" data=self.request(f"/v2/groups/{group_id}/topics", {"count": count,"scope":"all"}) if data.get("succeeded"): return data["resp_data"]["topics"] return [] # 使用示例 if __name__=="__main__": # 替換為你的Cookie COOKIE="zsxq_access_token=YOUR_TOKEN_HERE; ..." spider=ZsxqApiSpider(COOKIE) # 獲取星球列表 groups=spider.get_groups() for g in groups: print(f"星球:{g['name']}(ID:{g['group_id']})") # 獲取第一個星球的最新主題 if groups: topics=spider.get_topics(groups[0]["group_id"]) for t in topics: print(f"主題:{t.get('title','無標題')}")定時任務配置
1. 創建日程任務
使用`calendar_create`工具創建每日定時任務:
# 在主對話中調用 calendar_create( summary="知識星球每日簡報", description="通過知識星球API獲取最新內容,分析持倉相關信息。執行命令:python3 ~/zsxq_spider/final_crawler.py", dtstart="20260419080000",# 每天早上8點執行 rrule={"freq":"DAILY","interval":1}, time_range={ "earliest_schedule_time":"20260419070000", "latest_schedule_time":"20260419090000" } )2. 任務執行流程
每日觸發 → 執行爬蟲腳本 → 解析數據 → 生成簡報 → 推送到主對話常見問題
Q1: Cookie過期怎么辦?
現象:API返回`{"succeeded": false, "code": 1001}`
解決:
重新登錄網頁版
獲取新的Cookie
更新腳本中的COOKIE變量
Q2: 請求頻率限制
現象:API返回`{"code": 1059}`
解決:
添加請求間隔:`time.sleep(1)`
減少單次請求數量
實現重試機制
Q3: 內容提取不完整
原因:主題內容存儲在不同字段中
解決:按優先級提取
def extract_content(topic): # 1. talk.text(短文/評論) if topic.get('talk', {}).get('text'): return topic['talk']['text'] # 2. article.article_content(長文) if topic.get('article', {}).get('article_content'): return topic['article']['article_content'] # 3. files(附件) if topic.get('files'): return f"[附件]{topic['files'][0].get('name')}" return ""數據存儲建議
目錄結構
/app/data/所有對話/主對話/zsxq_data/ ├── daily_20260419.json # 每日原始數據 ├── files/ # 下載的文件 │ ├── 研報_20260419.pdf │ └── 音頻_20260419.mp3 └── brief_20260419.md # 每日簡報數據格式
{ "示例星球名稱": [ { "topic_id":88442514812884, "title":"示例主題標題", "content":"示例內容...", "create_time":"2026-04-19T08:30:00.000+0800" } ] }安全提示
Cookie安全:不要將包含Cookie的代碼上傳到公開倉庫
請求頻率:避免高頻請求,尊重平臺規則
數據使用:獲取的數據僅供個人學習研究使用
本教程僅供技術學習交流,請遵守知識星球用戶協議。
![]()
作者:坦桑尼亞老云 | 編輯:栗加
每個視角都是拼湊世界真相的碎片,聽真誠的行業觀察者講述獨特的故事。
我們有深耕行業的資深顧問,連續跨界探索的未來創業者,專注細節的產品匠人,和許多志同道合的你們,如果你有想要分享的故事或者感想,可以留言或者郵件聯系(AiysJY@outlook.com)。
,也歡迎點分享給需要的朋友們,記得點一下在看和星標,期待共同在這個行業的宏大敘事中,留下一句詩。:)
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.