【油猴脚本教程】P2 初识油猴脚本 & 油猴脚本的基本构成
P2 初识油猴脚本 教程索引 视频链接 光讲JS感觉不是特别直观，用两个不涉及网络请求的脚本进行讲解 第一个脚本 - Remove Live.js 脚本链接： https://github.com/chr233/GM_Scripts/blob/master/Bilibili/Remove_Live.js 脚本功能： 提供一个开关，用于移除直播播放器，并且带有记忆功能 源码： // ==UserScript== // @name Remove_Live // @name:zh-CN 去除B站直播间播放器 // @namespace https://blog.chrxw.com // @version 1.1 // @description 去除B站多余的直播播放器（滑稽） // @author Chr_ // @include https://live.bilibili.com/* // @license AGPL-3.0 // @icon https://blog.chrxw.com/favicon.ico // ==/UserScript== (() => { "use strict"; //去除播放器的开关 let VEnable = localStorage.getItem("VEnable") === "true"; if (VEnable) { setTimeout(() => { document.getElementById("live-player").remove(); }, 3000); } let btnArea = document.querySelector(".right-ctnr"); let btn = document.createElement("button"); btn.textContent = VEnable ? "恢复播放器" : "移除播放器"; btn.addEventListener("click", () => { VEnable = !VEnable; localStorage.setItem("VEnable", VEnable); btn.textContent = VEnable ? "恢复播放器" : "移除播放器"; if (VEnable) { document.getElementById("live-player").remove(); } else { location.reload(); } }); btnArea.insertBefore(btn, btnArea.children[0]); })(); 第二个脚本 - SteamDB CN.js 脚本链接： https://github.com/chr233/GM_Scripts/blob/master/SteamDB/SteamDB_CN.js 脚本功能： 汉化SteamDB 源码： // ==UserScript== // @name:zh-CN SteamDB汉化 // @name SteamDB_CN // @namespace https://blog.chrxw.com // @supportURL https://blog.chrxw.com/scripts.html // @contributionURL https://afdian.net/@chr233 // @version 1.32 // @description SteamDB汉化插件 // @description:zh-cn SteamDB汉化插件 // @author Chr_ // @match https://steamdb.info/* // @license AGPL-3.0 // @icon https://blog.chrxw.com/favicon.ico // @resource data https://cf.chrxw.com/SteamDB/SteamDB_CN.json // @grant GM_addStyle // @grant GM_getResourceText // @grant GM_registerMenuCommand // ==/UserScript== (() => { "use strict"; //是否打开调试模式（使用自定义汉化规则而不是在线规则） const DEBUG = localStorage["dbg_mode"] == "开"; //是否在控制台输出未汉化文本 const OUTPUT = localStorage["out_word"] == "开"; GM_registerMenuCommand(`调试汉化文本: 【${DEBUG ? "开" : "关"}】`, () => { window.localStorage["dbg_mode"] = DEBUG ? "关" : "开"; window.location.reload(); }); GM_registerMenuCommand(`在控制台输出未匹配文本: 【${OUTPUT ? "开" : "关"}】`, () => { window.localStorage["out_word"] = OUTPUT ? "关" : "开"; window.location.reload(); }); document.querySelector("html").setAttribute("lang", "zh-CN"); let Locales; if (DEBUG) { const template = `{"DOC":{"更新时间":"调试模式","贡献名单":["调试模式"]},\n"STATIC":\n{\n\n},\n"INPUT":\n{\n\n},\n"LABEL":\n{\n\n},\n"DYNAMIC":\n{\n\n}\n}`; const box = document.createElement("div"); box.className = "sdc"; const text = document.createElement("textarea"); box.appendChild(text); const action = document.createElement("div"); action.className = "sdc-links"; box.appendChild(action); const btnSave = document.createElement("a"); btnSave.innerText = "💾 保存并应用"; btnSave.addEventListener("click", () => { const raw = text.value.trim(); if (!raw) { alert("翻译文本不能为空!!!"); } else { try { JSON.parse(raw); window.localStorage["sdb_lang"] = raw; window.location.reload(); } catch (e) { alert("翻译文本不是有效的JSON格式!!!"); } } }); action.appendChild(btnSave); const btnReset = document.createElement("a"); btnReset.textContent = "🗑️ 清空文本"; btnReset.addEventListener("click", () => { window.localStorage["sdb_lang"] = template; window.location.reload(); }); action.appendChild(btnReset); const btnOnline = document.createElement("a"); btnOnline.textContent = "📄 当前在线文本"; btnOnline.addEventListener("click", () => { if (confirm("替换为在线版本后当前所做修改将会丢失, 确定要继续吗?")) { text.value = GM_getResourceText("data"); } }); action.appendChild(btnOnline); const about = document.createElement('a'); about.href = "https://blog.chrxw.com" about.innerText = "🔗 By Chr_ © 2022"; action.appendChild(about); const father = document.getElementById("main"); father.insertBefore(box, father.firstChild); const customLang = window.localStorage["sdb_lang"] ?? template; text.value = customLang; Locales = JSON.parse(customLang); } else { Locales = JSON.parse(GM_getResourceText("data")); } //计时 const Start = new Date().getTime(); {//静态元素 for (const [css, dic] of Object.entries(Locales.STATIC)) { if (OUTPUT) { console.log(`〖${css}〗`); } const elements = document.querySelectorAll(css); if (elements.length > 0) { for (let i = 0; i < elements.length; i++) { const element = elements[i]; if (element.childElementCount === 0) {//节点内部无其他元素 const raw = element.innerText?.trim(); if (!raw || raw.length <= 2) { continue; } const txt = dic[raw]; if (txt) { element.innerText = txt; } else if (OUTPUT) { console.log(`"${raw}": "",`); } } else {//节点内部有其他元素 const nodes = element.childNodes; for (let j = 0; j < nodes.length; j++) { const node = nodes[j]; if (node.nodeType === Node.TEXT_NODE) { const raw = node.textContent?.trim(); if (!raw || raw.length <= 2) { continue; } const txt = dic[raw]; if (txt) { node.textContent = txt; } else if (OUTPUT) { console.log(`"${raw}": "",`); } } } } } } else { if (OUTPUT) { console.warn(`CSS选择器未匹配到任何元素: ${css}`); } } } } {//输入框 const inputs = Locales.INPUT; if (OUTPUT) { console.log("〖输入框〗"); } const elements = document.querySelectorAll("input"); for (let i = 0; i < elements.length; i++) { const element = elements[i]; const raw = element.placeholder; if (!raw) { continue; } const txt = inputs[raw]; if (txt) { element.placeholder = txt; } else if (OUTPUT) { console.log(`"${raw}": "",`); } } } {//悬浮提示 const labels = Locales.LABEL; if (OUTPUT) { console.log("〖提示文本〗"); } const elements = document.querySelectorAll("*[aria-label]"); for (let i = 0; i < elements.length; i++) { const element = elements[i]; const raw = element.getAttribute("aria-label"); if (!raw) { continue; } const txt = labels[raw]; if (txt) { element.setAttribute("aria-label", txt); } else if (OUTPUT) { console.log(`"${raw}": "",`); } } } const { script: { version } } = GM_info; //const version = GM_info.script.version; const { DOC: { "更新时间": update, "贡献名单": contribution } } = Locales; const End = new Date().getTime(); // 统计耗时 console.log("执行耗时", `${End - Start} ms`); console.log("================================="); console.log(`插件版本: ${version}`); console.log(`更新时间: ${update}`); console.log(`贡献名单: ${contribution.join(", ")}`); console.log("================================="); console.log("迷茫同学:\n『没有恶意 请问直接用谷歌翻译整个网页不香吗』") // 添加按钮 const headerUl=document.querySelector(".header-menu-container>div>ul:nth-child(1)"); const footerUl=document.querySelector(".footer-container>div>ul:nth-child(1)"); const scriptLink = document.createElement("li"); scriptLink.innerHTML = `SteamDB 汉化 V${version}`; headerUl.appendChild(scriptLink); footerUl.appendChild(scriptLink.cloneNode(true)); // 添加样式 GM_addStyle(` .tabnav-tabs > a { min-width: 80px; } .sdc { display: flex; } .sdc > textarea { width: 100%; height: 200px; min-height: 200px; resize: vertical; } .sdc > div.sdc-links { width: 150px; margin: 5px; } .sdc > div.sdc-links > a { width: 100%; margin-bottom: 10px; background-color: #213145; color: white; font-size: 12px; border-radius: 0px; display: inline-block; height: 30px; } .sdc > div.sdc-links > a:last-child { width: 100%; margin-top: 30px; margin-bottom: 0px; color: #67c1f5; background-color: #273b4b; } `); })(); 油猴脚本基本构成 元信息 记录脚本的额外信息，供油猴插件以及 GreasyFork 使用 // ==UserScript== // @name:zh-CN 脚本名称(可选，可以使用语言代码来支持多语言) // @name 脚本名称 // @namespace 命名空间 // @version 脚本版本 // @description 脚本描述 // @description:zh-cn 脚本描述(可选，可以使用语言代码来支持多语言) // @author 作者 // @include 脚本生效域名 // @match 脚本生效域名 // @license 共享协议 // @icon 脚本图标(可选) // @resource 外部资源链接，以及访问名称(可选) // @grant 申请额外权限(可选) // ==/UserScript== 脚本正文 略
P0 开发环境配置 教程索引 视频链接 下载工具 VSCode : https://code.visualstudio.com/#alt-downloads Git：https://git-scm.com/download/win 安装 一路下一步，推荐勾选“添加右键菜单” 推荐把Git默认编辑器改成Vscode VSCode配置 插件安装 Chinese —— 简体中文语言包 EsLint —— JS语法检查 GitLens —— 源代码管理工具（可选） 左边栏菜单 Git简介与使用 工作流程 修改文件 -> 暂存 -> 提交 配置用户名和邮箱 暂存 提交 查看提交记录和文件历史 配置远程仓库 直接通过账号密码连接到GitHUB 生成SSH密钥对，手动添加远程仓库 GreasyFork的使用 编写你的脚本 添加必要的元信息 发布你编写的脚本 使用WebHook自动更新 为远程代码仓库配置 Greasy Fork 的 WebHook 为指定脚本配置仓库中脚本的文件路径 （Raw链接） 这个时候GreasyFork中的脚本就会跟远程仓库保持同步
前言 本文仅供学习探讨之用，如果侵犯您的权益请联系我删除。 上文 [post cid="714"/] [post cid="1347"/] [post cid="1365"/] [post cid="1383"/] 前情提要 距离上一篇文章已经过去一年多了，前两天心血来潮找了最新版本研究了一下，熬了两天夜也没整明白，不打算继续研究下去了，做个笔记记录下分析过程。 @> 本文适用于小黑盒 1.3.191，小黑盒历史版本参考我的仓库 @> 全文评论后可见
前言 最近在学习单片机开发，用的是ESP 8266这块芯片，Arduino IDE实在是用不习惯，研究了下怎么配置VS Code，简单的做个记录。 插件安装 在扩展商店里搜索arduino，然后安装微软开发的那个插件即可 Arduino 插件配置 手动添加这两行即可： "arduino.additionalUrls": "附加开发版管理器的网址", "arduino.path": "C:\\Program Files (x86)\\Arduino" arduino.additionalUrls 对应ArduinoIDE里的设置项（如图） arduino.path 即Arduino IDE的安装路径 i> 插件配置以后需要重启VS Code才会生效 Arduino Cli 安装 从 Arduino-Cli Releases 下载对应操作系统的版本，然后丢进Arduino IDE安装目录，最后在VS Code的插件设置里勾选Use Arduino Cli 终端乱码解决方法 安装最新版本的Arduino IDE后终端显示会不正常，原因是中文环境下终端默认的代码页为936，只能显示GBK编码的文本，而最新版本的Arduino IDE输出的文本编码是UTF-8，对应编码页是65001，Arduino插件中包含代码页的判定，但是好像忘记设置代码页了，作用存疑，稍微修改一下即可。 涉及到的文件位置为%HOMEPATH%\.vscode\extensions\vsciot-vscode.vscode-arduino-0.4.0\out\src\common\util.js !> 插件版本不同文件夹后缀名称也会不同，自行修改即可 在第207行左右，把const chcp = child_process.execSync("chcp.com");改成const chcp = child_process.execSync(chcp.com ${codepage});即可 重启VS Code生效。 顺手提交了一个PR，不知道会不会采纳。
前言 Handsome主题又更新了，改动挺大的，还好之前有记录，摸索着又加了个性化内容。 handsome 6.0 的修改记录参见： [post cid="814"/] !> 修改前务必先备份 超链接特效 修改/usr/themes/handsome/assets/css/handsome.min.css，删除这两节： .comment-content-true a:hover,.wrapper-lg .entry-content a:hover{ color:#222;border-bottom-color:#222 } .comment-content-true a,.wrapper-lg .entry-content a{ color:#58666e;border-bottom-color:#222;border-bottom:1px solid #999;word-wrap:break-word;word-break:break-all } 自定义CSS： /*超链接特效*/ .comment-content-true a:not(.light-link):not(.post_inser_a),.wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a){position:relative;margin:auto 4px;color:#23b7e5;-webkit-transition:color .3s;transition:color .3s;-webkit-perspective:600px;perspective:600px;-webkit-perspective-origin:50% 100%;perspective-origin:50% 100%;word-wrap:break-word;word-break:break-all;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;max-width:inherit;width:inherit} .comment-content-true a:not(.light-link):not(.post_inser_a):focus,.comment-content-true a:not(.light-link):not(.post_inser_a):hover,.wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a):focus,.wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a):hover{color:#fff} .comment-content-true a:not(.light-link):not(.post_inser_a)::after,.comment-content-true a:not(.light-link):not(.post_inser_a)::before,.wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a)::after,.wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a)::before{position:absolute;top:0;left:-4px;z-index:-1;box-sizing:content-box;padding:0 4px;width:100%;height:100%;content:''} .comment-content-true a:not(.light-link):not(.post_inser_a)::before,.wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a)::before{background-color:#23b7e5;-webkit-transition:-webkit-transform .2s;transition:transform .2s;-webkit-transition-timing-function:cubic-bezier(.7,0,.3,1);transition-timing-function:cubic-bezier(.7,0,.3,1);-webkit-transform:rotateX(90deg);transform:rotateX(90deg);-webkit-transform-origin:50% 100%;transform-origin:50% 100%} .comment-content-true a:not(.light-link):not(.post_inser_a):focus::before,.comment-content-true a:not(.light-link):not(.post_inser_a):hover::before,.wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a):focus::before,.wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a):hover::before{-webkit-transform:rotateX(0);transform:rotateX(0)} .comment-content-true a:not(.light-link):not(.post_inser_a)::after,.wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a)::after{border-bottom:1px solid #23b7e5} 如果使用版权提示插件，链接有可能会超出提示框，添加以下css解决： .content-copyright {overflow: hidden} 自定义左侧栏 !> 有一定风险，修改前一定要先备份 文件路径/usr/themes/handsome/component/aside.php，大概在85行~212行，替换 到<?php endif; ?>之间的内容： <?php _me("导航") ?> <?php $hideHomeItem = false; if (!empty(Typecho_Widget::widget('Widget_Options')->asideItems)) { $json = '[' . Utils::remove_last_comma(Typecho_Widget::widget('Widget_Options')->asideItems) . ']'; $asideItems = json_decode($json); $asideItemsOutput = ""; foreach ($asideItems as $asideItem) { @$itemName = $asideItem->name; @$itemStatus = $asideItem->status; @$itemSub = $asideItem->sub; if ($itemName === 'home' && strtoupper($itemStatus) === 'HIDE') { $hideHomeItem = true; continue; //本次循环结束，不再执行下面内容 } $haveSub = false; $subListHtml = ""; // print_r($itemSub); if (is_array($itemSub)) { $haveSub = true; $subListHtml .= ' '; foreach ($itemSub as $subItem) { $subListHtml .= Content::returnLeftItem($subItem, false, ""); } $subListHtml .= ' '; } $asideItemsOutput .= Content::returnLeftItem($asideItem, $haveSub, $subListHtml); } } ?> <?php if (!$hideHomeItem) : ?> <a href="<?php $this->options->rootUrl(); ?>/" class="auto"> <?php _me("博客首页") ?> <?php endif; ?> <?php echo @$asideItemsOutput ?> <?php if (@!in_array('component', $this->options->asideSetting)) : ?> <?php _me("一级分类") ?> <li <?php echo $class; ?>> <?php _me("更多分类") ?> <?php _me("分类") ?> <?php _me("二级分类") ?> <?php _me("页面") ?> <a data-no-instant> <?php _me("页面") ?> <?php _me("友链墙") ?> <a data-no-instant> <?php _me("友链") ?> <?php $mypattern1 = " {name} "; Handsome_Plugin::output($mypattern1, 0, "ten"); ?> <?php _me("独立页面") ?> <?php endif; ?> 导航模板： <?php _me("名称") ?> 自定义光标 √> 图标素材下载：链接 解压后上传服务器，nomral.cur是默认光标，link.cur是手掌光标。 以下内容放进自定义CSS里，路径自行修改。 /*自定义光标*/ *{ cursor:url(/usr/customize/normal.cur),auto!important } a,a *,button,button *,div.OwO-logo,div.OwO-logo *,div.panel-collapse,div.panel-collapse *,li.OwO-item,ul.OwO-packages *{ cursor:url(/usr/customize/link.cur),auto!important } 增加滑稽表情，微调表情栏 √> 下载链接：改版滑稽表情包.zip 食用方法： 下载表情包以后先解压 把huaji文件夹丢进/usr/themes/handsome/assets/img/emotion/里 用OwO.json替换掉/usr/themes/handsome/usr/OwO.json 如果嫌表情太大，可以在自定义CSS里加上这些： img[class^="emotion-"] {max-height: 3em !important} * 去除烦人的`OwO`标题： 打开`/usr/themes/handsome/assets/js/features/OwO.min.js`，删除这句： ```javascript OwO 404页面添加返回按钮 打开/usr/themes/handsome/404.php 在第95行左右，把 后面插入： <?php _me("返回") ?> <a href="<?php $this->options->rootUrl(); ?>" class="list-group-item"> <?php _me("首页") ?> Mac风格代码框 √> 插件下载&食用方法：链接 稍微改了下BlackMac的主题，去除了阴影，然后让复制按钮和代码类型一直显示。 文件路径：/usr/plugins/CodePrettify/static/styles/BlackMac.css code[class*=language-],pre[class*=language-]{color:#f8f8f2;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:2;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;font-size:13px}pre[class*=language-]{padding:.5em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#21252a}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#997f66}.token.punctuation{opacity:.7}.namespace{opacity:.7}.token.boolean,.token.constant,.token.number,.token.property,.token.symbol,.token.tag{color:#d1939e}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#bce051}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f4b73d}.token.atrule,.token.attr-value,.token.keyword{color:#d1939e}.token.important,.token.regex{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.deleted{color:red}pre.line-numbers{padding-left:3.3em;counter-reset:linenumber}pre.line-numbers>code{white-space:inherit font-size: 15px}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:0;width:3em;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.9em;text-align:right;background:#272c33}div.code-toolbar{font-size:100%;border-radius:4px;position:relative;padding-top:30px;background-color:#161616;margin:20px 0 20px 0}.code-toolbar:before{content:" ";position:absolute;-webkit-border-radius:50%;border-radius:50%;background:#fc625d;width:11px;height:11px;left:10px;top:10px;z-index:2}div.code-toolbar>.toolbar{padding-right:.4em;position:absolute;top:.09em;right:.2em;width:100%;text-align:center}div.code-toolbar>.toolbar .toolbar-item{padding:0 1px 1px 3px;display:inline-block}div.code-toolbar>.toolbar button{cursor:pointer;position:absolute;background-color:transparent;right:2px;top:4px;font-size:12px;line-height:12px;padding:3px 5px;border:none;color:#fff}div.code-toolbar>.toolbar:hover{text-decoration:none!important}div.code-toolbar>.div.code-toolbar>.toolbar button,div.code-toolbar>.toolbar span{font-family:Ubuntu,sans-serif;font-weight:700;font-size:.9em;color:#fff}#post-content .code-block-fullscreen{padding-top:32px;position:fixed;width:80vw;height:80vh;min-height:80vh;top:0;left:0;right:0;bottom:0;margin:auto;z-index:9999999;animation:elastic 1s;overflow:hidden;background:#21252a}.code-block-fullscreen code{--widthA:100%;--widthB:calc(var(--widthA) - 30px);height:var(--widthB);min-height:99%;overflow-y:scroll;height:100%}.code-block-fullscreen-html-scroll{overflow:hidden}.shelter{width:6.5px;height:6.5px;z-index:100;background:#313238;position:absolute;bottom:0;right:0}.max-img::-webkit-scrollbar-track-piece{background:#eee}.max-img::-webkit-scrollbar{width:8px;height:6px}.max-img::-webkit-scrollbar-thumb{border-radius:6px;background-color:#777}.max-img::-webkit-scrollbar-thumb:hover{background-color:#bbb}pre::-webkit-scrollbar{width:8px;height:6px}pre::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}pre::-webkit-scrollbar-thumb:hover{background-color:#bbb}code::-webkit-scrollbar{width:6px;height:6px}code::-webkit-scrollbar-thumb{border-radius:6px;background-color:#777}code::-webkit-scrollbar-thumb:hover{background-color:#bbb}html::-webkit-scrollbar-track-piece{background:#eee}html::-webkit-scrollbar{width:8px;height:6px}html::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}html::-webkit-scrollbar-thumb:hover{background-color:#bbb} 复制后提示 (与5.3.1相同) √> layer下载地址：链接 解压后把layer文件夹丢进/usr/customize/下 添加自定义javascript document.body.oncopy = function() {layer.msg('复制成功,转载请保留原文链接！');}; 添加尾部HTML代码： 其他微调 添加到自定义CSS里： /* 右侧栏气泡颜色加深 */ div.post-tags>a,aside.asideBar .badge{background-color:#777} /* 时光机圆形头像 */ .img-square {border-radius: 50%;} .list-group-item .thumb-sm .img-square {border-radius: 5px;}
x> 本脚本已过期，仅作存档 前言 本脚本仅供学习交流之用，使用者如何使用与本文作者无关。 AutoJS下载 & 教程 [post cid="1235" /] 脚本【控件定位版】 脚本 //遇到问题请在https://chrxw.com留言 //Ver:2.3 By Chr_(chr@chrxw.com) //增强模式，支持自动加购任务，如果不需要请把true改成false var adv_mode = true; auto.waitFor(); toast('\n脚本开始运行\n请切换到任务页'); className("android.view.View").text("做任务领金币").waitFor(); if (!className("android.view.View").textContains("任务每日0点刷新").exists()) { className("android.view.View").text("做任务领金币").findOne().parent().click(); } toast("\n即将开始工作\n中途需退出请按【音量+】终止"); sleep(2000); var i = 0; for (;;) { var btn = text("去完成").findOnce(i); if (btn != null) { var task = btn.parent().parent().parent(); var txt = task.child(0).child(1).text(); if (txt.search("8秒") != -1) { btn.click(); view(); i = 0; } else if (txt.search("88") != -1) { btn.click(); view(); i = 0; } else if (txt.search("浏览可得") != -1) { btn.click(); view2(); i = 0; } else if (adv_mode & txt.search("5个") != -1) { btn.click(); advview(); i = 0; } else { i++; } } else { toast("\n脚本运行完毕\n模拟浏览任务全部完成（大概）"); exit(); } } //随机延时 function rsleep(s) { while (s--) { sleep(random(900, 1200)); } } //模拟返回 function advback() { for (var i = 0; i < 3; i++) { if (!className("android.widget.ImageView").desc("返回").exists()) { rslideR(1); rsleep(2); continue; } className("android.widget.ImageView").desc("返回").click(); rsleep(3); if (className("android.view.View").textContains("做任务领金币").exists()) { return; } } toast("定位不到返回按钮，模拟返回键"); back(); } //随机划屏 function rslide(i) { while (i--) { var x1 = random(200, 900); var y1 = random(1200, 1900); var x2 = random(200, 900); var y2 = random(1000, 1200); swipe(x1, y1, x2, y2, 300); rsleep(1); } } //随机划屏，反向 function rslideR(i) { while (i--) { var x1 = random(200, 900); var y1 = random(900, 1300); var x2 = random(200, 900); var y2 = random(1500, 1900); swipe(x1, y1, x2, y2, 300); rsleep(1); } } //模拟浏览（浏览会场任务） function view() { rsleep(3); rslide(10); className("android.view.View").textStartsWith("恭喜完成").findOne(5000); rslideR(1); rsleep(3); advback(); } //模拟浏览（浏览会场任务） function view2() { rsleep(1); for (var i = 0; i < 4; i++) { back(); rsleep(3); if (className("android.view.View").textContains("做任务领金币").exists()) { return; } } } //高级浏览（浏览商品、加购任务） function advview() { rsleep(3); var add_cart = true; var count = 4; if (className("android.view.View").textContains("浏览以下5个商品").exists()) { add_cart = false; count = 3; } toast(add_cart); for (var i = 0; i < 5; i++) { var prices = className("android.view.View").textMatches("^¥[0-9]+\.[0-9][0-9]").find(); var good = prices[i].parent().parent(); if (good.childCount() > count) { continue; } if (!add_cart) { //good.click(); rect = prices[i].bounds(); click(rect.centerX(), rect.centerY()); rsleep(2); rslide(2); className("android.widget.ImageView").desc("返回").click(); } else { good.child(3).click(); rslide(1); } rsleep(2); } advback(); rsleep(3); } 说明 修复了浏览商品函数失效的问题。 支持了一个新的任务。 稳定性应该提升不少，测试了两个号除了遇到了一次网络问题卡住之外没有其他问题。 加了个返回的函数，应该不会出现跳到京东主页的情况了。 还有一个浏览任务有待支持（但是没有浏览时间要求，手动完成也不麻烦） 推荐使用方式是先打开活动页，然后运行脚本，切换回京东就能自动运行了。 需要中断运行请按音量+。 当前已支持加购物车和浏览商品任务。 脚本【旧版截图识色版】（仅存档） [collapse status="false" title="点击展开"] 脚本 "auto"; toast('开始运行，请打开京东任务页') images.requestScreenCapture() ys = new Array(760, 1160, 1350, 1550, 1730) x = 970 sleep(500) on = -49108 off = -7570829 for (;;) { y = ison() if (y > 0) { click(x, y) sleep(500) for (i = 15; i; i--) { x1 = random(200, 800) y1 = random(1200, 1900) x2 = random(200, 800) y2 = random(1000, 1200) swipe(x1, y1, x2, y2, 300) sleep(1100) } back() } sleep(3000) } function ison() { j = ys.length img = images.captureScreen() for (i = 0; i < j; i++) { if (Math.abs(img.pixel(x, ys[i]) - on) < 50) { return (ys[i]) } } return (0) } 说明 脚本的原理是每1秒截一次屏，判断(x,ys)的位置是不是红色，是的话会模拟浏览动作。 浏览商品和加购物车任务只能手动完成，使用脚本会有问题。 此脚本只适配了Mix2S，其他屏幕分辨率请自行修改坐标： 在开发者模式里打开指针位置就能知道点击位置的坐标了。 如图，在每个按钮的右侧背景上取点(没必要很精确,注意避开按钮文字)，坐标为(x,y1),(x,y2),(x,y3),……，记录x和y1,y2,y3,……的值，第一个分享按钮没必要记录。 脚本第5行x=960，把960改成你测得的x的值。 脚本第7行ys=new Array(950,1155,1350,1540,1715)，把里面的数字改成y1,y2,y3,……的值， 注意要用半角逗号分隔，不然会报错。 例如你量出来有6个按钮，坐标为(980,950)(980,1150)(980,1350),(980,1530),(980,1710),(980,1890) 修改后的脚本： 第5行x=980 第7行ys=new Array(950,1150,1350,1530, 1710,1890) [/collapse] 在我的手机上正常运行不代表能在所有设备上正常运行，如果遇到问题欢迎在下方留言。 可以的话请带上出问题时候的截图发到我的邮箱（chr@chrxw.com）里，感谢理解与支持。
前言 记录一下本博客针对Handsome 6.0主题的修改 handsome 7.X 的修改记录参见： [post cid="1315"/] !> 修改前务必备份 博客图标修改 feathericon图标修改方法：搜索data-feather，把后面的值改掉即可 顶部图标： 文件路径：/usr/themes/handsome/component/headnav.php 图标(从左往右)：music，message-square，log-in 右栏图标： 文件路径：/usr/themes/handsome/component/sidebar.php 我使用的图标： 图标1(从左往右)：thumbs-up，message-square，coffee 图标2(从上往下)：archive，message-square，calendar，activity 右侧悬浮按钮： 文件路径：/usr/themes/handsome/component/sidebar.php，/usr/themes/handsome/component/footer.php 图标(从上往下)：list，arrow-up 原图标改成feathericon以后会有轻微的位移，所以在自定义CSS里修正： /*右侧悬浮按钮*/ .pos-abt svg { margin-top: 2px; } 超链接特效 (与5.3.1相同) 修改/usr/themes/handsome/assets/css/handsome.min.css，删掉下面的内容： .comment-content-true a:hover,.wrapper-lg .entry-content a:hover{ color:#222;border-bottom-color:#222 } .comment-content-true a,.wrapper-lg .entry-content a{ color:#58666e;border-bottom-color:#222;border-bottom:1px solid #999;word-wrap:break-word;word-break:break-all } 自定义CSS： /*超链接特效*/ .comment-content-true a:not(.light-link):not(.post_inser_a), .wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a) { position: relative; margin: auto 4px; color: #23b7e5; -webkit-transition: color 0.3s; transition: color 0.3s; -webkit-perspective: 600px; perspective: 600px; -webkit-perspective-origin: 50% 100%; perspective-origin: 50% 100%; word-wrap: break-word; word-break: break-all; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; max-width: inherit; width: inherit; } .comment-content-true a:not(.light-link):not(.post_inser_a):hover, .comment-content-true a:not(.light-link):not(.post_inser_a):focus, .wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a):hover, .wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a):focus { color: #fff; } .comment-content-true a:not(.light-link):not(.post_inser_a)::before, .comment-content-true a:not(.light-link):not(.post_inser_a)::after, .wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a)::before, .wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a)::after { position: absolute; top: 0; left: -4px; z-index: -1; box-sizing: content-box; padding: 0 4px; width: 100%; height: 100%; content: ''; } .comment-content-true a:not(.light-link):not(.post_inser_a)::before, .wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a)::before { background-color: #23b7e5; -webkit-transition: -webkit-transform 0.2s; transition: transform 0.2s; -webkit-transition-timing-function: cubic-bezier(0.7, 0, 0.3, 1); transition-timing-function: cubic-bezier(0.7, 0, 0.3, 1); -webkit-transform: rotateX(90deg); transform: rotateX(90deg); -webkit-transform-origin: 50% 100%; transform-origin: 50% 100%; } .comment-content-true a:not(.light-link):not(.post_inser_a):hover::before, .comment-content-true a:not(.light-link):not(.post_inser_a):focus::before, .wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a):hover::before, .wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a):focus::before { -webkit-transform: rotateX(0deg); transform: rotateX(0deg); } .comment-content-true a:not(.light-link):not(.post_inser_a)::after, .wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a)::after { border-bottom: 1px solid #23b7e5; } 自定义光标 (与5.3.1相同) 炫彩鼠标插件下载【链接】 因为这个插件不支持PJAX，效果不好，所以我把光标资源提取出来手写了个CSS。 以下内容放进自定义CSS里，光标路径改对，nomral.cur是默认光标，link.cur是手掌光标。 /*自定义光标*/ *{ cursor: url("/usr/customize/normal.cur"),auto !important; } a,a *,button,button *,.OwO-item,.OwO-logo,.OwO-logo *,.OwO-packages *{ cursor: url("/usr/customize/link.cur"),auto !important; } 修改版滑稽表情，微调表情栏 (与5.3.1相同) 打开/usr/themes/handsome/assets/js/features/OwO.min.js 删除这句： OwO 我个人给每个表情加上了注释，略微修改了顺序。 √> 下载链接：改版滑稽表情包.zip 食用方方法： 解压 把huaji文件夹丢进/usr/themes/handsome/usr/img/emotion/里 用OwO.json替换掉/usr/themes/handsome/usr/OwO.json 如果嫌表情太大，可以在自定义CSS里加上 img[class^="emotion-"] { max-height: 3em !important } 404页面按钮修改 打开/usr/themes/handsome/404.php 在第132行左右，把 到 之间改成下面这样： <?php _me("返回") ?> <a href="<?php $this->options->rootUrl(); ?>" class="list-group-item"> <?php _me("首页") ?> <?php if (!@in_array('hideLogin',$this->options->featuresetup)): ?> <a href="<?php $this->options->rootUrl(); ?>/admin/login.php" class="list-group-item"> <?php _me("登录") ?> <a href="<?php $this->options->rootUrl(); ?>/admin/register.php" class="list-group-item"> <?php _me("注册") ?> <?php endif; ?> ## Mac风格代码框 (与5.3.1相同) 插件下载&食用方法：【[链接](https://www.xcnte.com/archives/523/)】 略微修改了黑色主题的css，减少了代码框的外阴影，微移了复制按钮的位置 文件路径：`/usr/plugins/CodePrettify/static/styles/BlackMac.css` ```css code[class*="language-"],pre[class*="language-"]{color:#f8f8f2;background:#313238;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:2;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;}pre[class*="language-"]{padding:.5em;margin:.5em 0;overflow:auto;}:not(pre)>code[class*="language-"],pre[class*="language-"]{background:#21252a}:not(pre)>code[class*="language-"]{padding:.1em;border-radius:.3em;white-space:normal}.token.comment,.token.block-comment,.token.prolog,.token.doctype,.token.cdata{color:#999;}.token.punctuation{color:#ccc;}.token.tag,.token.attr-name,.token.namespace,.token.deleted{color:#e2777a;}.token.function-name{color:#6196cc;}.token.boolean,.token.number,.token.function{color:#f08d49;}.token.property,.token.class-name,.token.constant,.token.symbol{color:#f8c555;}.token.selector,.token.important,.token.atrule,.token.keyword,.token.builtin{color:#cc99cd;}.token.string,.token.char,.token.attr-value,.token.regex,.token.variable{color:#7ec699;}.token.operator,.token.entity,.token.url{color:#67cdcc;}.token.important,.token.bold{font-weight:bold;}.token.italic{font-style:italic;}.token.entity{cursor:help;}.token.inserted{color:green;}pre.line-numbers{padding-bottom:.8em;padding-left:3.3em;counter-reset:linenumber}pre.line-numbers>code{white-space:inherit font-size:15px}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-.1em;width:3em;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.9em;text-align:right;background:#272c33}div.code-toolbar{font-size:100%;border-radius:4px;position:relative;box-shadow:0 0 10px 1px rgba(0,0,0,.4);padding-top:30px;background-color:#161616;margin:20px 4 20px 4}.code-toolbar:before{content:" ";position:absolute;-webkit-border-radius:50%;border-radius:50%;background:#fc625d;width:11px;height:11px;left:10px;top:10px;-webkit-box-shadow:20px 0 #fdbc40,40px 0 #35cd4b;box-shadow:20px 0 #fdbc40,40px 0 #35cd4b;z-index:2}div.code-toolbar>.toolbar{padding-right:.4em;position:absolute;top:.09em;right:0;width:100%;text-align:center;}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar>.toolbar .toolbar-item{padding:0 1px 1px 3px;display:inline-block}div.code-toolbar>.toolbar button{cursor:pointer;transition:all .3s;position:absolute;background-color:transparent;right:4px;top:4px;font-size:12px;line-height:12px;padding:3px 5px;border:1px solid;border-radius:6px;opacity:0;color:#FFF;}div.code-toolbar:hover button{opacity:1;}div.code-toolbar>.toolbar:hover{text-decoration:none!important}div.code-toolbar>.div.code-toolbar>.toolbar button,div.code-toolbar>.toolbar span{font-family:'Ubuntu',sans-serif;font-weight:bold;font-size:.9em;opacity:0;color:#FFF;}div.code-toolbar:hover .toolbar span{opacity:1;}#post-content .code-block-fullscreen{padding-top:32px;position:fixed;width:80vw;height:80vh;min-height:80vh;top:0;left:0;right:0;bottom:0;margin:auto;z-index:9999999;box-shadow:0 0 20px 0 rgba(255,255,255,.4);animation:elastic 1s;overflow:hidden;background:#21252a;}.code-block-fullscreen code{--widthA:100%;--widthB:calc(var(--widthA) - 30px);height:var(--widthB);min-height:99%;overflow-y:scroll;height:100%;}.code-block-fullscreen-html-scroll{overflow:hidden;}.shelter{width:6.5px;height:6.5px;z-index:100;background:#313238;position:absolute;bottom:0;right:0;}.max-img::-webkit-scrollbar-track-piece{background:#eee}.max-img::-webkit-scrollbar{width:8px;height:6px}.max-img::-webkit-scrollbar-thumb{border-radius:6px;background-color:#777}.max-img::-webkit-scrollbar-thumb:hover{background-color:#bbb}pre::-webkit-scrollbar-track-piece{}pre::-webkit-scrollbar{width:8px;height:6px}pre::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}pre::-webkit-scrollbar-thumb:hover{background-color:#bbb}code::-webkit-scrollbar-track-piece{}code::-webkit-scrollbar{width:6px;height:6px}code::-webkit-scrollbar-thumb{border-radius:6px;background-color:#777}code::-webkit-scrollbar-thumb:hover{background-color:#bbb}html::-webkit-scrollbar-track-piece{background:#eee}html::-webkit-scrollbar{width:8px;height:6px}html::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}html::-webkit-scrollbar-thumb:hover{background-color:#bbb} 复制后提示 (与5.3.1相同) 下载layer【链接】 解压后把layer文件夹丢进/usr/themes/handsome/assets/js/下 在主题外观设置里添加自定义javascriptdocument.body.oncopy = function() {layer.msg('复制成功,转载请保留原文链接！');}; 赞赏图标动画 (与5.3.1相同) 放进自定义CSS里： /*赞赏按钮动画*/ .btn-pay { border-radius: 15px 5px; transition: border-radius .1s } .btn-pay:hover { border-radius: 5px 15px; transition: border-radius .2s } 微调底栏 添加到自定义CSS里： /*底栏*/ .wrapper { padding: 10px } 其他微调 /* 时光机 */ .img-square { border-radius: 50%; } .list-group-item .thumb-sm .img-square { border-radius: 5px; } /* TAB部件 */ .post_tab li.active>a { background-color: #ebf9fd !important; } /* 其他文章部件 */ div.preview { transition: all 0.3s; } div.preview:hover { box-shadow: 0px 0px 10px rgba(30, 30, 30, 0.2); }
前言 Handsome主题现已更新至7.1，本文章仅作存档之用。 handsome 7.X 修改记录请前往： [post cid="1315"/] handsome 6.0 修改记录请前往： [post cid="814"/] 原文： 使用Handsome主题一年了，主题从5.1升级到5.3.1了，最近刚好迁移了网站，也顺带着把整个博客做了一些改动，写这篇主要方便我升级主题的时候还能保留DIY的特性。 超链接特效 修改/usr/themes/handsome/assets/css/handsome.min.css，删掉下面的内容： comment-content-true a:hover,.wrapper-lg .entry-content a:hover{ color:#222;border-bottom-color:#222 } .comment-content-true a,.wrapper-lg .entry-content a{ color:#58666e;border-bottom-color:#222;border-bottom:1px solid #999;word-wrap:break-word;word-break:break-all } 自定义CSS： /*超链接特效*/ .comment-content-true a:not(.light-link), .wrapper-lg .entry-content a:not(.light-link) { position: relative; margin: auto 4px; color: #23b7e5; -webkit-transition: color 0.3s; transition: color 0.3s; -webkit-perspective: 600px; perspective: 600px; -webkit-perspective-origin: 50% 100%; perspective-origin: 50% 100%; word-wrap: break-word; word-break: break-all; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; max-width: inherit; width: inherit; } .comment-content-true a:not(.light-link):hover, .comment-content-true a:not(.light-link):focus, .wrapper-lg .entry-content a:not(.light-link):hover, .wrapper-lg .entry-content a:not(.light-link):focus { color: #fff; } .comment-content-true a:not(.light-link)::before, .comment-content-true a:not(.light-link)::after, .wrapper-lg .entry-content a:not(.light-link)::before, .wrapper-lg .entry-content a:not(.light-link)::after { position: absolute; top: 0; left: -4px; z-index: -1; box-sizing: content-box; padding: 0 4px; width: 100%; height: 100%; content: ''; } .comment-content-true a:not(.light-link)::before, .wrapper-lg .entry-content a:not(.light-link)::before { background-color: #23b7e5; -webkit-transition: -webkit-transform 0.2s; transition: transform 0.2s; -webkit-transition-timing-function: cubic-bezier(0.7, 0, 0.3, 1); transition-timing-function: cubic-bezier(0.7, 0, 0.3, 1); -webkit-transform: rotateX(90deg); transform: rotateX(90deg); -webkit-transform-origin: 50% 100%; transform-origin: 50% 100%; } .comment-content-true a:not(.light-link):hover::before, .comment-content-true a:not(.light-link):focus::before, .wrapper-lg .entry-content a:not(.light-link):hover::before, .wrapper-lg .entry-content a:not(.light-link):focus::before { -webkit-transform: rotateX(0deg); transform: rotateX(0deg); } .comment-content-true a:not(.light-link)::after, .wrapper-lg .entry-content a:not(.light-link)::after { border-bottom: 1px solid #23b7e5; } .content-copyright { overflow: hidden; } 自定义光标 炫彩鼠标插件下载【链接】 因为这个插件不支持PJAX，效果不好，所以我把光标资源提取出来手写了个CSS。 以下内容放进自定义CSS里，光标路径改对，nomral.cur是默认光标，link.cur是手掌光标。 /*自定义光标*/ *{ cursor: url("/usr/customize/normal.cur"),auto !important; } a,a *,button,button *,.OwO-item,.OwO-logo,.OwO-logo *,.OwO-packages *{ cursor: url("/usr/customize/link.cur"),auto !important; } 时光机UA显示 引入字体 添加到自定义HTML里 修改/usr/themes/handsome/libs/UA.php /* 第148行 */ public function returnOS(){ $ua = $this->ua; $title = "未知浏览器"; $icon = "fa fa-question-circle"; if (preg_match('/win/i', $ua)) { $icon ="fa fa-windows"; if (preg_match('/Windows NT 6.1/i', $ua)) { $title = "Windows 7"; //$icon = "iconfont icon-win"; }elseif (preg_match('/Windows 98/i', $ua)) { $title = "Windows 98"; //$icon = "iconfont icon-win2"; }elseif (preg_match('/Windows NT 5.0/i', $ua)) { $title = "Windows 2000"; //$icon = "iconfont icon-win2"; }elseif (preg_match('/Windows NT 5.1/i', $ua)) { $title = "Windows XP"; //$icon = "iconfont icon-win"; }elseif (preg_match('/Windows NT 5.2/i', $ua)) { if (preg_match('/Win64/i', $ua)) { $title = "Windows XP 64 bit"; } else { $title = "Windows Server 2003"; } //$icon = 'iconfont icon-win'; }elseif (preg_match('/Windows NT 6.0/i', $ua)) { $title = "Windows Vista"; //$icon = "fa fa-windows"; }elseif (preg_match('/Windows NT 6.2/i', $ua)) { $title = "Windows 8"; //$icon = "iconfont icon-win8"; }elseif (preg_match('/Windows NT 6.3/i', $ua)) { $title = "Windows 8.1"; //$icon = "iconfont icon-win8"; }elseif (preg_match('/Windows NT 10.0/i', $ua)) { $title = "Windows 10"; //$icon = "iconfont icon-win3"; }elseif (preg_match('/Windows Phone/i', $ua)) { $matches = explode(';',$ua); $title = $matches[2]; //$icon = "iconfont icon-winphone"; $icon = "fa fa-mobile"; } } elseif (preg_match('#iPod.*.CPU.([a-zA-Z0-9.( _)]+)#i', $ua, $matches)) { $title = "iPod ";//.$matches[1] //$icon = "iconfont icon-ipod"; $icon = "fa fa-apple"; } elseif (preg_match('/iPhone OS ([_0-9]+)/i', $ua, $matches)) { $title = "Iphone ";//.$matches[1] //$icon = "iconfont icon-iphone"; $icon = "fa fa-apple"; } elseif (preg_match('/iPad; CPU OS ([_0-9]+)/i', $ua, $matches)) { $title = "iPad ";//.$matches[1] //$icon = "iconfont icon-ipad"; $icon = "fa fa-apple"; } elseif (preg_match('/Mac OS X ([0-9_]+)/i', $ua, $matches)) { if(count(explode(7,$matches[1]))>1) $matches[1] = 'Lion '.$matches[1]; elseif(count(explode(8,$matches[1]))>1) $matches[1] = 'Mountain Lion '.$matches[1]; $title = "Mac OSX"; //$icon = "iconfont icon-macosdeicon"; $icon = "fa fa-apple"; } elseif (preg_match('/Macintosh/i', $ua)) { $title = "Mac OS"; //$icon = "iconfont icon-iconmacos"; $icon = "fa fa-apple"; } elseif (preg_match('/CrOS/i', $ua)){ $title = "Google Chrome OS"; //$icon = "iconfont icon-iconchromeos"; $icon = "fa fa-chrome"; } elseif (preg_match('/Linux/i', $ua)) { $title = 'Linux'; $icon = 'fa fa-linux'; if (preg_match('/Ubuntu/i', $ua)) { $title = "Ubuntu Linux"; //$icon = "iconfont icon-ubuntu"; }elseif(preg_match('#Debian#i', $ua)) { $title = "Debian GNU/Linux"; //$icon = "iconfont icon-debian"; }elseif (preg_match('#Fedora#i', $ua)) { $title = "Fedora Linux"; //$icon = "iconfont icon-fedora"; }elseif (preg_match('/Android.([0-9. _]+)/i',$ua, $matches)) { $title= "Android"; //$icon = "iconfont icon-android"; $icon = "fa fa-android"; } } elseif (preg_match('/Android.([0-9. _]+)/i',$ua, $matches)) { $title= "Android"; //$icon = "iconfont icon-android"; $icon = "fa fa-android"; } return array("title"=>$title, "icon"=>$icon); } /** * 时光机页面ua，如果是手机设备，只显示设备类型，如果是电脑设备只显示电脑设备类型，如果是扩展发送，显示发送自「扩展」，如果是微信公众号，显示 */ public function returnTimeUa(){ if ($this->ua == "weixin" || $this->ua == "weChat"){ return array("title"=>_mt("微信公众号"), "icon"=>"fa fa-wechat"); }elseif ($this->ua == "crx"){ return array("title"=>_mt("Chrome扩展"), "icon"=>"fa fa-chrome"); }elseif ($this->ua == "qq"){ return array("title"=>_mt("QQ机器人"), "icon"=>"fa fa-qq"); }else{ return $this->returnOS(); } } } 修改/usr/themes/handsome/component/say.php /* 第78行 */ 改成这样 <i class="<?php echo $ua->returnTimeUa()['icon'] ?> m-l-sm"> 头像动画 添加到自定义CSS里 第2行的width:90px是头像整体缩放 第20行scale(1.1)，1.1是旋转后的缩放倍率，改成1就是不放大 /*头像动画*/ .thumb-lg{ width:90px } .avatar{ -webkit-transition: 0.4s; -webkit-transition: -webkit-transform 0.4s ease-out; transition: transform 0.4s ease-out; -moz-transition: -moz-transform 0.4s ease-out; } .avatar:hover{ transform: rotateZ(360deg); -webkit-transform: rotateZ(360deg); -moz-transform: rotateZ(360deg); } #aside-user span.avatar{ animation-timing-function:cubic-bezier(0,0,.07,1)!important; border:0 solid } #aside-user span.avatar:hover{ transform:rotate(360deg) scale(1.1); border-width:5px; animation:avatar .5s } 修改版滑稽表情，微调表情栏 打开/usr/themes/handsome/assets/js/features/OwO.min.js 删除这句： OwO 我个人给每个表情加上了注释，略微修改了顺序。 √> 下载链接：改版滑稽表情包.zip 食用方方法： 解压 把huaji文件夹丢进/usr/themes/handsome/usr/img/emotion/里 用OwO.json替换掉/usr/themes/handsome/usr/OwO.json 如果嫌表情太大，可以在自定义CSS里加上 img[class^="emotion-"] { max-height: 3em !important } 404页面自动返回 打开/usr/themes/handsome/404.php 在第130行左右，在 404 后面添加： 10秒后自动返回··· 立刻返回 然后把下面这段放到最后的 前 把下面的删掉就能隐藏注册按钮(个人博客不需要) <a href="<?php $this->options->rootUrl(); ?>/admin/register.php" class="list-group-item"> <?php _me("注册") ?> 在侧栏添加响应耗时 打开Web根目录/usr/themes/handsome/functions.php 把下面的函数添加到合适的位置 function timer_start() { global $timestart; $mtime = explode( ' ', microtime() ); $timestart = $mtime[1] + $mtime[0]; return true; } timer_start(); function timer_stop( $display = 0, $precision = 3 ) { global $timestart, $timeend; $mtime = explode( ' ', microtime() ); $timeend = $mtime[1] + $mtime[0]; $timetotal = number_format( $timeend - $timestart, $precision ); $r = $timetotal < 1 ? $timetotal * 1000 . " ms" : $timetotal . " s"; if ( $display ) { echo $r; } return $r; } 然后打开 打开Web根目录/usr/themes/handsome/component/sidebar.php 把这句话插到91行左右，最后活动的后面 <?php echo timer_stop();?><?php _me("加载用时") ?> Mac风格代码框 插件下载&食用方法：【链接】 略微修改了黑色主题的css，减少了代码框的外阴影，微移了复制按钮的位置 文件路径：/usr/plugins/CodePrettify/static/styles/BlackMac.css code[class*="language-"],pre[class*="language-"]{color:#f8f8f2;background:#313238;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:2;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;}pre[class*="language-"]{padding:.5em;margin:.5em 0;overflow:auto;}:not(pre)>code[class*="language-"],pre[class*="language-"]{background:#21252a}:not(pre)>code[class*="language-"]{padding:.1em;border-radius:.3em;white-space:normal}.token.comment,.token.block-comment,.token.prolog,.token.doctype,.token.cdata{color:#999;}.token.punctuation{color:#ccc;}.token.tag,.token.attr-name,.token.namespace,.token.deleted{color:#e2777a;}.token.function-name{color:#6196cc;}.token.boolean,.token.number,.token.function{color:#f08d49;}.token.property,.token.class-name,.token.constant,.token.symbol{color:#f8c555;}.token.selector,.token.important,.token.atrule,.token.keyword,.token.builtin{color:#cc99cd;}.token.string,.token.char,.token.attr-value,.token.regex,.token.variable{color:#7ec699;}.token.operator,.token.entity,.token.url{color:#67cdcc;}.token.important,.token.bold{font-weight:bold;}.token.italic{font-style:italic;}.token.entity{cursor:help;}.token.inserted{color:green;}pre.line-numbers{padding-bottom:.8em;padding-left:3.3em;counter-reset:linenumber}pre.line-numbers>code{white-space:inherit font-size:15px}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-.1em;width:3em;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.9em;text-align:right;background:#272c33}div.code-toolbar{font-size:100%;border-radius:4px;position:relative;box-shadow:0 0 10px 1px rgba(0,0,0,.4);padding-top:30px;background-color:#161616;margin:20px 4 20px 4}.code-toolbar:before{content:" ";position:absolute;-webkit-border-radius:50%;border-radius:50%;background:#fc625d;width:11px;height:11px;left:10px;top:10px;-webkit-box-shadow:20px 0 #fdbc40,40px 0 #35cd4b;box-shadow:20px 0 #fdbc40,40px 0 #35cd4b;z-index:2}div.code-toolbar>.toolbar{padding-right:.4em;position:absolute;top:.09em;right:0;width:100%;text-align:center;}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar>.toolbar .toolbar-item{padding:0 1px 1px 3px;display:inline-block}div.code-toolbar>.toolbar button{cursor:pointer;transition:all .3s;position:absolute;background-color:transparent;right:4px;top:4px;font-size:12px;line-height:12px;padding:3px 5px;border:1px solid;border-radius:6px;opacity:0;color:#FFF;}div.code-toolbar:hover button{opacity:1;}div.code-toolbar>.toolbar:hover{text-decoration:none!important}div.code-toolbar>.div.code-toolbar>.toolbar button,div.code-toolbar>.toolbar span{font-family:'Ubuntu',sans-serif;font-weight:bold;font-size:.9em;opacity:0;color:#FFF;}div.code-toolbar:hover .toolbar span{opacity:1;}#post-content .code-block-fullscreen{padding-top:32px;position:fixed;width:80vw;height:80vh;min-height:80vh;top:0;left:0;right:0;bottom:0;margin:auto;z-index:9999999;box-shadow:0 0 20px 0 rgba(255,255,255,.4);animation:elastic 1s;overflow:hidden;background:#21252a;}.code-block-fullscreen code{--widthA:100%;--widthB:calc(var(--widthA) - 30px);height:var(--widthB);min-height:99%;overflow-y:scroll;height:100%;}.code-block-fullscreen-html-scroll{overflow:hidden;}.shelter{width:6.5px;height:6.5px;z-index:100;background:#313238;position:absolute;bottom:0;right:0;}.max-img::-webkit-scrollbar-track-piece{background:#eee}.max-img::-webkit-scrollbar{width:8px;height:6px}.max-img::-webkit-scrollbar-thumb{border-radius:6px;background-color:#777}.max-img::-webkit-scrollbar-thumb:hover{background-color:#bbb}pre::-webkit-scrollbar-track-piece{}pre::-webkit-scrollbar{width:8px;height:6px}pre::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}pre::-webkit-scrollbar-thumb:hover{background-color:#bbb}code::-webkit-scrollbar-track-piece{}code::-webkit-scrollbar{width:6px;height:6px}code::-webkit-scrollbar-thumb{border-radius:6px;background-color:#777}code::-webkit-scrollbar-thumb:hover{background-color:#bbb}html::-webkit-scrollbar-track-piece{background:#eee}html::-webkit-scrollbar{width:8px;height:6px}html::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}html::-webkit-scrollbar-thumb:hover{background-color:#bbb} 复制后提示 下载layer【链接】 解压后把layer文件夹丢进/usr/themes/handsome/assets/js/下 在主题外观设置里添加自定义javascriptdocument.body.oncopy = function() {layer.msg('复制成功,转载请保留原文链接！');}; 在自定义HTML头部或尾部里添加 赞赏图标动画 放进自定义CSS里： /*赞赏按钮动画*/ .btn-pay { border-radius: 15px 5px; transition: border-radius .1s } .btn-pay:hover { border-radius: 5px 15px; transition: border-radius .2s } 上一页下一页微调 丢进自定义CSS里： /*上一页按钮*/ li.previous a { border-radius: 5px 15px; transition: border-radius .2s } li.previous a:hover { border-radius: 15px 5px; transition: border-radius .2s } /*下一页按钮*/ li.next a { border-radius: 15px 5px; transition: border-radius .2s } li.next a:hover { border-radius: 5px 15px; transition: border-radius .2s } 评论按钮微调 丢进自定义CSS里： /*评论按钮*/ .btn-success { border-radius: 5px 5px; transition: border-radius .2s } .btn-success:hover { border-radius: 15px 15px; transition: border-radius .2s } 首页文章列表悬停上浮 放进自定义CSS里： /*首页文章列表悬停上浮*/ .blog-post .panel:not(article) { transition: all 0.3s; } .blog-post .panel:not(article):hover { transform: translateY(-5px); box-shadow: 0 4px 5px rgba(73, 90, 47, 0.47) }