可以使用go搭建一个api后端,用于转发chatgpt的结果,但同时也可以在该后端新建一个路由用于设置webhook
实际上,我的这个项目就是

部署在paas平台,自带https

main

这是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的通信。

handlePost

提取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)
    }
}

CreateTgbot

这个函数来源于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)
    }
}

InvokeChatGPTAPI

使用了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
}

目前我已经成功部署了,并且微信公众号和tg都可以正常返回结果,更多细节内容还在完善中,源码可以查看:Gobot-vio