全球主机交流论坛备用站

 找回密码
 立即注册

QQ登录

只需一步,快速开始

全球云38元起免备案V2EX搬瓦工VPS
SEO查询超级PING网站测速
Virmach特价鸡乌云漏洞吾爱破解
查看: 118|回复: 5

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

[复制链接]

50

主题

605

回帖

1822

积分

金牌会员

Rank: 6Rank: 6

积分
1822
发表于 2025-2-19 12:27:24 | 显示全部楼层 |阅读模式
20230417
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. // 打印 HTTP 状态码和响应体
  99. fmt.Printf("HTTP Status Code: %d\n", resp.StatusCode)
  100. fmt.Printf("Response Body: %s\n", string(body))

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

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

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

  122. return nil, fmt.Errorf("API响应格式错误,没有找到content")
  123. }
复制代码
MJJ,你的签名掉了~~~
回复

使用道具 举报

46

主题

444

回帖

1484

积分

金牌会员

Rank: 6Rank: 6

积分
1484
发表于 2025-2-19 13:42:30 | 显示全部楼层
有没有可能不知道怎么编译,不知道怎么运行,只知道类似php的放目录里面就行
MJJ,你的签名掉了~~~
回复 支持 反对

使用道具 举报

50

主题

605

回帖

1822

积分

金牌会员

Rank: 6Rank: 6

积分
1822
 楼主| 发表于 2025-2-19 13:49:36 | 显示全部楼层
本帖最后由 我心飞呀飞 于 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,这些是处理请求和响应的关键功能。

如果您有更多需求或修改,随时告诉我!
MJJ,你的签名掉了~~~
回复 支持 反对

使用道具 举报

0

主题

982

回帖

2366

积分

金牌会员

Rank: 6Rank: 6

积分
2366
发表于 2025-2-19 13:42:00 | 显示全部楼层
这么筒单的一个功能, 为啥味不用Python写?几行就行。
看这Go 代码行数就头疼。
MJJ,你的签名掉了~~~
回复 支持 反对

使用道具 举报

50

主题

605

回帖

1822

积分

金牌会员

Rank: 6Rank: 6

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

没py环境
MJJ,你的签名掉了~~~
回复 支持 反对

使用道具 举报

50

主题

605

回帖

1822

积分

金牌会员

Rank: 6Rank: 6

积分
1822
 楼主| 发表于 2025-2-19 14:01:44 | 显示全部楼层
再弄个捷径去post中转的接口在ios手机上也能用
MJJ,你的签名掉了~~~
回复 支持 反对

使用道具 举报

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

本版积分规则

展开

QQ|Archiver|手机版|小黑屋|全球主机交流论坛备用站

GMT+8, 2025-5-3 16:42 , Processed in 0.046150 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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