zhinjs / zhin Goto Github PK
View Code? Open in Web Editor NEWa chat bot framework for Node.js developers, compatible with qq、icqq、wechat、discord、onebot(11/12)、dingtalk and more
Home Page: https://docs.zhin.dev
License: MIT License
a chat bot framework for Node.js developers, compatible with qq、icqq、wechat、discord、onebot(11/12)、dingtalk and more
Home Page: https://docs.zhin.dev
License: MIT License
plugins:
config: null # 指定启用配置管理插件
daemon: null # 指定启用守护进程插件
help: null # 指定启用帮助插件
login: null # 指定启用命令行登录插件
plugin: null # 指定启用插件管理插件
systemInfo: null # 指定启用系统信息查看插件
watcher: plugins # 指定启用文件监听插件
repeater: null # 指定启用复读机插件
没有文档
% npm init zhin
Create Zhin
✔ Project name: … tw-qq-bot
Error: TAR_BAD_ARCHIVE: Unrecognized archive format
at Unpack.warn (/Users/linonetwo/.npm/_npx/f2b2dbed5e8bf168/node_modules/tar/lib/warn-mixin.js:21:40)
at Unpack.warn (/Users/linonetwo/.npm/_npx/f2b2dbed5e8bf168/node_modules/tar/lib/unpack.js:229:18)
at Unpack. (/Users/linonetwo/.npm/_npx/f2b2dbed5e8bf168/node_modules/tar/lib/parse.js:83:14)
at Unpack.emit (node:events:525:35)
at [emit] (/Users/linonetwo/.npm/_npx/f2b2dbed5e8bf168/node_modules/tar/lib/parse.js:303:12)
at [maybeEnd] (/Users/linonetwo/.npm/_npx/f2b2dbed5e8bf168/node_modules/tar/lib/parse.js:426:17)
at [consumeChunk] (/Users/linonetwo/.npm/_npx/f2b2dbed5e8bf168/node_modules/tar/lib/parse.js:434:21)
at Unpack.write (/Users/linonetwo/.npm/_npx/f2b2dbed5e8bf168/node_modules/tar/lib/parse.js:385:25)
at Unpack.end (/Users/linonetwo/.npm/_npx/f2b2dbed5e8bf168/node_modules/tar/lib/parse.js:505:14)
at IncomingMessage.onend (node:internal/streams/readable:705:10) {
recoverable: false,
cwd: '/Users/linonetwo/Desktop/repo/qq-bot/tw-qq-bot',
code: 'TAR_BAD_ARCHIVE',
tarCode: 'TAR_BAD_ARCHIVE'
}
我认为需要接入QQ签名服务器,但貌似文档里没有介绍。
cli 生成的配置文件
port: 8086
adapters:
icqq:
bots:
- uin: xxx
password: -
platform: 1
master: xxx
data_dir: data
self_url: localhost
data_dir: data
plugin_dir: plugins
plugins:
watcher: /Users/linonetwo/Desktop/repo/qq-bot
log_level: info
services: {}
delay:
prompt: 60000
logConfig:
appenders:
consoleOut:
type: console
saveFile:
type: file
filename: /Users/linonetwo/Desktop/repo/qq-bot/logs.log
categories:
default:
appenders:
- consoleOut
- saveFile
level: info
能不把密码放在这里吗?想放在一个 。env 文件里
让群友提醒群主及时重启并输入验证码等等
插件可以拿到这个信息吗
[2023-03-10T20:44:45.376] [WARN] [zhin] - failed to parse
[2023-03-10T20:44:45.377] [WARN] [zhin] - Error: Cannot find module 'sequelize'
Require stack:
- /node_modules/@zhinjs/plugin-task/lib/index.js
[2023-03-10T20:44:45.369] [WARN] [zhin] - failed to parse
[2023-03-10T20:44:45.369] [WARN] [zhin] - Error: Cannot find module 'sequelize'
Require stack:
- /node_modules/@zhinjs/plugin-cron/lib/index.js
[2023-03-10T20:44:45.358] [WARN] [zhin] - failed to parse
[2023-03-10T20:44:45.358] [WARN] [zhin] - Error: Cannot find module 'uuid'
Require stack:
- /node_modules/@zhinjs/plugin-console/lib/index.js
如题
使用zhin start后报错hild process exited with code 254
可能是系统的原因,也可能是我**了。
npm init zhin
,输完项目名称后报错 AxiosError: connect ECONNREFUSED 127.0.0.1:443
,看了看信息应该本来是要请求 https://github.com/zhinjs/boilerplate/archive/refs/heads/master.tar.gz,不知道为什么飘到本地来了。zhin start
启动的时候报错 Error: spawn npm ENOENT
,这个我查了下应该是系统差异。之后直接 npm run start
,提示没有 start-zhin
这个命令。现在只想找个方法安装一下。
系统 win11,安装均使用默认最新版本。
ctx.command('cn <keyword:text>').action(({ options }) => {
console.log('options', options);
return 'hello world';
});
[2023-02-27T00:15:47.438] [INFO] [zhin] - 已重载插件:tw-qa
[2023-02-27T00:16:11.610] [INFO] [Watch:1287688945] - 更新了群列表,新增了群:[2023-02-27T00:16:17.202] [INFO] [Watch:1287688945] - recv from: [Group: ), Member: 林一二()] {at:} cn test
https://github.com/tiddly-gittly/qq-bot
上周在 Android Linux 上可用,今天到 Windows 上就这样了
Node v20
"dependencies": {
"icqq": "^0.3.12",
"zhin": "2.0.7"
},
我觉得这可以是个测试
宇宙安全声明:我自己开发得爽不代表任何人都能开发得爽,不喜勿喷,🙏谢谢
这玩意儿还没写完,比如现在还不支持指令等(但是你依然可以在函数里面使用指令之类的,毕竟这个类只是在Zhin上外包了一层贼好用的架子
)
和Spring很像,也和nest.js/Midway很像。能Get到点的应该都知道这开发起来得有多爽吧,不像Spring和Nest.js那样,我这个和Midway更像一点;你想注入什么就注入什么,0配置
,请自由发挥。~
我为什么会突发奇想再包装一层装饰器呢?
Zhin的插件,范式大概是这样的:
import { Plugin, Context } from "zhin";
export function install(this: Plugin, ctx: Context) {
ctx.on("icqq.message", () => {
// 一些逻辑
})
ctx.middleware((seesion) => {
// 一些逻辑
})
})
这就启发我了;这玩意的范式套了两层函数,我自然而然就想到了JS的Class:这和Class有什么区别?
而且,启发我更重要的另外一个原因是,Zhin和icqq都有完善的TypeScript支持,而且可以看出两者都在类型方面下了很多功夫的;既如此,我立马想到nest
之类的框架:那和TypeScript的Decorator
结合起来用,那岂不是爽的一批?
于是就诞生了这玩意儿。
其实实现起来也没几行代码,要实现起来得要去细细研究nest和midway等的底层原理便是了。
闲来唠嗑,这涉及到另外一种插件开发范式,所以先放个issue这边放着;等此仓库的作者回复对此的意见,看看这种范式如何,再来提PR。
Bug 描述
根据文档中的三种方式创建项目均会出现报错
复现步骤
实际情况
如果可以,请提供截图描述
运行环境:
近10条日志:
[email protected] start:zhin
start-zhin
sh: line 1: start-zhin: command not found
Error: Command failed: npm run start
at genericNodeError (node:internal/errors:984:15)
at wrappedFn (node:internal/errors:538:14)
at checkExecSyncError (node:child_process:890:11)
at execSync (node:child_process:962:15)
at install (/root/.npm/_npx/ce99ce5353c1f606/node_modules/create-zhin/lib/index.js:242:38)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async start (/root/.npm/_npx/ce99ce5353c1f606/node_modules/create-zhin/lib/index.js:266:5) {
status: 127,
signal: null,
output: [ null, null, null ],
pid: 1219781,
stdout: null,
stderr: null
}
pnpm start
> @linonetwo012/[email protected] start /data/data/com.termux/files/home/qq-bot
> start-zhin
[2023-05-08T19:29:58.478] [INFO] [zhin] - server listen at
http://192.168.3.17:8086
http://127.0.0.1:8086
WARNING: linker: /data/data/com.termux/files/home/qq-bot/node_modules/.pnpm/[email protected]/node_modules/esbuild-android-arm64/bin/esbuild: unsupported flags DT_FLAGS_1=0x8000000
[2023-05-08T19:30:02.883] [INFO] [zhin] - 已载入(9)个插件 (8个内置,1个本地,0个模块)
[2023-05-08T19:30:02.884] [INFO] [zhin] - 已挂载(4)个服务(server,koa,router,request)
[2023-05-08T19:30:02.918] [MARK] [icqq] - ----------
[2023-05-08T19:30:02.922] [MARK] [icqq] - Package Version: [email protected] (Released on 2023/4/29)
[2023-05-08T19:30:02.923] [MARK] [icqq] - View Changelogs:https://github.com/icqqjs/icqq/releases
[2023-05-08T19:30:02.924] [MARK] [icqq] - ----------
[2023-05-08T19:30:04.290] [INFO] [icqq] - Calculating PoW of plus 10000 times cost 403 ms
[2023-05-08T19:30:04.458] [MARK] [icqq] - 222.94.109.:8080 connected
[2023-05-08T19:30:04.998] [MARK] [icqq] - 收到登录保护,只需验证一次便长期有效,可以访问URL验证或发短信验证。访问URL完成验证后调用login()可直接登录。发短信验证需要调用sendSmsCode()和submitSmsCode()方法。
[2023-05-08T19:30:04.999] [MARK] [icqq] - 登录保护验证URL:https://accounts.qq.com/safe/qrcode?_wv=2&_wwv=128&envfrom=double-check&uin=125&sig=t2KdsK4uLkkUEI9sIC7gerQuZVMYOimrOFDC%2FFyYDtkN6lylC8jLdQQA2pcSLh7rCvyKv2SYS5W6LjTjttnNw%3D
[2023-05-08T19:30:05.000] [MARK] [icqq] - 密保手机号:
[2023-05-08T19:30:05.002] [MARK] [zhin] - 请选择设备验证方式:(1:短信验证 其他:扫码验证)
1
[2023-05-08T19:30:21.095] [MARK] [zhin] - 请输入手机收到的短信验证码:
[2023-05-08T19:30:21.145] [WARN] [icqq] - token失效: [登录失败]服务连接中,请稍后再试。(0x6)(错误码:6)
[2023-05-08T19:30:21.149] [ERROR] [icqq] - [登录失败]服务连接中,请稍后再试。(0x6)
^C
pnpm start
> @linonetwo012/[email protected] start /data/data/com.termux/files/home/qq-bot
> start-zhin
[2023-05-08T19:31:59.390] [INFO] [zhin] - server listen at
http://192.168.3.17:8086
http://127.0.0.1:8086
WARNING: linker: /data/data/com.termux/files/home/qq-bot/node_modules/.pnpm/[email protected]/node_modules/esbuild-android-arm64/bin/esbuild: unsupported flags DT_FLAGS_1=0x8000000
[2023-05-08T19:32:05.007] [INFO] [zhin] - 已载入(9)个插件 (8个内置,1个本地,0个模块)
[2023-05-08T19:32:05.010] [INFO] [zhin] - 已挂载(4)个服务(server,koa,router,request)
[2023-05-08T19:32:05.053] [MARK] [icqq] - ----------
[2023-05-08T19:32:05.057] [MARK] [icqq] - Package Version: [email protected] (Released on 2023/4/29)
[2023-05-08T19:32:05.059] [MARK] [icqq] - View Changelogs:https://github.com/icqqjs/icqq/releases
[2023-05-08T19:32:05.059] [MARK] [icqq] - ----------
[2023-05-08T19:32:06.322] [INFO] [icqq] - Calculating PoW of plus 10000 times cost 404 ms
[2023-05-08T19:32:06.417] [MARK] [icqq] - 222.94.109.:8080 connected
[2023-05-08T19:32:06.698] [MARK] [icqq] - 收到登录保护,只需验证一次便长期有效,可以访问URL验证或发短信验证。访问URL完成验证后调用login()可直接登录。发短信验证需要调用sendSmsCode()和submitSmsCode()方法。
[2023-05-08T19:32:06.700] [MARK] [icqq] - 登录保护验证URL:https://accounts.qq.com/safe/qrcode?_wv=2&_wwv=128&envfrom=double-check&uin=125&sig=nTXuKtxSAQv%2FIcjy41E3Z2fJ6p67KR0ogftz1F%2BL%2B49pqIy8lL7b%2F6Ff4ICHNqabRXzvGqQDVOZM79JWTP3Syr1SRk%3D
[2023-05-08T19:32:06.706] [MARK] [icqq] - 密保手机号:
[2023-05-08T19:32:06.712] [MARK] [zhin] - 请选择设备验证方式:(1:短信验证 其他:扫码验证)
[2023-05-08T19:34:28.777] [MARK] [zhin] - 完成扫码验证后回车继续。
验证地址: https://accounts.qq.com/safe/verify?_wv=2&_wwv=128&envfrom=double-check&uin=128945&sig=nTXuKtxSAQv%2FIcjy41E3Z2fJ6p67KR0ogftz12F6Ff4ICHNqabRXzvGqQDVOZM79JWTP3Syr1SRk%3D
[2023-05-08T19:34:57.907] [INFO] [icqq] - Calculating PoW of plus 10000 times cost 418 ms
[2023-05-08T19:34:58.056] [WARN] [icqq] - token失效: [禁止登录]登录失败,建议升级最新版本后重试,或通过问题反馈与我们联系。(错误码:45)
[2023-05-08T19:34:58.065] [ERROR] [icqq] - [禁止登录]登录失败,建议升级最新版本后重试,或通过问题反馈与我们联系。
cli 新创建的项目,启动报错
手机上扫码是成功允许登录了的,然后回车出现这个
如题,当前npm模块无法直接运行,会报lodash未找到,需要手动安装lodash,建议声明依赖到package.json中
Bug 描述
使用 Javascript-setup
模式开发插件
启动项目时,载入该插件报错
复现步骤
zhin new test
新建插件Javascript-setup
方式编写代码,如:// index.js
const { useContext } = require("zhin");
const ctx = useContext();
ctx
.command('test')
.action(() => 'success');
实际情况
启动项目后,在载入插件过程中报错。报错内容如下
TypeError: Cannot read properties of undefined (reading 'call')
at Plugin.mount (F:\work\mine\bot\zhin\node_modules\zhin\lib\plugin.js:62:45)
at installPlugin (F:\work\mine\bot\zhin\node_modules\zhin\lib\context.js:223:20)
at Proxy.plugin (F:\work\mine\bot\zhin\node_modules\zhin\lib\context.js:229:24)
at getContext (F:\work\mine\bot\zhin\node_modules\zhin\lib\factory.js:85:14)
at useContext (F:\work\mine\bot\zhin\node_modules\zhin\lib\factory.js:65:16)
...
运行环境:
简单分析
定位到 plugin.js
是如下代码:
// 根据指定配置挂载插件
class Plugin {
// code
mount(ctx) {
// code
const result = this.options.install.call(this, ctx);
// code
}
// code
}
也就是插件的 install
方法为 undefined
,导致 call
调用失败了。
根据文档,setup 语法不用写 install
方法。
但是这里没有 install
就会报错。
问题原因
经过逐步调试发现,在 zhin.js
下的 getInstalledModules
方法中
当且仅当插件为 zhin
的内置插件时,系统才会标识其为 setup
插件,并为其添加一个 install
方法。
其他插件均不会被标记为 setup
插件,也就是说,需要自己提供 install
方法。
这就与 setup
的意义相悖了。
解决办法
setup
方式开发插件package.json
中加入字段 "setup": true
。第二种方法并没有在文档种说明,而是通过源代码得出来的。建议添加到文档或修改该部分代码逻辑。
建议
这个建议没有考虑更多因素,如果原方式有其他方面的考量,希望可以告知下~
既然纵使是 setup
插件,也是由系统为其添加 install
方法
那干脆不用标识是否为 setup
方式
而是在加载插件时,判断其是否有 install
方法
如果有,不管
如果没有,系统自动为其添加(空的) install
方法
这样,无论如何,插件都会有 install
方法,也就不会报该错了。
更新了一下就这样了,文档也没写新的用法
按 https://github.com/icqqjs/icqq/issues/78#issuecomment-1617254310 的建议加了之后,不管是加在 adaptor -> icqq 里,还是直接加在 zhin.yaml 底部,都没生效,还是错误码 45
Bug 描述
报错 [2023-09-24T22:59:10.468] [WARN] [icqq] - 只能单独发送转发节点
然后没收到机器人的消息
复现步骤
在 https://github.com/tiddly-gittly/qq-bot 里 npm start
预期情况
正常发送消息
实际情况
没收到消息
运行环境:
近10条日志:
[2023-09-24T22:58:57.653] [MARK] [icqq] - 加载了5个好友,3个群,0个频道,0个陌生人
[2023-09-24T22:58:57.653] [MARK] [icqq] - 加载了5个好友,3个群,0个频道,0个陌生人
[2023-09-24T22:59:00.429] [INFO] [icqq] - recv from: [Private: 563061713(friend)] cn 插件
[2023-09-24T22:59:00.429] [INFO] [icqq] - recv from: [Private: 563061713(friend)] cn 插件
[2023-09-24T22:59:10.468] [WARN] [icqq] - 只能单独发送转发节点
[2023-09-24T22:59:10.468] [WARN] [icqq] - 只能单独发送转发节点
[2023-09-24T22:59:11.359] [INFO] [icqq] - succeed to send: [Private(563061713)] [json消息]
[2023-09-24T22:59:11.359] [INFO] [icqq] - succeed to send: [Private(563061713)] [json消息]
复现配置:
其他信息
在此处添加有关该问题的任何其他上下文。
via zhin new tw-qa -t
readme 底部的 群里反馈qq group xxx ,群号只能搜到一个人
滑块地址: https://ssl.captcha.qq.com/template/wireless_mqq_captcha.html?style=simple&aid=16&uin=
t03y39tybxRArpxR2Xpism_pxbK9J_
t03y39tybxRArpxR2Xpism_pxbK9J
[2023-07-01T17:38:05.949] [WARN] [icqq] - token失效: [禁止登录]登录失败,建议升级最新版本后重试,或通过问题反馈与我们联
系。(错误码:45)
[2023-07-01T17:38:05.950] [ERROR] [icqq] - [禁止登录]登录失败,建议升级最新版本后重试,或通过问题反馈与我们联系。
[2023-07-01T17:38:05.950] [ERROR] [zhin:protocol-icqq] - 3173635489:[禁止登录]登录失败,建议升级最新版本后重试,或通过问题反馈与我们联系。
目前需要连打两次token,第二次回车后才真正接收 token,旧版不会这样
不过不管怎样,都无法登录
降级回 2.0.7 解决了问题
在 sugar
中使用正则表达式时,解析出的数据不对。具体表现为:第一次成功匹配,第二次及以后均复用第一次解析的数据。
在 parseSugar
时修改了 sugar
的配置数据。
ctx
.command("parse <name:string>")
.sugar(/name is (\w+)/, {args: ['$1']})
.action(({}, name) => name)
【User】: name is Jack
【Bot】: Jack
【User】: name is Bob
【Bot】: Jack
【User】: name is Nancy
【Bot】: Jack
// 源代码 command.js
parseSugar(template) {
// code
for (const sugar of this.sugarsConfig) {
const matched = sugar.regexp.exec(template);
if (!matched)
continue;
argv.name = this.name;
const { args = [], options = {} } = sugar;
for (let i = 0; i < args.length; i++) {
let arg = args[i];
const argConfig = this.argsConfig[i];
if (!argConfig)
break;
if (typeof arg === "string" && arg.startsWith("$") && matched[+arg.slice(1)]) {
// 此处对 args[i] 的赋值操作修改了原 sugar 的配置。
args[i] = arg = Command.transform([matched[+arg.slice(1)]], argConfig.type);
// 即 args[i] 的值由原来的 $1 变成了数据字符串 Jack。
// 下次匹配时,arg = "Jack" 不满足该 if 条件,无法更新匹配的数据。
}
// code
}
// code
}
return argv;
}
删除对 args[i] 的赋值操作。
// 原代码
args[i] = arg = Command.transform([matched[+arg.slice(1)]], argConfig.type);
// 修复后代码
arg = Command.transform([matched[+arg.slice(1)]], argConfig.type);
大佬有没有计划做一个沙盒环境,开发时在沙盒环境模拟对话达到调试目的。
因为调试需要本机登录账号,调试期间肯定不让别人用,频繁切换机器人账号也有点危险emmmm
是不是得开发一个适配器?
TypeError: Cannot read properties of undefined (reading 'toString')
at generateShortDevice (qq-bot/node_modules/oicq/lib/core/device.js:47:35)
wifi_ssid: `TP-LINK-${uin.toString(16)}`,
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.