我亏一点
type: channel
link: https://www.000081.xyz/
description: 学习
items: AstrBot 安装 Whisper 语音识别
items: docker-compose 部署 AstrBot + NapCatQQ
items: 苹果cms10 去除官方更新
items: 苹果cms10 挂码手机端自动跳转非法网站处理
items: 油猴 1688列表自动爬取数据
items: 苹果cms10 列表和搜索过滤会员组没有权限的数据
items: PHP多级分类数据列表转为树型父子结构
items: Javascript 实现阿拉伯数字转中文数字
items: Centos7系统的笔记本，启动摄像头
items: mysql5.7 sql语句实现父子查询

AstrBot 安装 Whisper 语音识别
type: item
date: 2026-03-16T13:30:00+00:00
description: AI摘要 本文介绍了为 AstrBot 安装 Whisper 语音识别的步骤。首先，通过平台或命令行安装 `openai-whisper` 库。安装成功后，需重启 AstrBot 容器或服务器以使更改生效。接着，在 AstrBot 后台的语音转文字设置中添加 Whisper(local) 模型并进行测试。最后，提醒用户确保已安装 `ffmpeg` 环境，若未安装可在容器内使用 `apt install -y ffmpeg` 命令进行安装。 此内容根据文章生成，仅用于文章内容的解释与总结 AstrBot 安装 Whisper 语音识别1.两种安装方法所需库openai-whisper方法一 平台安装AstrBot后台->更多功能->平台日志->安装Pip库输入openai-whisper安装，如果安装不成功就换源方法二 命令行安装进入服务器，如果使用docker则进入容器docker进入容器命令docker exec -it 容器id bash执行命令进行pip安装pip install -U openai-whisper2.重启安装成功后，平台不生效，需要重启容器或者服务器重启容器命令docker restart 容器id3.添加模型后台语音转文字，添加Whisper(local)的模型，测试，成功运行注意如果没有ffmpeg环境，就安装一下。容器内可以使用该命令安装apt install -y ffmpeg

docker-compose 部署 AstrBot + NapCatQQ
type: item
date: 2026-03-16T12:38:00+00:00
description: AI摘要 本文详细介绍了如何通过`docker-compose`部署AstrBot和NapCatQQ。提供的`docker-compose.yml`配置了两个服务，包括NapCatQQ（QQ机器人框架）和AstrBot（其插件）。配置涵盖了网络、端口映射、数据卷挂载及环境变量，并指出两者可通过容器名连接，如`ws://astrbot:6199/ws`，实现自动化部署和管理。 此内容根据文章生成，仅用于文章内容的解释与总结 docker-compose 部署 AstrBot + NapCatQQ不用1panel的话，网卡可以自行修改。连接的话可以直接使用容器名链接。例如ws://astrbot:6199/ws启动命令docker compose up -dversion: '3.8' networks: 1panel-network: external: true services: # NapCat 服务 napcat: image: mlikiowa/napcat-docker:latest container_name: napcat restart: always networks: - 1panel-network ports: - "3001:3001" - "6099:6099" environment: - WS_ENABLE=true - NAPCAT_UID=${UID:-1000} - NAPCAT_GID=${GID:-1000} volumes: - ./napcat/config:/app/napcat/config - ./ntqq:/app/.config/QQ # AstrBot 服务 astrbot: image: soulter/astrbot:v4.20.0 container_name: astrbot restart: always networks: - 1panel-network ports: - "6185:6185" - "6194:6194" - "6195:6195" - "6196:6196" - "6199:6199" - "11451:11451" volumes: - ./astrbot/data:/AstrBot/data - ./ntqq:/app/.config/QQ - ./whisper/cache:/root/.cache environment: - TZ=Asia/Shanghai

苹果cms10 去除官方更新
type: item
date: 2026-03-15T12:00:00+00:00
description: AI摘要 本文详细介绍了如何从苹果cms10中去除官方更新，以应对官方更新通道可能存在的安全风险。主要步骤包括：从GitHub下载源代码，批量替换官方域名为空或自定义域名，注释掉`Update.php`和`Safety.php`中的更新后门代码，移除播放器文件中的广告链接，以及注释掉多个JavaScript文件中的更新检测和请求代码。此外，还建议在服务器层面屏蔽官方域名，以彻底杜绝潜在的安全隐患。 此内容根据文章生成，仅用于文章内容的解释与总结 苹果cms10 去除官方更新根据奇安信实锤，基本上可以确认是官方更新通道投毒https://mp.weixin.qq.com/s/nl_Pntpoys9NVBp7RKLJvg1.下载源代码从github中下载源代码，一般来说后门不会直勾勾的写在github上，都是通过安装之后通过自动更新加入到代码中。所以此时的github代码是安全的https://github.com/magicblack/maccms102.批量替换域名（关键）使用代码编辑器，批量替换代码域名，此处域名我以自己网站代替，即使自己的域名有些请求失败，但是也好过官方的。union.maccms.la => 所有带有该域名的链接全部改为空maccms.la => 替换成自己的域名aHR0cDovL3VwZGF0ZS5tYWNjbXMubGEv => 该字符串为更新域名的base64编码，替换为空，有两处地方要修改。application/admin/controller/Update.phpapplication/admin/controller/Safety.php3.注释更新后门文件（关键）文件路径：application/admin/controller/Update.php<?php namespace app\admin\controller; use think\Db; use app\common\util\PclZip; class Update extends Base { var $_url; var $_save_path; public function __construct() { parent::__construct(); //header('X-Accel-Buffering: no'); $this->_url = base64_decode("")."v10/"; $this->_save_path = './application/data/update/'; } public function index() { return $this->fetch('admin@test/index'); } public function step1($file='') { // if(empty($file)){ // return $this->error(lang('param_err')); // } // $version = config('version.code'); // $url = $this->_url .$file . '.zip?t='.time(); // echo $this->fetch('admin@public/head'); // echo " ".lang('admin/update/step1_a')." ".lang('admin/update/step1_b')."\n"; // ob_flush();flush(); // sleep(1); // $save_file = $version.'.zip'; // $html = mac_curl_get($url); // @fwrite(@fopen($this->_save_path.$save_file,'wb'),$html); // if(!is_file($this->_save_path.$save_file)){ // echo lang('admin/update/download_err')."\n"; // exit; // } // if(filesize($this->_save_path.$save_file) <1){ // @unlink($this->_save_path.$save_file); // echo lang('admin/update/download_err')."\n"; // exit; // } // echo lang('admin/update/download_ok')."\n"; // echo lang('admin/update/upgrade_package_processed')."\n"; // ob_flush(…

苹果cms10 挂码手机端自动跳转非法网站处理
type: item
date: 2026-03-15T06:12:00+00:00
description: AI摘要 苹果cms10手机端自动跳转非法网站，经证实是官方更新通道投毒。恶意链接包括播放器引用`union.maccms.la`和`application/extra/active.php`文件，后者加载伪装的恶意JS，主要针对移动端。处理方法：1. 屏蔽官方更新域名`update.maccms.la`，将代码中相关链接置空或注释`Update.php`和`Safety.php`中的更新方法。2. 批量替换所有`maccms.la`域名。3. 删除`application/extra/active.php`文件。 此内容根据文章生成，仅用于文章内容的解释与总结 苹果cms10 挂码手机端自动跳转非法网站处理{alert type="info"}程序使用的是maccms.la的苹果cms，记录目前处理方法，不一定有效，可能还有漏网之鱼。{/alert}{message type="error" content="2026/3/15 17:00 实测此方法并不能完全解决，还有漏网之鱼，手机端还是偶尔会跳转"/}去更新可以查看这篇 https://www.000081.xyz/index.php/archives/388/{message type="success" content="2026/3/15 18:00 请从github下载最新的程序，进行域名替换，去除官方更新，然后再导入数据库数据，此方法目前有效"/}根据奇安信实锤，基本上可以确认是官方更新通道投毒https://mp.weixin.qq.com/s/nl_Pntpoys9NVBp7RKLJvg1.目前已知的非法跳转有播放器引用链接：union.maccms.la/html/prestrain.html播放器引用链接：union.maccms.la/html/loading.htmlapplication/extra/active.php文件active.php文件里面有gzuncompress加密，借助ai代码审计后解密后的内容 AI代码审计主要恶意文件：application/extra/active.php 该文件包含大量恶意代码，通过 gzuncompress 压缩隐藏： 解密后发现的内容： 恶意JavaScript脚本：加载外部恶意URL https://code.jquecy.com/jquery.min-3.6.8.js（伪装成jQuery） 恶意域名列表：用于流量劫持和跳转 http://maccms.info:88 https://www.ywquyq.com:10443 https://vodplay2.com 等多个恶意域名 攻击特点： ✅ 仅针对移动端用户（!$env->isMobile() 时跳过） ✅ 绕过管理员IP检测 ✅ 通过 view_filter 钩子自动执行 ✅ 包含反调试功能伪装的jquery链接，在电脑打开，返回内容为空白，电脑切换为手机的ua，才会正常加载内容2.处理方法2.1.屏蔽官方更新更新文件路径：application/admin/controller/Update.php更新文件路径：application/admin/controller/Safety.php将所有 "aHR0cDovL3VwZGF0ZS5tYWNjbXMubGEv" 内容替换为 ""aHR0cDovL3VwZGF0ZS5tYWNjbXMubGEv内容base64解码后为http://update.maccms.la/Update.php文件中，方法内容注释<?php namespace app\admin\controller; use think\Db; use app\common\util\PclZip; class Update extends Base { var $_url; var $_save_path; public function __construct() { parent::__construct(); //header('X-Accel-Buffering: no'); //aHR0cDovL3VwZGF0ZS5tYWNjbXMubGEv $this->_url = base64_decode("")."v10/"; $this->_save_path = './application/data/update/'; } public function index() { return $this->fetch('admin@test/index'); } public function step1($file='') { // if(empty($file)){ // return $this->error(la…

油猴 1688列表自动爬取数据
type: item
date: 2026-03-14T02:41:00+00:00
description: AI摘要 这是一个油猴脚本，用于自动爬取1688商品搜索列表和店铺商品列表数据。它通过拦截XHR请求和JSONP回调获取列表数据，并利用iframe抓取商品详情页数据。脚本提供了一个日志面板，并指示用户在两处代码中补充将商品信息上传到数据库的逻辑，以及进行数据库校验，实现自动化数据采集。 此内容根据文章生成，仅用于文章内容的解释与总结 油猴 1688列表自动爬取数据此代码为油猴脚本，用于1688商品搜索列表和店铺商品列表爬取自动数据，请在商品两处地方补充自己的代码，将商品信息上传到自己的数据库。代码原理是，hook 1688的xhr请求，请求中途拦截响应，取出请求内容处理。但是有些请求是通过JSONP的方式，就是通过script标签动态插入body，从而让浏览器加载，所以同样监听了script加载内容回调，符合的响应内容则返回。对于商品详情的数据，则通过iframe，父页面开启监听，子页面进行推送。// ==UserScript== // @name 1688列表自动爬取数据 // @namespace http://tampermonkey.net/ // @version 0.2 // @description 1688列表自动爬取数据 // @author 我亏一点 // @match *.1688.com/page/offerlist.htm* // @match *.1688.com/offer/*.html* // @match *.1688.com/selloffer/offer_search.htm* // @icon https://s1.ax1x.com/2022/10/14/xwsJYT.png // @grant none // ==/UserScript== (function () { "use strict"; const config = { lock: false, //是否自动爬取 true为是，false为否 run_status: false, //是否正在拦截爬取 sleep: 5, // 爬取间隔 (秒) iframe_timeout: 3600, // 最大等待时间（秒），防止卡死 debug: false, // 是否开启测试，开启只会爬一个数据 data: [], //数据集 is_iframe: window.self !== window.top, type: "", // 页面类型 shop_list为店铺商品列表，goods_list为搜索商品列表，detail为商品详情 type_match: { shop_list: "mtop.alibaba.alisite.cbu.server.moduleasyncservice", // 店铺商品列表 goods_list: "mtop.relationrecommend.wirelessrecommend.recommend", // 搜索商品列表 }, }; //================创建面板开始==================== // 创建一个 div 元素用于显示日志 const logDiv = document.createElement("div"); logDiv.id = "log-div-1688"; logDiv.style.position = "fixed"; logDiv.style.bottom = "10px"; logDiv.style.left = "10px"; logDiv.style.width = "400px"; logDiv.style.height = "300px"; logDiv.style.overflowY = "auto"; logDiv.style.border = "10px solid black"; logDiv.style.backgroundColor = "white"; logDiv.style.zIndex = 9999; logDiv.style.padding = "20px"; logDiv.style.boxShadow = "0 4px 8px rgba(0, 0, 0, 0.1)"; logDiv.style.wordWrap = "break-word"; logDiv.style.overflowWrap = "break-word"; logDiv.style.fontFamily = "monospace"; logDiv.style.fontSize = "12px"; // 日志容器 - 使用单独的容器存放日志条目 const logContainer = document.createElement("di…

苹果cms10 列表和搜索过滤会员组没有权限的数据
type: item
date: 2026-03-13T14:21:00+00:00
description: AI摘要 苹果cms10在列表和搜索中可能显示会员组无权限数据。新版本可通过后台“网站基础参数-性能优化-数据权限过滤”开启此功能。老版本需手动修改`application/common/model/Vod.php`文件。在`listData`方法中，增加代码以根据当前用户组的`group_type`过滤`type_id`，确保用户只能看到其会员组有权限的内容，避免点击后才提示登录。 此内容根据文章生成，仅用于文章内容的解释与总结 苹果cms10 列表和搜索过滤会员组没有权限的数据苹果cms10的列表中，会出现会员组没有权限的数据，只有点进去才会提示登录。1.新版本后台-》网站基础参数-》性能优化-》数据权限过滤开启即可2.老版本编辑文件application/common/model/Vod.php找到listData方法，增加过滤方法public function listData($where,$order,$page=1,$limit=20,$start=0,$field='*',$addition=1,$totalshow=1) { $page = $page > 0 ? (int)$page : 1; $limit = $limit ? (int)$limit : 20; $start = $start ? (int)$start : 0; if(!is_array($where)){ $where = json_decode($where,true); } $where2=''; if(!empty($where['_string'])){ $where2 = $where['_string']; unset($where['_string']); } // =====修改开始===== // 增加会员组过滤方法 $where3 = []; // 如果是用户请求 if(isset($GLOBALS['user'])){ $category_ids = array_filter(explode(',',$GLOBALS['user']['group']['group_type'])); $where3['type_id'] = ['in',$category_ids]; } $limit_str = ($limit * ($page-1) + $start) .",".$limit; if($totalshow==1) { // 增加where3查询 $total = $this->where($where)->where($where2)->where($where3)->count(); } // 增加where3查询 $list = Db::name('Vod')->field($field)->where($where)->where($where2)->where($where3)->order($order)->limit($limit_str)->select(); // =====修改结束===== //分类 $type_list = model('Type')->getCache('type_list'); //用户组 $group_list = model('Group')->getCache('group_list'); foreach($list as $k=>$v){ if($addition==1){ if(!empty($v['type_id'])) { $list[$k]['type'] = $type_list[$v['type_id']]; $list[$k]['type_1'] = $type_list[$list[$k]['type']['type_pid']]; } if(!empty($v['group_id'])) { $list[$k]['group'] = $group_list[$v['group_id']]; } } } return ['code'=>1,'msg'=>lang('data_list'),'page'=>$page,'pagecount'=>ceil($total/$limit),'limit'=>$limit,'total'=>$total,'list'=>$list]; }

PHP多级分类数据列表转为树型父子结构
type: item
date: 2024-01-10T01:36:00+00:00
description: AI摘要 该PHP函数`formatToTree`用于将MySQL查询出的多级分类列表数据转换为树型父子结构。它通过递归实现，接收数据数组、最上级父节点ID和父ID字段名作为参数，将具有相同父ID的项归类到`children`属性中，从而构建出层级清晰的树状结构。 此内容根据文章生成，仅用于文章内容的解释与总结 PHP多级分类数据列表转为树型父子结构function formatToTree($array, $pid = 0, $pidName = 'parent_id') { return array_values(array_map(function ($item) use ($array, $pid) { $item['children'] = formatToTree($array, $item['id']); return $item; },array_filter($array,function ($item) use ($pidName,$pid) { return $item[$pidName] === $pid; }))); }$array为mysql查询出来的列表数据$pid为最上级父节点id$pidName为父id字段

Javascript 实现阿拉伯数字转中文数字
type: item
date: 2023-11-13T06:55:00+00:00
description: AI摘要 该JavaScript代码实现了一个`numToChinese`函数，用于将阿拉伯数字转换为中文数字。它支持亿位以下的数字转换，通过预定义的中文数字和单位数组进行映射。函数逻辑处理了零的显示、单位的连接以及“一十”简化为“十”等特殊情况。例如，输入12会输出“十二”。 此内容根据文章生成，仅用于文章内容的解释与总结 代码（仅适用亿位以下）：function numToChinese(num) { const CN_NUM = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']; const CN_UNIT = ['', '十', '百', '千', '万', '十', '百', '千', '亿']; let numStr = String(num); let len = numStr.length; let result = ''; if (len === 0) { return '零'; } for (let i = 0; i < len; i++) { let n = numStr.charAt(i); let unitIndex = len - i - 1; let numIndex = parseInt(n); let preUnit = CN_UNIT[unitIndex]; let preNum = CN_NUM[numIndex]; let replaceNum = preNum ? preNum : ''; if (unitIndex > 0 && numIndex === 0) { replaceNum = ''; } else if (numIndex > 0) { replaceNum = preNum; } result += replaceNum + preUnit; } result = result.replace(/零(千|百|十|)/g, '零$1'); let matchs = (result.match(/([亿|万|千|百|十]{2,})/g))||[] for (const iterator of matchs) { result = result.replace(iterator,iterator.slice(0,1) + "零") } result = result.replace("一十","十") return result.endsWith("零") ? result.slice(0,-1) : result; } console.log(numToChinese(12));结果：十二

Centos7系统的笔记本，启动摄像头
type: item
date: 2023-07-18T06:21:56+00:00
description: AI摘要 在Centos7笔记本上启动摄像头，首先使用`dmesg | grep -i webcam`命令确认摄像头已被系统识别。若需启动或重新加载摄像头模块，可在终端依次运行`modprobe -r uvcvideo`和`modprobe uvcvideo`。 此内容根据文章生成，仅用于文章内容的解释与总结 Centos7系统的笔记本，启动摄像头1. 确认摄像头已正确安装。在终端中运行以下命令，检查摄像头是否被正确识别：dmesg | grep -i webcam如果摄像头被正确识别，你应该能在输出中看到相关的信息。2. 检查摄像头是否已经启动。在终端中运行以下命令，启动摄像头：modprobe -r uvcvideo modprobe uvcvideo

mysql5.7 sql语句实现父子查询
type: item
date: 2023-05-02T06:25:45+00:00
description: AI摘要 本文介绍了在MySQL 5.7中实现父子查询的方法。首先创建了`goods_metas`数据表，包含`id`、`name`、`type`和`parent`等字段以存储层级关系。接着，提供了一个SQL查询语句，该语句利用`FIND_IN_SET`函数和用户自定义变量，能够根据指定的父ID高效地查询出其所有子节点（即所有后代，不包含父节点自身）。文章还展示了查询结果示例。 此内容根据文章生成，仅用于文章内容的解释与总结 mysql5.7 sql语句实现父子查询1.数据表创建SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS `goods_metas`; CREATE TABLE `goods_metas` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号', `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名', `type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '类型', `count` int(11) NULL DEFAULT 0 COMMENT '统计', `parent` int(11) NULL DEFAULT 0 COMMENT '父编号（只有class需要）', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `name`(`name`, `type`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; INSERT INTO `goods_metas` VALUES (1, '美甲', 'class', 0, 0); INSERT INTO `goods_metas` VALUES (2, '长甲', 'class', 0, 1); INSERT INTO `goods_metas` VALUES (3, '短甲', 'class', 0, 1); INSERT INTO `goods_metas` VALUES (4, '可爱', 'tag', 0, 0); INSERT INTO `goods_metas` VALUES (5, '简约', 'tag', 0, 0); INSERT INTO `goods_metas` VALUES (6, '测试', 'class', 0, 2); SET FOREIGN_KEY_CHECKS = 1;2.根据父id查所有子节点将{id}修改为查询的父id不包含父节点自身select * from goods_metas where id in (SELECT id FROM (SELECT * FROM goods_metas where type="class") goods_metas, (SELECT @pid := '{id}') pd WHERE FIND_IN_SET(parent, @pid) > 0 AND @pid := concat(@pid, ',', id));id=0查询结果+----+----------+-------+-------+--------+ | id | name | type | count | parent | +----+----------+-------+-------+--------+ | 2 | 长甲 | class | 0 | 1 | | 3 | 短甲 | class | 0 | 1 | | 6 | 测试 | class | 0 | 2 | +----+----------+-------+-------+--------+