Bläddra i källkod

feat: 添加bilibili视频信息模板和接口定义

refactor: 移除未使用的mc插件及相关代码

chore: 添加@renmu/bili-api依赖并更新pnpm-lock

style: 清理测试插件中的注释代码
枫林 1 månad sedan
förälder
incheckning
4a905f8c57

+ 1 - 0
botQQ_screenshots/bilibiliData.json

@@ -0,0 +1 @@
+{"2180323481":{"bilibiliData":{"bili_jct":"dd824efa742a8dbc536875da592c48a9","SESSDATA":"48b568e6%2C1767151027%2C2a0e6%2A72CjBF4lmo9_M4rfAycCE9-8l6Wup4xX9WG10rXRpvUgvm3jAmeihZH5xXXlikN6tpaQsSVkt1VmEyLVE4UERVQjNTb3o1ODFBYS1nOFlCUmNndS1TeDJVRjg1UVRCT01KUDYyVkFORGZkaWVyWHZqZlZONUFCY1JpRHliU3RpbjV6bHdWdExKSGRBIIEC","DedeUserID":"156627564"},"createtime":1751623140913,"updatetime":1751623140913}}

+ 1 - 0
botQQ_screenshots/mcData.json

@@ -0,0 +1 @@
+{}

+ 1 - 0
package.json

@@ -13,6 +13,7 @@
   "author": "",
   "license": "ISC",
   "dependencies": {
+    "@renmu/bili-api": "^2.7.0",
     "art-template": "^4.13.2",
     "axios": "^1.7.8",
     "jimp": "^1.6.0",

+ 115 - 0
pnpm-lock.yaml

@@ -8,6 +8,9 @@ importers:
 
   .:
     dependencies:
+      '@renmu/bili-api':
+        specifier: ^2.7.0
+        version: 2.7.0
       art-template:
         specifier: ^4.13.2
         version: 4.13.4
@@ -89,6 +92,9 @@ packages:
     resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
     engines: {node: '>=6.9.0'}
 
+  '@bufbuild/protobuf@2.6.0':
+    resolution: {integrity: sha512-6cuonJVNOIL7lTj5zgo/Rc2bKAo4/GvN+rKCrUj7GdEHRzCk8zKOfFwUsL9nAVk5rSIsRmlgcpLzTRysopEeeg==}
+
   '@colors/colors@1.6.0':
     resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==}
     engines: {node: '>=0.1.90'}
@@ -227,6 +233,14 @@ packages:
     engines: {node: '>=18'}
     hasBin: true
 
+  '@renmu/bili-api@2.7.0':
+    resolution: {integrity: sha512-po/WsP4Rv/6L7AV//VR+rb520Km6xXt1e8D1qZ5jnBCVVvSAO90HE0da0PfVdSl9TR6lKJjUuYvhaWTiSU7UzA==}
+    engines: {node: '>=18'}
+
+  '@renmu/throttle@1.0.3':
+    resolution: {integrity: sha512-6ArdPb+EJ3IXnvemzNDj8YIAJMgyU8NMCi3Ad4nL0Vr9R8TfAk4KvHHsu9tWbmOmgrbp3bCYYO7AAQRN0MRQuw==}
+    engines: {node: '>= v0.8.0'}
+
   '@tokenizer/token@0.3.0':
     resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==}
 
@@ -331,6 +345,11 @@ packages:
     resolution: {integrity: sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g==}
     engines: {node: '>=6.0.0'}
 
+  axios-retry@4.5.0:
+    resolution: {integrity: sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==}
+    peerDependencies:
+      axios: 0.x || 1.x
+
   axios@1.9.0:
     resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==}
 
@@ -482,6 +501,14 @@ packages:
     resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==}
     engines: {node: '>= 14'}
 
+  debug@2.6.9:
+    resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
   debug@4.4.1:
     resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==}
     engines: {node: '>=6.0'}
@@ -580,6 +607,9 @@ packages:
     resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
     engines: {node: '>=6'}
 
+  eventemitter3@5.0.1:
+    resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+
   events@3.3.0:
     resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
     engines: {node: '>=0.8.x'}
@@ -598,6 +628,10 @@ packages:
   fast-levenshtein@2.0.6:
     resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
 
+  fast-xml-parser@4.5.3:
+    resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==}
+    hasBin: true
+
   fd-slicer@1.1.0:
     resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
 
@@ -756,6 +790,10 @@ packages:
     resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
     engines: {node: '>=0.12.0'}
 
+  is-retry-allowed@2.2.0:
+    resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==}
+    engines: {node: '>=10'}
+
   is-stream@2.0.1:
     resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
     engines: {node: '>=8'}
@@ -852,6 +890,9 @@ packages:
   moment@2.30.1:
     resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==}
 
+  ms@2.0.0:
+    resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+
   ms@2.1.3:
     resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
 
@@ -913,6 +954,14 @@ packages:
     resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==}
     engines: {node: '>= 0.8.0'}
 
+  p-queue@8.1.0:
+    resolution: {integrity: sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==}
+    engines: {node: '>=18'}
+
+  p-timeout@6.1.4:
+    resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==}
+    engines: {node: '>=14.16'}
+
   pac-proxy-agent@7.2.0:
     resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==}
     engines: {node: '>= 14'}
@@ -1093,6 +1142,9 @@ packages:
   stack-trace@0.0.10:
     resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==}
 
+  stream-parser@0.3.1:
+    resolution: {integrity: sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==}
+
   streamx@2.22.0:
     resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==}
 
@@ -1111,6 +1163,9 @@ packages:
     resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
     engines: {node: '>=4'}
 
+  strnum@1.1.2:
+    resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==}
+
   strtok3@6.3.0:
     resolution: {integrity: sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==}
     engines: {node: '>=10'}
@@ -1140,6 +1195,9 @@ packages:
   through@2.3.8:
     resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
 
+  tiny-typed-emitter@2.1.0:
+    resolution: {integrity: sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==}
+
   tinycolor2@1.6.0:
     resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==}
 
@@ -1322,6 +1380,8 @@ snapshots:
 
   '@babel/helper-validator-identifier@7.27.1': {}
 
+  '@bufbuild/protobuf@2.6.0': {}
+
   '@colors/colors@1.6.0': {}
 
   '@cspotcode/source-map-support@0.8.1':
@@ -1546,6 +1606,25 @@ snapshots:
       - bare-buffer
       - supports-color
 
+  '@renmu/bili-api@2.7.0':
+    dependencies:
+      '@bufbuild/protobuf': 2.6.0
+      '@renmu/throttle': 1.0.3
+      axios: 1.9.0
+      axios-retry: 4.5.0(axios@1.9.0)
+      fast-xml-parser: 4.5.3
+      p-queue: 8.1.0
+      tiny-typed-emitter: 2.1.0
+    transitivePeerDependencies:
+      - debug
+      - supports-color
+
+  '@renmu/throttle@1.0.3':
+    dependencies:
+      stream-parser: 0.3.1
+    transitivePeerDependencies:
+      - supports-color
+
   '@tokenizer/token@0.3.0': {}
 
   '@tootallnate/quickjs-emscripten@0.23.0': {}
@@ -1631,6 +1710,11 @@ snapshots:
 
   await-to-js@3.0.0: {}
 
+  axios-retry@4.5.0(axios@1.9.0):
+    dependencies:
+      axios: 1.9.0
+      is-retry-allowed: 2.2.0
+
   axios@1.9.0:
     dependencies:
       follow-redirects: 1.15.9
@@ -1789,6 +1873,10 @@ snapshots:
 
   data-uri-to-buffer@6.0.2: {}
 
+  debug@2.6.9:
+    dependencies:
+      ms: 2.0.0
+
   debug@4.4.1(supports-color@5.5.0):
     dependencies:
       ms: 2.1.3
@@ -1873,6 +1961,8 @@ snapshots:
 
   event-target-shim@5.0.1: {}
 
+  eventemitter3@5.0.1: {}
+
   events@3.3.0: {}
 
   exif-parser@0.1.12: {}
@@ -1891,6 +1981,10 @@ snapshots:
 
   fast-levenshtein@2.0.6: {}
 
+  fast-xml-parser@4.5.3:
+    dependencies:
+      strnum: 1.1.2
+
   fd-slicer@1.1.0:
     dependencies:
       pend: 1.2.0
@@ -2050,6 +2144,8 @@ snapshots:
 
   is-number@7.0.0: {}
 
+  is-retry-allowed@2.2.0: {}
+
   is-stream@2.0.1: {}
 
   is-url@1.2.4: {}
@@ -2152,6 +2248,8 @@ snapshots:
 
   moment@2.30.1: {}
 
+  ms@2.0.0: {}
+
   ms@2.1.3: {}
 
   nanoid@5.1.5: {}
@@ -2217,6 +2315,13 @@ snapshots:
       type-check: 0.3.2
       word-wrap: 1.2.5
 
+  p-queue@8.1.0:
+    dependencies:
+      eventemitter3: 5.0.1
+      p-timeout: 6.1.4
+
+  p-timeout@6.1.4: {}
+
   pac-proxy-agent@7.2.0:
     dependencies:
       '@tootallnate/quickjs-emscripten': 0.23.0
@@ -2411,6 +2516,12 @@ snapshots:
 
   stack-trace@0.0.10: {}
 
+  stream-parser@0.3.1:
+    dependencies:
+      debug: 2.6.9
+    transitivePeerDependencies:
+      - supports-color
+
   streamx@2.22.0:
     dependencies:
       fast-fifo: 1.3.2
@@ -2434,6 +2545,8 @@ snapshots:
 
   strip-bom@3.0.0: {}
 
+  strnum@1.1.2: {}
+
   strtok3@6.3.0:
     dependencies:
       '@tokenizer/token': 0.3.0
@@ -2483,6 +2596,8 @@ snapshots:
 
   through@2.3.8: {}
 
+  tiny-typed-emitter@2.1.0: {}
+
   tinycolor2@1.6.0: {}
 
   to-regex-range@5.0.1:

+ 33 - 0
src/interface/sakulin.ts

@@ -0,0 +1,33 @@
+export interface RootObject {
+  success: boolean;
+  detail: Detail;
+  pdf: string[];
+}
+
+export interface Detail {
+  save_path: string;
+  exists: boolean;
+  skip: boolean;
+  album_id: string;
+  scramble_id: string;
+  name: string;
+  page_count: number;
+  pub_date: string;
+  update_date: string;
+  likes: string;
+  views: string;
+  comment_count: number;
+  works: string[];
+  actors: any[];
+  tags: string[];
+  authors: string[];
+  episode_list: (number | string)[][];
+  related_list: Relatedlist[];
+}
+
+export interface Relatedlist {
+  id: string;
+  author: string;
+  name: string;
+  image: string;
+}

+ 0 - 219
src/plugins/mc.ts

@@ -1,219 +0,0 @@
-import { param, plugins, runcod } from "../lib/decorators.js";
-import { Rcon } from "rcon-client"
-import { Permission } from '../lib/Permission.js';
-import { GroupMessage, PrivateFriendMessage, PrivateGroupMessage, Receive } from "node-napcat-ts";
-import { mccfg } from "../lib/config.js";
-import path from "path";
-import { fileURLToPath } from "url";
-import fs from 'fs'
-import { qqBot } from "../app.js";
-
-@plugins({
-    easycmd: true,
-    name: "我的世界工具箱",
-    version: "0.0.1",
-    describe: "这是一个我的世界工具箱,用来管理你的服务器",
-    author: "枫叶秋林",
-    help: {
-        enabled: true,
-        description: "查看帮助信息"
-    }
-})
-export class mc {
-    rcon: Rcon
-    constructor() {
-        this.rcon = new Rcon({
-            host: mccfg.host,
-            port: mccfg.port,
-            password: mccfg.password
-        })
-        qqBot.on('notice.group_decrease', async (context) => {
-            if (!context.user_id) {
-                return
-            }
-            const plId = await this.readpl(context.user_id)
-            if (plId?.plId) {
-                try {
-                    const rcon = await this.rcon.connect()
-                    if (context.sub_type === 'kick') {
-                        const res = await rcon.send(`ban ${plId?.plId}`)
-                        await this.deletepl(context.user_id)
-                        qqBot.send_group_msg({
-                            group_id: context.group_id,
-                            message: [{
-                                type: "text",
-                                data: {
-                                    text: `群友:${context.user_id}被踢出,玩家${plId.plId}已被封禁!:\n
-                                           指令执行结果:${res}`
-                                }
-                            }]
-                        })
-                        return
-                    }
-                    if (context.sub_type === 'leave') {
-                        const res = await rcon.send(`whitelist remove ${plId?.plId}`)
-                        if (res.includes(`Removed ${plId?.plId} from the whitelist`)) {
-                            await this.deletepl(context.user_id)
-                            qqBot.send_group_msg({
-                                group_id: context.group_id,
-                                message: [{
-                                    type: "text",
-                                    data: {
-                                        text: `群友:${context.user_id}离开群了,玩家${plId.plId}已移除白名单!`
-                                    }
-                                }]
-                            })
-                        }
-                    }
-                    rcon.end()
-                } catch (error) {
-                    console.log(error)
-                }
-            } else {
-                qqBot.send_group_msg({
-                    group_id: context.group_id,
-                    message: [{
-                        type: "text",
-                        data: {
-                            text: `群友:${context.user_id}离开群了,但是玩家${plId}不在白名单!`
-                        }
-                    }]
-                })
-            }
-        })
-    }
-
-    @runcod(["list", "在线玩家"], "查看在线玩家") //命令描述,用于显示在默认菜单中
-    async list() {
-        try {
-            const rcon = await this.rcon.connect()
-            const res = await rcon.send("list")
-            const players = res.split(":");
-            rcon.end()
-            return players[1]
-        } catch (error) {
-            return "连接失败"
-        }
-    }
-    @Permission('Admin')
-    @runcod(["指令", "cmd"], "运行指令") //命令描述,用于显示在默认菜单中
-    async cmd(@param("执行指令", 'text') runcod: Receive["text"]) {//参数装饰器,用于解析参数) {
-        try {
-            const rcon = await this.rcon.connect()
-            runcod.data.text = runcod.data.text?.replace(/,/g, ' ')
-            const res = await rcon.send(runcod?.data?.text ?? '')
-            rcon.end()
-            return res
-        } catch (error) {
-            return "连接失败"
-        }
-    }
-    @runcod(["绑定", ""], "绑定玩家") //命令描述,用于显示在默认菜单中
-    async bindPl(@param("Id", 'text') pId: Receive["text"],
-        context: PrivateFriendMessage | PrivateGroupMessage | GroupMessage) {
-        const seedId = context?.sender?.user_id ?? null
-        const plId = pId?.data?.text ?? null
-        if (!seedId || !plId) {
-            return "绑定失败"
-        }
-        try {
-            const rcon = await this.rcon.connect()
-            const res = await rcon.send(`whitelist add ${plId}`)
-            //Added feng_linH to the whitelist
-            if (res.includes(`Added ${plId} to the whitelist`)) {
-                await this.savepl(seedId, plId)
-                return "绑定成功!"
-            }
-            rcon.end()
-            return res
-        } catch (error: any) {
-            return `绑定失败:${error.message}`
-        }
-    }
-
-    @runcod(["解绑", ""], "解绑玩家") //命令描述,用于显示在默认菜单中
-    async unBindPl(
-        context: PrivateFriendMessage | PrivateGroupMessage | GroupMessage) {
-        const seedId = context?.sender?.user_id ?? null
-        if (!seedId) {
-            return "解绑失败"
-        }
-        try {
-            const plId = await this.readpl(seedId)
-            if (!plId) {
-                return "解绑失败"
-            }
-            const rcon = await this.rcon.connect()
-            const res = await rcon.send(`whitelist remove ${plId}`)
-            //Removed feng_linH from the whitelist
-            if (res.includes(`Removed ${plId} from the whitelist`)) {
-                await this.savepl(seedId, '')
-                return "解绑成功!"
-            }
-            rcon.end()
-            return res
-        } catch (error: any) {
-            return `解绑失败:${error.message}`
-        }
-    }
-
-
-
-    private async savepl(seedId: number, plId: string): Promise<void> {
-        const __dirname = path.dirname(fileURLToPath(import.meta.url));
-        //json
-        const filePath = path.join(__dirname, '..', '..', 'botQQ_screenshots', 'mcData.json');
-        let data: any = {};
-        if (fs.existsSync(filePath)) {
-            const fileContent = fs.readFileSync(filePath, 'utf-8');
-            data = JSON.parse(fileContent);
-        } else {
-            fs.writeFileSync(filePath, JSON.stringify(data));
-        }
-        if (data[seedId]) {
-            data[seedId].plId = plId;
-            data[seedId].updatetime = new Date().getTime()
-        } else {
-            data[seedId] = {
-                plId,
-                createtime: new Date().getTime(),
-                updatetime: new Date().getTime(),
-            }
-        }
-        fs.writeFileSync(filePath, JSON.stringify(data));
-        return;
-    }
-
-    private async readpl(seedId: number): Promise<{ plId: string, createtime: number, updatetime: number } | undefined> {
-        const __dirname = path.dirname(fileURLToPath(import.meta.url));
-        const filePath = path.join(__dirname, '..', '..', 'botQQ_screenshots', 'mcData.json');
-        let data: any = {};
-        if (fs.existsSync(filePath)) {
-            const fileContent = fs.readFileSync(filePath, 'utf-8');
-            data = JSON.parse(fileContent);
-            if (data[seedId]) {
-                return data[seedId];
-            }
-        }
-        if (data[seedId]) {
-            return data[seedId];
-        }
-    }
-    //deletepl
-    private async deletepl(seedId: number): Promise<void> {
-        const __dirname = path.dirname(fileURLToPath(import.meta.url));
-        const filePath = path.join(__dirname, '..', '..', 'botQQ_screenshots', 'mcData.json');
-        let data: any = {};
-        if (fs.existsSync(filePath)) {
-            const fileContent = fs.readFileSync(filePath, 'utf-8');
-            data = JSON.parse(fileContent);
-            if (data[seedId]) {
-                delete data[seedId];
-                fs.writeFileSync(filePath, JSON.stringify(data));
-            }
-        }
-    }
-
-
-
-}

+ 2 - 2
src/plugins/test.ts

@@ -72,7 +72,7 @@ export class test {
                 enabled: true,//是否启用模板,启用将发送图片内容
                 sendText: false,//是否发送文本,启用将发送文本内容,如果都启用则发送两条消息
                 path: path.resolve(__dirname, '..', 'resources', 'test', 'param.html'),//模版路径,推荐按规范放置在resources目录下
-                html: `<div>简约自定义html渲染内容</div>`,//简易渲染,填写html内容
+                // html: `<div>简约自定义html渲染内容</div>`,//简易渲染,填写html内容
                 render: {//浏览器默认参数设置,用于打开浏览器的设置
                     width: 600, // 模板宽度
                     height: 1, // 模板高度
@@ -80,7 +80,7 @@ export class test {
                     quality: 100,// 模板质量
                     fullPage: false,// 是否全屏
                     background: true,// 是否背景
-                    url: 'http://www.baidu.com'// 直接使用网站截图渲染支持90%的网站,需要自行测试
+                    // url: 'http://www.baidu.com'// 直接使用网站截图渲染支持90%的网站,需要自行测试
                 }
             },
             toString() { //重写toString方法,用于返回文本内容,启用sendText时将发送文本内容,不启用时将发送图片内容,图片发送失败时发送文字内容

+ 94 - 0
src/resources/bilibili/video-info.html

@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>{{info.title}} - 视频信息</title>
+    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
+    <style>
+        .video-header {
+            border-bottom: 1px solid #eee;
+            padding-bottom: 1rem;
+            margin-bottom: 1.5rem;
+        }
+
+        .media-container {
+            display: grid;
+            grid-template-columns: 1fr 2fr;
+            gap: 2rem;
+            margin-bottom: 2rem;
+        }
+
+        .thumbnail-wrapper {
+            position: relative;
+            border-radius: 8px;
+            overflow: hidden;
+        }
+
+        .stats-grid {
+            display: grid;
+            grid-template-columns: repeat(2, 1fr);
+            gap: 1rem;
+            background: #f8f9fa;
+            padding: 1.5rem;
+            border-radius: 8px;
+        }
+
+        .stat-item {
+            display: flex;
+            align-items: center;
+            gap: 8px;
+        }
+
+        .stat-icon {
+            width: 24px;
+            height: 24px;
+        }
+    </style>
+</head>
+
+<body class="bg-light">
+    <div class="container py-5">
+        <!-- 头部标题 -->
+        <div class="video-header">
+            <h1 class="h3 mb-0">{{info.title}}</h1>
+        </div>
+
+        <!-- 主体内容 -->
+        <div class="media-container">
+            <!-- 左侧封面 -->
+            <div class="thumbnail-wrapper">
+                <img src="{{info.pic}}" class="img-fluid" alt="视频封面">
+            </div>
+
+            <!-- 右侧介绍 -->
+            <div class="tags-section">
+                <p class="text-muted">{{info.desc}}</p>
+            </div>
+        </div>
+        <div class="stats-grid row">
+            <div class="stat-item">
+            
+                <svg class="stat-icon" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 448 512"><path d="M424.4 214.7L72.4 6.6C43.8-10.3 0 6.1 0 47.9V464c0 37.5 40.7 60.1 72.4 41.3l352-208c31.4-18.5 31.5-64.1 0-82.6z" fill="currentColor"></path></svg>
+                <span>{{info.stat.view}}</span>
+            </div>
+            <div class="stat-item">
+                <svg class="stat-icon" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512"><path d="M256 32C114.6 32 0 125.1 0 240c0 47.6 19.9 91.2 52.9 126.3C38 405.7 7 439.1 6.5 439.5c-6.6 7-8.4 17.2-4.6 26S14.4 480 24 480c61.5 0 110-25.7 139.1-46.3C192 442.8 223.2 448 256 448c141.4 0 256-93.1 256-208S397.4 32 256 32zm0 368c-26.7 0-53.1-4.1-78.4-12.1l-22.7-7.2l-19.5 13.8c-14.3 10.1-33.9 21.4-57.5 29c7.3-12.1 14.4-25.7 19.9-40.2l10.6-28.1l-20.6-21.8C69.7 314.1 48 282.2 48 240c0-88.2 93.3-160 208-160s208 71.8 208 160s-93.3 160-208 160z" fill="currentColor"></path></svg>
+                <span>{{info.stat.reply}}</span>
+            </div>
+            <div class="stat-item">
+                <svg class="stat-icon" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512"><path d="M256 32C114.6 32 0 125.1 0 240c0 47.6 19.9 91.2 52.9 126.3C38 405.7 7 439.1 6.5 439.5c-6.6 7-8.4 17.2-4.6 26S14.4 480 24 480c61.5 0 110-25.7 139.1-46.3C192 442.8 223.2 448 256 448c141.4 0 256-93.1 256-208S397.4 32 256 32zm0 368c-26.7 0-53.1-4.1-78.4-12.1l-22.7-7.2l-19.5 13.8c-14.3 10.1-33.9 21.4-57.5 29c7.3-12.1 14.4-25.7 19.9-40.2l10.6-28.1l-20.6-21.8C69.7 314.1 48 282.2 48 240c0-88.2 93.3-160 208-160s208 71.8 208 160s-93.3 160-208 160z" fill="currentColor"></path></svg>
+                <span>{{info.stat.coin}}</span>
+            </div>
+            <div class="stat-item">
+                <svg class="stat-icon" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32"><path d="M22.45 6a5.47 5.47 0 0 1 3.91 1.64a5.7 5.7 0 0 1 0 8L16 26.13L5.64 15.64a5.7 5.7 0 0 1 0-8a5.48 5.48 0 0 1 7.82 0l2.54 2.6l2.53-2.58A5.44 5.44 0 0 1 22.45 6m0-2a7.47 7.47 0 0 0-5.34 2.24L16 7.36l-1.11-1.12a7.49 7.49 0 0 0-10.68 0a7.72 7.72 0 0 0 0 10.82L16 29l11.79-11.94a7.72 7.72 0 0 0 0-10.82A7.49 7.49 0 0 0 22.45 4z" fill="currentColor"></path></svg>
+                <span>{{info.stat.favorite}}</span>
+            </div>
+        </div>
+    </div>
+
+    <script src="https://cdn.bootcdn.net/ajax/libs/handlebars.js/4.7.7/handlebars.min.js"></script>
+</body>
+
+</html>