提交 0ead3479 编写于 作者: 奶油话梅糖's avatar 奶油话梅糖 🎨

upload

Signed-off-by: 奶油话梅糖's avatarHuameitang <xiaoyu13561171914@163.com>
上级
/.idea
/logs
/miraigo-logs
application.yaml
device.json
Sora233-MiraiGo
.lsp.db
.lsp.db.lock
DDBOT
/.coverage.out
/coverage.html
/qrcode.png
/qq-logs
/session.token
/dist/
/template
/version*.json" "
此差异已折叠。
## DDBOT常见问题问答
### Q:为什么我设置了@全体成员却没效果?
- 我使用的是官方bot:
首先@全体成员无法在官方demo bot上正常使用,如果您使用的是官方bot,该问题是已知的,请使用@特定用户作为替代。
(这是因为一个账号一天只能@全体成员十次,该次数在所有群内共享,因为官方bot用户众多,很容易把次数用尽,用尽后即无法再@全体成员)
- 我使用的是私人部署的bot:
请检查是否把bot设为qq群管理员,检查`/config at_all`配置是否设置为`on`,如果确认配置无问题,请把该问题提交给开发者。
### Q:为什么我在群里发指令它没反应?
- 我使用的是官方bot:
请确认该命令是正确的,以及该命令没有被管理员禁用,最后确认bot处于正常运行的状态(可以使用/help测试有没有反应),如果确认后仍然没有解决,请把该问题提交给开发者。
- 我使用的是私人部署的bot:
请检查后台有无反应,如果后台有发送消息失败的日志但是qq没有收到,大概率是qq帐号处于风控帐号,需要人工登陆帐号正常使用一段时间以解除风控(注意不要再继续使用BOT了,否则会导致被封号)。
如果后台没有消息发送失败的日志,但是qq也没有收到,该情况小概率触发,一般交替使用别的命令数次,以及等待一段时间可以解决。
如果后台无法接受消息,请用手机登陆bot帐号,在设备管理页面把`mirai`名字的设备全部删除,等待一段时间重新登陆。
### Q:为什么我无法订阅b站动态/直播?
- 我使用的是官方bot:
请把该问题提交给开发者。
- 我使用的是私人部署的bot:
请检查b站配置完整,用文本编辑`application.yaml`文件,需要配置`bilibili`一栏的`account``password`
常见情况:
- 写错了帐号/密码
- 填写了错误的格式
一个格式示范:
英文引号后需要一个英文空格,帐号和密码用英文引号括起来
```yaml
bilibili:
account: "account"
password: "password"
```
- 如果上面确认无误,那您的b站帐号不支持自动登陆,此时只能手动设置cookie,如果不知道如何查看cookie,请百度搜索`如何查看cookie`
**cookie内容可能较长,请确认复制完整**
请按照下面格式配置,注意把`account``password`删除
```yaml
# b站登陆后的cookie字段,从cookie中找到这两个填进去
# 警告:
# SESSDATA和bili_jct等价于您的帐号凭证
# 请绝对不要透露给他人,更不能上传至Github等公开平台
# 否则将导致您的帐号被盗
bilibili:
SESSDATA: "xxxxxxxxxxxx"
bili_jct: "xxxxxxxxxxxx"
```
**获取cookie后,不可点击b站的退出登陆,否则cookie将失效,您可以使用浏览器的清除历史记录功能,或者在浏览器隐私窗口内登陆获取**
**注意:刚注册的号有时候关注时会提示“账户异常”,此为B站帐号的原因,无法在DDBOT解决**
### Q:为什么我订阅了动态/直播没有推送?
- 我使用的是官方bot:
检查是否使用`/config filter`设置了动态过滤。
- 我使用的是私人部署的bot
检查bot日志是否有该条`notify`,以及是否有消息发送失败。
### Q:为什么我私人部署的bot修改了配置后运行时闪退?
因为配置格式填写的不对,一些填写时注意事项:
- 填写时请把井号及后面的内容删除
- 所有引号、冒号均需要使用英文(半角)格式
- 冒号后需要加一个英文空格
### Q:为什么我私人部署的bot会出现发送群消息失败?
如果您是刚开始使用BOT,大概是因为qq账号被风控导致,建议使用bot挂机3-7天(期间请不要使用bot的功能,否则可能导致封号),即可解除风控。
如果仍出现问题,请删除`device.json`文件,重复上面的步骤。
### Q:我下载的DDBOT程序应该如何运行?
检查您是否下载了正确的程序,windows程序应该有.exe后缀。
- 根据系统选择windows / linux / darwin
- 根据架构选择 32位->386 / 64位->amd64 / arm->arm
例如您的系统是windows 11/10/7/server,64位则选择windows-amd64下载,32位则选择windows-386下载。
### Q:我的数据库文件损坏如何处理?
**操作前请备份.lsp.db文件**
尝试进行下面的操作:
- 用文本编辑器打开.lsp.db文件,删掉最后一行,然后测试能否正常启动。
连续重试上面步骤数十次,如果仍然无法解决,请到交流群内寻求帮助。
\ No newline at end of file
# 为DDBOT编写插件
*阅读这个内容需要一定的开发能力。*
文档地址:
[![GoDoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](https://pkg.go.dev/github.com/Sora233/DDBOT)
为DDBOT编写插件的基本步骤为:
- 通过`concern.StateManager`,实现`concern.Concern`接口
-`init()`函数中进行注册
-`main`中引入刚刚编写的包
DDBOT提供了一个插件脚手架,可以快速创建一个插件模版:[DDBOT-template](https://github.com/Sora233/DDBOT-template)
在编写插件前,请先阅读一个示例插件:[DDBOT-example](https://github.com/Sora233/DDBOT-example)
示例插件展示了为DDBOT编写插件的方法。
```golang
// 引入刚刚编写的插件
import (
_ "github.com/Sora233/DDBOT-example/concern"
)
```
这个例子为网站`example`新增了一个类型`example`,可以使用对应的`watch`命令进行订阅:
```
/watch -s example -t example ID
```
使用unwatch进行取消订阅:
```
/unwatch -s example -t example ID
```
使用list进行查看订阅:
```
/list
```
## 一些开箱即用的组件
**示例代码为了简洁,均忽略错误处理,在实际编写代码的过程中,请注意错误处理。**
在编写插件的过程中,第一步通常是创建新的`StateManager`,下面的示例均基于这个结构:
```golang
type StateManager struct {
*concern.StateManager
}
var s *StateManager = ... // 初始化
```
### 持久化
在编写插件的过程中,总会遇到想要存储一些数据的需求,DDBOT默认提供了一个key-value数据库可以使用,支持串行事务,key ttl,并且已经包含在`StateManager`中:
```golang
s.SetInt64("myInt64", 123456) // 即可往数据库中设置kv对 "myInt64" - 123456
v, _ := s.GetInt64("myInt64") // 获取刚刚写入的值
// v == 123456
// 还有 s.SetJson() s.Set() 等更多方法
```
还有更多方法请参考`buntdb/shortcut.go`
### 轮询器
当订阅网站暂时没有发现比较高效的爬虫方式时,我们只能选择不断地依次访问每一个订阅目标的特定页面来获取目标是否有新信息,这种方式叫做轮询。
DDBOT内置了一个轮询器来满足这种方式:
```golang
// 首先需要启动 EmitQueue 轮询器
s.UseEmitQueue()
// 然后可以使用轮询器提供的helper创建一个 FreshFunc
s.UseFreshFunc(s.EmitQueueFresher(func(p concern_type.Type, id interface{}) ([]concern.Event, error) {
// id 是此时轮到的目标信息,此时可以刷新这个目标
// p是id所有订阅过的Type的集合
}))
```
### 更多文档正在施工中。
\ No newline at end of file
# 部署指南
首先需要获取DDBOT程序,可以选择下载预编译的版本,也可以选择从源码编译。
如果您不清楚如何进行编译,请选择预编译版本。
## 预编译版本
[Release](https://github.com/Sora233/DDBOT/releases) 中下载适合您的版本,版本规则:
- 根据系统选择windows / linux / darwin
- 根据架构选择 32位->386 / 64位->amd64 / arm->arm
例如对于windows 7/8/10/11/server,64位系统,推荐选择`-windows-amd64.zip`
<details>
<summary>从源码编译(不推荐,需要编程能力)</summary>
## 从源码编译
首先安装go,go >= 1.17
然后执行下面的命令
```
make build
# 如果没有安装make程序,则用下面的命令编译
go build
```
</details>
## 配置
获取的DDBOT程序为二进制程序,可以直接运行。
**Linux**下请确认DDBOT程序对所在目录有读写权限,并需要赋予程序可执行权限,可通过下面的命令实现:`chmod +x ./DDBOT`
然后可以通过`./DDBOT`运行DDBOT程序。
**windows**版DDBOT默认应该有.exe后缀,即程序名为`DDBOT.exe`,如果没有后缀,请确认下载的程序是windows版本。
Windows版可以双击运行DDBOT程序。
首次运行默认会通过二维码登陆,并且会自动生成所有配置。
DDBOT的配置文件为`application.yaml`,该文件可以用文本编辑器(windows的记事本/vscode,linux的nano/vim等)打开。
### 设置BOT管理员
**方法一**
初次运行bot时,默认没有管理员,此时您可以对bot私聊发送`/whosyourdaddy`命令,成功后发送命令的账号将成为bot管理员。
*请放心,只有当bot没有管理员时可以使用此命令,后续发送此命令将无法生效*
<details>
<summary>方法二(不推荐)</summary>
bot未运行时,执行以下命令。
```shell
./DDBOT --set-admin 你的QQ号码
```
</details>
### 设置BOT运行模式
*该功能从v0.1.0版本开始支持,v0.1.0之前的版本可以跳过这一段*
初次运行bot时,bot默认为公开模式,会自动同意好友申请与加群邀请,您可以通过以下命令切换:
- 切换到私人模式,该模式下会自动拒绝好友申请与加群邀请,您可以手动登陆bot QQ主动加好友与群
```shell
/mode 私人
```
- 切换到审核模式,该模式下会保留好友申请与加群邀请,您可以选择同意或是拒绝。
```shell
/mode 审核
```
- 您也可以重新切换回公开模式
```shell
/mode 公开
```
### 减少bot的刷屏输出
*该功能从v0.1.3版本开始支持,v0.1.3之前的版本可以跳过这一段*
如果您已经对bot命令比较熟悉,同时您的bot为非公开地小范围内使用,您可以对bot私聊发送`/silence`命令减少bot的输出内容。
这个操作会全局设置沉默模式,bot的输出信息将会减少,不再输出权限不足、命令被禁用、命令帮助等信息。
沉默模式也可以对单个群开启,详情请看命令文档。
**如果您对bot的命令尚不熟悉,建议暂时不开启这个设置。**
### device.json
device.json是运行时使用的设备信息(可以理解为伪装的手机型号),应尽量使用同一个,否则可能会触发安全机制无法登陆。
如果检测到不存在,该文件会自动生成,正常情况无需关心。
### application.yaml
DDBOT运行时的配置文件,可以用记事本打开修改,如果检测到不存在,会生成一个最小配置。
#### 最小配置
测试时推荐使用扫码登陆,即不指定帐号和密码(注意:掉线或重启后无法自动重连,仍需扫码,仅推荐测试使用)。
最小配置可以正常使用斗鱼、虎牙、B站订阅功能(最小配置下,B站订阅推荐不超过5个,过多订阅会导致推送延迟大幅增加)。
如果可以直连油管,那也可以正常使用YTB订阅,如果无法直连油管,则需要配置代理功能,YTB订阅才能正常工作。
如果要大规模使用b站订阅功能,推荐配置B站帐号,订阅数最高可达2000(初号机已验证2000订阅)。
如果要使用 TwitCasting 订阅功能,请自行参考完整配置。
```yaml
# 注意,填写时请把井号及后面的内容删除,并且冒号后需要加一个空格
bot:
account: # 你bot的qq号,不填则使用扫码登陆
password: # 你bot的qq密码
onJoinGroup:
rename: "【bot】" # BOT进群后自动改名,默认改名为“【bot】”,如果留空则不自动改名
# 初次运行时将不使用b站帐号方便进行测试
# 如果不使用b站帐号,则推荐订阅数不要超过5个,否则推送延迟将上升
# b站相关的功能推荐使用一个b站账号,建议使用小号
# bot将使用您b站帐号的以下功能:
# 关注用户 / 取消关注用户 / 查看关注列表
# 请注意,订阅一个账号后,此处使用的b站账号将自动关注该账号
bilibili:
SESSDATA: # 你的b站cookie
bili_jct: # 你的b站cookie
interval: 25s
concern:
emitInterval: 5s
logLevel: info
```
#### 完整配置
<details>
<summary> 点此查看全部配置 (仅供高级用户参考) </summary>
```yaml
bot:
account: # bot账号
password: # bot密码
commandPrefix: "/" # bot触发命令的前缀,默认为单斜杠 /
onDisconnected: "exit" # 设置掉线时处理方式,exit为退出,不填或者其他值为尝试重连
onJoinGroup:
rename: "【bot】" # BOT进群后自动改名,默认改名为“【bot】”,如果留空则不自动改名
# 请注意,bot将使用您b站帐号的以下功能,建议使用新注册的小号:
# 关注用户 / 取消关注用户 / 查看关注列表
# 目前支持填cookie和账号两种方式 (选择任意一种方式即可,推荐使用账号密码)
# 若使用账号
# 直接填入账号密码
# 若使用cookie
# b站登陆后的cookie字段,从cookie中找到这两个填进去
# 警告:
# SESSDATA和bili_jct等价于您的帐号凭证
# 请绝对不要透露给他人,更不能上传至Github等公开平台
# 否则将导致您的帐号被盗
# 请注意,订阅一个账号后,此处使用的b站账号将自动关注该账号
bilibili:
SESSDATA: ""
bili_jct: ""
account: # 你的b站账号 (目前不可用)
password: # 你的b站密码 (目前不可用)
interval: 25s # 直播状态和动态检测间隔,过快可能导致ip被暂时封禁
imageMergeMode: "auto" # 设置图片合并模式,支持 "auto" / "only9" / "off"
# auto 为默认策略,存在比较刷屏的图片时会合并
# only9 表示仅当恰好是9张图片的时候合并
# off 表示不合并
hiddenSub: false # 是否使用悄悄关注,默认不使用
unsub: false # 是否自动取消关注,默认不取消,如果您的b站账号有多个bot同时使用,取消可能导致推送丢失
minFollowerCap: 0 # 设置订阅的b站用户需要满足至少有多少个粉丝,默认为0,设为-1表示无限制
disableSub: false # 禁止ddbot去b站关注帐号,这意味着只能订阅帐号已关注的用户,或者在b站手动关注
onlyOnlineNotify: false # 是否不推送Bot离线期间的动态和直播,默认为false表示需要推送,设置为true表示不推送
localPool: # 图片功能,使用本地图库
imageDir: # 本地路径
loliconPool: # 图片功能,使用api.lolicon.app图库
apikey: # 由于该图库更新,此字段不再需要了,留空即可
cacheMin: 10
cacheMax: 50
proxy:
pyProxyPool: # 代理池配置,py代理池 https://github.com/jhao104/proxy_pool
host: http://127.0.0.1:5010
localProxyPool: # 代理池配置,固定代理
oversea: # 可翻墙的代理,用于访问YTB或pixiv
- 127.0.0.1:8888
mainland: # 不可翻墙的代理,用于直连国内网站
- 127.0.0.1:8888
# 加入 twitcasting 部分即启用 tc 订阅功能
# 参阅 https://apiv2-doc.twitcasting.tv/#registration
# 你需要到 https://twitcasting.tv/developer.php 新增一个 App
# 填入所需资料后就可以获取 clientId 和 clientSecret
# 详细: https://www.codenong.com/7d930656a7499340f14a/
twitcasting:
clientId: abc
clientSecret: xyz
# 为防止风控,可选择性广播以下元素
broadcaster:
title: false # 标题 (有风控机会)
created: true # 开播时间
image: false # 直播封面 (墙内无法获取TC直播封面,建议有代理才开启
# 自定义名称显示,日文字太多很大机会风控
# 例如 "(如何显示) 正在直播""
nameStrategy: "name" # 如何显示名称, name= 显示用户名称, userid= 显示用户ID, both= 显示 "用户名称 (用户ID)"
concern:
emitInterval: 5s # 订阅的刷新频率,5s表示每5秒刷新一个ID,过快可能导致ip被暂时封禁
imagePool:
type: "off" # localPool / loliconPool
proxy:
type: "off" # localProxyPool/ pyProxyPool
debug: # debug模式,只有以下群或qq号可以触发命令
group:
- 0
uin:
- 0
message-marker: # 是否禁用自动已读功能,true为禁用,false为不禁用,默认为不禁用
disable: false
qq-logs: # 是否启用在命令行内展示qq聊天内容,true为启用,false为禁用,默认为禁用
enable: false
dispatch:
largeNotifyLimit: 50 # 巨量推送的判定配置,默认为50,当大于这个配置时,将增大推送延迟保证账号稳定
notify:
parallel: 1 # 增加推送消息的并发配置,默认为1以优先保证账号稳定,当出现推送堆积的时候可以尝试调高
template: # 是否启用模板功能,true为启用,false为禁用,默认为禁用
enable: false # 需要了解模板请看模板文档
autoreply: # 自定义命令自动回复,自定义命令通过模板发送消息,且不支持任何参数,需要同时启用模板功能
group: # 需要了解该功能请看模板文档
command: [ ]
private:
command: [ ]
# 重定义命令前缀,优先级高于bot.commandPrefix
# 如果有多个,可填写多项,prefix支持留空,可搭配自定义命令使用
# 例如下面的配置为:<Q命令1> <命令2> </help>
customCommandPrefix:
命令1: "Q"
命令2: ""
logLevel: info # 日志等级
```
</details>
\ No newline at end of file
此差异已折叠。
BUILD_TIME := $(shell date --rfc-3339=seconds)
COMMIT_ID := $(shell git rev-parse HEAD)
LDFLAGS = -X "github.com/Sora233/DDBOT/lsp.BuildTime='"$(BUILD_TIME)"'" -X "github.com/Sora233/DDBOT/lsp.CommitId='"$(COMMIT_ID)"'"
SRC := $(shell find . -type f -name '*.go') lsp/template/default/*
PROTO := $(shell find . -type f -name '*.proto')
COV := .coverage.out
TARGET := DDBOT
$(COV): $(SRC)
go test ./... -coverprofile=$(COV)
$(TARGET): $(SRC) go.mod go.sum
go build -ldflags '$(LDFLAGS)' -o $(TARGET) github.com/Sora233/DDBOT/cmd
build: $(TARGET)
proto: $(PROTO)
protoc --go_out=. $(PROTO)
test: $(COV)
coverage: $(COV)
go tool cover -func=$(COV) | grep -v 'pb.go'
report: $(COV)
go tool cover -html=$(COV)
clean:
- rm -rf $(TARGET) $(COV)
# DDBOT
[<img src="https://github.com/Sora233/DDBOT/actions/workflows/ci.yml/badge.svg"/>](https://github.com/Sora233/DDBOT/actions/workflows/ci.yml)
[<img src="https://coveralls.io/repos/github/Sora233/DDBOT/badge.svg?branch=master"/>](https://coveralls.io/github/Sora233/DDBOT)
[![GoDoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](https://pkg.go.dev/github.com/Sora233/DDBOT)
DDBOT是一个基于 [MiraiGO](https://github.com/Mrs4s/MiraiGo) 的QQ群推送框架, 内置支持b站直播/动态,斗鱼直播,YTB直播/预约直播,虎牙直播,ACFUN直播,微博动态,
也可以通过插件支持任何订阅源。
*DDBOT不是一个聊天机器人。*
[Bilibili专栏](https://www.bilibili.com/read/cv10602230)
-----
## 设计理念
制作bot的本意是为了减轻一些重复的工作负担,bot只会做好bot份内的工作:
- ddbot的交互被刻意设计成最小程度,正常交流时永远不必担心会误触ddbot。
- ddbot只有两种情况会主动发言,更新动态和直播,以及答复命令结果。
## **基本功能:**
- **B站直播/动态推送**
- 让阁下在DD的时候不错过任何一场突击。
- 支持按关键字过滤,只推送有关键字的动态。
- 支持按动态类型过滤,例如:不推送转发的动态,只推送视频/专栏投稿,只推动带图片的动态等等。
- **斗鱼直播推送**
- 没什么用,主要用来看爽哥。
- **油管直播/视频推送**
- 支持推送预约直播信息及视频更新。
- **虎牙直播推送**
- 不知道能看谁。
- **ACFUN直播推送**
- 好像也有一些虚拟主播
- **微博动态推送**
- 支持自定义**插件**,可通过插件支持任意订阅来源
- 需要写代码
- 可配置的 **@全体成员**
- 只建议单推群开启。
- **倒放**
- 主要用来玩。
- **Roll**
- 没什么用的roll点。
- **签到**
- 没什么用的签到。
- **权限管理**
- 可配置整个命令的启用和禁用,也可对单个用户配置命令权限,防止滥用。
- **帮助**
- 输出一些没什么帮助的信息。
<details>
<summary>里命令</summary>
以下命令默认禁用,使用enable命令后才能使用
- **随机图片**
-[api.lolicon.app](https://api.lolicon.app/#/) 提供
</details>
### 推送效果
<img src="https://user-images.githubusercontent.com/11474360/111737379-78fbe200-88ba-11eb-9e7e-ecc9f2440dd8.jpg" width="300">
### 用法示例
详细介绍及示例请查看:[详细示例](/EXAMPLE.md)
~~阁下可添加官方Demo机器人体验~~
不再提供官方的公开BOT,你可以加入交流群申请使用群友搭建的BOT,也可以选择自己搭建。
## 使用与部署
对于普通用户,推荐您选择使用开放的官方Demo机器人。
您也可以选择私人部署,[详见部署指南](/INSTALL.md)
私人部署的好处:
- 保护您的隐私,bot完全属于您,我无法得知您bot的任何信息(我甚至无法知道您部署了一个私人bot)
- 稳定的@全体成员功能
- 可定制BOT账号的头像、名字、签名
- 减轻我的服务器负担
- 很cool
如果您遇到任何问题,或者有任何建议,可以加入**唯一指定交流群:755612788**
## 最近更新
请参考[更新文档](/UPDATE.md)
## 常见问题FAQ
提问前请先查看[FAQ文档](/FAQ.md),如果仍然未能解决,请咨询唯一指定交流群。
## 增加推送来源 (为DDBOT编写插件)
DDBOT可以作为一个通用的QQ推送框架来使用。
您可以通过为DDBOT编写插件,DDBOT会为您完成大部分工作,您只需要实现少量代码,就能支持一个新的来源。
如果您对此有兴趣,请查看[框架文档](/FRAMEWORK.md)
## 自定义消息模板 & 自定义命令回复
DDBOT已实现消息模板功能,一些内置命令和推送可通过模板自定义格式。
同时支持自定义命令,自动回复模板内容。
详细介绍请看[模板文档](/TEMPLATE.md)
## 注意事项
- **bot只在群聊内工作,但命令可以私聊使用,以避免在群内刷屏**(少数次要娱乐命令暂不支持,详细列表请看用法指南)
- **建议bot秘密码设置足够强,同时不建议把bot设置为QQ群管理员,因为存在密码被恶意爆破的可能(包括但不限于盗号、广告等)**
- **您应当知道,bot账号可以人工登陆,请注意个人隐私**
- bot掉线无法重连时将自动退出,请自行实现保活机制
- bot使用 [buntdb](https://github.com/tidwall/buntdb) 作为embed database,会在当前目录生成文件`.lsp.db`
,删除该文件将导致bot恢复出厂设置,可以使用 [buntdb-cli](https://github.com/Sora233/buntdb-cli) 作为运维工具,但注意不要在bot运行的时候使用(buntdb不支持多写)
## 声明
- 您可以免费使用DDBOT进行其他商业活动,但不允许通过出租、出售DDBOT等方式进行商业活动。
- 如果您运营了私人部署的BOT,可以接受他人对您私人部署的BOT进行捐赠以帮助BOT运行,但该过程必须本着自愿的原则,不允许用BOT使用权来强制他人进行捐赠。
- 如果您使用了DDBOT的源代码,或者对DDBOT源代码进行修改,您应该用相同的开源许可(AGPL3.0)进行开源,并标明著作权。
## 贡献
*Feel free to make your first pull request.*
想要为开源做一点微小的贡献?
[Golang点我入门!](https://github.com/justjavac/free-programming-books-zh_CN#go)
您也可以选择点一下右上角的⭐星⭐
发现问题或功能建议请到 [issues](https://github.com/Sora233/DDBOT/issues)
其他用法问题请到**唯一指定交流群:755612788**
## 赞助
(排名按时间先后顺序)
| 赞助者 | 渠道 | 金额 |
|--------------|-----|---------|
| VE-H Maw | 爱发电 | ¥30.00 |
| 饱受突击的3737民 | 爱发电 | ¥168.00 |
| 刀光流水 | 爱发电 | ¥5.00 |
| 爱发电用户_4QBx | 爱发电 | ¥5.00 |
| XDMrSmile_鸟鸟 | 爱发电 | ¥120.00 |
| 别赋清颜 | 爱发电 | ¥300.00 |
| 赫尔博达 | 爱发电 | ¥50.00 |
| 冰王星 | 爱发电 | ¥5.00 |
| yzr6991 | 爱发电 | ¥30.00 |
| 么鱼 | 爱发电 | ¥5.00 |
| Darren今天社恐了嘛 | 爱发电 | ¥5.00 |
| Ed😓 | 爱发电 | ¥5.00 |
| 殿九 | 爱发电 | ¥30.00 |
| ACR | 爱发电 | ¥50.00 |
| 南宫 | 爱发电 | ¥30.00 |
| 宇 | QQ | ¥100.00 |
| 殿九 | QQ | ¥50.00 |
| 梦幻七罪 | 爱发电 | ¥5.00 |
| 电子鸽子 | 爱发电 | ¥30.00 |
| 星落泪羽 | 爱发电 | ¥30.00 |
## 鸣谢
> [Goland](https://www.jetbrains.com/go/) 是一个非常适合Gopher的智能IDE,它极大地提高了开发人员的效率。
特别感谢 [JetBrains](https://jb.gg/OpenSource) 为本项目提供免费的 [Goland](https://www.jetbrains.com/go/) 等一系列IDE的授权
[<img src="https://user-images.githubusercontent.com/11474360/112592917-baa00600-8e41-11eb-9da4-ecb53bb3c2fa.png" width="200"/>](https://jb.gg/OpenSource)
## DDBOT:star:趋势图
[![Stargazers over time](https://starchart.cc/Sora233/DDBOT.svg)](https://starchart.cc/Sora233/DDBOT)
此差异已折叠。
## DDBOT最近更新日志
- 2023-07-01 v1.1.2
- 更新登录代码
```
# 本版本需要配置签名服务器,详情请看https://github.com/Mrs4s/go-cqhttp/issues/2242
# 请在application.yaml文件中添加配置:
sign-server: "你的签名服务器"
```
- 2023-05-27 v1.1.1
- 更新登录代码
- 更新b站接口签名
- 2023-03-21 v1.1.0
- 适配新miraigo和登录代码(更新时需要手动删除device.json文件)
- 2022-10-19 v1.0.9.2
- 修复grant命令
- 2022-10-02 v1.0.9
- 通用:
- 更新b站DynamicHistory接口
- 修复b站XSpaceAccInfo接口-401错误
- 升级go版本至1.19
- 现在推送时@全员合并成一条消息
- 模板:
- 现在会自动去除模板文件的bom,带有bom的模板不会再意外地换行了
- 新增支持发送戳一戳消息,和戳一戳事件模板
- 新增模板函数`bot_uin`返回bot的qq号码
- 新增模板变量`{{ .template_name }}`返回当前执行的模板名字
- 新增模板函数`cooldown`可以设置计时
- 新增模板函数`openFile`用于读取本地文件
- 新增模板函数`abort`用于退出当前模板,并且已经产生的消息将被丢弃,如果有传入参数,参数将被作为消息发送
- 新增模板函数`fin`用于退出当前模板,并且已经产生的消息将被发送,未处理的模板代码将被跳过
- 2022-07-05 v1.0.8
- 通用:
- 从零开始的BOT不会再提醒迁移数据库了
- 增加了数据库独占锁,当尝试重复启动单个BOT时将提示错误以防止数据库损坏 *(不会影响多个BOT同时使用)*
- windows下一些致命错误将使用messagebox提示
- 修复一些条件下无法正常触发命令的情况
- 增加`/检测异常订阅`命令用于查询未能正常退出的群的订阅
- 增加`/清除订阅`命令用于清除异常订阅,或者清除指定群的订阅,清除时可以指定订阅网站和种类
- 模板:
- 修复32位下模板无法解析int64的情况
- 自定义命令支持@成员参数
- 新增模板命令获取指定成员的基本信息
- 模板函数`choose`现在可以在每一项后增加一个可选的权重(整数),如未指定则为1
- 自定义命令新增{{.full_args}}获取完整的包含空格的字符串格式的参数
- 自定义命令现在遇到非文字内容(图片等)时会跳过该内容,而不是直接停止解析参数
- 模板现在允许比较字符串类型的数字和数字类型的数字
- 修复私聊模板无法获取参数的问题
- 新增模板函数`{{weekday}}`获取当天是星期几
- 新增一系列模板函数,包括字符串、list、dict、数学、哈希、默认值空值
- 模板函数`pic`支持base64字符串格式的图片
- 新增模板函数`httpGet` `httpPostJson` `httpPostForm`用于发送http get/post请求
- 新增模板函数`toGJson`用于处理json
- 修复customCommandPrefix不支持大写字母的问题
- 2022-05-17 v1.0.7
- 通用:
- 修复@时显示QQ号的问题(这次是真的)
- 修复release ci没有正确设置版本的问题
- 支持重定义特定命令的前缀,可以设置无需前缀的自定义命令,参考完整配置的`customCommandPrefix`
- 支持定义`cronjob`定时消息模板,详细介绍请看[模板介绍](/TEMPLATE.md)
- 增加b站下播的准确检查,现在不会再发生`错误下播->马上开播`的情况了
- 模板:
- 现在支持自定义命令传入文字参数,在模板中可以通过{{.cmd}}和{{.args}}变量获取命令名字和参数
- 增加`trigger.private.new_friend_added.tmpl`事件模板
- 增加`trigger.private.group_invited.tmpl`事件模板
- 增加`hour minute second month year day yearday`等时间函数
- 新增私聊命令`/ping`支持模板
- 模板函数`pic`默认不再对url图片进行缓存,这意味着会返回随机图片的url可以正常工作了
- 2022-04-14 v1.0.6
- 通用:
- 更换自定义miraigo,可能减少消息发送失败
- 增加定时监测新版本,并会通知Admin
- 使用新的推送限流方式,现在更多地考虑账号稳定
- 支持Concern启动失败,没有启动成功的Concern无法再使用相关命令
- 支持B站不配置帐号使用,仅推荐订阅**不超过5个**时使用(用于初次部署时快速验证),**配置帐号仍旧是最佳方案**
- 修复@时显示QQ号的问题
- 增加推送消息的并发配置,默认为1以优先保证账号稳定,当出现推送堆积的时候可以尝试调高
- 支持配置不推送BOT离线期间的B站动态和直播
- 现在当BOT设置为私人模式时,被私自拉进群聊时无法再使用了(当群聊人数较少时,系统会直接同意,无法拒绝)
- 模板:
- 模板函数pic支持本地gif
- 新增模板函数用于@成员
- 新增模板函数显示成员头像
- 增加更多消息模板上下文,主要是群命令和私聊命令的member_code/member_name
- 现在模板消息会自动去掉模板末尾的EOL,一些editor可能会自动添加EOL(eg. VIM)
- 2022-04-04 v1.0.5
- 增加巨量推送的判定配置,默认为50
- 修复无法使用socks5协议代理的问题
- 增加b站禁止自动关注的配置,这意味着只能订阅b站帐号内已经关注的用户;当需要订阅新用户时,只能手动在b站关注
- qq聊天记录默认不再输出到终端,需要手动配置开启,过去为默认开启
- 修复油管推送当多个群订阅的时候,只能发送到一个群的问题 (fix #129)
- 修复一个和推送@相关的race condition
- 修复推送时可能多次@全员的问题
- 增加消息模板,为一些功能的实现做准备,模板的详细介绍请看[模板介绍](/TEMPLATE.md)
- 增加自定义命令回复,触发命令时自动回复定义的模板消息,模板的详细介绍请看[模板介绍](/TEMPLATE.md)
- **模板尚处于实验性质,不排除模板规则变动的可能**
- 2022-02-14 v1.0.4
- 现在`/admin`命令在有权限的情况下支持列出一个群内的GroupAdmin
- 修复登陆出现的问题
- 增加巨量推送时的限流,当一次性推送至50个群以上时,将增加推送延迟避免被封qq号
- 现在支持手动关注b站用户,当ddbot订阅b站用户关出现注失败时,可以手动登陆b站账号关注,这个功能可能有几十秒的延迟
- 支持设置b站关注需要的粉丝数量,当粉丝数量不足时无法订阅,这主要是用来过滤一些无用的测试订阅(仍然可以手动登陆b站关注)
- 更新微博图片到原图
- 2022-01-27 v1.0.3
- 支持配置不在命令行内显示qq聊天记录
- 现在admin邀请bot加群时会自动同意,不论bot设置成什么mode
- 更好的自适应命令名称
- 在windows平台增加了额外退出机制保证在点击console ×的时候可以正常退出
- 修复acfun无法订阅的问题
- 修复b站订阅的账号异常问题
- 更好的`twitcasting`订阅 ( by [@eric2788](https://github.com/eric2788) )
- 2021-12-24 v1.0.2
- 新增订阅源`twitcasting` ( by [@eric2788](https://github.com/eric2788) )
- 支持socks5代理
- 增加miraigo `AnimatedSticker` 支持
- 更新miraigo解决SSO frame panic问题
- *merry Christmas*
- 2021-12-08 v1.0.1.1
- 由于发现登陆出现问题,快速更新miraigo版本发现似乎可以解决
- 修复douyu/huya一些情况下在订阅的时刻会立即错误推送的问题
- 2021-12-05 v1.0.1
- 修复更新检查会失败的问题
- 优化推送时内存的使用,现在对内存的使用大幅优化了
- 更新miraigo消息类型
- 更新项目整体结构,优化依赖,现在可以通过`DDBOT.Run`方法启动bot,编写插件时更加方便了
- b站直播推送链接去掉了多余的参数
- 修复油管一些情况不推送的问题
- 修复在某些情况下unwatch一些不存在的订阅的时候会返回成功的问题
- 增强一些错误信息
- 2021-11-19 v1.0.0
- 升级到DDBOTv2版本,v1版本将不会再增加订阅源,v2版本预计将会支持更多订阅源
- 实现数据库迁移机制,支持无缝从v1迁移到v2
- 更新b站推送@机制,如果bot因为一些原因一段时间没有成功刷新b站,则启动之后前几次刷新时不会触发@指令(即延迟的消息不再@)。
- b站推送缩略推送增加了动态时间
- 更新b站缩略推送样式,现在如果可以会回复之前推送的动态
- 增加b站 cookie过期检测,现在可以正确处理cookie提前过期了(b站自动登录目前为失效状态)
- 支持b站账号订阅账号自身的动态和直播
- b站动态推送增加更多检测被审核动态的方法(目前仍无法100%找回)
- 增加了一些缓存,优化在低带宽(<=1m)环境下的表现
- 删除`/face`命令,去除gocv,不再支持使用gocv
- `/list`命令支持网站参数,可以通过`-s`指定要查询的网站,防止订阅网站过多
- 增加命令前缀的配置,默认为斜杠`/`,可自定义成其他
- 删除芝麻代理配置,不再支持芝麻代理池
- 限制bot发言频率,避免同一时间推送过过过于频繁而被封号(私人bot的发言频率几乎不会受到影响)
- 修复当消息带有回复时,@检查失效的问题
- **新增支持ACFUN直播推送,微博动态推送**
- **升级到v1.0.0之后无法再退回v1.0.0版本以下!如果您追求稳定性,可以选择暂时不升级**
- 2021-10-14 v0.1.4
- 增加@检查,当消息以@开头,如果@对象不是当前bot,则会跳过本条消息
- local proxy pool 会自动识别uri schema了,如果没有schema,则默认是http,因此也支持https了。
- 增加b站登陆失败原因信息
- 修复一些bug
- 删除阿里云相关功能
- 一些悄悄地升级到v2版本的准备工作
- 2021-10-10 v0.1.3.1
- 修复开启取关配置后,在特定情况下,b站会错误取消关注的情况
- 完善取关触发时机,触发退群时也会尝试取关了
- 2021-10-08 v0.1.3
- 增加多次转发的省略机制,短时间推送同一条动态的多次转发时,只有第一次会显示全部内容,后续转发动态将被省略(看asoul更方便了)
- 更新b站FeedList接口逻辑,减少在b站接口失败时会误报的情况
- 增加b站4302类型动态
- 增加管理员命令`/admin`,用于查看当前拥有Admin权限的人
- 增加进群后修改bot改名的配置,现在可以自定义改名内容或者取消改名了
- 支持配置b站关注时使用悄悄关注
- 支持设置b站自动取消关注
- 支持设置沉默模式,会减少一些命令的输出信息,具体范围请看命令文档
- 2021-09-20 v0.1.2
- 修复youtube推送有时候被错误过滤掉的问题
- 修复审核模式下同意单个好友请求时,会删除剩下的请求的问题
- 更新b站直播刷新链接(与PC web端保持一致)
- 增加掉线时处理方式配置,可以禁用自动重连
- 更新ci及ut配置
- 2021-08-31 v0.1.1
- 增加启动完成时的文案,避免让人以为卡住了
- 支持当b站使用帐号密码登陆时,cookie可以自动过期并且刷新了
- 支持配置b站图片是否合并
- 修复b站转发动态原动态失效时会推送错误格式的问题
- 修复关注b站动态时有时候会错误地显示一条关于直播的提示的问题
- 2021-08-23 v0.1.0.1
- 更新b站登陆方案,修复b站登陆失效的问题
- 2021-08-22 v0.1.0
- 支持设置bot运行模式,支持“公开”、“私人”、“审核”三种,私人模式下bot会拒绝群邀请和好友申请,审核模式下bot会保留申请,等待审核
- 优化了一些性能,减少了写磁盘频率
- 不再推送b站4308类型的动态(对应发布直播信息的推送,应该不是手动发布的),新增b站4098/4099/4101/4300类型的动态
- 修复取消最后一个直播订阅时,无法刷新直播状态的问题
- 修复local image pool不支持图片数量的问题
- 修复退群时有一些key没被删除的问题
- 修复config命令有时候没有答复的问题
- 2021-08-14 发布 v0.0.20
- 支持关闭消息自动已读功能
- 支持配置图床代理,默认使用`pixiv.cat`
- 升级至miraigo最新版本
- 修复本地时间有误差时可能无法操作bot的问题
- 重构了日志格式,更换成更适合人类阅读的格式
- 更新了b站图片merge的策略
- 增加联合投稿的防刷屏机制,短时间内多人联合投稿,后续动态将被简化
- 下播推送时去掉了链接
- 2021-08-09 发布 v0.0.19
- 支持了优雅停机,现在关闭DDBOT时会等待排队的推送发送完毕。
- 更新了合并图片的逻辑,现在在非9图但比较刷屏的情况也会合并图片了。
- 增加了合并图片的缓存,之前同一动态在多个群内推送时会每个群都做一次合并图片。
- 增加了版本管理,以及启动时检查更新的逻辑。
- 更新了许多日志文案信息。
- 修复了私聊消息已读没有生效的bug。
- 去除了全体禁用的检测(因为管理员权限并不准确)。
- 支持了b站直播预约抽奖。
- 增强了quit命令清除数据的力度。
- 简化了帮助信息,只留下最常见的使用场景,其他详细命令请看命令文档。
- 增加了b站订阅直播时检测粉丝数的逻辑,如果粉丝数过少,将提示确认订阅无误(主要是用直播间ID来订阅的情况,直播间ID也可能是合法的UID)。
- 2021-08-01 发布 v0.0.18
- 增加了管理员命令/quit,用于退出群聊,或清除未正常退出的群的数据。
- 重构buntdb支持嵌套事务,现在被禁言时不会再尝试推送了
- 2021-07-24 发布 v0.0.17
- 增加了b站使用账号密码登陆,可以不用再手动填cookie了(非常容易出错)
- 2021-07-17 发布 v0.0.16
- 增加了禁用单个命令的管理员命令,对所有群组生效
- 2021-07-12 发布 v0.0.15
- 改善了初次使用的体验(增加扫码登陆,自动生成device.json和application.yaml)
- 增加了config配置下播推送,直播间标题推送,开启@全体成员,b站动态推送过滤器。
- 增加了config命令,目前支持配置推送同时@成员(实验阶段,并不保证稳定,目前只支持直播推送)。
- 增加了私聊的grant命令,现在可以通过私聊配置qq群内的群友命令权限了。
- 更新了list命令,现在list命令会展示所有网站的所有订阅,不必再指定-s和-t了。
- 增加了私聊的list命令,现在可以通过私聊查看订阅列表了。
- 增加了虎牙直播的推送。
- 增加了私聊的enable和disable命令,现在可以通过私聊配置qq群内的命令了。
- 增加了私聊的watch和unwatch命令,现在可以通过私聊配置qq群内的订阅了(注意仍然是qq群推送)。
- 更换船新b站监控方案,预计单帐号可支持1000订阅,最大延迟30秒。
package DDBOT
import (
"fmt"
"github.com/Sora233/DDBOT/lsp"
"github.com/Sora233/DDBOT/warn"
"github.com/Sora233/MiraiGo-Template/bot"
"github.com/Sora233/MiraiGo-Template/config"
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
"github.com/rifflock/lfshook"
"github.com/sirupsen/logrus"
"io/ioutil"
"os"
"os/signal"
"path"
"runtime"
"strings"
"syscall"
"time"
_ "github.com/Sora233/DDBOT/logging"
_ "github.com/Sora233/DDBOT/lsp/acfun"
_ "github.com/Sora233/DDBOT/lsp/douyu"
_ "github.com/Sora233/DDBOT/lsp/huya"
_ "github.com/Sora233/DDBOT/lsp/twitcasting"
_ "github.com/Sora233/DDBOT/lsp/weibo"
_ "github.com/Sora233/DDBOT/lsp/youtube"
_ "github.com/Sora233/DDBOT/msg-marker"
)
// SetUpLog 使用默认的日志格式配置,会写入到logs文件夹内,日志会保留七天
func SetUpLog() {
writer, err := rotatelogs.New(
path.Join("logs", "%Y-%m-%d.log"),
rotatelogs.WithMaxAge(7*24*time.Hour),
rotatelogs.WithRotationTime(24*time.Hour),
)
if err != nil {
logrus.WithError(err).Error("unable to write logs")
return
}
logrus.SetFormatter(&logrus.TextFormatter{
FullTimestamp: true,
PadLevelText: true,
QuoteEmptyFields: true,
})
logrus.AddHook(lfshook.NewHook(writer, &logrus.TextFormatter{
FullTimestamp: true,
PadLevelText: true,
QuoteEmptyFields: true,
ForceQuote: true,
}))
}
// Run 启动bot,这个函数会阻塞直到收到退出信号
func Run() {
if fi, err := os.Stat("device.json"); err != nil {
if os.IsNotExist(err) {
fmt.Println("警告:没有检测到device.json,正在生成,如果是第一次运行,可忽略")
bot.GenRandomDevice()
} else {
warn.Warn(fmt.Sprintf("检查device.json文件失败 - %v", err))
os.Exit(1)
}
} else {
if fi.IsDir() {
warn.Warn("检测到device.json,但目标是一个文件夹!请手动确认并删除该文件夹!")
os.Exit(1)
} else {
fmt.Println("检测到device.json,使用存在的device.json")
}
}
if fi, err := os.Stat("application.yaml"); err != nil {
if os.IsNotExist(err) {
fmt.Println("警告:没有检测到配置文件application.yaml,正在生成,如果是第一次运行,可忽略")
if err := ioutil.WriteFile("application.yaml", []byte(exampleConfig), 0755); err != nil {
warn.Warn(fmt.Sprintf("application.yaml生成失败 - %v", err))
os.Exit(1)
} else {
fmt.Println("最小配置application.yaml已生成,请按需修改,如需高级配置请查看帮助文档")
}
} else {
warn.Warn(fmt.Sprintf("检查application.yaml文件失败 - %v", err))
os.Exit(1)
}
} else {
if fi.IsDir() {
warn.Warn("检测到application.yaml,但目标是一个文件夹!请手动确认并删除该文件夹!")
os.Exit(1)
} else {
fmt.Println("检测到application.yaml,使用存在的application.yaml")
}
}
config.GlobalConfig.SetConfigName("application")
config.GlobalConfig.SetConfigType("yaml")
config.GlobalConfig.AddConfigPath(".")
config.GlobalConfig.AddConfigPath("./config")
err := config.GlobalConfig.ReadInConfig()
if err != nil {
warn.Warn(fmt.Sprintf("读取配置文件失败!请检查配置文件格式是否正确 - %v", err))
os.Exit(1)
}
config.GlobalConfig.WatchConfig()
// 快速初始化
bot.Init()
// 初始化 Modules
bot.StartService()
// 登录
bot.Login()
// 刷新好友列表,群列表
bot.RefreshList()
lsp.Instance.PostStart(bot.Instance)
ch := make(chan os.Signal, 1)
signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
<-ch
bot.Stop()
}
var exampleConfig = func() string {
s := `
# 注意,填写时请把井号及后面的内容删除,并且冒号后需要加一个空格
sign-server: ""
bot:
account: # 你bot的qq号,不填则使用扫码登陆
password: # 你bot的qq密码
onJoinGroup:
rename: "【bot】" # BOT进群后自动改名,默认改名为“【bot】”,如果留空则不自动改名
# 初次运行时将不使用b站帐号方便进行测试
# 如果不使用b站帐号,则推荐订阅数不要超过5个,否则推送延迟将上升
# b站相关的功能推荐配置一个b站账号,建议使用小号
# bot将使用您b站帐号的以下功能:
# 关注用户 / 取消关注用户 / 查看关注列表
# 请注意,订阅一个账号后,此处使用的b站账号将自动关注该账号
bilibili:
SESSDATA: # 你的b站cookie
bili_jct: # 你的b站cookie
interval: 25s
concern:
emitInterval: 5s
logLevel: info
`
// win上用记事本打开不会正确换行
if runtime.GOOS == "windows" {
s = strings.ReplaceAll(s, "\n", "\r\n")
}
return s
}()
//go:build !windows
// +build !windows
package main
func exitHook(func()) error {
return nil
}
//go:build windows
// +build windows
package main
import (
"syscall"
"time"
)
const (
CTRL_C_EVENT = uint32(0)
CTRL_BREAK_EVENT = uint32(1)
CTRL_CLOSE_EVENT = uint32(2)
CTRL_LOGOFF_EVENT = uint32(5)
CTRL_SHUTDOWN_EVENT = uint32(6)
)
var (
kernel32 = syscall.NewLazyDLL("kernel32.dll")
procSetConsoleCtrlHandler = kernel32.NewProc("SetConsoleCtrlHandler")
)
func exitHook(f func()) error {
n, _, err := procSetConsoleCtrlHandler.Call(
syscall.NewCallback(func(controlType uint32) uint {
f()
time.Sleep(time.Second * 1)
switch controlType {
case CTRL_CLOSE_EVENT:
return 1
default:
return 0
}
}),
1)
if n == 0 {
return err
}
return nil
}
package main
import (
"fmt"
"github.com/Sora233/DDBOT"
_ "github.com/Sora233/DDBOT/logging"
"github.com/Sora233/DDBOT/lsp"
_ "github.com/Sora233/DDBOT/lsp/acfun"
"github.com/Sora233/DDBOT/lsp/bilibili"
localdb "github.com/Sora233/DDBOT/lsp/buntdb"
_ "github.com/Sora233/DDBOT/lsp/douyu"
_ "github.com/Sora233/DDBOT/lsp/huya"
"github.com/Sora233/DDBOT/lsp/permission"
_ "github.com/Sora233/DDBOT/lsp/weibo"
_ "github.com/Sora233/DDBOT/lsp/youtube"
_ "github.com/Sora233/DDBOT/msg-marker"
"github.com/Sora233/DDBOT/warn"
"github.com/Sora233/MiraiGo-Template/config"
"github.com/alecthomas/kong"
"net/http"
_ "net/http/pprof"
"os"
"runtime"
)
func main() {
var cli struct {
Play bool `optional:"" help:"运行play函数,适用于测试和开发"`
Debug bool `optional:"" help:"启动debug模式"`
SetAdmin int64 `optional:"" xor:"c" help:"设置admin权限"`
Version bool `optional:"" xor:"c" short:"v" help:"打印版本信息"`
SyncBilibili bool `optional:"" xor:"c" help:"同步b站帐号的关注,适用于更换或迁移b站帐号的时候"`
}
kong.Parse(&cli)
if cli.Version {
fmt.Printf("Tags: %v\n", lsp.Tags)
fmt.Printf("COMMIT_ID: %v\n", lsp.CommitId)
fmt.Printf("BUILD_TIME: %v\n", lsp.BuildTime)
os.Exit(0)
}
if err := localdb.InitBuntDB(""); err != nil {
if err == localdb.ErrLockNotHold {
warn.Warn("tryLock数据库失败:您可能重复启动了这个BOT!\n如果您确认没有重复启动,请删除.lsp.db.lock文件并重新运行。")
} else {
warn.Warn("无法正常初始化数据库!请检查.lsp.db文件权限是否正确,如无问题则为数据库文件损坏,请阅读文档获得帮助。")
}
return
}
if runtime.GOOS == "windows" {
if err := exitHook(func() {
localdb.Close()
}); err != nil {
localdb.Close()
warn.Warn("无法正常初始化Windows环境!")
return
}
} else {
defer localdb.Close()
}
if cli.SetAdmin != 0 {
sm := permission.NewStateManager()
err := sm.GrantRole(cli.SetAdmin, permission.Admin)
if err != nil {
fmt.Printf("设置Admin权限失败 %v\n", err)
}
return
}
if cli.SyncBilibili {
config.Init()
c := bilibili.NewConcern(nil)
c.StateManager.FreshIndex()
bilibili.Init()
c.SyncSub()
return
}
fmt.Println("DDBOT唯一指定交流群:755612788")
if cli.Debug {
lsp.Debug = true
go http.ListenAndServe("localhost:6060", nil)
}
if cli.Play {
play()
return
}
DDBOT.SetUpLog()
DDBOT.Run()
}
package main
func play() {
}
module github.com/Sora233/DDBOT
go 1.20
require (
github.com/Jeffail/gabs/v2 v2.7.0
github.com/Mrs4s/MiraiGo v0.0.0-20230627090859-19e3d172596e
github.com/PuerkitoBio/goquery v1.8.1
github.com/Sora233/MiraiGo-Template v0.0.0-20230701113809-5e00ec58aa6f
github.com/Sora233/sliceutil v0.0.0-20210120043858-459badd8d882
github.com/alecthomas/kong v0.7.1
github.com/davecgh/go-spew v1.1.1
github.com/dimchansky/utfbom v1.1.1
github.com/ericpauley/go-quantize v0.0.0-20200331213906-ae555eb2afa4
github.com/fsnotify/fsnotify v1.6.0
github.com/ghodss/yaml v1.0.0
github.com/gofrs/flock v0.8.1
github.com/google/uuid v1.3.0
github.com/guonaihong/gout v0.3.7
github.com/hashicorp/golang-lru v0.5.4
github.com/huandu/xstrings v1.4.0
github.com/imdario/mergo v0.3.14
github.com/json-iterator/go v1.1.12
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
github.com/mitchellh/copystructure v1.2.0
github.com/modern-go/gls v0.0.0-20220109145502-612d0167dce5
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
github.com/nobuf/cas v0.0.0-20211227073117-1f46a292d04a
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
github.com/robfig/cron/v3 v3.0.1
github.com/samber/lo v1.38.1
github.com/shopspring/decimal v1.3.1
github.com/sirupsen/logrus v1.9.3
github.com/spf13/cast v1.5.1
github.com/stretchr/testify v1.8.3
github.com/tidwall/buntdb v1.2.10
github.com/tidwall/gjson v1.14.4
go.uber.org/atomic v1.10.0
golang.org/x/sync v0.3.0
google.golang.org/protobuf v1.31.0
)
require (
github.com/RomiChan/protobuf v0.1.1-0.20230204044148-2ed269a2e54d // indirect
github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e // indirect
github.com/andybalholm/brotli v1.0.5 // indirect
github.com/andybalholm/cascadia v1.3.1 // indirect
github.com/bytedance/sonic v1.9.2 // indirect
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
github.com/fumiama/imgsz v0.0.2 // indirect
github.com/gabriel-vasile/mimetype v1.4.2 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.14.1 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/jonboulle/clockwork v0.4.0 // indirect
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
github.com/leodido/go-urn v1.2.4 // indirect
github.com/lestrrat-go/strftime v1.0.6 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.0.8 // indirect
github.com/pierrec/lz4/v4 v4.1.18 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/spf13/afero v1.9.5 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/spf13/viper v1.16.0 // indirect
github.com/subosito/gotenv v1.4.2 // indirect
github.com/tidwall/btree v1.6.0 // indirect
github.com/tidwall/grect v0.1.4 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.1 // indirect
github.com/tidwall/rtred v0.1.2 // indirect
github.com/tidwall/tinyqueue v0.1.1 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
golang.org/x/arch v0.3.0 // indirect
golang.org/x/crypto v0.10.0 // indirect
golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect
golang.org/x/net v0.11.0 // indirect
golang.org/x/sys v0.9.0 // indirect
golang.org/x/text v0.10.0 // indirect
gopkg.ilharper.com/x/isatty v1.1.1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
此差异已折叠。
package local_pool
import (
"errors"
"github.com/Sora233/DDBOT/image_pool"
localutils "github.com/Sora233/DDBOT/utils"
"github.com/Sora233/MiraiGo-Template/utils"
"io/ioutil"
"math/rand"
"os"
"sync"
"time"
)
var logger = utils.GetModuleLogger("local_pool")
type LocalPool struct {
freshMutex *sync.Mutex
imageDir string
imageList []string
}
type Image struct {
Path string
}
func (i *Image) Content() ([]byte, error) {
return ioutil.ReadFile(i.Path)
}
func (pool *LocalPool) Get(opts ...image_pool.OptionFunc) ([]image_pool.Image, error) {
if pool == nil {
return nil, errors.New("pool status down")
}
pool.freshMutex.Lock()
defer pool.freshMutex.Unlock()
if len(pool.imageList) == 0 {
return nil, errors.New("no image")
}
var (
result []image_pool.Image
option = make(image_pool.Option)
num = 1
)
for _, opt := range opts {
opt(option)
}
for k, v := range option {
switch k {
case "num":
_v, ok := v.(int)
if ok {
num = _v
}
}
}
for i := 0; i < num; i++ {
result = append(result, &Image{
Path: pool.imageList[rand.Intn(len(pool.imageList))],
})
}
return result, nil
}
func (pool *LocalPool) RefreshImage() error {
pool.freshMutex.Lock()
defer pool.freshMutex.Unlock()
files, err := localutils.FilePathWalkDir(pool.imageDir)
if err != nil {
return err
} else {
pool.imageList = files
}
return nil
}
func NewLocalPool(path string) (*LocalPool, error) {
if i, err := os.Stat(path); err != nil || i == nil {
return nil, errors.New("invalid path")
}
pool := &LocalPool{
imageDir: path,
freshMutex: new(sync.Mutex),
imageList: make([]string, 0),
}
err := pool.RefreshImage()
if err != nil {
return nil, err
}
go func() {
timer := time.NewTimer(time.Minute)
for {
select {
case <-timer.C:
err := pool.RefreshImage()
if err != nil {
logger.Errorf("local pool refresh failed %v", err)
}
timer.Reset(time.Minute)
}
}
}()
return pool, nil
}
此差异已折叠。
package lolicon_pool
import "fmt"
var (
ErrNotFound = fmt.Errorf("没有符合条件的图片")
ErrAPIKeyError = fmt.Errorf("APIKEY 不存在或被封禁")
ErrQuotaExceed = fmt.Errorf("达到调用额度限制")
)
此差异已折叠。
此差异已折叠。
package image_pool
import "errors"
var ErrNotInit = errors.New("not init")
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
package acfun
import "github.com/Sora233/DDBOT/lsp/concern"
type GroupConcernConfig struct {
concern.IConfig
}
func NewGroupConcernConfig(g concern.IConfig) *GroupConcernConfig {
return &GroupConcernConfig{g}
}
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册