<tr id="tp1vn"><td id="tp1vn"><dl id="tp1vn"></dl></td></tr>
  1. <p id="tp1vn"></p>
  2. <sub id="tp1vn"><p id="tp1vn"></p></sub>
    <u id="tp1vn"><rp id="tp1vn"></rp></u>
    <meter id="tp1vn"></meter>
      <wbr id="tp1vn"><sup id="tp1vn"></sup></wbr>
      日韩第一页浮力,欧美a在线,中文字幕无码乱码人妻系列蜜桃 ,国产成人精品三级麻豆,国产男女爽爽爽免费视频,中文字幕国产精品av,两个人日本www免费版,国产v精品成人免费视频71pao
      網(wǎng)易首頁 > 網(wǎng)易號 > 正文 申請入駐

      扒了下微信接 OpenClaw 的源碼,我做出了自己的機(jī)器人~

      0
      分享至


      ?前言

      就在前天,微信官方終于推出了小龍蝦接入微信的插件「微信 ClawBot」:


      那作為一個(gè)程序員,我就想了,微信能把小龍蝦接進(jìn)來,那不就能把滿足協(xié)議要求的任何機(jī)器人接進(jìn)來了么?二開一個(gè)官方支持的微信機(jī)器人不再是夢想!


      這篇文章就來講一下怎么根據(jù)微信官方支持的渠道,實(shí)現(xiàn)一個(gè)自己高度自定義的機(jī)器人,而不是局限于小龍蝦這個(gè)框架。

      背景

      根據(jù)官方的插件接入指南可以看到,微信機(jī)器人主要是靠一個(gè)叫@tencent-weixin/openclaw-weixin-cli的 npm 包:


      那我們來到這個(gè)包在 npm 上的對應(yīng)頁面 https://www.npmjs.com/package/@tencent-weixin/openclaw-weixin-cli,可以看到有非常清晰的說明:

      從介紹里我們也能看到,這個(gè)包只是一個(gè)安裝程序,并沒有程序的實(shí)際內(nèi)容,實(shí)際的邏輯都在@tencent/openclaw-weixin里:


      所以我們需要找到這個(gè)包對應(yīng)的 npm 頁面 https://www.npmjs.com/package/@tencent-weixin/openclaw-weixin,核心的內(nèi)容就是下圖中的這段話:


      就是說,想把自己的程序接入到微信機(jī)器人里,只需要實(shí)現(xiàn)這5個(gè) Http 接口就好了。

      接口

      路徑

      作用

      getUpdates

      ilink/bot/getupdates

      長輪詢拉取新消息

      sendMessage

      ilink/bot/sendmessage

      發(fā)送消息給用戶

      getUploadUrl

      ilink/bot/getuploadurl

      獲取媒體文件上傳地址

      getConfig

      ilink/bot/getconfig

      獲取賬號配置

      sendTyping

      ilink/bot/sendtyping

      發(fā)送「正在輸入」?fàn)顟B(tài)

      文檔的旁邊還有源碼,這也是我們二開的重要參考:


      ? 整體架構(gòu)

      理清楚上面的背景之后,我們要做的這個(gè)項(xiàng)目的數(shù)據(jù)流向就非常清晰了:收消息 → 問 AI → 發(fā)回復(fù)。


      核心實(shí)現(xiàn) 一、掃碼登錄

      掃碼登錄是整個(gè)流程的第一步。微信的登錄協(xié)議是一個(gè)典型的「生成二維碼 → 輪詢狀態(tài) → 獲取 Token」流程:


      首先通過get_bot_qrcode接口拿到二維碼:

      async function fetchQRCode(): Promise {
      const url = `${BASE_URL}/ilink/bot/get_bot_qrcode?bot_type=${BOT_TYPE}`;
      const res = await fetch(url);
      if (!res.ok) throw new Error(`獲取二維碼失敗: ${res.status}`);
      return (await res.json()) as QRCodeResponse;
      }

      這里參考的是插件源碼中的src/auth/login-qr.ts文件:


      然后用qrcode-terminal把二維碼渲染到終端里,用微信掃碼即可:


      掃碼后,通過長輪詢get_qrcode_status接口來追蹤狀態(tài)變化。這里的狀態(tài)機(jī)有四種狀態(tài):

      • wait—— 等待掃碼,繼續(xù)輪詢

      • scaned—— 用戶已掃碼,等待手機(jī)確認(rèn)

      • expired—— 二維碼過期,自動刷新(最多 3 次)

      • confirmed—— 用戶確認(rèn),返回bot_tokenilink_bot_id

      case "confirmed": {
      if (!status.bot_token || !status.ilink_bot_id) {
      thrownewError("登錄確認(rèn)但未返回 token 或 bot_id");
      }
      const creds: LoginCredentials = {
      token: status.bot_token,
      baseUrl: status.baseurl || BASE_URL,
      accountId: status.ilink_bot_id,
      userId: status.ilink_user_id,
      };
      saveCredentials(creds);
      console.log(`[auth] ? 登錄成功! accountId=${creds.accountId}`);
      return creds;
      }

      拿到憑證后保存到data/credentials.json,文件權(quán)限設(shè)為0o600(僅當(dāng)前用戶可讀寫)。下次啟動時(shí)如果憑證還在,就跳過掃碼直接復(fù)用。

      我們只需要點(diǎn)擊連接,就登錄成功可以對話啦:


      二、微信 API 層

      和微信通信的核心就是 HTTP POST,但有幾個(gè)協(xié)議細(xì)節(jié)需要注意。

      1)每個(gè)請求都需要攜帶特定的 Header:

      function buildHeaders(token?: string): Record {
      const headers: Record = {
      "Content-Type": "application/json",
      AuthorizationType: "ilink_bot_token",
      "X-WECHAT-UIN": randomWechatUin(),
      };
      if (token) {
      headers.Authorization = `Bearer ${token}`;
      }
      return headers;
      }

      X-WECHAT-UIN是一個(gè)隨機(jī)的 uint32 經(jīng)過 base64 編碼,每次請求都重新生成。AuthorizationType固定為ilink_bot_token

      2)getUpdates 長輪詢:

      這是整個(gè)機(jī)器人的「耳朵」。它通過一個(gè)游標(biāo)get_updates_buf實(shí)現(xiàn)增量同步,服務(wù)端會 hold 住請求直到有新消息或者超時(shí)(默認(rèn) 35 秒):

      export asyncfunction getUpdates(
      baseUrl: string,
      token: string,
      buf: string,
      timeoutMs = DEFAULT_LONG_POLL_TIMEOUT_MS,
      ): Promise {
      try {
      returnawait apiPost (
      baseUrl,
      "ilink/bot/getupdates",
      { get_updates_buf: buf },
      token,
      timeoutMs,
      );
      } catch (err) {
      if (err instanceofError && err.name === "AbortError") {
      return { ret: 0, msgs: [], get_updates_buf: buf };
      }
      throw err;
      }
      }

      注意這里對AbortError(超時(shí))的處理——長輪詢超時(shí)是正常現(xiàn)象,直接返回空響應(yīng)讓調(diào)用方繼續(xù)下一輪即可。

      3)sendMessage:

      發(fā)消息需要構(gòu)造一個(gè)符合微信協(xié)議的WeixinMessage結(jié)構(gòu),里面的關(guān)鍵字段是context_token,這是微信用來標(biāo)識會話上下文的令牌,必須從收到的消息里提取出來回傳:

      await apiPost(
      baseUrl,
      "ilink/bot/sendmessage",
      {
      msg: {
      from_user_id: "",
      to_user_id: to,
      client_id: clientId,
      message_type: MessageType.BOT,
      message_state: MessageState.FINISH,
      item_list: [{ type: MessageItemType.TEXT, text_item: { text } }],
      context_token: contextToken,
      },
      },
      token,
      );
      三、AI 對話層

      AI 層使用 OpenAI SDK,但通過baseURL參數(shù)實(shí)現(xiàn)了對任意兼容接口的支持。所以不管你用 GPT、DeepSeek 還是智譜 GLM,改個(gè)環(huán)境變量就行。

      核心設(shè)計(jì)是按用戶維度維護(hù)獨(dú)立的對話上下文

      export class AIChat {
      private sessions = new Map();

      async chat(userId: string, userMessage: string): Promise {
      const session = this.getSession(userId);
      session.history.push({ role: "user", content: userMessage });

      // 滑動窗口,防止上下文過長
      if (session.history.length > this.maxHistory) {
      session.history = session.history.slice(-this.maxHistory);
      }

      const messages: ChatCompletionMessageParam[] = [
      { role: "system", content: this.systemPrompt },
      ...session.history,
      ];

      const completion = awaitthis.client.chat.completions.create({
      model: this.model,
      messages,
      });

      const reply = completion.choices[0]?.message?.content || "(AI 未返回內(nèi)容)";
      session.history.push({ role: "assistant", content: reply });
      return reply;
      }
      }

      每個(gè)微信用戶 ID 對應(yīng)一個(gè)ChatSession,里面存著這個(gè)用戶的對話歷史。通過滑動窗口來控制上下文長度,避免 token 超限。

      用戶可以發(fā)送/clear指令來清空對話上下文,重新開始。

      四、Bot 主循環(huán)

      最后就是把所有模塊串起來的 Bot 主循環(huán)。它的核心就是一個(gè)while循環(huán):

      while (this.running) {
      try {
      const resp = await getUpdates(
      this.credentials.baseUrl,
      this.credentials.token,
      this.getUpdatesBuf,
      );

      // 更新游標(biāo)
      if (resp.get_updates_buf) {
      this.getUpdatesBuf = resp.get_updates_buf;
      }

      // 處理每條消息
      for (const msg of resp.msgs ?? []) {
      awaitthis.handleMessage(msg);
      }
      } catch (err) {
      // 重試 + 退避策略
      }
      }

      消息處理的邏輯:

      1. 過濾非用戶消息,只處理message_type === USER的消息

      2. 緩存context_token

      3. 提取文本內(nèi)容

      4. 通過sendMessage發(fā)回去

      處理失敗還有重試策略:連續(xù)失敗不超過 5 次時(shí),每次等 2 秒后重試;超過 5 次則退避 30 秒,避免頻繁請求被限流。

      使用方式 環(huán)境要求

      • Node.js >= 22

      三步啟動

      # 1. 克隆并安裝
      git clone https://github.com/user/wx-robot-ilink.git
      cd wx-robot-ilink
      npm install

      # 2. 配置 AI 模型
      cp .env.example .env
      # 編輯 .env 填入你的 API Key

      # 3. 啟動
      npm run dev

      首次啟動會在終端顯示二維碼,微信掃碼后在手機(jī)確認(rèn),就能開始使用了。

      結(jié)語

      以上就是wx-robot-ilink的完整實(shí)現(xiàn)啦。回顧一下,整個(gè)項(xiàng)目做了這幾件事:

      1. @tencent-weixin/openclaw-weixin源碼里提取了微信 iLink HTTP API 協(xié)議

      2. 實(shí)現(xiàn)了掃碼登錄方案是 QR 狀態(tài)機(jī) + 憑證持久化

      3. 實(shí)現(xiàn)了長輪詢收消息 + 發(fā)消息的通信層

      4. 接入 OpenAI 兼容 AI 模型,支持多輪對話

      5. 用一個(gè) while 循環(huán)把所有東西串起來

      整體不到 300 行 TypeScript,沒有任何重型框架依賴,就實(shí)現(xiàn)了一個(gè)微信 AI 機(jī)器人。

      當(dāng)然,目前這個(gè)版本還是比較基礎(chǔ)的,后續(xù)可以擴(kuò)展的方向有很多:

      • 圖片/語音支持 —— 協(xié)議本身支持 IMAGE、VOICE、VIDEO、FILE 類型,可以實(shí)現(xiàn)多模態(tài)對話

      • 持久化對話歷史 —— 目前對話在內(nèi)存中,重啟會丟失,可以接 SQLite 或 Redis

      • 定時(shí)消息 —— 結(jié)合 cron 實(shí)現(xiàn)早報(bào)、天氣推送等

      更多功能還是要等微信官方支持~

      項(xiàng)目已開源:https://github.com/co-pine/wx-robot-ilink,歡迎大家 Star、Fork、提 Issue!

      這篇文章是我們編程導(dǎo)航團(tuán)隊(duì)「松柏」同學(xué)的實(shí)戰(zhàn),如果覺得寫得不錯,可以給個(gè)點(diǎn)贊和關(guān)注支持一下哦~

      有問題歡迎在評論區(qū)交流,下期再見!

      特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。

      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.

      相關(guān)推薦
      熱點(diǎn)推薦
      美國名記:湖人并沒有期待東契奇在次輪復(fù)出,湖人陣容不會改變

      美國名記:湖人并沒有期待東契奇在次輪復(fù)出,湖人陣容不會改變

      愛體育
      2026-05-07 22:38:41
      G1輸球驚動馬刺老祖!波波維奇親自出手,G2砍戈貝爾戰(zhàn)術(shù)上線!

      G1輸球驚動馬刺老祖!波波維奇親自出手,G2砍戈貝爾戰(zhàn)術(shù)上線!

      田先生籃球
      2026-05-07 09:23:56
      《低智商犯罪》被觀眾要求下架!理由:主演招人煩、演技尷尬

      《低智商犯罪》被觀眾要求下架!理由:主演招人煩、演技尷尬

      笑談歷史阿晡
      2026-05-06 22:24:38
      2比0!一只腳踏進(jìn)東決!NBA季后賽最強(qiáng)進(jìn)攻

      2比0!一只腳踏進(jìn)東決!NBA季后賽最強(qiáng)進(jìn)攻

      籃球教學(xué)論壇
      2026-05-07 10:49:06
      心酸!5月B級車也開始大降價(jià),最大降幅48%,合資車成“白菜價(jià)”

      心酸!5月B級車也開始大降價(jià),最大降幅48%,合資車成“白菜價(jià)”

      芭比衣櫥
      2026-05-07 01:50:58
      打什么電話比12345更管用?這些電話比它管用100倍,建議收藏好

      打什么電話比12345更管用?這些電話比它管用100倍,建議收藏好

      細(xì)說職場
      2026-04-28 10:39:02
      【U17女足亞洲杯】三連勝零失球!中國隊(duì)6比0泰國隊(duì)

      【U17女足亞洲杯】三連勝零失球!中國隊(duì)6比0泰國隊(duì)

      體壇周報(bào)
      2026-05-07 21:35:34
      打進(jìn)14球的凱恩出局,姆巴佩基本鎖定本賽季歐冠金靴

      打進(jìn)14球的凱恩出局,姆巴佩基本鎖定本賽季歐冠金靴

      懂球帝
      2026-05-07 05:07:34
      突然暴漲 7 萬!服務(wù)器 CPU 徹底缺貨,這3家公司將成最大贏家!

      突然暴漲 7 萬!服務(wù)器 CPU 徹底缺貨,這3家公司將成最大贏家!

      我不叫阿哏
      2026-05-07 01:36:26
      檔期資訊| S1的懸念新人即將登場?

      檔期資訊| S1的懸念新人即將登場?

      孤獨(dú)的獨(dú)角獸影視
      2026-05-07 09:15:13
      路由器快不行了?這四個(gè)信號別忽視

      路由器快不行了?這四個(gè)信號別忽視

      像素與芯片
      2026-05-07 01:00:54
      俄烏戰(zhàn)爭以來曝俄軍首次大規(guī)模敗退!烏克蘭炸毀俄后勤大橋

      俄烏戰(zhàn)爭以來曝俄軍首次大規(guī)模敗退!烏克蘭炸毀俄后勤大橋

      項(xiàng)鵬飛
      2026-05-05 19:02:50
      鄭智剛被官宣禁賽6場!西海岸就敲定代理主帥人選,值得期待

      鄭智剛被官宣禁賽6場!西海岸就敲定代理主帥人選,值得期待

      二爺臺球解說
      2026-05-07 15:37:20
      中國商務(wù)部首動阻斷禁令,114國拒絕簽字,魯比奧氣急放狠話

      中國商務(wù)部首動阻斷禁令,114國拒絕簽字,魯比奧氣急放狠話

      瀲滟晴方DAY
      2026-05-08 00:19:42
      國家喊你“存肌肉”了!這5個(gè)跡象說明肌肉在流失,第3個(gè)太常見

      國家喊你“存肌肉”了!這5個(gè)跡象說明肌肉在流失,第3個(gè)太常見

      人民日報(bào)健康客戶端
      2026-05-06 20:14:23
      對話“洪迪厄斯”號郵輪乘客:“我頭天下船,漢坦病毒陽性乘客第二天登船”

      對話“洪迪厄斯”號郵輪乘客:“我頭天下船,漢坦病毒陽性乘客第二天登船”

      紅星新聞
      2026-05-07 19:26:32
      王海稱胖東來套取國家補(bǔ)貼資金,情節(jié)嚴(yán)重負(fù)責(zé)人可承擔(dān)刑事責(zé)任

      王海稱胖東來套取國家補(bǔ)貼資金,情節(jié)嚴(yán)重負(fù)責(zé)人可承擔(dān)刑事責(zé)任

      映射生活的身影
      2026-05-06 23:38:17
      美國從德國撤軍超5000人,波蘭總統(tǒng):波蘭可接收這批撤軍

      美國從德國撤軍超5000人,波蘭總統(tǒng):波蘭可接收這批撤軍

      澎湃新聞
      2026-05-07 16:02:26
      柬埔寨封城抓4000中國人,電詐清零風(fēng)暴真的來了?

      柬埔寨封城抓4000中國人,電詐清零風(fēng)暴真的來了?

      老特有話說
      2026-05-07 18:23:07
      孩子脫臼復(fù)位只收100元,家長舉報(bào)亂收費(fèi)!衛(wèi)健委:應(yīng)收110元,你還少給了!家長拒繳費(fèi)后離開!

      孩子脫臼復(fù)位只收100元,家長舉報(bào)亂收費(fèi)!衛(wèi)健委:應(yīng)收110元,你還少給了!家長拒繳費(fèi)后離開!

      醫(yī)脈圈
      2026-04-25 20:04:06
      2026-05-08 02:35:00
      程序員魚皮 incentive-icons
      程序員魚皮
      一手科技資訊和編程干貨
      114文章數(shù) 101關(guān)注度
      往期回顧 全部

      科技要聞

      月之暗面完成20億美元融資,估值突破200億

      頭條要聞

      日媒詢問中國是否希望恢復(fù)中日之間人員往來 中方回應(yīng)

      頭條要聞

      日媒詢問中國是否希望恢復(fù)中日之間人員往來 中方回應(yīng)

      體育要聞

      巴黎再進(jìn)歐冠決賽,最尷尬的情況還是發(fā)生了

      娛樂要聞

      Lisa主持!寧藝卓觀看脫衣秀風(fēng)波升級

      財(cái)經(jīng)要聞

      人均年薪406萬,這家ST公司驚呆市場!

      汽車要聞

      雷克薩斯全新純電三排SUV 全新TZ全球首發(fā)

      態(tài)度原創(chuàng)

      健康
      時(shí)尚
      本地
      教育
      軍事航空

      干細(xì)胞治燒燙傷面臨這些“瓶頸”

      今年最火的4雙平底鞋,配小黑裙好看又氣質(zhì)!

      本地新聞

      用青花瓷的方式,打開西溪濕地

      教育要聞

      二模很重要!2026臨沂二模、青島二模語文、數(shù)學(xué)試題及答案!

      軍事要聞

      特朗普:美伊"很可能"達(dá)成協(xié)議

      無障礙瀏覽 進(jìn)入關(guān)懷版 主站蜘蛛池模板: 国产中年熟女大集合| 一级片一区| 日本视频高清一道一区| 97久久精品人人澡人人爽| 国产精品国产AV片国产| 一区二区三区不卡在线观看| 99久久精品国产一区二区蜜芽| 天堂网av一区二区三区| 欧美综合网| 亚洲综合网国产精品一区 | 精品无码人妻一区二区三区不卡| 国产无人区码一区二区| V一区无码内射国产| 五月婷婷丁香色| 国产成人亚洲精品青草天美| 99中文在线精品| 91超碰在线| 亚洲欧美香港在线观看三级片| 黑人特级欧美aaaaaa片| 麻豆人妻| 小嫩批日出水无码视频免费| av中文资源在线资源免费观看| 国产精品亚洲专区无码web| 亚洲最大无码中文字幕| 亚洲天堂视频网| 日韩精品福利一区二区三区| 亚洲国产第六| 日本熟妇人妻xxxxx-欢迎您 | 久久国产自拍一区二区三区| 辽阳县| 亚洲成AV人无码综合在线| 久久久久无码国产精品不卡| 久久中文字幕av不卡一区二区 | 99精品视频免费观看| 欧美日韩亚洲中文字幕二区| 人人爽人人爽人人片a| 亚洲东京色一区二区三区| 乱人伦视频中文字幕| 一本色道久久综合无码人妻| 老头老太性行交视频| 欧美日韩国产成人在线观看|