Skip to content

Commit 7b94eb6

Browse files
committed
Init commit
1 parent 326dc91 commit 7b94eb6

File tree

11 files changed

+180
-181
lines changed

11 files changed

+180
-181
lines changed

.gitignore

+3-4
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
*.dylib
77
.idea/
88
.vscode/
9-
wechatbot
10-
storage.json
119

1210
# Test binary, built with `go test -c`
1311
*.test
@@ -16,5 +14,6 @@ storage.json
1614
*.out
1715

1816
# Dependency directories (remove the comment below to include it)
19-
# vendor/
20-
/config.json
17+
config.json
18+
storage.json
19+
vendor

README.md

+50-95
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,51 @@
1-
# wechatbot
1+
# chatgpt_wechat_robot
2+
个人微信接入ChatGPT,实现和GPT机器人互动聊天。支持私聊回复和群聊艾特回复。
23

3-
> 本项目是 fork 他人的项目来进行学习和使用,请勿商用,可以下载下来做自定义的功能
4-
> 最近ChatGPT异常火爆,本项目可以将个人微信化身GPT机器人,
5-
> 项目基于[openwechat](https://github.com/eatmoreapple/openwechat) 开发。
6-
7-
> `友链:`[chatgpt-dingtalk](https://github.com/eryajf/chatgpt-dingtalk) 本项目可以将GPT机器人集成到钉钉群聊中。
8-
9-
10-
### 目前实现了以下功能
4+
### 实现功能
115

126
* GPT机器人模型热度可配置
137
* 提问增加上下文
14-
* 指令清空上下文(指令:根据配置)
15-
* 机器人群聊@回复
8+
* 指令清空上下文
169
* 机器人私聊回复
10+
* 机器人群聊@回复
1711
* 私聊回复前缀设置
1812
* 好友添加自动通过可配置
19-
* ~~增加每天工作的起始时间和结束时间,只有在该时间段才会对外提供 chatgpt 服务~~
20-
* ~~增加 vip 用户在任意时段都可享受 chatgpt 服务,只需要在 \wechatbot\handlers\group_msg_handler.go 中 的 VipUserList 切片中,
21-
加入具体的 vip 昵称~~
2213

23-
# 实现机制
24-
目前机器人有两种实现方式
25-
* 逆向功能,扒取官网API,通过抓取cookie获取GPT响应信息,`优点:`效果与官网一致,`缺点:`cookie会过期需要不定时更新。
26-
* 基于openai官网提供的API,`优点`:模型以及各种参数可以自由配置,`缺点:`效果达不到官网智能,且API收费,新账号有18美元免费额度。
14+
### 实现机制
15+
基于openai官网提供的API,`优点`:模型以及各种参数可以自由配置,`缺点:`效果达不到官网智能,且API收费,新账号有18美元免费额度。
2716

28-
> 本项目基于第二种方式实现,模型之间具体差异可以参考[官方文档](https://beta.openai.com/docs/models/overview), 详细[参数示例](https://beta.openai.com/examples)
17+
> 模型之间具体差异可以参考[官方文档](https://beta.openai.com/docs/models/overview), 详细[参数示例](https://beta.openai.com/examples)
2918
30-
# 常见问题
31-
* 如无法登录 login error: write storage.json: bad file descriptor 删除掉storage.json文件重新登录。
32-
* 如无法登录 login error: wechat network error: Get "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage": 301 response missing Location header 一般是微信登录权限问题,先确保PC端能否正常登录。
33-
* 其他无法登录问题,依然尝试删除掉storage.json文件,结束进程(linux一般是kill -9 进程id)之后重启程序,重新扫码登录,(如为docket部署,Supervisord进程管理工具会自动重启程序)。
34-
* ~~机器人无法正常回复,检查ApiKey能否正常使用,控制台日志中有详细错误信息~~ 新版本会机器人会直接输出,因为被问得好烦了。
35-
* linux中二维码无法扫描,缩小命令行功能,让二维码像素尽可能清晰。(无法从代码层面解决)
36-
* 机器人一直答非所问,可能因为上下文累积过多。切换不同问题时,发送指令:启动时配置的`session_clear_token`字段。会清空上下文
19+
### 常见问题
20+
> 如无法登录`login error: write storage.json: bad file descriptor`
21+
删除掉storage.json文件重新登录。
3722

38-
# 使用前提
23+
> 如无法登录`login error: wechat network error: Get "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage": 301 response missing Location header`
24+
一般是微信登录权限问题,先确保PC端能否正常登录。
3925

40-
> * ~~目前只支持在windows上运行因为需要弹窗扫码登录微信,后续会支持linux~~ 已支持
41-
> * 有openai账号,并且创建好api_key,注册事项可以参考[此文章](https://juejin.cn/post/7173447848292253704)
42-
> * 应用可以参考这篇文章 [此文章](https://juejin.cn/post/7176813187705077816)
43-
> * 微信必须实名认证。
26+
> 其他无法登录问题
27+
尝试删除掉storage.json文件,结束进程(linux一般是kill -9 进程id)之后重启程序,重新扫码登录。
28+
如果为docket部署,Supervisord进程管理工具会自动重启程序。
4429

45-
# 注意事项
30+
> linux中二维码无法扫描
31+
缩小命令行功能,让二维码像素尽可能清晰。
4632

47-
> * 项目仅供娱乐,滥用可能有微信封禁的风险,请勿用于商业用途。
48-
> * 请注意收发敏感信息,本项目不做信息过滤。
33+
> 机器人一直答非所问
34+
可能因为上下文累积过多。切换不同问题时,发送指令:启动时配置的`session_clear_token`字段。会清空上下文
4935

50-
# 使用docker运行
36+
### 使用前提
37+
* 有openai账号,并且创建好api_key,注册事项可以参考[此文章](https://juejin.cn/post/7173447848292253704)
38+
* 应用可以参考这篇文章 [此文章](https://juejin.cn/post/7176813187705077816)
39+
* 微信必须实名认证。
5140

41+
### 注意事项
42+
* 项目仅供娱乐,滥用可能有微信封禁的风险,请勿用于商业用途。
43+
* 请注意收发敏感信息,本项目不做信息过滤。
44+
45+
### docker运行
5246
你可以使用docker快速运行本项目。
5347

54-
`第一种:基于环境变量运行`
48+
#### 1. 基于环境变量运行
5549

5650
```sh
5751
# 运行项目,环境变量参考下方配置说明
@@ -73,7 +67,7 @@ $ tail -f -n 50 /app/run.log
7367

7468
运行命令中映射的配置文件参考下边的配置文件说明。
7569

76-
`第二种:基于配置文件挂载运行`
70+
#### 2. 基于配置文件挂载运行
7771

7872
```sh
7973
# 复制配置文件,根据自己实际情况,调整配置里的内容
@@ -89,78 +83,39 @@ $ tail -f -n 50 /app/run.log
8983

9084
其中配置文件参考下边的配置文件说明。
9185

92-
# 快速开始
93-
94-
`第一种:直接下载二进制(适合对编程不了解的同学)`
95-
96-
> 非技术人员请直接下载release中的[压缩包](https://github.com/869413421/wechatbot/releases) ,请根据自己系统以及架构选择合适的压缩包,下载之后直接解压运行。
97-
98-
下载之后,在本地解压,即可看到可执行程序,与配置文件:
99-
100-
```
101-
# windows
102-
1.下载压缩包解压
103-
2.复制文件中config.dev.json更改为config.json
104-
3.将config.json中的api_key替换为自己的
105-
4.双击exe,扫码登录
106-
107-
# linux
108-
$ tar xf wechatbot-v0.0.2-darwin-arm64.tar.gz
109-
$ cd wechatbot-v0.0.2-darwin-arm64
110-
$ cp config.dev.json # 根据情况调整配置文件内容
111-
$ ./wechatbot # 直接运行
112-
113-
# 如果要守护在后台运行
114-
$ nohup ./wechatbot &> run.log &
115-
$ tail -f run.log
116-
```
11786

118-
`第二种:基于源码运行(适合了解go语言编程的同学)`
87+
### 源码运行
88+
适合了解go语言编程的同学
11989

12090
````
12191
# 获取项目
122-
$ git clone https://github.com/869413421/wechatbot.git
92+
$ git clone https://github.com/ZYallers/chatgpt_wechat_robot.git
12393
12494
# 进入项目目录
125-
$ cd wechatbot
95+
$ cd chatgpt_wechat_robot
12696
12797
# 复制配置文件
128-
$ copy config.dev.json config.json
98+
$ cp config.dev.json config.json
12999
130100
# 启动项目
131101
$ go run main.go
132102
````
133103

134-
# 配置文件说明
104+
### 配置说明
135105

136-
````
106+
```json
137107
{
138-
"api_key": "your api key",
139-
"auto_pass": true,
140-
"session_timeout": 60,
141-
"max_tokens": 1024,
142-
"model": "text-davinci-003",
143-
"temperature": 1,
144-
"reply_prefix": "来自机器人回复:",
145-
"session_clear_token": "清空会话"
108+
"api_key": "your api key", # openai账号里设置的api_key
109+
"auto_pass": true, # 是否自动通过好友添加
110+
"session_timeout": 60, # 会话超时时间,默认60秒,单位秒,在会话时间内所有发送给机器人的信息会作为上下文
111+
"max_tokens": 1024, # GPT响应字符数,最大2048,默认值512。会影响接口响应速度,字符越大响应越慢
112+
"model": "text-davinci-003", # GPT选用模型,默认text-davinci-003,具体选项参考官网训练场
113+
"temperature": 1, # GPT热度,0到1,默认0.9,数字越大创造力越强,但更偏离训练事实,越低越接近训练事实
114+
"reply_prefix": "来自机器人回复:", # 私聊回复前缀
115+
"session_clear_token": "清空会话" # 会话清空口令,默认`下一个问题`
146116
}
117+
```
147118

148-
api_key:openai api_key
149-
auto_pass:是否自动通过好友添加
150-
session_timeout:会话超时时间,默认60秒,单位秒,在会话时间内所有发送给机器人的信息会作为上下文。
151-
max_tokens: GPT响应字符数,最大2048,默认值512。max_tokens会影响接口响应速度,字符越大响应越慢。
152-
model: GPT选用模型,默认text-davinci-003,具体选项参考官网训练场
153-
temperature: GPT热度,0到1,默认0.9。数字越大创造力越强,但更偏离训练事实,越低越接近训练事实
154-
reply_prefix: 私聊回复前缀
155-
session_clear_token: 会话清空口令,默认`下一个问题`
156-
````
157-
158-
# 使用示例
159-
### 私聊
160-
161-
<img width="300px" src="https://raw.githubusercontent.com/869413421/study/master/static/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20221208153022.jpg"/>
162-
163-
### 群聊@回复
164-
165-
<img width="300px" src="https://raw.githubusercontent.com/869413421/study/master/static/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20221208153015.jpg"/>
166-
119+
### 友情提示
120+
本项目是 fork 他人的项目来进行学习和使用,请勿商用,可以下载下来做自定义的功能。
121+
项目基于[openwechat](https://github.com/eatmoreapple/openwechat) 开发。

bootstrap/bootstrap.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ package bootstrap
22

33
import (
44
"fmt"
5+
"github.com/eatmoreapple/openwechat"
56
"github.com/qingconglaixueit/wechatbot/handlers"
67
"github.com/qingconglaixueit/wechatbot/pkg/logger"
7-
"github.com/eatmoreapple/openwechat"
88
)
99

1010
func Run() {
@@ -14,7 +14,7 @@ func Run() {
1414
// 注册消息处理函数
1515
handler, err := handlers.NewHandler()
1616
if err != nil {
17-
logger.Danger("register error: %v", err)
17+
logger.Danger(fmt.Sprintf("handlers.NewHandler error: %v", err))
1818
return
1919
}
2020
bot.MessageHandler = handler
@@ -28,9 +28,10 @@ func Run() {
2828
// 执行热登录
2929
err = bot.HotLogin(reloadStorage, true)
3030
if err != nil {
31-
logger.Warning(fmt.Sprintf("login error: %v ", err))
31+
logger.Warning(fmt.Sprintf("bot.HotLogin error: %v ", err))
3232
return
3333
}
34+
3435
// 阻塞主goroutine, 直到发生异常或者用户主动退出
35-
bot.Block()
36+
_ = bot.Block()
3637
}

config/config.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ package config
33
import (
44
"encoding/json"
55
"fmt"
6-
"github.com/qingconglaixueit/wechatbot/pkg/logger"
7-
"log"
86
"os"
97
"strconv"
108
"sync"
119
"time"
10+
11+
"github.com/qingconglaixueit/wechatbot/pkg/logger"
1212
)
1313

1414
// Configuration 项目配置
@@ -44,22 +44,22 @@ func LoadConfig() *Configuration {
4444
MaxTokens: 512,
4545
Model: "text-davinci-003",
4646
Temperature: 0.9,
47-
SessionClearToken: "下一个问题",
47+
SessionClearToken: "下个问题",
4848
}
4949

5050
// 判断配置文件是否存在,存在直接JSON读取
5151
_, err := os.Stat("config.json")
5252
if err == nil {
5353
f, err := os.Open("config.json")
5454
if err != nil {
55-
log.Fatalf("open config err: %v", err)
55+
logger.Danger(fmt.Sprintf("open config error: %v", err))
5656
return
5757
}
5858
defer f.Close()
5959
encoder := json.NewDecoder(f)
6060
err = encoder.Decode(config)
6161
if err != nil {
62-
log.Fatalf("decode config err: %v", err)
62+
logger.Danger(fmt.Sprintf("decode config error: %v", err))
6363
return
6464
}
6565
}
@@ -81,7 +81,7 @@ func LoadConfig() *Configuration {
8181
if SessionTimeout != "" {
8282
duration, err := time.ParseDuration(SessionTimeout)
8383
if err != nil {
84-
logger.Danger(fmt.Sprintf("config session timeout err: %v ,get is %v", err, SessionTimeout))
84+
logger.Danger(fmt.Sprintf("config session timeout error: %v, get is %v", err, SessionTimeout))
8585
return
8686
}
8787
config.SessionTimeout = duration
@@ -92,15 +92,15 @@ func LoadConfig() *Configuration {
9292
if MaxTokens != "" {
9393
max, err := strconv.Atoi(MaxTokens)
9494
if err != nil {
95-
logger.Danger(fmt.Sprintf("config MaxTokens err: %v ,get is %v", err, MaxTokens))
95+
logger.Danger(fmt.Sprintf("config max tokens error: %v ,get is %v", err, MaxTokens))
9696
return
9797
}
9898
config.MaxTokens = uint(max)
9999
}
100100
if Temperature != "" {
101101
temp, err := strconv.ParseFloat(Temperature, 64)
102102
if err != nil {
103-
logger.Danger(fmt.Sprintf("config Temperature err: %v ,get is %v", err, Temperature))
103+
logger.Danger(fmt.Sprintf("config temperature error: %v, get is %v", err, Temperature))
104104
return
105105
}
106106
config.Temperature = temp
@@ -114,7 +114,7 @@ func LoadConfig() *Configuration {
114114

115115
})
116116
if config.ApiKey == "" {
117-
logger.Danger("config err: api key required")
117+
logger.Danger("config error: api key required")
118118
}
119119

120120
return config

0 commit comments

Comments
 (0)