<cite id="ffb66"></cite><cite id="ffb66"><track id="ffb66"></track></cite>
      <legend id="ffb66"><li id="ffb66"></li></legend>
      色婷婷久,激情色播,久久久无码专区,亚洲中文字幕av,国产成人A片,av无码免费,精品久久国产,99视频精品3
      網(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—— 二維碼過期,自動(dòng)刷新(最多 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)前用戶可讀寫)。下次啟動(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ù)端會(huì) 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í)是正?,F(xiàn)象,直接返回空響應(yīng)讓調(diào)用方繼續(xù)下一輪即可。

      3)sendMessage:

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

      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 });

      // 滑動(dòng)窗口,防止上下文過長
      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è)用戶的對話歷史。通過滑動(dòng)窗口來控制上下文長度,避免 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

      三步啟動(dòng)

      # 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. 啟動(dòng)
      npm run dev

      首次啟動(dòng)會(huì)在終端顯示二維碼,微信掃碼后在手機(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)存中,重啟會(huì)丟失,可以接 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),如果覺得寫得不錯(cuò),可以給個(gè)點(diǎn)贊和關(guān)注支持一下哦~

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

      特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(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)推薦
      淪為共享單車的女色虎

      淪為共享單車的女色虎

      深度報(bào)
      2026-03-05 22:39:27
      宗馥莉就地解散公司,震驚行業(yè)!

      宗馥莉就地解散公司,震驚行業(yè)!

      財(cái)經(jīng)三分鐘pro
      2026-03-03 11:20:05
      鄭麗文來京時(shí)間確定,馬英九拒絕通話,大陸發(fā)出統(tǒng)一后安排

      鄭麗文來京時(shí)間確定,馬英九拒絕通話,大陸發(fā)出統(tǒng)一后安排

      李橑在北漂
      2026-03-27 11:17:44
      歐洲人在性方面有多開放?德國再創(chuàng)歷史!女廁所、女浴室隨便進(jìn)了

      歐洲人在性方面有多開放?德國再創(chuàng)歷史!女廁所、女浴室隨便進(jìn)了

      西樓知趣雜談
      2026-03-24 14:38:30
      戰(zhàn)爭已到臨界點(diǎn)!以色列下達(dá)決戰(zhàn)書:48小時(shí)定生死,立刻啟用核彈

      戰(zhàn)爭已到臨界點(diǎn)!以色列下達(dá)決戰(zhàn)書:48小時(shí)定生死,立刻啟用核彈

      夢史
      2026-03-28 12:31:05
      別被“某音”前凸后翹的網(wǎng)紅騙了

      別被“某音”前凸后翹的網(wǎng)紅騙了

      健身S叔
      2026-03-22 11:12:04
      悲??!新星進(jìn)國乒半年就退役,看不慣關(guān)系戶,飯圈影響大患抑郁癥

      悲?。⌒滦沁M(jìn)國乒半年就退役,看不慣關(guān)系戶,飯圈影響大患抑郁癥

      八斗小先生
      2026-03-27 18:22:28
      洪秀柱:大陸加臺(tái)灣才是一個(gè)完整的中國!

      洪秀柱:大陸加臺(tái)灣才是一個(gè)完整的中國!

      看看新聞Knews
      2026-03-28 21:11:07
      東西部的頂峰相見的預(yù)演之一?

      東西部的頂峰相見的預(yù)演之一?

      靜易墨
      2026-03-28 21:01:34
      當(dāng)“整容臉”混進(jìn)央視年代劇,碰上天然臉演員,簡直是降維打擊!

      當(dāng)“整容臉”混進(jìn)央視年代劇,碰上天然臉演員,簡直是降維打擊!

      嘴角上翹的弧度
      2026-03-24 01:01:55
      云南省發(fā)展和改革委員會(huì)享受一級調(diào)研員待遇退休干部許建平接受審查調(diào)查

      云南省發(fā)展和改革委員會(huì)享受一級調(diào)研員待遇退休干部許建平接受審查調(diào)查

      界面新聞
      2026-03-28 15:06:35
      特朗普稱霍爾木茲為特朗普海峽

      特朗普稱霍爾木茲為特朗普海峽

      界面新聞
      2026-03-28 09:36:19
      香港這批終身不婚不育的女星已經(jīng)老了,她們晚年真的孤獨(dú)凄慘嗎?

      香港這批終身不婚不育的女星已經(jīng)老了,她們晚年真的孤獨(dú)凄慘嗎?

      八卦寶寶
      2026-03-17 11:08:51
      我國每天增加1萬癌癥患者,罪魁禍?zhǔn)资乔嗖耍?種青菜別再多吃

      我國每天增加1萬癌癥患者,罪魁禍?zhǔn)资乔嗖耍?種青菜別再多吃

      今日養(yǎng)生之道
      2026-03-27 17:56:29
      張雪峰追悼會(huì)再度被看哭!現(xiàn)場人山人海,萬束鮮花,凌晨三點(diǎn)奔赴

      張雪峰追悼會(huì)再度被看哭!現(xiàn)場人山人海,萬束鮮花,凌晨三點(diǎn)奔赴

      裕豐娛間說
      2026-03-28 08:03:03
      大廠高薪外派員工的困境:工作20年,賺了近2000萬,媳婦提離婚

      大廠高薪外派員工的困境:工作20年,賺了近2000萬,媳婦提離婚

      螞蟻大喇叭
      2026-03-27 17:40:21
      伊朗開辟曼德海峽新戰(zhàn)線,分析:或進(jìn)一步重創(chuàng)全球經(jīng)濟(jì),以色列面臨更多困難

      伊朗開辟曼德海峽新戰(zhàn)線,分析:或進(jìn)一步重創(chuàng)全球經(jīng)濟(jì),以色列面臨更多困難

      紅星新聞
      2026-03-28 17:45:18
      41歲張雪峰離世,搶救細(xì)節(jié)曝光,曾有3次活命機(jī)會(huì),全被耽誤了!

      41歲張雪峰離世,搶救細(xì)節(jié)曝光,曾有3次活命機(jī)會(huì),全被耽誤了!

      可愛小菜
      2026-03-25 22:25:55
      F1日本:安東內(nèi)利連奪桿位,維斯塔潘沖5連冠已絕望,勒克萊爾第4

      F1日本:安東內(nèi)利連奪桿位,維斯塔潘沖5連冠已絕望,勒克萊爾第4

      體育妞世界
      2026-03-28 17:19:35
      從世界第十到世界第一!西班牙這三年太猛了,德拉富恩特真神人

      從世界第十到世界第一!西班牙這三年太猛了,德拉富恩特真神人

      仰臥撐FTUer
      2026-03-28 20:16:09
      2026-03-28 21:51:00
      程序員魚皮 incentive-icons
      程序員魚皮
      一手科技資訊和編程干貨
      76文章數(shù) 76關(guān)注度
      往期回顧 全部

      科技要聞

      華為盤古大模型負(fù)責(zé)人王云鶴確認(rèn)離職

      頭條要聞

      女子被指擁有"3個(gè)身份證號" 當(dāng)?shù)囟嗖块T回應(yīng)

      頭條要聞

      女子被指擁有"3個(gè)身份證號" 當(dāng)?shù)囟嗖块T回應(yīng)

      體育要聞

      “我是全家最差勁的運(yùn)動(dòng)員”

      娛樂要聞

      陳牧馳陳冰官宣得子 曬一家三口握拳照

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

      臥底"科技與狠活"培訓(xùn):化工調(diào)味劑泛濫

      汽車要聞

      置換補(bǔ)貼價(jià)4.28萬起 第五代宏光MINIEV正式上市

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

      家居
      房產(chǎn)
      本地
      游戲
      教育

      家居要聞

      曲線華爾茲 現(xiàn)代簡約

      房產(chǎn)要聞

      首日430組來訪,單日120組認(rèn)籌!??谑讉€(gè)真四代,徹底爆了!

      本地新聞

      在濰坊待了三天,沒遇到一個(gè)“濰坊人”

      悲報(bào)!《FF9》重制版慘遭擱置:遙遙無期了

      教育要聞

      教育縱深 | 讓健康成為校園“底色”

      無障礙瀏覽 進(jìn)入關(guān)懷版