mirror of https://github.com/certd/certd
Merge branch 'v2' into v2-dev
commit
b1b3e39fcd
|
@ -14,6 +14,7 @@
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "lerna bootstrap --hoist",
|
"start": "lerna bootstrap --hoist",
|
||||||
|
"start:server": "cd ./packages/ui/certd-server && npm start",
|
||||||
"devb": "lerna run dev-build",
|
"devb": "lerna run dev-build",
|
||||||
"i-all": "lerna link && lerna exec npm install ",
|
"i-all": "lerna link && lerna exec npm install ",
|
||||||
"publish": "npm run prepublishOnly2 && lerna publish --force-publish=pro/plus-core --conventional-commits --create-release github && npm run afterpublishOnly && npm run commitAll",
|
"publish": "npm run prepublishOnly2 && lerna publish --force-publish=pro/plus-core --conventional-commits --create-release github && npm run afterpublishOnly && npm run commitAll",
|
||||||
|
|
|
@ -461,7 +461,7 @@ export class PipelineService extends BaseService<PipelineEntity> {
|
||||||
cron = cron.replace("* *", "0 0");
|
cron = cron.replace("* *", "0 0");
|
||||||
}
|
}
|
||||||
if (cron.startsWith("*")) {
|
if (cron.startsWith("*")) {
|
||||||
cron = cron.replace("*", "0");
|
cron = cron.replace(/\*/g, "0");
|
||||||
}
|
}
|
||||||
const triggerId = trigger.id;
|
const triggerId = trigger.id;
|
||||||
const name = this.buildCronKey(pipelineId, triggerId);
|
const name = this.buildCronKey(pipelineId, triggerId);
|
||||||
|
|
|
@ -12,3 +12,4 @@ export * from './bark/index.js';
|
||||||
export * from './feishu/index.js';
|
export * from './feishu/index.js';
|
||||||
export * from './dingtalk/index.js';
|
export * from './dingtalk/index.js';
|
||||||
export * from './vocechat/index.js';
|
export * from './vocechat/index.js';
|
||||||
|
export * from './onebot/index.js';
|
|
@ -0,0 +1,140 @@
|
||||||
|
import { BaseNotification, IsNotification, NotificationBody, NotificationInput } from "@certd/pipeline";
|
||||||
|
import axios from "axios";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文档: https://github.com/botuniverse/onebot-11
|
||||||
|
* 教程: https://ayakasuki.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
@IsNotification({
|
||||||
|
name: 'onebot',
|
||||||
|
title: 'OneBot V11 通知',
|
||||||
|
desc: '通过动态拼接URL发送 OneBot V11 协议消息',
|
||||||
|
needPlus: false,
|
||||||
|
})
|
||||||
|
export class OneBotNotification extends BaseNotification {
|
||||||
|
// 基础服务地址(不含路径)
|
||||||
|
@NotificationInput({
|
||||||
|
title: '服务地址',
|
||||||
|
component: {
|
||||||
|
placeholder: 'http://xxxx.xxxx.xxxx',
|
||||||
|
},
|
||||||
|
helper: 'OneBot 服务的基础地址(不包含action路径)',
|
||||||
|
required: true,
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
validator: (value) => /^https?:\/\/\S+$/.test(value),
|
||||||
|
message: '请输入有效的HTTP/HTTPS地址'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
baseUrl = '';
|
||||||
|
|
||||||
|
// 目标类型选择
|
||||||
|
@NotificationInput({
|
||||||
|
title: '目标类型',
|
||||||
|
component: {
|
||||||
|
name: 'a-select',
|
||||||
|
options: [
|
||||||
|
{ value: 'group', label: '群聊' },
|
||||||
|
{ value: 'private', label: '私聊' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
required: true,
|
||||||
|
helper: '选择消息发送的目标类型',
|
||||||
|
})
|
||||||
|
targetType = 'group';
|
||||||
|
|
||||||
|
// 目标ID配置
|
||||||
|
@NotificationInput({
|
||||||
|
title: '目标ID',
|
||||||
|
component: {
|
||||||
|
placeholder: '123456789',
|
||||||
|
},
|
||||||
|
helper: '群聊ID或用户ID(纯数字)',
|
||||||
|
required: true,
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
validator: (value) => /^\d+$/.test(value),
|
||||||
|
message: 'ID必须为纯数字'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
targetId = '';
|
||||||
|
|
||||||
|
// 鉴权密钥(非必填)
|
||||||
|
@NotificationInput({
|
||||||
|
title: '鉴权密钥',
|
||||||
|
component: {
|
||||||
|
placeholder: 'xxxxxxxxxx',
|
||||||
|
},
|
||||||
|
helper: '(选填)访问API的授权令牌(无token时留空)',
|
||||||
|
required: false, // 关键修改点
|
||||||
|
})
|
||||||
|
accessToken = '';
|
||||||
|
|
||||||
|
// 构建完整请求URL(支持无token场景)
|
||||||
|
private buildFullUrl(): string {
|
||||||
|
const action = this.targetType === 'group'
|
||||||
|
? 'send_group_msg'
|
||||||
|
: 'send_private_msg';
|
||||||
|
|
||||||
|
let url = `${this.baseUrl}/${action}`;
|
||||||
|
|
||||||
|
// 动态添加access_token参数(仅当存在时)
|
||||||
|
if (this.accessToken) {
|
||||||
|
url += `?access_token=${encodeURIComponent(this.accessToken)}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 构建消息内容
|
||||||
|
private buildMessage(body: NotificationBody): string {
|
||||||
|
return body.title
|
||||||
|
? `${body.title}\n${body.content}`
|
||||||
|
: body.content;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 构建请求体(动态字段)
|
||||||
|
private buildRequestBody(body: NotificationBody): object {
|
||||||
|
return {
|
||||||
|
[this.targetType === 'group' ? 'group_id' : 'user_id']: Number(this.targetId),
|
||||||
|
message: this.buildMessage(body),
|
||||||
|
auto_escape: false
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发送通知主逻辑
|
||||||
|
async send(body: NotificationBody) {
|
||||||
|
const fullUrl = this.buildFullUrl();
|
||||||
|
const requestBody = this.buildRequestBody(body);
|
||||||
|
|
||||||
|
try {
|
||||||
|
console.debug("[ONEBOT] 最终请求URL:", fullUrl);
|
||||||
|
console.debug("[ONEBOT] 请求体:", JSON.stringify(requestBody));
|
||||||
|
console.debug("[ONEBOT] 使用Token:", !!this.accessToken); // 明确token使用状态
|
||||||
|
|
||||||
|
const response = await axios.post(fullUrl, requestBody, {
|
||||||
|
timeout: 5000,
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'User-Agent': 'Certd-Notification/1.0'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 响应验证(保持不变)
|
||||||
|
if (response.data?.retcode !== 0) {
|
||||||
|
throw new Error(`[${response.data.retcode}] ${response.data.message}`);
|
||||||
|
}
|
||||||
|
return response.data;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('[ONEBOT] 请求失败:', {
|
||||||
|
url: fullUrl,
|
||||||
|
tokenUsed: !!this.accessToken, // 记录token使用状态
|
||||||
|
error: error.response?.data || error.message
|
||||||
|
});
|
||||||
|
throw new Error(`OneBot通知发送失败: ${error.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -54,7 +54,7 @@ async function login() {
|
||||||
'redirectTo': 'https://www.51dns.com/domain',
|
'redirectTo': 'https://www.51dns.com/domain',
|
||||||
'_token': _token
|
'_token': _token
|
||||||
}
|
}
|
||||||
console.log(JSON.stringify(obj, null, 2))
|
// console.log(JSON.stringify(obj, null, 2)) // Avoid logging sensitive data
|
||||||
const res2 = await instance.request({
|
const res2 = await instance.request({
|
||||||
url: 'https://www.51dns.com/login',
|
url: 'https://www.51dns.com/login',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
|
|
Loading…
Reference in New Issue