ChatGPT API + Cloudflare Worker 實現免費免VPN Telegram Bot的代碼研究: TBXark’s repo

前兩天搞了Cloudflare Worker+ VLESS 翻牆代理,靈機一動,這個Cloudflare Worker的serverless function能不能作爲ChatGPT的API轉接呢?那就不需要自己用主機來運行Python實現ChatGPT的Telegram Bot了。原來網上已有大神開源了他的Repo:TBXark/ChatGPT-Telegram-Workers: Deploy your own Telegram ChatGPT bot on Cloudflare Workers with ease. (github.com) 因爲涉及到OpenAI的付費API,研究一下是不能懶的。

TBXark的代碼寫得很完整,體驗很好,Documentation詳細,簡直是模範。部署方式有兩種,我選擇的是直接在Cloudflare worker上部署,所以直接看 /dist/index.js (本地部署可以用/src裏面的)

index.js裏面的代碼用 // src/xxx.js 的方式分段了,把每一段餵給ChatGPT:

context.js 是做什麼的?

這段代碼似乎定義了一個名為 Context 的 JavaScript 類,該類用於管理聊天上下文的相關信息和初始化。讓我逐步解釋每個部分的含義:

var Context = class {
  // 用戶配置
  USER_CONFIG = {
    // ... 用戶配置項 ...
  };
  USER_DEFINE = {
    // ... 用戶自定義角色 ...
  };
  // 當前聊天上下文
  CURRENT_CHAT_CONTEXT = {
    // ... 當前聊天信息 ...
  };
  // 共享上下文
  SHARE_CONTEXT = {
    // ... 共享上下文信息 ...
  };

  // ... 其他方法 ...

};

這個類的定義中包含了四個對象屬性:USER_CONFIG 用於存儲用戶配置,USER_DEFINE 用於存儲用戶自定義角色,CURRENT_CHAT_CONTEXT 用於存儲當前聊天上下文信息,SHARE_CONTEXT 用於存儲共享上下文信息。每個對象屬性都包含了相應的配置項。

在這個類中還定義了一些方法,用於初始化和管理聊天上下文:

  • _initChatContext(chatId, replyToMessageId): 用於初始化當前聊天上下文,包括聊天ID和回覆的消息ID等信息。
  • _initUserConfig(storeKey): 異步方法,用於初始化用戶配置信息,從數據庫中讀取存儲的用戶配置並應用到 USER_CONFIGUSER_DEFINE 對象中。
  • _initUserDefine(userDefine): 初始化用戶自定義角色,將用戶自定義的角色信息應用到 USER_DEFINE 對象中。
  • initTelegramContext(request): 初始化 Telegram 上下文,從請求中解析出當前的 Telegram Bot 信息並存儲在 SHARE_CONTEXT 中。
  • _initShareContext(message): 異步方法,根據收到的消息初始化共享上下文信息,包括聊天歷史、配置存儲鍵等。
  • initContext(message): 異步方法,用於初始化整個聊天上下文,調用上述的方法來初始化各個上下文信息。
  • openAIKeyFromContext(): 從上下文中獲取 OpenAI API 密鑰,優先使用用戶配置中的密鑰,然後是環境變量中的密鑰。

這個類的作用似乎是為了統一管理聊天機器人應用的上下文信息,包括用戶配置、聊天信息等,並提供方法來初始化和獲取這些信息。它可能在聊天機器人的應用邏輯中起到了重要的作用。

telegram.js是做什麼的?

這段代碼看起來是一個名為 telegram.js 的模塊,其中包含了一系列與 Telegram API 交互的函數。這些函數用於發送消息、操作群組、獲取聊天角色等。

以下是這些函數的功能和解釋:

  • sendMessage(message, token, context): 用於發送消息到 Telegram,包括消息文本、上下文信息和 Token。根據消息長度自動切分較長的消息為多條消息。
  • sendMessageToTelegramWithContext(context): 返回一個函數,該函數用於通過上下文發送消息到 Telegram。
  • deleteMessageFromTelegramWithContext(context): 返回一個函數,該函數用於通過上下文刪除 Telegram 中的消息。
  • sendPhotoToTelegram(url, token, context): 用於發送照片到 Telegram,包括照片 URL、上下文信息和 Token。
  • sendPhotoToTelegramWithContext(context): 返回一個函數,該函數用於通過上下文發送照片到 Telegram。
  • sendChatActionToTelegram(action, token, chatId): 用於發送聊天動作到 Telegram,比如 “typing” 表示正在輸入。
  • sendChatActionToTelegramWithContext(context): 返回一個函數,該函數用於通過上下文發送聊天動作到 Telegram。
  • bindTelegramWebHook(token, url): 用於綁定 Telegram 的 Webhook,以便接收來自 Telegram 的消息通知。
  • getChatRole(id, groupAdminKey, chatId, token): 獲取用戶在群組中的角色,比如管理員、成員等。
  • getChatRoleWithContext(context): 返回一個函數,該函數用於通過上下文獲取用戶在群組中的角色。
  • getChatAdminister(chatId, token): 獲取群組的管理員列表。
  • getBot(token): 獲取機器人的信息,包括名稱、用戶名和權限等。

這些函數似乎是用於封裝 Telegram API 的操作,以便在聊天機器人應用中更方便地發送消息、操作群組等。它們可能被用於應用的消息處理邏輯中。

gpt3.js是做什麼的?

這段代碼似乎是一個名為 gpt3.js 的模塊,其中包含了用於處理 GPT-3 編碼的一些函數。

以下是這些函數的功能和解釋:

  • resourceLoader(key, url): 用於加載資源,首先嘗試從數據庫中獲取資源,如果不存在則從指定 URL 獲取資源並存儲到數據庫中。
  • gpt3TokensCounter(): 創建一個函數用於計算文本中的 GPT-3 tokens 數量。它從指定的 GitHub 倉庫獲取編碼器和詞匯表,然後根據一定規則計算 tokens 數量。
  • bytes_to_unicode(): 返回字節與 Unicode 字符的映射關系。
  • get_pairs(word): 獲取詞匯的字符對。
  • bpe(token): 使用字節對編碼(byte pair encoding)算法對 token 進行編碼。
  • tokenCount(text): 計算文本中的 GPT-3 tokens 數量。

這些函數似乎是為了計算文本的 GPT-3 tokens 數量而設計的,使用了字節對編碼算法對文本進行編碼,然後統計編碼後的 tokens 數量。這可能在使用 GPT-3 模型時用於計算 API 請求中的 token 數量,以便控制 API 使用量。

utils.js是做什麼的?

這段代碼是一個名為 utils.js 的模塊,其中包含了一些常用的實用函數。

以下是這些函數的功能和解釋:

  • randomString(length): 生成指定長度的隨機字符串,包含數字和大小寫字母。
  • historyPassword(): 獲取歷史記錄密碼,如果密碼不存在,則生成一個新的密碼並存儲。
  • renderHTML(body): 將傳入的內容包裝成一個簡單的 HTML 頁面。
  • errorToString(e): 將錯誤對象轉換成字符串,包括錯誤消息和堆棧信息。
  • mergeConfig(config, key, value, types): 將給定的配置項與值合並到配置對象中,根據配置項類型進行適當的轉換。
  • tokensCounter(): 創建一個函數用於計算文本中的 tokens 數量,根據配置選擇使用普通字符計數或 GPT-3 tokens 計數。
  • makeResponse200(resp): 將傳入的響應對象轉換成一個具有 200 狀態碼的響應,如果響應為 null,則返回一個帶有 “NOT HANDLED” 內容的 200 響應。

這些函數看起來是用於處理不同的實用邏輯,例如生成隨機字符串、操作密碼、處理錯誤、計算 tokens 數量等。它們可能在應用的不同部分用於不同的功能。

openai.js是做什麼的?

這段代碼是一個名為 openai.js 的模塊,其中包含了與 OpenAI API 進行交互的函數。這些函數用於從 OpenAI 請求文本生成和其他任務。

以下是這些函數的功能和解釋:

  • extractContentFromStreamData(stream): 從事件流數據中提取內容,用於處理從 OpenAI 獲取的流式響應。
  • requestCompletionsFromOpenAI(message, history, context, onStream): 請求文本生成完成的結果,可以選擇使用流式響應。根據傳入的消息、歷史記錄和上下文信息向 OpenAI 發送請求。
  • requestImageFromOpenAI(prompt, context): 請求生成圖片,根據提示從 OpenAI 獲取生成的圖像 URL。
  • requestBill(context): 請求 OpenAI 的計費信息,獲取訂閱費用和用量等信息。
  • requestCompletionsFromChatGPT(text, context, modifier, onStream): 請求 ChatGPT 的文本生成結果,可以選擇使用流式響應。在生成文本之前,可以使用 modifier 函數來修改歷史記錄和文本。
  • updateBotUsage(usage, context): 更新機器人使用情況統計,將 tokens 使用情況記錄到數據庫中。
  • loadHistory(key, context): 加載歷史記錄,根據給定的鍵和上下文加載歷史記錄。可以進行歷史記錄的修剪和截斷操作,以保持歷史記錄的最大長度和 tokens 數量。

這些函數主要用於與 OpenAI 進行通信,請求生成文本和圖像,並處理響應。它們在應用中用於實現與 OpenAI 相關的功能。

chat.js是做什麼的?

這段代碼是一個名為 chat.js 的模塊,其中包含了與用戶聊天和 OpenAI 進行交互的函數。這些函數用於處理用戶的聊天消息,並通過調用 OpenAI 相關函數來生成回覆。

以下是這些函數的功能和解釋:

  • chatWithOpenAI(text, context, modifier): 與用戶聊天並通過 OpenAI 生成回覆。該函數首先嘗試向 Telegram 發送“正在輸入”的狀態,然後根據聊天上下文和選項準備好適當的參數。如果啟用了流式響應,它會在文本生成過程中通過事件流向 Telegram 發送消息。接著,它調用 requestCompletionsFromChatGPT 函數來請求 ChatGPT 生成回覆。最後,它處理生成的回覆並根據情況設置回覆按鈕。如果出現錯誤,它會將錯誤消息發送給用戶。

這些函數主要用於處理與用戶的實時聊天,調用 OpenAI 函數生成回覆,並將回覆發送給 Telegram。它們在應用中用於實現用戶與機器人之間的交互。

command.js是做什麼的?

這段代碼是一個名為 command.js 的模塊,它包含了處理 Telegram 命令和權限的函數。這些函數用於解析和執行用戶發送的命令,同時進行權限檢查和處理。以下是這些函數的功能和解釋:

  • commandAuthCheck: 這是一個對象,其中包含了不同命令需要的權限檢查函數。根據聊天類型和配置來確定用戶是否有執行特定命令的權限。
  • commandSortList: 包含了命令的排序列表,用於定義命令的顯示順序。
  • commandHandlers: 這是一個對象,包含了每個命令的處理函數、所需權限等信息。每個命令都對應一個處理函數,它將解析命令參數並執行相應的操作。

這些函數主要用於處理 Telegram 用戶發送的命令,包括生成幫助信息、創建新的聊天上下文、生成圖片、查看用量統計等操作。它們與聊天功能一起為用戶提供了更多的交互方式。

message.js是做什麼的?

這段代碼是一個名為 message.js 的模塊,它包含了處理Telegram消息的一系列函數。這些函數用於初始化聊天上下文、處理消息內容、執行命令、與OpenAI進行聊天等操作。以下是這些函數的功能和解釋:

  • msgInitChatContext(message, context): 初始化聊天上下文。根據收到的消息初始化聊天上下文,包括生成 chat_idreply_to_message_id(針對群組消息)以及 SHARE_CONTEXT
  • msgSaveLastMessage(message, context): 保存最後一條消息。在調試模式下,將最後一條消息保存到數據庫,以便跟蹤和調試。
  • msgIgnoreOldMessage(message, context): 忽略舊消息。在安全模式下,檢查是否已處理過相同的消息,如果是則忽略。
  • msgCheckEnvIsReady(message, context): 檢查環境是否準備好。檢查OpenAI API密鑰和數據庫是否已設置。
  • msgFilterWhiteList(message, context): 過濾白名單。根據聊天類型和設置,確定用戶是否有權限使用機器人。
  • msgFilterNonTextMessage(message, context): 過濾非文本消息。如果收到的消息不包含文本內容,則進行過濾。
  • msgHandleGroupMessage(message, context): 處理群組消息。檢查是否提及了機器人,並執行相應的操作。
  • msgHandleCommand(message, context): 處理命令。調用命令處理函數,解析並執行用戶發送的命令。
  • msgHandleRole(message, context): 處理角色。如果消息以波浪符號開頭(例如 ~role),則根據角色配置更新用戶配置。
  • msgChatWithOpenAI(message, context): 與OpenAI聊天。將用戶發送的文本消息傳遞給OpenAI進行處理,獲取回覆並返回給用戶。
  • msgProcessByChatType(message, context): 根據聊天類型處理消息。根據不同的聊天類型,選擇對應的處理函數進行進一步處理。
  • loadMessage(request, context): 加載消息。從收到的請求中加載消息內容,並進行一些預處理。
  • handleMessage(request): 處理消息。根據處理流程依次執行上述各個處理函數,對收到的消息進行處理並生成回覆。

這些函數協同工作,負責處理從Telegram收到的消息,根據不同情況進行適當的操作和回覆。

router.js是做什麼的?

這段代碼是一個名為 router.js 的模塊,它定義了路由處理和一些輔助函數。以下是這些函數的功能和解釋:

  • buildKeyNotFoundHTML(key): 構建環境變量未設置的錯誤消息的 HTML 片段。用於生成環境變量未設置的提示信息。
  • bindWebHookAction(request): 綁定 Webhook 操作。根據配置的可用 Telegram 令牌,綁定 Webhook 並顯示綁定結果。
  • loadChatHistory(request): 加載聊天歷史記錄。根據請求中的密碼和歷史記錄鍵,加載聊天歷史記錄並以 HTML 格式返回。
  • telegramWebhook(request): 處理 Telegram Webhook 請求。調用處理消息的函數,並將處理結果以 200 狀態碼返回。
  • telegramSafeHook(request): 安全的 Telegram Webhook 處理。如果啟用了 API 保護,則將請求轉發到正常的 Telegram Webhook 處理。
  • defaultIndexAction(): 默認首頁操作。顯示關於項目和綁定 Webhook 的信息,以及一些其他配置和命令。
  • gpt3TokenTest(request): 測試 GPT-3 令牌。根據請求中的文本,計算文本的令牌數量並顯示。
  • loadBotInfo(): 加載機器人信息。顯示關於機器人環境和配置的信息。
  • handleRequest(request): 處理請求。根據請求的路徑,調用適當的函數進行處理,並返回響應。

這些函數一起組成了路由處理邏輯,根據不同的請求路徑執行相應的操作,並生成相應的 HTML 響應。它們在處理 Telegram Webhook、綁定 Webhook、顯示信息等方面起到了關鍵作用。

https://chat.openai.com/share/002daac5-1faa-401b-8143-a9fe6215d7d3

歡迎你的留言討論:

你可以一針見血

by Upsangel
Logo