主机论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 87|回复: 5

找gpt写了一个go的后端 来用老马的xAi

[复制链接]

48

主题

588

回帖

1770

积分

金牌会员

Rank: 6Rank: 6

积分
1770
发表于 5 天前 | 显示全部楼层 |阅读模式
150刀自用还是不错的,翻译啥的。
有几个坑,不支持内地、香港的主机,地区不可用,我找了个日本的可以用。




运行后通过post http://服务器地址:8089/ask
body格式
{
  "prompt": "AdGuard 9设备终身价格仅需16刀折合人民币116元"
}


go写的,自行替换key编译一下就能用,端口和细节按需修改。
#main.go 源代码
  1. package main

  2. import (
  3.         "bytes"
  4.         "encoding/json"
  5.         "fmt"
  6.         "io"
  7.         "net/http"
  8.         "time"
  9. )

  10. // xAiRequest 定义请求结构体
  11. type xAiRequest struct {
  12.         Prompt string `json:"prompt"`
  13. }

  14. // xAiResponse 定义简化后的响应结构体
  15. type xAiResponse struct {
  16.         Content string `json:"content"`
  17. }

  18. // Message 定义消息结构体
  19. type Message struct {
  20.         Role    string `json:"role"`
  21.         Content string `json:"content"`
  22. }

  23. // APIRequest 定义API请求结构体
  24. type APIRequest struct {
  25.         Messages []Message `json:"messages"`
  26.         Model    string    `json:"model"`
  27. }

  28. func main() {
  29.         http.HandleFunc("/ask", func(w http.ResponseWriter, r *http.Request) {
  30.                 // 解析请求体
  31.                 var req xAiRequest
  32.                 if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
  33.                         http.Error(w, fmt.Sprintf("解析请求失败: %v", err), http.StatusBadRequest)
  34.                         return
  35.                 }

  36.                 // 调用xAi API
  37.                 xAiResponse, err := callxAiAPI(req.Prompt)
  38.                 if err != nil {
  39.                         http.Error(w, fmt.Sprintf("调用API失败: %v", err), http.StatusInternalServerError)
  40.                         return
  41.                 }

  42.                 // 返回响应
  43.                 w.Header().Set("Content-Type", "application/json")
  44.                 if err := json.NewEncoder(w).Encode(xAiResponse); err != nil {
  45.                         http.Error(w, fmt.Sprintf("编码响应失败: %v", err), http.StatusInternalServerError)
  46.                         return
  47.                 }
  48.         })

  49.         // 启动HTTP服务器
  50.         server := &http.Server{
  51.                 Addr:         ":8089",
  52.                 ReadTimeout:  10 * time.Second,
  53.                 WriteTimeout: 10 * time.Second,
  54.         }
  55.         fmt.Println("服务器正在运行,监听端口 8089...")
  56.         if err := server.ListenAndServe(); err != nil {
  57.                 fmt.Printf("服务器启动失败: %v\n", err)
  58.         }
  59. }

  60. // callxAiAPI 调用xAi API
  61. func callxAiAPI(prompt string) (*xAiResponse, error) {
  62.         url := "https://api.x.ai/v1/chat/completions"

  63.         // 创建请求体
  64.         requestBody, err := json.Marshal(APIRequest{
  65.                 Messages: []Message{
  66.                         {
  67.                                 Role:    "user", // 角色为用户
  68.                                 Content: prompt, // 用户输入的内容
  69.                         },
  70.                 },
  71.                 Model: "grok-2-latest", // 模型名称
  72.         })
  73.         if err != nil {
  74.                 return nil, fmt.Errorf("创建请求体失败: %v", err)
  75.         }

  76.         // 创建HTTP请求
  77.         req, err := http.NewRequest("POST", url, bytes.NewBuffer(requestBody))
  78.         if err != nil {
  79.                 return nil, fmt.Errorf("创建HTTP请求失败: %v", err)
  80.         }

  81.         // 添加Authorization头
  82.         req.Header.Set("Authorization", "Bearer 改成你的key")
  83.         req.Header.Set("Content-Type", "application/json")

  84.         // 发送请求
  85.         client := &http.Client{
  86.                 Timeout: 10 * time.Second, // 设置超时时间
  87.         }
  88.         resp, err := client.Do(req)
  89.         if err != nil {
  90.                 return nil, fmt.Errorf("发送请求失败: %v", err)
  91.         }
  92.         defer resp.Body.Close()

  93.         // 读取响应体
  94.         body, err := io.ReadAll(resp.Body)
  95.         if err != nil {
  96.                 return nil, fmt.Errorf("读取响应体失败: %v", err)
  97.         }
  98.        
  99.         // 打印 HTTP 状态码和响应体
  100.         fmt.Printf("HTTP Status Code: %d\n", resp.StatusCode)
  101.         fmt.Printf("Response Body: %s\n", string(body))

  102.         // 检查响应状态码
  103.         if resp.StatusCode != http.StatusOK {
  104.                 return nil, fmt.Errorf("API请求失败,状态码: %d, 响应: %s", resp.StatusCode, string(body))
  105.         }

  106.         // 解析响应体
  107.         var apiResponse struct {
  108.                 Choices []struct {
  109.                         Message struct {
  110.                                 Content string `json:"content"`
  111.                         } `json:"message"`
  112.                 } `json:"choices"`
  113.         }
  114.         if err := json.Unmarshal(body, &apiResponse); err != nil {
  115.                 return nil, fmt.Errorf("解析响应体失败: %v", err)
  116.         }

  117.         // 提取并返回content字段
  118.         if len(apiResponse.Choices) > 0 {
  119.                 return &xAiResponse{
  120.                         Content: apiResponse.Choices[0].Message.Content,
  121.                 }, nil
  122.         }

  123.         return nil, fmt.Errorf("API响应格式错误,没有找到content")
  124. }
复制代码
回复

使用道具 举报

46

主题

458

回帖

1540

积分

金牌会员

Rank: 6Rank: 6

积分
1540
发表于 5 天前 | 显示全部楼层
有没有可能不知道怎么编译,不知道怎么运行,只知道类似php的放目录里面就行
回复

使用道具 举报

48

主题

588

回帖

1770

积分

金牌会员

Rank: 6Rank: 6

积分
1770
 楼主| 发表于 5 天前 | 显示全部楼层
本帖最后由 我心飞呀飞 于 2025-2-19 13:51 编辑
801N 发表于 2025-2-19 13:42
有没有可能不知道怎么编译,不知道怎么运行,只知道类似php的放目录里面就行 ...


PHP的

代码过不了waf自行复制吧
https://codecopy.cn/post/h0fpoy

解释:
类定义:为了模拟 Go 中的结构体,我们在 PHP 中定义了 XAiRequest, XAiResponse, Message, 和 APIRequest 类。
请求处理:handleRequest 函数处理 POST 请求,解析请求体并调用 xAi API。
调用 xAi API:在 callXAiAPI 函数中,我们使用 file_get_contents 来发送 HTTP 请求并读取响应。请求头包含 Authorization 和 Content-Type。
服务器监听:PHP 在标准 HTTP 服务器环境下(如 php -S 启动)监听指定端口和路径。
运行方法:
将此 PHP 文件保存为 index.php。
启动 PHP 内置服务器:
php -S 0.0.0.0:8089
通过 HTTP POST 请求访问 http://localhost:8089/ask,提交 JSON 请求体。
请确保您的 PHP 环境支持 file_get_contents 和 json_decode,这些是处理请求和响应的关键功能。

如果您有更多需求或修改,随时告诉我!
回复

使用道具 举报

0

主题

659

回帖

1612

积分

金牌会员

Rank: 6Rank: 6

积分
1612
发表于 5 天前 | 显示全部楼层
这么筒单的一个功能, 为啥味不用Python写?几行就行。
看这Go 代码行数就头疼。
回复

使用道具 举报

48

主题

588

回帖

1770

积分

金牌会员

Rank: 6Rank: 6

积分
1770
 楼主| 发表于 5 天前 | 显示全部楼层
pykane 发表于 2025-2-19 14:01
这么筒单的一个功能, 为啥味不用Python写?几行就行。
看这Go 代码行数就头疼。
...

没py环境
回复

使用道具 举报

48

主题

588

回帖

1770

积分

金牌会员

Rank: 6Rank: 6

积分
1770
 楼主| 发表于 5 天前 | 显示全部楼层
再弄个捷径去post中转的接口在ios手机上也能用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|主机论坛

GMT+8, 2025-2-24 07:49 , Processed in 0.057608 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表