Skip to content

Commit

Permalink
Merge pull request #97 from t3ls/main
Browse files Browse the repository at this point in the history
feat: 支持配置 openai 模型
  • Loading branch information
houko authored Apr 5, 2024
2 parents b1fc304 + 84d636e commit 8f4b992
Show file tree
Hide file tree
Showing 18 changed files with 734 additions and 363 deletions.
4 changes: 2 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
FROM golang:1.19-alpine as builder
FROM golang:1.21-alpine as builder

RUN apk --no-cache add git && export GOPRIVATE=github.com/houko/wechatgpt && \
RUN apk --no-cache add git && export GOPRIVATE=github.com/t3ls/wechatgpt && \
export GOPROXY=https://goproxy.cn,direct

COPY . /root/build
Expand Down
100 changes: 20 additions & 80 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,26 @@
<a href="#" target="_blank">
<img alt="License: MIT" src="https://img.shields.io/badge/License-MIT-green.svg" />
</a>
<a href="https://twitter.com/xiaomoinfo" target="_blank">
<img alt="Twitter: xiaomoinfo" src="https://img.shields.io/twitter/follow/xiaomoinfo.svg?style=social" />
</a>
</p>

## 仓库地址
## 介绍

https://github.com/houko/wechatgpt
基于 OpenAI 官方 API 开发的微信智能机器人。

## 准备运行环境
功能:
- 多模态对话
- gpt4-vision-preview 识别图片并回复
- DALL·E 生成图片(“生成图片” 关键字)

```
go mod tidy
cp config/config.yaml.example local/config.yaml
感谢 https://github.com/houko/wechatgpt 提供的基础代码

`wechatgpt` 的基础上,我增加了多模态对话的功能,以及修复一些问题。

## 运行命令

```bash
git clone https://github.com/t3ls/wechatgpt.git
cd wechatgpt && docker compose up -d
```

## 修改你的token
Expand All @@ -45,6 +51,9 @@ chatgpt:
| 变量名 || 作用 |
|----------------|-------------------|------------------|
| api_key | "chatgpt的api_key" | 必填项 |
|openai_text_model| "gpt-3.5-turbo" | 可选项,不填默认为gpt-3.5-turbo |
| openai_vision_model| "gpt4-vision-preview" | 可选项,不填默认为gpt4-vision-preview |
| openai_image_model| "dall-e-2" | 可选项,不填默认为dall-e-2 |
| wechat | "true" 或缺省 | 如果为true就会启动微信机器人 |
| wechat_keyword | "关键字"或缺省 | 如果缺省则发任何消息机器都会回复 |
| telegram | telegram的token或缺省 | 如果要启动tg机器人需要填写 |
Expand All @@ -55,31 +64,10 @@ chatgpt:
go run main.go
```

## `Docker` 方式运行`wechatgpt`

运行微信智能机器人的话运行下面这段代码,微信登陆的地址请查看运行日志`docker logs <containerId>`

```
docker run -d \
--name wechatgpt \
-e api_key="你的chatgpt api_key" \
-e wechat="true" \
-e wechat_keyword="微信触发关键字" \
xiaomoinfo/wechatgpt:latest
```

运行微信智能机器人不需要任何触发关键字请运行下面这段代码,适合微信小号专业做机器人用,微信登陆的地址请查看运行日志`docker logs <containerId>`
`警告:以下命令会让任何消息都会被机器人接管,微信主号不要用下面这个命令`
或者修改 docker-compose.yml 文件中的环境变量后运行

```
docker run -d \
--name wechatgpt \
-e api_key="你的chatgpt api_key" \
-e wechat="true" \
xiaomoinfo/wechatgpt:latest

```
## 运行`telegram`智能机器人(暂不对 telegram 相关原始代码进行维护)

运行`telegram`智能机器人的话运行下面这段代码

Expand Down Expand Up @@ -152,54 +140,6 @@ INFO[0099] 3 <Friend:wloscar>
,你的微信就会调用`chatGPT`AI自动回复你的好友。
当然,在群里也是可以的。

### 使用场景1

别人给你发消息时,如果消息中带有关键字,系统就会调用AI自动帮你回复此问题。

<img src="screenshots/IMG_3837.png" alt="drawing" style="width:250px;"/><img src="screenshots/IMG_3840.png" alt="drawing" style="width:250px;"/><img src="screenshots/IMG_3850.png" alt="drawing" style="width:250px;"/>

### 使用场景2

自己给自己发消息时,如果消息中带有关键字,系统会也调用AI自动帮你回复此问题。

<img src="screenshots/IMG_3844.png" alt="drawing" style="width:250px;"/>

### 意外之喜

<img src="screenshots/IMG_3843.png" alt="drawing" style="width:250px;"/>

这不比对象来的贴心?

### telegram机器人使用方式
修改 config下的 `chatgpt.telegram`的token后运行`go run main.go`进行启动,参考如下:

```
chatgpt:
wechat: 小莫
token: sk-pKHZD1fLYyd56sadsdUvIODTT3ssjdfadsJC2gTuqqhTum
telegram: 5718911250:AAhRdbdfxzcCFoM_GyI2g9B18S7WbYviQ
```

`token`获取方式,请在telegram中添加好友`@botFather`并按提示操作

<img src="screenshots/IMG_3991.png" alt="drawing" style="width:250px;"/>

## 总结

- 你可以把它当作你的智能助理,帮助你快速回复消息。
- 你可以把它当作一个智能机器人,邀请在群里之后通过关键字帮助大家解答问题。
- 你可以把它当作你的智多星,有什么问题不懂的时候随时问它。

## 变爸爸事件

放在B站
[用chatgpt写了个微信机器人结果变爸爸了](https://www.bilibili.com/video/BV1B24y1Q7us/)

## 贡献本仓库

如果大家有玩的时候有遇到一些奇怪的对话可以截图发PR分享给大家。另外对本项目有什么想法或者贡献的话欢迎提[issue](https://github.com/houko/wechatgpt/issues)
[pr](https://github.com/houko/wechatgpt/pulls)

## Q&A

### 1. 返回错误`invalid_api_key`
Expand Down
24 changes: 12 additions & 12 deletions bootstrap/telegram.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ import (
func StartTelegramBot() {
log.Info("Start Telegram Bot")
telegramKey := config.GetTelegram()
if telegramKey == nil {
if telegramKey == "" {
log.Info("未找到tg token,不启动tg bot")
return
}

bot, err := tgbotapi.NewBotAPI(*telegramKey)
bot, err := tgbotapi.NewBotAPI(telegramKey)
if err != nil {
log.Error("tg bot 启动失败:", err.Error())
return
Expand All @@ -46,8 +46,8 @@ func StartTelegramBot() {
chatUserName := update.Message.Chat.UserName

tgUserNameStr := config.GetTelegramWhitelist()
if tgUserNameStr != nil {
tgUserNames := strings.Split(*tgUserNameStr, ",")
if tgUserNameStr != "" {
tgUserNames := strings.Split(tgUserNameStr, ",")
if len(tgUserNames) > 0 {
found := false
for _, name := range tgUserNames {
Expand All @@ -65,10 +65,10 @@ func StartTelegramBot() {
}

tgKeyWord := config.GetTelegramKeyword()
var reply *string
reply := ""
// 如果设置了关键字就以关键字为准,没设置就所有消息都监听
if tgKeyWord != nil {
content, key := utils.ContainsI(text, *tgKeyWord)
if tgKeyWord != "" {
content, key := utils.ContainsI(text, tgKeyWord)
if len(key) == 0 {
continue
}
Expand All @@ -80,24 +80,24 @@ func StartTelegramBot() {

requestText := strings.TrimSpace(splitItems[1])
log.Info("问题:", requestText)
reply = telegram.Handle(requestText)
reply = telegram.Handle(chatUserName, requestText)
} else {
log.Info("问题:", text)
reply = telegram.Handle(text)
reply = telegram.Handle(chatUserName, text)
}

if reply == nil {
if reply == "" {
continue
}

msg := tgbotapi.NewMessage(chatID, *reply)
msg := tgbotapi.NewMessage(chatID, reply)
_, err := bot.Send(msg)
if err != nil {
log.Errorf("发送消息出错:%s", err.Error())
continue
}

log.Info("回答:", *reply)
log.Info("回答:", reply)
}

select {}
Expand Down
21 changes: 6 additions & 15 deletions bootstrap/wechat.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package bootstrap

import (
"os"

"wechatbot/handler/wechat"

"github.com/eatmoreapple/openwechat"
Expand All @@ -12,22 +10,15 @@ import (
func StartWebChat() {
log.Info("Start WebChat Bot")
bot := openwechat.DefaultBot(openwechat.Desktop)
bot.MessageHandler = wechat.Handler
bot.MessageHandler = wechat.Handler.AsMessageHandler()
bot.UUIDCallback = openwechat.PrintlnQrcodeUrl

reloadStorage := openwechat.NewJsonFileHotReloadStorage("token.json")
err := bot.HotLogin(reloadStorage)
reloadStorage := openwechat.NewFileHotReloadStorage("storage.json")
defer reloadStorage.Close()
err := bot.PushLogin(reloadStorage, openwechat.NewRetryLoginOption())
if err != nil {
err := os.Remove("token.json")
if err != nil {
return
}

reloadStorage = openwechat.NewJsonFileHotReloadStorage("token.json")
err = bot.HotLogin(reloadStorage)
if err != nil {
return
}
log.Fatal(err)
return
}

// 获取登陆的用户
Expand Down
Loading

0 comments on commit 8f4b992

Please sign in to comment.