178 lines
3.8 KiB
Go
178 lines
3.8 KiB
Go
|
package lib
|
|||
|
|
|||
|
import (
|
|||
|
"bytes"
|
|||
|
"crypto/md5"
|
|||
|
"encoding/hex"
|
|||
|
"encoding/json"
|
|||
|
"fmt"
|
|||
|
"html"
|
|||
|
"io"
|
|||
|
"io/ioutil"
|
|||
|
"log"
|
|||
|
"net/http"
|
|||
|
"net/url"
|
|||
|
"os/exec"
|
|||
|
"regexp"
|
|||
|
"runtime"
|
|||
|
"strings"
|
|||
|
)
|
|||
|
|
|||
|
// 打开浏览器
|
|||
|
func Open(url string) error {
|
|||
|
var (
|
|||
|
cmd string
|
|||
|
args []string
|
|||
|
)
|
|||
|
|
|||
|
switch runtime.GOOS {
|
|||
|
case "windows":
|
|||
|
cmd, args = "cmd", []string{"/c", "start"}
|
|||
|
case "darwin":
|
|||
|
cmd = "open"
|
|||
|
default:
|
|||
|
// "linux", "freebsd", "openbsd", "netbsd"
|
|||
|
cmd = "xdg-open"
|
|||
|
}
|
|||
|
args = append(args, url)
|
|||
|
return exec.Command(cmd, args...).Start()
|
|||
|
}
|
|||
|
|
|||
|
// 发送http post请求数据为form
|
|||
|
func PostForm(url string, data url.Values) (string, error) {
|
|||
|
resp, err := http.PostForm(url, data)
|
|||
|
if err != nil {
|
|||
|
return "", err
|
|||
|
}
|
|||
|
defer resp.Body.Close()
|
|||
|
content, err := ioutil.ReadAll(resp.Body)
|
|||
|
if err != nil {
|
|||
|
return "", err
|
|||
|
}
|
|||
|
return string(content), nil
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
*
|
|||
|
去除html标签,过滤html标签
|
|||
|
*/
|
|||
|
func TrimHtml(src string) string {
|
|||
|
// 使用正则表达式删除HTML标签
|
|||
|
re := regexp.MustCompile(`(?m)<[^>]+>`)
|
|||
|
withoutTags := re.ReplaceAllString(src, "")
|
|||
|
|
|||
|
// 解码HTML实体,并去除左右的空格
|
|||
|
return strings.TrimSpace(html.UnescapeString(withoutTags))
|
|||
|
}
|
|||
|
|
|||
|
// md5加密
|
|||
|
func Md5(src string) string {
|
|||
|
m := md5.New()
|
|||
|
m.Write([]byte(src))
|
|||
|
res := hex.EncodeToString(m.Sum(nil))
|
|||
|
return res
|
|||
|
}
|
|||
|
func WriteToEnvFile(data map[string]string, filePath string) error {
|
|||
|
// 读取原始文件内容
|
|||
|
content, err := ioutil.ReadFile(filePath)
|
|||
|
if err != nil {
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
lines := strings.Split(string(content), "\n")
|
|||
|
updatedLines := make([]string, 0)
|
|||
|
|
|||
|
// 遍历每一行
|
|||
|
for _, line := range lines {
|
|||
|
if len(line) > 0 {
|
|||
|
parts := strings.SplitN(line, "=", 2)
|
|||
|
key := strings.TrimSpace(parts[0])
|
|||
|
|
|||
|
// 检查是否需要更新的键
|
|||
|
if value, exists := data[key]; exists {
|
|||
|
line = fmt.Sprintf("%s=%s", key, value)
|
|||
|
delete(data, key) // 从待更新数据中删除已更新的键
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
updatedLines = append(updatedLines, line)
|
|||
|
}
|
|||
|
|
|||
|
// 追加未更新的键值对
|
|||
|
for key, value := range data {
|
|||
|
updatedLines = append(updatedLines, fmt.Sprintf("%s=%s", key, value))
|
|||
|
}
|
|||
|
|
|||
|
// 将更新后的内容写回文件
|
|||
|
err = ioutil.WriteFile(filePath, []byte(strings.Join(updatedLines, "\n")), 0644)
|
|||
|
if err != nil {
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
return nil
|
|||
|
}
|
|||
|
func ContainsAny(str string, substrs []string) bool {
|
|||
|
for _, substr := range substrs {
|
|||
|
if strings.Contains(str, substr) {
|
|||
|
return true
|
|||
|
}
|
|||
|
}
|
|||
|
return false
|
|||
|
}
|
|||
|
|
|||
|
func AskGPT(apiBase, apiKey, apiModel, visitorId, question string) (string, error) {
|
|||
|
|
|||
|
apiBase = strings.TrimRight(apiBase, "/")
|
|||
|
apiBase = strings.TrimRight(apiBase, "/v1")
|
|||
|
apiBase = apiBase + "/v1"
|
|||
|
|
|||
|
if apiModel == "" {
|
|||
|
apiModel = "gpt-3.5-turbo-16k"
|
|||
|
}
|
|||
|
url := apiBase + "/chat/completions"
|
|||
|
data := map[string]interface{}{
|
|||
|
"model": apiModel,
|
|||
|
}
|
|||
|
if strings.Contains(apiKey, "fastgpt-") || strings.Contains(apiKey, "gofly-") {
|
|||
|
data["chatId"] = visitorId
|
|||
|
}
|
|||
|
data["messages"] = []map[string]interface{}{
|
|||
|
{
|
|||
|
"role": "user",
|
|||
|
"content": question,
|
|||
|
},
|
|||
|
}
|
|||
|
|
|||
|
jsonData, err := json.Marshal(data)
|
|||
|
if err != nil {
|
|||
|
log.Println("Error marshaling JSON:", err)
|
|||
|
return "", err
|
|||
|
}
|
|||
|
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
|
|||
|
if err != nil {
|
|||
|
log.Println("Error creating request:", err)
|
|||
|
return "", err
|
|||
|
}
|
|||
|
req.Header.Set("Content-Type", "application/json")
|
|||
|
req.Header.Set("Authorization", "Bearer "+apiKey)
|
|||
|
client := &http.Client{}
|
|||
|
resp, err := client.Do(req)
|
|||
|
|
|||
|
if err != nil || resp.StatusCode != 200 {
|
|||
|
log.Println("Error making request:", err)
|
|||
|
return "", err
|
|||
|
}
|
|||
|
|
|||
|
// 在处理 API 响应的部分
|
|||
|
defer resp.Body.Close()
|
|||
|
body, err := io.ReadAll(resp.Body)
|
|||
|
if err != nil {
|
|||
|
log.Println("Error reading response body:", err)
|
|||
|
return "", err
|
|||
|
}
|
|||
|
|
|||
|
// 现在,body 包含了 API 响应的 JSON 数据,你可以对其进行处理
|
|||
|
return string(body), nil
|
|||
|
|
|||
|
}
|