可以使用go搭建一个api后端,用于转发chatgpt的结果,但同时也可以在该后端新建一个路由用于设置webhook
实际上,我的这个项目就是
这是23/12月完成的,tgbotapi要使用v5,有很多结构体和函数都有变化,注意后续的tgbot官方的更新。
接下来说明一下实现过程,直接上main函数的代码:
func main() {
var port = os.Getenv("PORT")
// 设置 /post 路径的 HTTP 处理函数
http.HandleFunc("/post", handlePost)
// 启动 Web 服务器监听 port 端口
go func() {
err := http.ListenAndServe(":"+port, nil)
if err != nil {
log.Println("Error starting HTTP server:", err)
}
log.Println("HTTP server is running on port", port)
}()
//创建一个tgbot
tgbot.CreateTgbot()
}
其中定义了两个函数,handlePost和CreateTgbot。
前者处理post请求,后者用于设置一个webhook,进而进行tgbot的通信。
提取post中的msg字符串,调用chatgpt api,返回响应回答。
我使用了postform的方式发送post请求,故我再此使用了表单结构。
func handlePost(w http.ResponseWriter, r *http.Request) {
if r.Method == http.MethodPost {
// 获取表单数据
err := r.ParseForm()
if err != nil {
http.Error(w, "Error parsing form data", http.StatusInternalServerError)
return
}
// 读取请求体
postmsg := r.Form.Get("usermsg")
if postmsg != "" {
log.Println("POST request,the usersmg:", postmsg)
} else {
http.Error(w, "Error:Don`t find the key:usersmg in the POST", http.StatusBadRequest)
}
// 调用ChatGPT API
gptResponse, err := chatgpt.InvokeChatGPTAPI(postmsg)
if err != nil {
log.Printf("Error calling ChatGPT API: %v", err)
gptResponse = "gpt调用失败了 错误信息:\n" + err.Error()
}
fmt.Fprintln(w, gptResponse)
} else {
http.Error(w, "Error: wrong HTTP method:"+r.Method+",required POST.", http.StatusMethodNotAllowed)
}
}
这个函数来源于tgbot关于go的库的官方示例,我对其进行了必要的修改。
在设置webhook的过程中,不要设置监听端口,因为外层的main函数中已经在监听port
端口了,这里只需要监听webhook就好了
func CreateTgbot() {
// 初始化bot
bot, err := tgbotapi.NewBotAPI(BOT_TOKEN)
if err != nil {
log.Fatal(err)
}
bot.Debug = true
log.Printf("Authorized on account %s", bot.Self.UserName)
//创建webhook,指向你的URL
wh, _ := tgbotapi.NewWebhook(TG_WEBHOOK_URL + bot.Token)
_, err = bot.Request(wh)
if err != nil {
log.Fatal(err)
}
//输出webhook信息,判断是否建立成功
info, err := bot.GetWebhookInfo()
if err != nil {
log.Fatal(err)
}
if info.LastErrorDate != 0 {
log.Printf("Telegram callback failed: %s", info.LastErrorMessage)
}
// 监听webhook是否有更新,更新存放到updates中
// 此处的/tgbot/,是为了和URL匹配,URL:https://your-website/tgbot/
updates := bot.ListenForWebhook("/tgbot/" + bot.Token)
// 对监听到的updates遍历,并作出回应
for update := range updates {
log.Printf("get the message:%v", update.Message)
if update.Message == nil {
continue
}
//回复信息,定义你自己的消息处理函数
HandleIncomingMessage(bot, update.Message)
}
}
使用了go-openai库,注意设置自己的必要变量,如:chatGPTAPIKey等
func InvokeChatGPTAPI(text string) (string, error) {
config := openai.DefaultConfig(chatGPTAPIKey)
config.BaseURL = chatGPTURL_broker
client := openai.NewClientWithConfig(config)
resp, err := client.CreateChatCompletion(
context.Background(),
openai.ChatCompletionRequest{
Model: openai.GPT3Dot5Turbo,
Messages: []openai.ChatCompletionMessage{
{
Role: openai.ChatMessageRoleUser,
Content: text,
},
},
},
)
if err != nil {
return "", err
}
return resp.Choices[0].Message.Content, err
}