3 分鐘利用 FastGPT 和 Laf 將 ChatGPT 接入企業微信

原文鏈接:https://forum.laf.run/d/556

FastGPT 是一個超級🐮🍺的 ChatGPT 平臺項目,功能非常強大:

✅ 集成了 ChatGPT、GPT4 和 Claude

✅ 可以使用任意文本來訓練自己的知識庫、文檔庫,而且知識庫專有模型可以限定爲“只能回答知識庫相關問題,其他問題一律不予回答”

✅ 開放模型市場,其中有一個非常暴躁的模型叫暴躁小哥😄

✅ 提供 API,你可以通過 API 的形式接入到自己的應用中,例如:飛書、企業微信、客服助手、公衆號等
✅ 可自定義 OpenAI API Key

🌐鏈接:https://fastgpt.run/?inviterId=64215e9914d068bf840141d0

而 Laf 是一款爲所有開發者打造的集函數、數據庫、存儲爲一體的雲開發平臺,助你像寫博客一樣寫代碼,隨時隨地發佈上線應用!3 分鐘上線 ChatGPT 應用!

🏠官網(國內):https://laf.run

🌎官網(海外):https://laf.dev

這篇文章教你用兩分半的時間,利用 FastGPT 和 Laf 將 ChatGPT 接入企業微信。

條件

  1. 你需要有企業微信管理權限
  2. 你需要一個 FastGPT賬號
  3. 你需要一個Laf(國區)賬號

企業微信需要使用已經備案的域名,所以這裏需要用國區的域名。點擊這裏可以參考企業微信詳細說明

FastGPT操作

  1. 前往“AI助手”頁面,創建一個AI助手,並記錄這裏的modelId(用FASTGPT_MODEL_ID表示)

  1. 前往“開發”頁面,創建一個API KEY,記錄這裏的API KEY 爲 FASTGPT_APIKEY

企業微信操作

  1. 進入企業微信管理後臺-我的企業,記錄這裏的企業ID爲 WXWORK_CORPID

  1. 進入應用管理頁面,點擊【創建應用】進入創建頁面,填寫應用信息後點擊【創建應用】。如果已經有現成的應用,可以跳過此步驟。

  1. 在應用管理頁面點擊剛剛創建好的應用,進入應用詳情頁面。記錄這裏的AgentId和Secret(需要點擊獲取按鈕,在企業微信聊天窗口裏面獲取),分別爲WXWORK_AGENTID和WXWORK_CORPSECRET。

  1. 在應用詳情頁面,接收消息處點擊【設置API接收】。

在API接收消息頁面,點一下兩個【隨機獲取】按鈕,它會自動生成一個Token和EncodingAESKey,我們分別記爲WXWORK_TOKEN和WXWORK_AESKEY。注意,不要關掉這個頁面,Laf側配置完畢後我們再來填寫URL。

Laf 操作

  1. 進入Laf控制檯,新建一個應用。

  1. 進入開發頁面,先安裝兩個npm依賴:
  • xml2js
  • @wecom/crypto

  1. 創建一個雲函數 chatgpt(不可改名),取消所有請求方法,填寫下面的代碼併發布。
import cloud from '@lafjs/cloud'

export async function sendGptMessage(message) {
  console.log('send gpt message', message)
  const res = await cloud.fetch({
    url: 'https://fastgpt.run/api/openapi/chat/chat',
    method: 'POST',
    headers: {
      apikey: process.env.FASTGPT_APIKEY
    },
    data: {
      "modelId": process.env.FASTGPT_MODEL_ID,
      "isStream": false,
      "prompts": [
        {
          "obj": "Human",
          "value": message
        },
      ]
    }
  })
  console.log('send gpt message result', res?.data)
  return res.data?.data
}
  1. 創建一個雲函數 wxwork(不可改名),取消所有請求方法,填寫下面的代碼併發布。
import cloud from '@lafjs/cloud'

export async function getToken() {
  const cache = cloud.shared.get('access-token')
  console.log('checking cache', cache, cache.expires >= Date.now())
  if (cache && cache.expires >= Date.now()) return cache.token;
  console.log('start to get token of', process.env.WXWORK_CORPID)

  const res = await cloud.fetch({
    url: 'https://qyapi.weixin.qq.com/cgi-bin/gettoken',
    method: 'get',
    params: {
      corpid: process.env.WXWORK_CORPID,
      corpsecret: process.env.WXWORK_CORPSECRET,
    }
  })
  const token = res.data.access_token
  cloud.shared.set('access-token', { token, expires: Date.now() + res.data.expires_in * 1000 })
  return token
}

export async function sendMessage(message, user) {
  console.log('send messagge', user, message)
  const res = await cloud.fetch({
    url: 'https://qyapi.weixin.qq.com/cgi-bin/message/send',
    method: 'POST',
    params: {
      access_token: await getToken()
    },
    data: {
      "touser": user,
      "msgtype": "text",
      "agentid": process.env.WXWORK_AGENTID,
      "text": {
        "content": message
      },
      "safe": 0,
      "enable_id_trans": 0,
      "enable_duplicate_check": 0,
      "duplicate_check_interval": 1800
    }
  })
  console.log('send message result', res.data)
}
  1. 創建一個雲函數wxwork-gpt-api (隨便改名),開放GET和POST請求,填寫下面的代碼併發布。
import cloud from '@lafjs/cloud'
import { decrypt, getSignature } from '@wecom/crypto';
import { sendMessage } from '@/wxwork'
import { sendGptMessage } from '@/chatgpt'
import xml2js from 'xml2js';

export default async function (ctx: FunctionContext) {
  const { query } = ctx;
  const { msg_signature, timestamp, nonce, echostr } = query;
  const token = process.env.WXWORK_TOKEN;
  const key = process.env.WXWORK_AESKEY;
  console.log('start to invoke wxwork-gpt-api')

  // 簽名驗證專用
  if (ctx.method === 'GET') {
    const signature = getSignature(token, timestamp, nonce, echostr);
    if (signature !== msg_signature) {
      return { message: '簽名驗證失敗', code: 401 }
    }
    const { message } = decrypt(key, echostr);
    return message
  }

  const payload = ctx.body.xml;
  const encrypt = payload.encrypt[0];
  const signature = getSignature(token, timestamp, nonce, encrypt);
  if (signature !== msg_signature) {
    return { message: '簽名驗證失敗', code: 401 }
  }
  //ctx.response.sendStatus(200);
  const { message } = decrypt(key, encrypt);
  const {
    xml
  } = await xml2js.parseStringPromise(message)
  // 由於GPT API耗時較久,這裏提前返回,防止企業微信超時重試,後續再手動調用發消息接口
  ctx.response.sendStatus(200);
  await asyncSendMessage(xml)
  return { message: true, code: 0 }
}


async function asyncSendMessage(xml) {
  if (xml.MsgType[0] !== 'text') return;
  sendMessage('AI思考中, 請耐心等待~~', xml.FromUserName[0])
  try {
    const result = await sendGptMessage(xml.Content[0])
    await sendMessage(result, xml.FromUserName[0])
  } 
  catch (e){
    console.log(e, e.config)
    sendMessage('接口請求失敗,請聯繫管理員查看錯誤信息', xml.FromUserName[0])
  }
}
  1. 點擊左下角設置,選擇環境變量,將剛剛收集的WXWORK_TOKEN、WXWORK_AESKEY、WXWORK_CORPID、WXWORK_AGENTID、WXWORK_CORPSECRET、FASTGPT_APIKEY、FASTGPT_MODEL_ID 填入,並點擊更新按鈕。

  1. 複製 wxwork-gpt-api 這個雲函數的調用地址,將它填寫到企業微信管理後臺【API接收消息】頁面中的URL中,並保存上述信息。

  1. 在企業微信中,進入你剛剛創建的應用,就可以跟機器人愉快的聊天了~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章