校长bloG - 代码
type: channel
link: https://vpsaz.cn/category/d/
items: 抖音聊天监控与自动回复
items: ZeppLife 步数同步
items: 影视搜索源码
items: 网站标题首次打开滚动文本
items: 易语言校长YY模块
items: 很可爱的返回顶部JS素材
items: 让Typecho支持emoji表情😜
items: 网页禁止查看审查元素及复制粘贴
items: 用JS实现计算加载页面所用时长
items: 支付宝API支付接口

抖音聊天监控与自动回复
type: item
date: 2026-04-10T06:36:00+08:00
description: 前言抖音PC端没有开放聊天API，想做消息监控或自动回复只能自己动手。传统方案是抓包拦截WebSocket，门槛高且容易被检测。本文介绍一种纯前端注入方案，零依赖，浏览器控制台粘贴即用。核心思路MutationObserver 监听DOM变化，实时捕获新消息data-index="0" 始终指向最新一条消息，避免全量扫描data-index递增遍历 查找连续消息的真实发送者昵称document.execCommand 向Slate富文本编辑器写入内容并模拟发送踩坑记录消息重复输出[class*="message"] 选择器太宽泛，匹配到了消息容器的子元素，一条消息被处理多次。改用精确类名 .messageMessageBoxmessageBox 解决。昵称互相覆盖最初用一个变量 lastNick 记住上一个昵称，但群聊里多个人轮流发言会互相覆盖。拆分为 lastSelfNick / lastOtherNick 后仍然有问题——群聊中任何非己方消息的 isSelf 都是 false，无法区分是A发的还是B发的。真正解决是用 data-index 向上遍历查找。抖音群聊的消息结构中，同一个人连续发消息时只有第一条显示昵称，后续消息省略头像和昵称元素。当我们需要获取当前消息的发送者昵称时，直接查 .MessageBoxMessageTitleavatarName 元素，如果没有就往 data-index+1 的消息找，直到找到有昵称的为止。发送后旧消息重复DOM重新渲染后元素引用失效，Set 去重失败。改用 data-index="0" 只监听最新消息，配合 lastContent 内容对比去重。两个data-index="0"左侧会话列表也有 data-index="0"，querySelector 会误匹配。遍历所有 data-index="0"，只取包含 .messageMessageBoxmessageBox 的那个。写入输入框但发送按钮禁用直接改 textContent 不会触发Slate编辑器内部状态更新。改用 document.execCommand('insertText') + Selection API，Slate能正确识别。连发相同消息被吞按内容去重导致相同内容被过滤。改为只对比 lastContent，新消息插入后 data-index="0" 的DOM元素变了，自然不会被误判。昵称元素根本不存在最初尝试用"有没有头像"来判断是否需要查历史，这是不对的。.commonIMAvataravatarContainer 不存在不代表没有昵称，应该直接查 .MessageBoxMessageTitleavatarName 元素。功能实时监听：文本、图片、大表情、小表情、分享视频昵称识别：连续消息无头像时自动往上查找真实发送者关键词自动回复：支持精确匹配和模糊匹配，3秒冷却防刷屏重复注入自动清理：断开旧Observer，重新启动使用方法打开抖音PC端，进入群聊页面修改 autoReply 数组配置关键词和回复F12打开控制台，粘贴代码回车// matchType: 'exact' = 精确匹配, 'fuzzy' = 模糊匹配 const autoReply = [ { keyword: '在吗', reply: '在的~', matchType: 'exact' }, { keyword: '加群', reply: '群主，群众中有坏蛋', matchType: 'fuzzy' } ];完整代码(function() { if (window.__chatMonitorObserver) { window.__chatMonitorObserver.disconnect(); window.__chatMonitorObserver = null; console.log('[已移除旧注入，重新启动]'); } window.__chatMonitorRunning = true; let lastContent = ''; let lastMsgEl = null; // matchType: 'exact' = 精确匹配(消息内容完全等于关键词), 'fuzzy' = 模糊匹配(消息内容包含关键词) const autoReply = [ { keyword: '建档', reply: '微扫置顶小程序码！', matchType: 'exact' }, { keyword: '在吗', reply: '在的~', matchType: 'exact' }, { keyword: '加群', reply: '群主，群众中有坏蛋', matchType: 'fuzzy' } ]; let replyCooldown …

ZeppLife 步数同步
type: item
date: 2025-02-25T13:39:00+08:00
description: <?php // error_reporting(0); header("Access-Control-Allow-Origin:*"); header('Content-type:text/json; charset=utf-8'); $user = '小米运动帐号'; $pwd = '小米运动密码'; $steps = 66666; // 要刷的步数 $code = access_code($user, $pwd); if (strlen($code) > 3) { $tokenjson = login_token($code); $login_token = $tokenjson['token_info']['login_token']; $user_id = $tokenjson['token_info']['user_id']; $appjson = get_app_token($login_token); $user_id = $appjson['token_info']['user_id']; $app_token = $appjson['token_info']['app_token']; $t = get_time(); $time = date("Y-m-d", time()); $data_json = data_json($time, $steps); $res = change_steps($t, $user_id, $app_token, $data_json); echo $res; } else { exit("登录失败"); } exit(); function access_code($user, $pwd) { $url = "https://api-user.huami.com/registrations/+86{$user}/tokens"; $header = ["Content-Type " => "application/x-www-form-urlencoded;charset=UTF-8"]; $post_data = array( "client_id" => "HuaMi", "password" => $pwd, "redirect_uri" => "https://s3-us-west-2.amazonaws.com/hm-registration/successsignin.html", "token" => "access" ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_USERAGENT, "MiFit/4.6.0 (iPhone; iOS 14.0.1; Scale/2.00)"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate'); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_TIMEOUT, 5); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); curl_setopt($ch, CURLOPT_HEADER, true); $output = curl_exec($ch); preg_match_all('/access=(.*?)&country_code/i', $output, $out); curl_close($ch); return $out[1][0]; } function login_token($code) { $url = "https://account.huami.com/v2/client/login"; $header = ["Content-Type " => "application/x-www-form-urlencoded;charset=UTF-8"]; $post_data = array( "app_name" => "com.xiaomi.hm.health", "app_version" => "4.6.0", "code" => $co…

影视搜索源码
type: item
date: 2024-12-19T15:35:00+08:00
description: <?php function getInitialTheme() { if (isset($_COOKIE['theme_preference'])) { return $_COOKIE['theme_preference'] === 'dark' ? 'dark' : 'light'; } if (isset($_SERVER['HTTP_ACCEPT'])) { $accept = $_SERVER['HTTP_ACCEPT']; if (strpos($accept, 'prefers-color-scheme: dark') !== false) { return 'dark'; } } return 'light'; } $initialTheme = getInitialTheme(); $selected_source = isset($_GET['y']) ? $_GET['y'] : (isset($_COOKIE['selected_source']) ? $_COOKIE['selected_source'] : '1'); $search_query = isset($_GET['search']) ? urlencode($_GET['search']) : ''; $search_results = []; if ($search_query) { $search_url = "https://baiapi.cn/api/ysss/?apikey=密钥&y={$selected_source}&wd={$search_query}"; $search_data = @file_get_contents($search_url); if ($search_data) { $search_results = json_decode($search_data, true); } } $movie_details = null; if (isset($_GET['movie_id'])) { $details_url = "https://baiapi.cn/api/ysss/?apikey=密钥&y={$selected_source}&id=". urlencode($_GET['movie_id']); $details_data = @file_get_contents($details_url); if ($details_data) { $movie_details = json_decode($details_data, true); } } ?> <html lang="zh-CN" data-theme="<?php echo $initialTheme; ?>"> 影视搜索 <i class="<?php echo $initialTheme === 'dark' ? 'fas fa-sun' : 'fas fa-moon'; ?>"> 📢 免责声明 本站所有内容均来自互联网，本站不会保存、复制或传播任何视频文件，也不对本站上的任何内容负法律责任。如果本站部分内容侵犯您的版权请告知，在必要证明文件下我们第一时间撤除。 请勿相信视频中的任何广告！ 开源地址：GitHub 5 秒后可关闭 影视搜索 <input type="text" name="search" value="<?php echo isset($_GET['search']) ? htmlspecialchars($_GET['search']) : ''; ?>" placeholder="请输入影片名称" style="flex-grow: 1; padding: 10px 10px; font-size: 16px; border: 1px solid var(--border-color); border-radius: 5px; margin-right: 10px; background-color: var(--input-bg); color: var(--input-text);"/> <option value="1" <?php echo ($selected_source == '1') ? 'selected' : ''; ?>>片源1 <option value="2" <?php echo ($selected_source == '2') ? 'selected' : ''; ?>>片源2 <option value="3" <?php echo ($selected_source == '3') ? 'selected' : ''; ?>>片源3 <option value="4" <?ph…

网站标题首次打开滚动文本
type: item
date: 2023-09-23T00:23:00+08:00

易语言校长YY模块
type: item
date: 2022-11-20T01:21:00+08:00
description: 写这个呢有两个原因，第一个原因是自己用的时候方便，第二个原因就是分享出来互相学习。模块主要包含登录、用户信息获取、频道信息获取，其他的功能后续会添加。调用简单，如果有什么不懂的可以联系我。立即购买//登录窗口 校长_用户_YY登录 () //用户信息 校长_用户_取YY号 () 校长_用户_取UID号 () 校长_用户_取登录CK () 校长_用户_取YY头像 () 校长_用户_取YY会员等级 () 校长_用户_取YY会员成长值 () 校长_用户_取YY会员每日成长值 () 校长_用户_取YY紫钻等级 () 校长_用户_取YY紫钻经验值 () 校长_用户_取YY紫钻每日经验值 () //频道信息 校长_频道_取YY频道在线人数 (“654933”) 校长_频道_取YY频道类型 (“654933”) 校长_频道_取YY频道头像 (“654933”) 校长_频道_取YY频道短位ID (“654933”) 校长_频道_取YY频道原始ID (“654933”) 校长_频道_取YY频道名称 (“654933”)

很可爱的返回顶部JS素材
type: item
date: 2022-10-18T19:58:00+08:00
description: 给自己网站放一个返回顶部js特效效果把，主要是图片素材也不错，比较抢镜，所以弄个小教程，比较简单，放上去试试看把！ 首先，主要代码如下 这里代码放在，一般是底部foot的文件里面，具体位置底部就行，faa-float是自然状态的摇曳抖动的效果。css文件： @media (max-width:1000px){.back-to-top{display:none!important;}} @-webkit-keyframes wrench{0%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}8%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}10%{-webkit-transform:rotate(24deg);transform:rotate(24deg)}18%,20%{-webkit-transform:rotate(-24deg);transform:rotate(-24deg)}28%,30%{-webkit-transform:rotate(24deg);transform:rotate(24deg)}38%,40%{-webkit-transform:rotate(-24deg);transform:rotate(-24deg)}48%,50%{-webkit-transform:rotate(24deg);transform:rotate(24deg)}58%,60%{-webkit-transform:rotate(-24deg);transform:rotate(-24deg)}68%{-webkit-transform:rotate(24deg);transform:rotate(24deg)}100%,75%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes wrench{0%{-webkit-transform:rotate(-12deg);-ms-transform:rotate(-12deg);transform:rotate(-12deg)}8%{-webkit-transform:rotate(12deg);-ms-transform:rotate(12deg);transform:rotate(12deg)}10%{-webkit-transform:rotate(24deg);-ms-transform:rotate(24deg);transform:rotate(24deg)}18%,20%{-webkit-transform:rotate(-24deg);-ms-transform:rotate(-24deg);transform:rotate(-24deg)}28%,30%{-webkit-transform:rotate(24deg);-ms-transform:rotate(24deg);transform:rotate(24deg)}38%,40%{-webkit-transform:rotate(-24deg);-ms-transform:rotate(-24deg);transform:rotate(-24deg)}48%,50%{-webkit-transform:rotate(24deg);-ms-transform:rotate(24deg);transform:rotate(24deg)}58%,60%{-webkit-transform:rotate(-24deg);-ms-transform:rotate(-24deg);transform:rotate(-24deg)}68%{-webkit-transform:rotate(24deg);-ms-transform:rotate(24deg);transform:rotate(24deg)}100%,75%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}}.faa-parent.animated-hover:hover>.faa-wrench,.faa-wrench.animated,.faa-wrench.animated-hover:hover{-webkit-animation:wrench 2.5s ease infinite;animation:wrench 2.5s ease infinite;transform-origin-x:90%;transform-origin-…

让Typecho支持emoji表情😜
type: item
date: 2022-10-10T13:01:00+08:00
description: 最近很多站长在使用Typecho主题时，均遇到无法使用emoji表情，最后发现报错： Database Query Error通过下面方法解决1、进入网站数据库，直接运行下列语句alter table typecho_comments convert to character set utf8mb4 collate utf8mb4_general_ci; alter table typecho_contents convert to character set utf8mb4 collate utf8mb4_general_ci; alter table typecho_fields convert to character set utf8mb4 collate utf8mb4_general_ci; alter table typecho_metas convert to character set utf8mb4 collate utf8mb4_general_ci; alter table typecho_options convert to character set utf8mb4 collate utf8mb4_general_ci; alter table typecho_relationships convert to character set utf8mb4 collate utf8mb4_general_ci; alter table typecho_users convert to character set utf8mb4 collate utf8mb4_general_ci;2、修改数据库的配置文件网站根目录数据库配置文件 config.inc.php (大约在60行) $db = new Typecho_Db('Pdo_Mysql', 'typecho_'); $db->addServer(array ( ... 'charset' => 'utf8mb4', // 将原来的utf8修改为 utf8mb4 ... ), Typecho_Db::READ | Typecho_Db::WRITE); Typecho_Db::set($db);通过上面的方法即可完美使用emoji表情了。

网页禁止查看审查元素及复制粘贴
type: item
date: 2022-10-10T12:44:00+08:00
description: //禁用F12 window.onkeydown = window.onkeyup = window.onkeypress = function (event) { // 判断是否按下F12，F12键码为123 if (event.keyCode == 123) { event.preventDefault(); // 阻止默认事件行为 window.event.returnValue = false; } }//禁用调试工具 var threshold = 160; // 打开控制台的宽或高阈值 // 每秒检查一次 var check = setInterval(function() { if (window.outerWidth - window.innerWidth > threshold || window.outerHeight - window.innerHeight > threshold) { // 如果打开控制台，则刷新页面 window.location.reload(); } }, 1000)//屏蔽右键菜单 document.oncontextmenu = function (event){ if(window.event){ event = window.event; } try{ var the = event.srcElement; if (!((the.tagName == "INPUT" && the.type.toLowerCase() == "text") || the.tagName == "TEXTAREA")){ return false; } return true; } catch (e){ return false; } }//屏蔽选中 document.onselectstart = function (event){ if(window.event){ event = window.event; } try{ var the = event.srcElement; if (!((the.tagName == "INPUT" && the.type.toLowerCase() == "text") || the.tagName == "TEXTAREA")){ return false; } return true; } catch (e) { return false; } }//屏蔽复制 document.oncopy = function (event){ if(window.event){ event = window.event; } try{ var the = event.srcElement; if(!((the.tagName == "INPUT" && the.type.toLowerCase() == "text") || the.tagName == "TEXTAREA")){ return false; } return true; } catch (e){ return false; } }//屏蔽剪贴 document.oncut = function (event){ if(window.event){ event = window.event; } try{ var the = event.srcElement; if(!((the.tagName == "INPUT" && the.type.toLowerCase() == "text") || the.tagName == "TEXTAREA")){ return false; } return true; } catch (e){ return false; } }//屏蔽粘贴 document.onpaste = function (event){ if(window.event){ event = window.event; } try{ var the = event.srcElement; if (!((the.tagName == "INPUT" && the.type.toLowerCase() == "text") || the.tagName == "TEXTAREA")){ return false; } return true; } catch (e){ return false; } }

用JS实现计算加载页面所用时长
type: item
date: 2022-10-10T12:42:32+08:00
description: 在页面Head部分加入初始时间： 在Body中加入： 在需要显示的地方插入一个ID为TimeShow的标签即可

支付宝API支付接口
type: item
date: 2022-10-10T12:41:00+08:00
description: 生成订单{ "success": true, "out_trade_no": "XZPAY202410200303413991", "create_time": "2024-10-20 03:03:42", "expire_time": "2024-10-20 03:08:42", "payment_url": "https://qr.alipay.com/bax09818vgakmd5uxhny55e1", "msg": "支付地址创建成功" }查询订单{ "success": true, "trade_status": "支付成功", "out_trade_no": "XZPAY202410200303413991", "trade_no": "2024101722001446361415021800", "total_amount": "0.10", "msg": "查询成功" }