Skip to content

Commit

Permalink
Merge pull request #1 from amtoaer/dev
Browse files Browse the repository at this point in the history
  • Loading branch information
amtoaer authored Dec 22, 2021
2 parents 8979bb9 + 70647f8 commit 5ab749b
Show file tree
Hide file tree
Showing 20 changed files with 470 additions and 448 deletions.
24 changes: 24 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: release
on:
push:
tags:
- "v*"

jobs:
release:
name: publish releases
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Use Golang
uses: actions/setup-go@v2
with:
go-version: "1.17.5"
- name: Build and Release
run: make
- name: Upload to release
uses: softprops/action-gh-release@v1
with:
files: build/release.zip
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
build/
18 changes: 18 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
NAME=bing-bong

.PHONY: clean

all: clean release

release: build
zip -q -r build/release.zip build/

dev:
go run main.go

build:
GOARCH=amd64 GOOS=linux go build -trimpath -ldflags '-w -s' -o build/$(NAME)
cp config.yml build/

clean:
rm -rf ./build
64 changes: 46 additions & 18 deletions client/qq.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (
"github.com/amtoaer/bing-bong/internal"
"github.com/amtoaer/bing-bong/message"
"github.com/amtoaer/bing-bong/model"
"github.com/amtoaer/bing-bong/utils"
log "github.com/sirupsen/logrus"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/driver"
Expand All @@ -37,20 +36,22 @@ func (q *QQ) Init() {
SelfID: account,
})
accountNum, err := strconv.ParseInt(account, 10, 64)
utils.Fatalf("error parsing account:%v", err)
time.Sleep(1 * time.Second) // zero内部的机器人注册是异步的,这里暂且使用sleep等待1s,防止zero.GetBot为nil
if err != nil {
log.Fatalf("解析账号失败:%v", err)
}
time.Sleep(100 * time.Millisecond) // zero内部的机器人注册是异步的,这里暂且使用sleep等待0.1s,防止zero.GetBot为nil
q.bot = zero.GetBot(accountNum)
if q.bot != nil {
log.Info("机器人成功启动")
} else {
log.Fatalf("机器人启动失败") //如果启动失败可以适当延长上面的sleep时间试试((
log.Fatal("机器人启动失败")
}
}

// 发送消息
func (q *QQ) SendMessage(userID int64, message string, isGroup bool) {
rand.Seed(time.Now().Unix()) //设置随机数种子
time.Sleep(time.Duration(rand.Int63n(30)) * time.Second) //尝试随机sleep,降低风控风险
time.Sleep(time.Duration(rand.Int63n(30)) * time.Second) //尝试随机sleep,或可降低风控风险
if isGroup {
q.bot.SendGroupMessage(userID, message)
} else {
Expand All @@ -59,11 +60,12 @@ func (q *QQ) SendMessage(userID int64, message string, isGroup bool) {
}

// 监听事件并阻塞程序
func (q *QQ) HandleEvent(mq *message.MessageQueue) {
func (q *QQ) HandleEvent(mm *message.Manager) {
zero.OnCommandGroup([]string{"订阅", "subscribe"}).Handle(func(ctx *zero.Ctx) {
var cmd extension.CommandModel
err := ctx.Parse(&cmd)
if utils.Errorf("处理命令时发生错误:%v", err) {
if err != nil {
log.Errorf("处理命令失败:%v", err)
return
}
if cmd.Args == "" {
Expand All @@ -73,27 +75,44 @@ func (q *QQ) HandleEvent(mq *message.MessageQueue) {
ctx.Send("请输入合法的链接!")
} else {
isGroup, userID := getCtxInfo(ctx)
for _, existFeed := range model.QueryFeed(userID) {
if cmd.Args == existFeed.Url {
feeds, err := model.QueryFeed(userID, isGroup)
if err != nil {
log.Errorf("查询订阅出现错误:%v", err)
ctx.Send("查询订阅出现未知错误,请联系管理员排查。")
return
}
for _, existFeed := range feeds {
if cmd.Args == existFeed.URL {
ctx.Send("您已经订阅了该地址!")
return
}
}
ctx.Send("获取feeds信息中...")
title, err := internal.ParseTitle(cmd.Args)
if utils.Errorf("error getting feeds title:%v", err) {
if err != nil {
log.Errorf("获取订阅标题失败:%v", err)
ctx.Send("获取信息失败,请检查机器人网络并确保网址为rss地址。")
return
}
mq.Subscribe(q, cmd.Args, userID, isGroup)
model.InsertSubscription(cmd.Args, title, userID, isGroup)
mm.Subscribe(cmd.Args, &model.User{Account: userID, IsGroup: isGroup})
err = model.InsertSubscription(cmd.Args, title, userID, isGroup)
if err != nil {
log.Errorf("插入订阅出现错误:%v", err)
ctx.Send("订阅出现未知错误,请联系管理员排查。")
return
}
ctx.Send(fmt.Sprintf("订阅《%s》成功!", title))
}
}
})
zero.OnCommandGroup([]string{"取消订阅", "unsubscribe"}).Handle(func(ctx *zero.Ctx) {
isGroup, userID := getCtxInfo(ctx)
feeds := model.QueryFeed(userID)
feeds, err := model.QueryFeed(userID, isGroup)
if err != nil {
log.Errorf("查询订阅出现错误:%v", err)
ctx.Send("查询订阅出现未知错误,请联系管理员排查。")
return
}
hasUrl, messageToSend := buildMessage(feeds, false)
if !hasUrl {
ctx.Send("您还没有任何订阅内容!")
Expand All @@ -109,8 +128,12 @@ func (q *QQ) HandleEvent(mq *message.MessageQueue) {
} else {
num -= 1
if num >= 0 && num < len(feeds) {
model.DeleteSubscription(feeds[num].Url, userID, isGroup)
mq.Unsubscribe(feeds[num].Url, userID)
err := model.DeleteSubscription(feeds[num].URL, userID, isGroup)
if err != nil {
log.Errorf("删除订阅出现错误:%v", err)
return
}
mm.UnSubscribe(feeds[num].URL, &model.User{Account: userID, IsGroup: isGroup})
ctx.Send("删除订阅成功!")
break
} else {
Expand All @@ -121,9 +144,14 @@ func (q *QQ) HandleEvent(mq *message.MessageQueue) {
}
})
zero.OnCommandGroup([]string{"查询订阅", "searchSubscription"}).Handle(func(ctx *zero.Ctx) {
_, userID := getCtxInfo(ctx)
urls := model.QueryFeed(userID)
hasUrl, messageToSend := buildMessage(urls, true)
isGroup, userID := getCtxInfo(ctx)
feeds, err := model.QueryFeed(userID, isGroup)
if err != nil {
log.Errorf("查询订阅出现错误:%v", err)
ctx.Send("查询订阅出现未知错误,请联系管理员排查。")
return
}
hasUrl, messageToSend := buildMessage(feeds, true)
if !hasUrl {
ctx.Send("您还没有任何订阅内容!")
} else {
Expand Down
14 changes: 9 additions & 5 deletions config.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
botType: qq # 机器人类型
botType: "qq" # 机器人类型
qq:
account: "123456" # QQ账号
webSocket: "ws://127.0.0.1:6700/" #cq-http的正向ws地址
accessToken: "123456" # cq-http的token
dbAddress: "localhost:3306" # 数据库链接(目前仅支持mysql)
dbUser: root # 数据库账号
dbPass: root # 数据库密码
dbName: bingbong # 数据库名
dbType: "sqlite" # 数据库类型
mysql:
dbAddress: "localhost:3306" # 数据库链接(目前仅支持mysql)
dbUser: "root" # 数据库账号
dbPass: "root" # 数据库密码
dbName: "bingbong" # 数据库名
sqlite:
path: "./sqlite.db" # 数据库位置
proxy: "" # 请求rss地址时使用的代理(例:http://localhost:7890,留空表示无代理)
checkTime: 5 # 检测rss订阅的时间间隔(单位分钟)
checkRange: 5 # 检测rss订阅的最大条数(程序会检测rss地址的前min(checkRange,len(feeds))条消息)
25 changes: 0 additions & 25 deletions db.sql

This file was deleted.

6 changes: 6 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,11 @@ require (
github.com/fsnotify/fsnotify v1.4.9 // indirect
github.com/gorilla/websocket v1.4.2 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.4 // indirect
github.com/json-iterator/go v1.1.11 // indirect
github.com/magiconair/properties v1.8.5 // indirect
github.com/mattn/go-sqlite3 v1.14.9 // indirect
github.com/mitchellh/mapstructure v1.4.1 // indirect
github.com/mmcdole/goxpp v0.0.0-20181012175147-0068e33feabf // indirect
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
Expand All @@ -36,4 +39,7 @@ require (
golang.org/x/text v0.3.5 // indirect
gopkg.in/ini.v1 v1.62.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gorm.io/driver/mysql v1.2.1 // indirect
gorm.io/driver/sqlite v1.2.6 // indirect
gorm.io/gorm v1.22.4 // indirect
)
15 changes: 15 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,12 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jinzhu/now v1.1.3/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jinzhu/now v1.1.4 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas=
github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ=
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
Expand All @@ -193,6 +199,8 @@ github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaW
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-sqlite3 v1.14.9 h1:10HX2Td0ocZpYEjhilsuo6WWtUqttj2Kb0KtD86/KYA=
github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
Expand Down Expand Up @@ -623,6 +631,13 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/driver/mysql v1.2.1 h1:h+3f1l9Ng2C072Y2tIiLgPpWN78r1KXL7bHJ0nTjlhU=
gorm.io/driver/mysql v1.2.1/go.mod h1:qsiz+XcAyMrS6QY+X3M9R6b/lKM1imKmcuK9kac5LTo=
gorm.io/driver/sqlite v1.2.6 h1:SStaH/b+280M7C8vXeZLz/zo9cLQmIGwwj3cSj7p6l4=
gorm.io/driver/sqlite v1.2.6/go.mod h1:gyoX0vHiiwi0g49tv+x2E7l8ksauLK0U/gShcdUsjWY=
gorm.io/gorm v1.22.3/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0=
gorm.io/gorm v1.22.4 h1:8aPcyEJhY0MAt8aY6Dc524Pn+pO29K+ydu+e/cXSpQM=
gorm.io/gorm v1.22.4/go.mod h1:1aeVC+pe9ZmvKZban/gW4QPra7PRoTEssyc922qCAkk=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
Expand Down
30 changes: 20 additions & 10 deletions internal/rss.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/amtoaer/bing-bong/model"
"github.com/amtoaer/bing-bong/utils"
"github.com/mmcdole/gofeed"
log "github.com/sirupsen/logrus"
"github.com/spf13/viper"
)

Expand All @@ -17,33 +18,42 @@ var fp *gofeed.Parser = gofeed.NewParser()
func init() {
proxyUrl := viper.GetString("proxy")
if proxy, err := url.ParseRequestURI(proxyUrl); err == nil {
fp.Client = &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxy)}}
fp.Client = &http.Client{
Transport: &http.Transport{
Proxy: http.ProxyURL(proxy),
},
Timeout: 10 * time.Second,
}
} else {
fp.Client = &http.Client{
Timeout: 10 * time.Second,
}
}
}

// 检测rss更新的定时任务
func CheckMessage(mq *message.MessageQueue) {
func CheckMessage(mm *message.Manager) {
checkTime := viper.GetInt64("checktime")
for range time.Tick(time.Duration(checkTime) * time.Minute) {
urls := mq.GetUrls()
urls := mm.GetTopics()
for _, url := range urls {
go checkMessage(url, mq)
go checkMessage(url, mm)
}
}
}

func checkMessage(url string, mq *message.MessageQueue) {
func checkMessage(url string, mm *message.Manager) {
feeds, err := fp.ParseURL(url)
if utils.Errorf("error parsing urls: %v", err) {
return
if err != nil {
log.Errorf("解析订阅链接失败:%v", err)
}
checkRange := min(feeds.Len(), viper.GetInt("checkrange")) //限制检测条数
for i := 0; i < checkRange; i++ {
feed := feeds.Items[i]
hash := utils.Hash(feed)
if !model.IsFeedExist(hash) {
mq.Publish(url, utils.BuildMessage(feeds.Title, feed))
model.InsertHash(url, hash)
mm.Publish(url, utils.BuildMessage(feeds.Title, feed))
model.InsertHash(hash)
}
}
}
Expand All @@ -56,7 +66,7 @@ func ParseTitle(url string) (string, error) {
checkRange := min(feeds.Len(), viper.GetInt("checkrange"))
// 在订阅时自动读取已存在的条目,避免多次推送
for i := 0; i < checkRange; i++ {
model.InsertHash(url, utils.Hash(feeds.Items[i]))
model.InsertHash(utils.Hash(feeds.Items[i]))
}
return feeds.Title, err
}
Expand Down
18 changes: 10 additions & 8 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@ import (
type robot interface {
Init()
SendMessage(int64, string, bool)
HandleEvent(*message.MessageQueue)
HandleEvent(*message.Manager)
}

func main() {
var (
bot robot //机器人实例
mq = message.Default() //消息队列
botConf map[string]interface{} //机器人配置
bot robot //机器人实例
mm = message.DefaultManager() //消息队列
botConf map[string]interface{} //机器人配置
)
// 根据机器人类型决定实例化内容
switch viper.GetString("botType") {
Expand All @@ -28,10 +28,12 @@ func main() {
}
// 登录机器人
bot.Init()
// 从数据库读取订阅信息初始化消息队列
model.InitMessageQueue(bot, mq)
// 初始化数据库链接
model.InitDB()
// 从数据库读取订阅信息初始化消息队列,同时启动消息监听
mm.Init(bot)
// 开始检测rss更新
go internal.CheckMessage(mq)
go internal.CheckMessage(mm)
// 启动机器人外部事件监听
bot.HandleEvent(mq)
bot.HandleEvent(mm)
}
Loading

0 comments on commit 5ab749b

Please sign in to comment.