Skip to content

Commit b015333

Browse files
committed
增加可配置文件
1 parent 0dc428f commit b015333

File tree

8 files changed

+173
-45
lines changed

8 files changed

+173
-45
lines changed

bootstrap/bootstrap.go

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package bootstrap
22

33
import (
4-
"fmt"
54
"github.com/869413421/wechatbot/handlers"
65
"github.com/eatmoreapple/openwechat"
6+
"log"
77
)
88

9+
10+
911
func Run() {
1012
//bot := openwechat.DefaultBot()
1113
bot := openwechat.DefaultBot(openwechat.Desktop) // 桌面模式,上面登录不上的可以尝试切换这种模式
@@ -15,34 +17,16 @@ func Run() {
1517
// 注册登陆二维码回调
1618
bot.UUIDCallback = openwechat.PrintlnQrcodeUrl
1719

18-
// 登陆
1920
// 创建热存储容器对象
2021
reloadStorage := openwechat.NewJsonFileHotReloadStorage("storage.json")
2122
// 执行热登录
2223
err := bot.HotLogin(reloadStorage)
2324
if err != nil {
2425
if err = bot.Login(); err != nil {
25-
fmt.Println(err)
26+
log.Printf("login error: %v \n", err)
2627
return
2728
}
2829
}
29-
30-
31-
// 获取登陆的用户
32-
self, err := bot.GetCurrentUser()
33-
if err != nil {
34-
fmt.Println(err)
35-
return
36-
}
37-
38-
// 获取所有的好友
39-
friends, err := self.Friends()
40-
fmt.Println(friends, err)
41-
42-
// 获取所有的群组
43-
groups, err := self.Groups()
44-
fmt.Println(groups, err)
45-
4630
// 阻塞主goroutine, 直到发生异常或者用户主动退出
4731
bot.Block()
4832
}

config.dev.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"api_key": "your api key",
3+
"auto_pass": true
4+
}

config/config.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package config
2+
3+
import (
4+
"encoding/json"
5+
"log"
6+
"os"
7+
"sync"
8+
)
9+
10+
// Configuration 项目配置
11+
type Configuration struct {
12+
// gtp apikey
13+
ApiKey string `json:"api_key"`
14+
// 自动通过好友
15+
AutoPass bool `json:"auto_pass"`
16+
}
17+
18+
var config *Configuration
19+
var once sync.Once
20+
21+
// LoadConfig 加载配置
22+
func LoadConfig() *Configuration {
23+
once.Do(func() {
24+
// 从文件中读取
25+
config = &Configuration{}
26+
f, err := os.Open("config.json")
27+
if err != nil {
28+
log.Fatalf("open config err: %v", err)
29+
return
30+
}
31+
defer f.Close()
32+
encoder := json.NewDecoder(f)
33+
err = encoder.Decode(config)
34+
if err != nil {
35+
log.Fatalf("decode config err: %v", err)
36+
return
37+
}
38+
39+
// 如果环境变量有配置,读取环境变量
40+
ApiKey := os.Getenv("ApiKey")
41+
AutoPass := os.Getenv("AutoPass")
42+
if ApiKey != "" {
43+
config.ApiKey = ApiKey
44+
}
45+
if AutoPass == "true" {
46+
config.AutoPass = true
47+
}
48+
})
49+
return config
50+
}

gtp/gtp.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@ package gtp
33
import (
44
"bytes"
55
"encoding/json"
6+
"github.com/869413421/wechatbot/config"
67
"io/ioutil"
78
"log"
89
"net/http"
910
)
1011

12+
const BASEURL = "https://api.openai.com/v1/"
13+
1114
// ChatGPTResponseBody 请求体
1215
type ChatGPTResponseBody struct {
1316
ID string `json:"id"`
@@ -18,6 +21,9 @@ type ChatGPTResponseBody struct {
1821
Usage map[string]interface{} `json:"usage"`
1922
}
2023

24+
type ChoiceItem struct {
25+
}
26+
2127
// ChatGPTRequestBody 响应体
2228
type ChatGPTRequestBody struct {
2329
Model string `json:"model"`
@@ -29,11 +35,11 @@ type ChatGPTRequestBody struct {
2935
PresencePenalty int `json:"presence_penalty"`
3036
}
3137

38+
// Completions gtp文本模型回复
3239
//curl https://api.openai.com/v1/completions
3340
//-H "Content-Type: application/json"
3441
//-H "Authorization: Bearer your chatGPT key"
3542
//-d '{"model": "text-davinci-003", "prompt": "give me good song", "temperature": 0, "max_tokens": 7}'
36-
// Completions gtp文本模型回复
3743
func Completions(msg string) (string, error) {
3844
requestBody := ChatGPTRequestBody{
3945
Model: "text-davinci-003",
@@ -47,18 +53,17 @@ func Completions(msg string) (string, error) {
4753
requestData, err := json.Marshal(requestBody)
4854

4955
if err != nil {
50-
log.Println(err)
5156
return "", err
5257
}
5358
log.Printf("request gtp json string : %v", string(requestData))
54-
req, err := http.NewRequest("POST", "https://api.openai.com/v1/completions", bytes.NewBuffer(requestData))
59+
req, err := http.NewRequest("POST", BASEURL+"completions", bytes.NewBuffer(requestData))
5560
if err != nil {
56-
log.Println(err)
5761
return "", err
5862
}
5963

64+
apiKey := config.LoadConfig().ApiKey
6065
req.Header.Set("Content-Type", "application/json")
61-
req.Header.Set("Authorization", "Bearer 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")
66+
req.Header.Set("Authorization", "Bearer "+apiKey)
6267
client := &http.Client{}
6368
response, err := client.Do(req)
6469
if err != nil {
@@ -75,7 +80,6 @@ func Completions(msg string) (string, error) {
7580
log.Println(string(body))
7681
err = json.Unmarshal(body, gptResponseBody)
7782
if err != nil {
78-
log.Println(err)
7983
return "", err
8084
}
8185
var reply string

handlers/group_msg_handler.go

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,24 +33,39 @@ func (g *GroupMessageHandler) ReplyText(msg *openwechat.Message) error {
3333
group := openwechat.Group{sender}
3434
log.Printf("Received Group %v Text Msg : %v", group.NickName, msg.Content)
3535

36-
if !strings.Contains(msg.Content, "向大兄弟提问") {
36+
// 不是@的不处理
37+
if !msg.IsAt() {
3738
return nil
3839
}
39-
splitItems := strings.Split(msg.Content, "向大兄弟提问")
40-
if len(splitItems) < 2 {
41-
return nil
42-
}
43-
requestText := strings.TrimSpace(splitItems[1])
40+
41+
// 替换掉@文本,然后向GPT发起请求
42+
replaceText := "@" + sender.Self.NickName
43+
requestText := strings.TrimSpace(strings.ReplaceAll(msg.Content, replaceText, ""))
4444
reply, err := gtp.Completions(requestText)
4545
if err != nil {
46-
log.Println(err)
46+
log.Printf("gtp request error: %v \n", err)
4747
msg.ReplyText("机器人神了,我一会发现了就去修。")
4848
return err
4949
}
50+
if reply == "" {
51+
return nil
52+
}
53+
54+
// 获取@我的用户
55+
groupSender, err := msg.SenderInGroup()
56+
if err != nil {
57+
log.Printf("get sender in group error :%v \n", err)
58+
return err
59+
}
5060

51-
_, err = msg.ReplyText(strings.TrimSpace(reply))
52-
if err != nil{
53-
log.Println(err)
61+
// 回复@我的用户
62+
reply = strings.TrimSpace(reply)
63+
reply = strings.Trim(reply, "\n")
64+
atText := "@" + groupSender.NickName
65+
replyText := atText + reply
66+
_, err = msg.ReplyText(replyText)
67+
if err != nil {
68+
log.Printf("response group error: %v \n", err)
5469
}
5570
return err
5671
}

handlers/handler.go

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package handlers
22

33
import (
4+
"github.com/869413421/wechatbot/config"
45
"github.com/eatmoreapple/openwechat"
6+
"log"
57
)
68

79
// MessageHandlerInterface 消息处理接口
@@ -14,27 +16,38 @@ type HandlerType string
1416

1517
const (
1618
GroupHandler = "group"
19+
UserHandler = "user"
1720
)
1821

22+
// handlers 所有消息类型类型的处理器
1923
var handlers map[HandlerType]MessageHandlerInterface
2024

2125
func init() {
2226
handlers = make(map[HandlerType]MessageHandlerInterface)
2327
handlers[GroupHandler] = NewGroupMessageHandler()
28+
handlers[UserHandler] = NewUserMessageHandler()
2429
}
2530

2631
// Handler 全局处理入口
2732
func Handler(msg *openwechat.Message) {
28-
//if msg.IsSendBySelf() {
29-
// return
30-
//}
31-
//sender, err := msg.Sender()
32-
//if err != nil {
33-
// log.Println(err)
34-
// return
35-
//}
33+
log.Printf("hadler Received msg : %v", msg.Content)
34+
// 处理群消息
3635
if msg.IsSendByGroup() {
3736
handlers[GroupHandler].handle(msg)
3837
return
3938
}
39+
40+
// 好友申请
41+
if msg.IsFriendAdd() {
42+
if config.LoadConfig().AutoPass {
43+
_, err := msg.Agree("你好我是基于chatGPT引擎开发的微信机器人,你可以向我提问任何问题。")
44+
if err != nil {
45+
log.Fatalf("add friend agree error : %v", err)
46+
return
47+
}
48+
}
49+
}
50+
51+
// 私聊
52+
handlers[UserHandler].handle(msg)
4053
}

handlers/user_msg_handler.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package handlers
2+
3+
import (
4+
"github.com/869413421/wechatbot/gtp"
5+
"github.com/eatmoreapple/openwechat"
6+
"log"
7+
"strings"
8+
)
9+
10+
var _ MessageHandlerInterface = (*UserMessageHandler)(nil)
11+
12+
// UserMessageHandler 私聊消息处理
13+
type UserMessageHandler struct {
14+
}
15+
16+
// handle 处理消息
17+
func (g *UserMessageHandler) handle(msg *openwechat.Message) error {
18+
if msg.IsText() {
19+
return g.ReplyText(msg)
20+
}
21+
return nil
22+
}
23+
24+
// NewUserMessageHandler 创建私聊处理器
25+
func NewUserMessageHandler() MessageHandlerInterface {
26+
return &UserMessageHandler{}
27+
}
28+
29+
// ReplyText 发送文本消息到群
30+
func (g *UserMessageHandler) ReplyText(msg *openwechat.Message) error {
31+
// 接收私聊消息
32+
sender, err := msg.Sender()
33+
log.Printf("Received User %v Text Msg : %v", sender.NickName, msg.Content)
34+
35+
// 向GPT发起请求
36+
requestText := strings.TrimSpace(msg.Content)
37+
requestText = strings.Trim(msg.Content, "\n")
38+
reply, err := gtp.Completions(requestText)
39+
if err != nil {
40+
log.Printf("gtp request error: %v \n", err)
41+
msg.ReplyText("机器人神了,我一会发现了就去修。")
42+
return err
43+
}
44+
if reply == "" {
45+
return nil
46+
}
47+
48+
// 回复用户
49+
reply = strings.TrimSpace(reply)
50+
reply = strings.Trim(reply, "\n")
51+
_, err = msg.ReplyText(reply)
52+
if err != nil {
53+
log.Printf("response user error: %v \n", err)
54+
}
55+
return err
56+
}

main.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package main
22

3-
import "github.com/869413421/wechatbot/bootstrap"
3+
import (
4+
"github.com/869413421/wechatbot/bootstrap"
5+
)
46

57
func main() {
68
bootstrap.Run()

0 commit comments

Comments
 (0)