Giter Club home page Giter Club logo

zhin's People

Contributors

github-actions[bot] avatar groupguanfang avatar lc-cn avatar szkisrunning avatar taidixiong233 avatar vikiboss avatar zzliux avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

zhin's Issues

【插件开发】Javascript-setup 模式报错

Bug 描述
使用 Javascript-setup 模式开发插件
启动项目时,载入该插件报错

复现步骤

  1. zhin new test 新建插件
  2. 按照 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)
    ...

运行环境:

  • OS: Windown 10
  • Node版本: 16.16.0
  • Zhin版本:2.4.5

简单分析
定位到 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 的意义相悖了。

解决办法

  1. 不用 setup 方式开发插件
    或者
  2. package.json 中加入字段 "setup": true

第二种方法并没有在文档种说明,而是通过源代码得出来的。建议添加到文档或修改该部分代码逻辑。

建议

这个建议没有考虑更多因素,如果原方式有其他方面的考量,希望可以告知下~

既然纵使是 setup 插件,也是由系统为其添加 install 方法
那干脆不用标识是否为 setup 方式
而是在加载插件时,判断其是否有 install 方法
如果有,不管
如果没有,系统自动为其添加(空的) install 方法
这样,无论如何,插件都会有 install 方法,也就不会报该错了。

[icqq] - 没收到机器人的消息 只能单独发送转发节点

Bug 描述

报错 [2023-09-24T22:59:10.468] [WARN] [icqq] - 只能单独发送转发节点

然后没收到机器人的消息

复现步骤
在 https://github.com/tiddly-gittly/qq-bot 里 npm start

预期情况

正常发送消息

实际情况

没收到消息

运行环境:

  • OS: WIndows
  • Node版本 20

近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消息]

复现配置:

  • icqq版本: 0.5.4
  • 使用platform: 1
  • 使用签名 qsign
  • 使用安卓版本 [e.g. 22]

其他信息
在此处添加有关该问题的任何其他上下文。

sugar 的正则匹配问题

问题简述

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);

TAR_BAD_ARCHIVE: Unrecognized archive format

% 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'
}

无法找到package.json

npm仓库中的 /zhin/lib/constants.js 121行中的exports.version = JSON.parse(fs.readFileSync(path_1.default.resolve('../package.json'), 'utf8')).version;
多打了一个. 识别到了前一个目录的package.json 导致无法创建项目
1a6d9c16696b31d355b8e25d8f7be143

其它插件是做什么的?

plugins:
  config: null # 指定启用配置管理插件
  daemon: null # 指定启用守护进程插件
  help: null # 指定启用帮助插件
  login: null # 指定启用命令行登录插件
  plugin: null # 指定启用插件管理插件
  systemInfo: null # 指定启用系统信息查看插件
  watcher: plugins # 指定启用文件监听插件
  repeater: null # 指定启用复读机插件 

没有文档

群没了

readme 底部的 群里反馈qq group xxx ,群号只能搜到一个人

202305 token失效: [禁止登录]登录失败

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] - [禁止登录]登录失败,建议升级最新版本后重试,或通过问题反馈与我们联系。

[求助] win11 下安装出现的包括但不限于命令缺失的问题

可能是系统的原因,也可能是我**了。

  • 尝试直接使用 npm init zhin,输完项目名称后报错 AxiosError: connect ECONNREFUSED 127.0.0.1:443,看了看信息应该本来是要请求 https://github.com/zhinjs/boilerplate/archive/refs/heads/master.tar.gz,不知道为什么飘到本地来了。
  • 尝试安装 cli,直到项目创建成功都没有报错。zhin start 启动的时候报错 Error: spawn npm ENOENT,这个我查了下应该是系统差异。之后直接 npm run start,提示没有 start-zhin 这个命令。

现在只想找个方法安装一下。

系统 win11,安装均使用默认最新版本。

关于一种我自己用的、仿Spring开发范式的插件

宇宙安全声明:我自己开发得爽不代表任何人都能开发得爽,不喜勿喷,🙏谢谢

话不多说,先看代码

image

这玩意儿还没写完,比如现在还不支持指令等(但是你依然可以在函数里面使用指令之类的,毕竟这个类只是在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。

沙盒环境?

大佬有没有计划做一个沙盒环境,开发时在沙盒环境模拟对话达到调试目的。
因为调试需要本机登录账号,调试期间肯定不让别人用,频繁切换机器人账号也有点危险emmmm

是不是得开发一个适配器?

command 在群聊内不生效

  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

缺少lodash依赖声明

如题,当前npm模块无法直接运行,会报lodash未找到,需要手动安装lodash,建议声明依赖到package.json中

能不把密码放在配置里吗?想放在一个 .env 文件里,方便提交到 git 上

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 文件里

[求助]根据文档安装过程中出现命令无法找到等报错

Bug 描述
根据文档中的三种方式创建项目均会出现报错

复现步骤

  1. 通过 cli 指令创建
  2. 通过 npm 指令创建
  3. 通过模板仓库创建

实际情况
如果可以,请提供截图描述

运行环境:

  • OS: Windows、Linux
  • Node版本: 20.15.0

近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
}

使用 @zhinjs/plugin-console、@zhinjs/plugin-cron、@zhinjs/plugin-task 报错

[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

token 需要输入两次,而且无法登录

滑块地址:    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,旧版不会这样

不过不管怎样,都无法登录

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.