AI摘要 本文介绍了如何搭建Codex AI开发项目。首先，推荐使用Claude平台购买token并获取API密钥。接着，通过命令行下载依赖并验证安装成功。然后，在指定文件夹下创建配置文件`config.toml`和环境变量文件，设置模型提供者、模型名称等信息，并替换为自己的API Key。最后，通过命令行进入工作目录，输入`codex`启动AI工作，也可以通过`codex -m`命令切换不同的模型。 此内容根据文章生成，仅用于文章内容的解释与总结 准备工作首先，推荐一个实用的平台，Claude平台，在这边购买token后，然后到api密钥去拿取自己的密钥上面是价格，按我使用习惯，一个月能用十多亿额度下载安装首先打开cmd，下载依赖npm install -g @openai/codex安装完成后，重新打开窗口，认证有没有安装成功配置然后进入这个文件夹C:\Users\你使用的电脑用户，新建一个文件夹并进入.codex创建第一个文件，config.tomlmodel_provider = "fox" model = "gpt-5" model_reasoning_effort = "high" disable_response_storage = true [model_providers.fox] name = "fox" base_url = "https://code.newcli.com/codex/v1" wire_api = "responses" requires_openai_auth = true创建第二个文件，auth.json{ "OPENAI_API_KEY": "替换为您的API Key" }进入cmd，再次设置自己的api密钥setx OPENAI_API_KEY 你的密钥然后重新打开窗口，进行验证echo %OPENAI_API_KEY%使用打开cmd，进入你要让ai工作的代码操作目录，然后输入codex然后就可以让它工作了另外也可以切换模型codex -m 你想要的模型如codex -m gpt-5-codex
AI摘要 博客美化：如何自定义CSS和JS文件 此内容根据文章生成，仅用于文章内容的解释与总结 前言随着博客逐渐美化，使用的后台的自定义css与自定义js越来越多，写起来就越来越难受。尤其是当里面代码多了，每次编辑就要一直往下滑，好不容易滑到底了，点击一下进入编辑又跑到顶上了......而且看着很混乱，所以我就创建文件单独给拉出来了自定义css进入/usr/themes/handsome/assets/css目录，创建customize.css文件（名字按自己喜欢的来，不需要一样），然后把更改外观-设置外观-开发者设置-自定义 CSS里面的内容全选剪切进customize.css文件将下面代码粘贴到 /usr/themes/handsome/component/header.php文件，大概在324行 <link rel="stylesheet" href="<?php echo STATIC_PATH; ?>css/customize.css?v=<?php echo Handsome::version . Handsome::$versionTag ?>" type="text/css"/>自定义css方法1：进入/usr/themes/handsome/assets/js目录，创建customize.js文件（名字按自己喜欢的来，不需要一样），然后把更改外观-设置外观-开发者设置-自定义JavaScript里面的内容全选剪切进customize.js文件将下面代码粘贴到 /usr/themes/handsome/component/footer.php文件，大概在310行，在 上面就行<script src="<?php $this->options->themeUrl('assets/js/customize.js'); ?>"> 或者是打开后台-更改外观-设置外观-开发者设置-复制代码粘贴至 自定义输出body 尾部的HTML代码 看到文件访问成功后，强制刷新一下网站，清除一下缓存就可以了
AI摘要 博客美化技巧：自定义CSS和JavaScript实现头像旋转、赞赏按钮跳动等功能。 此内容根据文章生成，仅用于文章内容的解释与总结 前言最近觉得博客有点单调，所以想美化一下美化首页头像鼠标悬停旋转[collapse status="false" title="点击打开查看"]打开后台-更改外观-设置外观-开发者设置-复制代码粘贴至 自定义 CSS 即可/*头像呼吸光环和鼠标悬停旋转 开始 */ .img-full { border-radius: 50%; animation: light 4s ease-in-out infinite; transition: 0.5s; } .img-full:hover { transform: rotate(666turn); transition-duration: 59s; transition-timing-function: cubic-bezier(.34, 0, .84, 1); } @keyframes light { 0% { box-shadow: 0 0 4px #22ACD6; } 50% { box-shadow: 0 0 16px #22ACD6; } 100% { box-shadow: 0 0 4px #22ACD6; } } /*头像呼吸光环和鼠标悬停旋转 结束 */[/collapse]文章赞赏按钮跳动[collapse status="false" title="点击打开查看"]打开后台-更改外观-设置外观-开发者设置-复制代码粘贴至 自定义 CSS 即可/*赞赏按钮跳动开始*/ .btn-pay { animation: star 0.5s ease-in-out infinite alternate; } @keyframes star { from { transform: scale(1); } to { transform: scale(1.1); } } /*赞赏按钮跳动结束*/[/collapse]转载提醒[collapse status="false" title="点击打开查看"]打开后台-更改外观-设置外观-开发者设置-复制代码粘贴至 自定义输出head 头部的HTML代码 打开后台-更改外观-设置外观-开发者设置-复制代码粘贴至 自定义 JavaScript document.body.oncopy=function(){layer.msg('复制成功,若要转载请务必保留原文链接！');};效果预览：[/collapse]时间流逝[collapse status="false" title="点击打开查看"]将下面代码加到 /usr/themes/handsome/component/sidebar.php的放在 <?php endif; ?> 后面，大概150行左右 <?php _me("时间流逝") ?> 今日已经过去小时 这周已经过去天 本月已经过去天 今年已经过去个月 打开后台-更改外观-设置外观-开发者设置-复制代码粘贴至 自定义 CSS/* 时间流逝 开始 */ .sidebar-count .content { padding: 15px } .sidebar-count .content .item { margin-bottom: 15px } .sidebar-count .content .item:last-child { margin-bottom: 0 } .sidebar-count .content .item .title { font-size: 12px; color: var(--minor); margin-bottom: 5px; display: flex; align-items: center } .sidebar-count .content .item .title span { color: var(--theme); font-weight: 500; font-size: 14px; margin: 0 5px } .sidebar-count .content .item .progress { display: flex; align-items: center } .sidebar-count .content .item .progress .progress-bar { height: 10px; border-radius: 5px; overflow: hidden; background: var(--classC); width: 0; min-width: 0; flex: 1; margin-right: 5px } @keyframes progress { 0% { background-position: 0 0 } 100% { background-position: 30px 0 } } .sidebar-count .content .item .progress .progress-bar .progress-inner { width: 0; height: 100%; border-radius: 5px; transition: width 0.35s; -webkit-animation: progress 750ms linear infinite; animation: progress 750ms linear infinite } .sidebar-count .content .item .progress .progress-bar .progress-inner-1 { background: #bde6ff; background-image: linear-gradient(135deg, #50bfff 25%, transparent 25%, transparent 50%, #50bfff 50%, #50bfff 75%, transparent 75%, transparent 100%); background-size: 30px 30px } .sidebar-count .content .item .progress .progress-bar .progress-inner-2 { background: #ffd980; background-image: linear-gradient(135deg, #f7ba2a 25%, transparent 25%, transparent 50%, #f7ba2a 50%, #f7ba2a 75%, transparent 75%, transparent 100%); background-size: 30px 30px } .sidebar-count .content .item .progress .progress-bar .progress-inner-3 { background: #ffa9a9; background-image: linear-gradient(135deg, #ff4949 25%, transparent 25%, transparent 50%, #ff4949 50%, #ff4949 75%, transparent 75%, transparent 100%); background-size: 30px 30px } .sidebar-count .content .item .progress .progress-bar .progress-inner-4 { background: #67c23a; background-image: linear-gradient(135deg, #4f9e28 25%, transparent 25%, transparent 50%, #4f9e28 50%, #4f9e28 75%, transparent 75%, transparent 100%); background-size: 30px 30px } .sidebar-count .content .item .progress .progress-percentage { color: var(--info) } /* 时间流逝 结束 */打开后台-更改外观-设置外观-开发者设置-复制代码粘贴至 自定义输出body 尾部的HTML代码 打开网站的/usr/themes/handsome/assets/js目录，新建一个名为timeinfo.js的文件，复制代码到里面function init_life_time() { function getAsideLifeTime() { /* 当前时间戳 */ let nowDate = +new Date(); /* 今天开始时间戳 */ let todayStartDate = new Date(new Date().toLocaleDateString()).getTime(); /* 今天已经过去的时间 */ let todayPassHours = (nowDate - todayStartDate) / 1000 / 60 / 60; /* 今天已经过去的时间比 */ let todayPassHoursPercent = (todayPassHours / 24) * 100; $('#dayProgress .title span').html(parseInt(todayPassHours)); $('#dayProgress .progress .progress-inner').css('width', parseInt(todayPassHoursPercent) + '%'); $('#dayProgress .progress .progress-percentage').html(parseInt(todayPassHoursPercent) + '%'); /* 当前周几 */ let weeks = { 0: 7, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6 }; let weekDay = weeks[new Date().getDay()]; let weekDayPassPercent = (weekDay / 7) * 100; $('#weekProgress .title span').html(weekDay); $('#weekProgress .progress .progress-inner').css('width', parseInt(weekDayPassPercent) + '%'); $('#weekProgress .progress .progress-percentage').html(parseInt(weekDayPassPercent) + '%'); let year = new Date().getFullYear(); let date = new Date().getDate(); let month = new Date().getMonth() + 1; let monthAll = new Date(year, month, 0).getDate(); let monthPassPercent = (date / monthAll) * 100; $('#monthProgress .title span').html(date); $('#monthProgress .progress .progress-inner').css('width', parseInt(monthPassPercent) + '%'); $('#monthProgress .progress .progress-percentage').html(parseInt(monthPassPercent) + '%'); let yearPass = (month / 12) * 100; $('#yearProgress .title span').html(month); $('#yearProgress .progress .progress-inner').css('width', parseInt(yearPass) + '%'); $('#yearProgress .progress .progress-percentage').html(parseInt(yearPass) + '%'); } getAsideLifeTime(); setInterval(() => { getAsideLifeTime(); }, 1000); } init_life_time() [/collapse]文末END及版权提示[collapse status="false" title="点击打开查看"]END将下面代码加到 /usr/themes/handsome/post.php的放在 <?php if ($this->options->adContentPost != ""): ?> 前面，大概79行左右 END 将下面代码加到 /usr/themes/handsome/post.php的放在 <?php if ($this->options->adContentPost != ""): ?> 前面，刚刚END代码的后面 本文作者：<a href="<?php $this->author->permalink(); ?>" rel="author"> <?php $this->author(); ?> 文章标题：<a href="<?php $this->permalink() ?>"><?php $this->title() ?> 本文地址：<a href="<?php $this->permalink() ?>"><?php $this->permalink() ?> 版权说明：若无注明，本文皆<a href="<?php $this->options->rootUrl(); ?>" target="_blank" data-original-title="<?php $this->options->title() ?>"><?php $this->options->title() ?>原创，转载请保留文章出处。 效果预览：[/collapse]博客信息内的访客总数及响应耗时[collapse status="false" title="点击打开查看"]将下面代码加到 /usr/themes/handsome/functions.php的放在文件最下面/*访问总量代码开始*/ function theAllViews(){ $db = Typecho_Db::get(); $row = $db->fetchAll('SELECT SUM(VIEWS) FROM `typecho_contents`'); echo number_format($row[0]['SUM(VIEWS)']); } /*访问总量代码结束*/ /*响应时间代码开始*/ 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; } /*响应时间代码结束*/将下面代码粘贴到 /usr/themes/handsome/component/sidebar.php内，最后活动的下方 <?php echo theAllViews();?><?php _me("访客总数") ?> <?php echo timer_stop();?><?php _me("响应耗时") ?> 效果预览：[/collapse]404页面自动返回首页[collapse status="false" title="点击打开查看"]然后将以下代码放到 /usr/themes/handsome/404.php 内 前面，添加下方代码，大概在93行，返回羡逍遥首页 替换成自己的站点名 页面将在 05 秒后返回羡逍遥首页 立即返回上一页 接着在文件最下面添加下方代码 效果预览：[/collapse]handsome原生入站提示[collapse status="false" title="点击打开查看"]打开后台-更改外观-设置外观-开发者设置-复制代码粘贴至自定义输出body尾部代码 [/collapse]评论一键赞、踩、打卡[collapse status="false" title="点击打开查看"]打开后台-更改外观-设置外观-开发者设置-复制代码粘贴至自定义JavaScript window.SIMPALED = {}; // 创建全局对象 SIMPALED，用于存放编辑器功能 // ... (existing code) // 定义一个函数 a，用于在文本框中插入文字 function a(a, b, c) { if (document.selection) { a.focus(); sel = document.selection.createRange(); c ? (sel.text = b + sel.text + c) : (sel.text = b); a.focus(); } else if (a.selectionStart || "0" == a.selectionStart) { var l = a.selectionStart; var m = a.selectionEnd; var n = m; c ? (a.value = a.value.substring(0, l) + b + a.value.substring(l, m) + c + a.value.substring(m, a.value.length)) : (a.value = a.value.substring(0, l) + b + a.value.substring(m, a.value.length)); c ? (n += b.length + c.length) : (n += b.length - m + l); l == m && c && (n -= c.length); a.focus(); a.selectionStart = n; a.selectionEnd = n; } else { a.value += b + c; a.focus(); } } window.SIMPALED.Editor = { daka: function() { var b = new Date().toLocaleTimeString(); var c = document.getElementById("comment") || 0; a(c, "滴！学生卡！打卡时间：" + b, "，请上车的乘客系好安全带~ "); // 将光标移到文本最后 if (c.setSelectionRange) { var len = c.value.length; c.setSelectionRange(len, len); c.focus(); } else if (c.createTextRange) { var range = c.createTextRange(); range.collapse(false); range.select(); c.focus(); } }, zan: function() { var c = document.getElementById("comment") || 0; var yuluResponses = [ " 这篇文章展现了作者深邃的思想和独特的观点，令人赞叹不已。 ::coolapk:96:: ", " 文章中的优美语言和精彩描写让人感受到一种心灵的震撼和触动，实在值得赞美。 ::coolapk:96:: ", " 作者以敏锐的洞察力和真挚的情感，将文字融为一体，这种写作技巧令人赞赏。 ::coolapk:96:: ", " 这篇文章展现了作者的才华和学识，无不让人对其赞美有加。 ::coolapk:96:: ", " 文章中的感人故事和深刻的寓意令人深深地感动和赞叹。 ::coolapk:96:: ", " 作者的文字流畅而富有节奏感，令人为之倾倒，实在是一篇令人赞美的佳作。 ::coolapk:96:: ", " 文章中的深邃思考和清晰逻辑令人对作者的才华赞赏不已。 ::coolapk:96:: ", " 这篇文章的独到见解和新颖观点，让人对作者的创意赞美有加。 ::coolapk:96:: ", " 作者运用生动的比喻和细腻的描写，让读者仿佛身临其境，实在是一种令人赞美的写作艺术。 ::coolapk:96:: ", " 这篇文章的深情笔触和真挚感受让人深深感叹，实在是一篇值得赞美的美文。 ::coolapk:96:: ", // // 添加更多额外的语录内容 ]; var randomIndex = Math.floor(Math.random() * yuluResponses.length); var randomResponse = yuluResponses[randomIndex]; a(c, randomResponse); }, cai: function() { var c = document.getElementById("comment") || 0; var yuluResponses = [ " 我是来替大家批评博主的，我是来批评的，这篇文章的结构有点混乱，需要更好地组织和展开内容。博主多多像我学习啊！ ::dunjiao:315:: ", " 我是来替大家批评博主的，作者的表达能力有待提高，有些地方表述不够清晰，读者可能会感到困惑。博主多多像我学习啊！ ::dunjiao:315:: ", " 我是来替大家批评博主的，文章的语法错误较多，建议仔细检查并进行修改。博主多多像我学习啊！ ::dunjiao:315:: ", " 我是来替大家批评博主的，内容有些空洞，需要更多具体的例子或细节来支撑观点。博主多多像我学习啊！ ::dunjiao:315:: ", " 我是来替大家批评博主的，文章缺乏逻辑，有些段落之间的衔接不够自然。博主多多像我学习啊！ ::dunjiao:315:: ", " 我是来替大家批评博主的，作者的观点没有充分论证，需要更多的证据和理由来支持主张。博主多多像我学习啊！ ::dunjiao:315:: ", " 我是来替大家批评博主的，文章中出现了一些拼写错误和用词不当的情况，建议进行仔细校对。博主多多像我学习啊！ ::dunjiao:315:: ", " 我是来替大家批评博主的，语言表达过于简单，可以尝试使用更丰富的词汇和句式来提升文章质量。博主多多像我学习啊！ ::dunjiao:315:: ", " 我是来替大家批评博主的，这篇文章的主题不够突出，需要更好地明确中心思想。博主多多像我学习啊！ ::dunjiao:315:: ", " 我是来替大家批评博主的，文章缺乏吸引人的开头，建议引入更有趣的故事或引语来吸引读者注意。博主多多像我学习啊！ ::dunjiao:315:: ", // // 添加更多额外的语录内容 ]; var randomIndex = Math.floor(Math.random() * yuluResponses.length); var randomResponse = yuluResponses[randomIndex]; a(c, randomResponse); }, yulu: function() { var c = document.getElementById("comment") || 0; var yuluResponses = [ " 有你在的日子才是我的日常。 ::dunjiao:302:: ", " 夹在我女友与前女友与青梅竹马间的果然是修罗场！ ::dunjiao:302:: ", " 既然如此，就再努力一次吧。别在这里愁眉不展，也不要再自欺欺人，重新来过！ ::dunjiao:302:: ", " 比自己,比梦想更重要的东西永远都存在着... ::dunjiao:302:: ", " 嘛，那又怎么样呢？ ::dunjiao:302:: ", " 自身不先改变的话，一切都不会改变。 ::dunjiao:302:: ", " 比起有一百个朋友，不如有个比一百人还要重要的真心朋友。 ::dunjiao:302:: ", " 我有在反省，但我不后悔。 ::dunjiao:302:: ", " 要超越过去与悲伤，用坚强和笑容去开拓明天。 ::dunjiao:302:: ", " 男人许下的诺言就一定要遵守。 ::dunjiao:302:: ", " 没有回忆就去创造回忆，没有道路就去开辟道路。 ::dunjiao:302:: ", " 我敬你是条汉子！ ::dunjiao:302:: ", " 不相信自己的人，连努力的价值都没有。 ::dunjiao:302:: ", " 微风摇曳着窗帘，夕阳斜射入教室，在那里鼓起勇气告白的少年。即使现在也能清晰地回想起她的声音「当朋友，不行吗？」 ::dunjiao:302:: ", " 就算是沉落地面的太阳，只要夜晚过了一定会再度升起，不管有什么痛苦或难过的事，跟今天截然不同的明天也一定会到来。 ::dunjiao:302:: ", " 我的腿让我停下，可是心却不允许我那么做。 ::dunjiao:302:: ", " 生活就像超级女生，走到最后的都是纯爷们。 ::dunjiao:302:: ", " 我要拼，装上假牙也要拼！ ::dunjiao:302:: ", " 想要成为无论多么悲伤的时候，也能够漂亮微笑的人吧。 ::dunjiao:302:: ", " 人们只是用好人来称呼对自己有用的人而以，不存在对所有人都有用的人。 ::dunjiao:302:: ", " 烈焰中舞动的火花，将赐予邪恶异性交往以天罚。 ::dunjiao:302:: ", " 无论乌云有多浓厚，星星也一定还在，只是暂时看不到了而已。 ::dunjiao:302:: ", " 不相信人咬不到肚脐的，咬破肚脐去死如何？ ::dunjiao:302:: ", " 人一生会遇到约万人，两个人相爱的概率是.。所以你不爱我，我不怪你。 ::dunjiao:302:: ", " 不管看到什么样的过去，都请不要迷失自己，不管你变成什么样子，我都是你的同伴。 ::dunjiao:302:: ", " 心，可是很重的。 ::dunjiao:302:: ", " 我爱上的人，称我为怪叔叔 ::dunjiao:302:: ", " 慕君之心，至死方休。 ::dunjiao:302:: ", " 虚伪的眼泪，会伤害别人，虚伪的笑容，会伤害自己。 ::dunjiao:302:: ", " 若隐若现才是艺术！ ::dunjiao:302:: ", " 生我何用？不能欢笑。灭我何用？不减狂骄。 ::dunjiao:302:: ", " 就是因为你不好，才要留在你身边，给你幸福。 ::dunjiao:302:: ", " 呐，我们好像是，被宇宙和地球拆散的恋人似的。 ::dunjiao:302:: ", " 你会梦游，我会磨牙，我们晚上一起去吓人吧！ ::dunjiao:302:: ", " 或许只需一滴露水，便能守护这绽放的花朵。 ::dunjiao:302:: ", " 自己永远是孤单的，但你可以让其他人变得不孤单。 ::dunjiao:302:: ", " 和哥哥的便当比起来夜空的薯片就像大便一样！只会给我大便的大便夜空是笨蛋～笨蛋～ ::dunjiao:302:: ", " 我手中的魔法，是守护挚爱的力量，是坚定这个信念所必须的力量，我一定会拯救你的，无论在何时、何地。 ::dunjiao:302:: ", " 要改变别人的心真是件很难办的事，不过改变自己要容易一点。 ::dunjiao:302:: ", " 风筝的线你随时可以放开，只是别盼望我会回来。 ::dunjiao:302:: ", " 与你的生命等价的东西，这个世界上根本没有。 ::dunjiao:302:: ", " 君子可寓意于物，但不可留意于物。 ::dunjiao:302:: ", " 最好的感觉，是有人懂你的欲言又止。 ::dunjiao:302:: ", " 看似美好的东西，往往藏着陷阱。 ::dunjiao:302:: ", " 爱,其实很简单，困难的是去接受它。 ::dunjiao:302:: ", " 喜欢大胸只是本能，喜欢贫乳才是审美。 ::dunjiao:302:: ", " 二次元什么的我本来是不感冒的，直到我的膝盖中了一箭。 ::dunjiao:302:: ", " 你才是⑨！你全家都是⑨！ ::dunjiao:302:: ", " 努力是不会背叛自己的，虽然梦想有时会背叛自己。 ::dunjiao:302:: ", " 面对就好，去经历就好。 ::dunjiao:302:: ", " 我从小就害怕虫子 ::dunjiao:302:: ", " 做不到的话，不过就是一死 。但是，赢了就能活下去，要是不战斗就赢不了。 ::dunjiao:302:: ", " 既然认准这条路，何必去打听要走多久。 ::dunjiao:302:: ", " 研表究明，汉字的序顺并不定一能影阅响读，比如当你看完这句话后，才发这现里的字全是都乱的。 ::dunjiao:302:: ", " 少年心意，一如明月松间的青石流水，那些年里看到了，却不懂。 ::dunjiao:302:: ", " 明明只是活着，哀伤却无处不在⋯⋯ ::dunjiao:302:: ", " 少罗嗦，你还不如虫子呢！ ::dunjiao:302:: ", " 天空是连着的，如果我们也能各自发光的话，无论距离有多远，都能看到彼此努力的身影。 ::dunjiao:302:: ", " 别人恋爱不成功，你连暗恋都不成功！ ::dunjiao:302:: ", // // 添加更多额外的语录内容 ]; var randomIndex = Math.floor(Math.random() * yuluResponses.length); var randomResponse = yuluResponses[randomIndex]; a(c, randomResponse); }, }; 代码内::dunjiao:302:: ::dunjiao:315::等是表情文件，可以根据自己的表情内容修改，文字内容是随机输出的打开 /usr/themes/handsome/component/comments.php 文件，找到并删除/注释以下内容：[/collapse]博客信息内的全站字数统计[collapse status="false" title="点击打开查看"]将下面代码加到 /usr/themes/handsome/functions.php的放在文件最下面/*全站字数统计开始*/ function allOfCharacters() { $chars = 0; $db = Typecho_Db::get(); $select = $db ->select('text')->from('table.contents'); $rows = $db->fetchAll($select); foreach ($rows as $row) { $chars += mb_strlen(trim($row['text']), 'UTF-8'); } $unit = ''; if($chars >= 10000) { $chars /= 10000; $unit = '万'; } else if($chars >= 1000) { $chars /= 1000; $unit = '千'; } $out = sprintf('%.2lf %s',$chars, $unit); return $out; } /*全站字数统计结束*/将下面代码粘贴到 /usr/themes/handsome/component/sidebar.php内，文章数目的下方 <?php echo allOfCharacters(); ?><?php _me("全站字数") ?> [/collapse]右侧边栏恋爱计时[collapse status="false" title="点击打开查看"]打开后台-更改外观-设置外观-开发者设置-复制代码粘贴至 全局右侧边栏广告位 <img src=" https://static.lyj15.cn/blogFiles/2025/10/28/微信图片_2025-10-28_162044_368.jpg" style="width: 50px;height: 50px;vertical-align: -20px;border-radius: 50%;margin-right: 5px;margin-bottom: 5px;-webkit-box-shadow: 1px 1px 1px rgba(0,0,0,.1), 1px 1px 1px rgba(0,0,0,0.1), 1px 1px 1px rgba(0,0,0,0.1);box-shadow: 1px 1px 1px rgba(0,0,0,.1), 1px 1px 1px rgba(0,0,0,0.1), 1px 1px 1px rgba(0,0,0,0.1);border: 2px solid #fff;"> <img src=" https://static.lyj15.cn/blogFiles/2025/10/28/微信图片_2025-10-28_162037_144.jpg" style="width: 50px;height: 50px;vertical-align: -20px;border-radius: 50%;margin-left: 5px;margin-bottom: 5px;-webkit-box-shadow: 1px 1px 1px rgba(0,0,0,.1), 1px 1px 1px rgba(0,0,0,0.1), 1px 1px 1px rgba(0,0,0,0.1);box-shadow: 1px 1px 1px rgba(0,0,0,.1), 1px 1px 1px rgba(0,0,0,0.1), 1px 1px 1px rgba(0,0,0,0.1);border: 2px solid #fff;"> 上面的图片地址改成自己的因为填在了全局右侧边栏广告位，所以标题会显示广告打开网站的 /usr/themes/handsome/component/sidebar.php文件，搜索广告，改成我们相爱了（按自己需求改）然后刷新一下网站就好了[/collapse]评论添加一键打卡[collapse status="false" title="点击打开查看"]打开后台-更改外观-设置外观-开发者设置-复制代码粘贴至 自定义JavaScript打开后台-更改外观-设置外观-PJAX-复制代码粘贴至 PJAX回调函数function a(a, b, c) { if (document.selection) a.focus(), sel = document.selection.createRange(), c ? sel.text = b + sel.text + c : sel.text = b, a.focus(); else if (a.selectionStart || "0" == a.selectionStart) { var l = a.selectionStart, m = a.selectionEnd, n = m; c ? a.value = a.value.substring(0, l) + b + a.value.substring(l, m) + c + a.value.substring(m, a.value.length) : a.value = a.value.substring(0, l) + b + a.value.substring(m, a.value.length); c ? n += b.length + c.length : n += b.length - m + l; l == m && c && (n -= c.length); a.focus(); a.selectionStart = n; a.selectionEnd = n } else a.value += b + c, a.focus() } var b = (new Date).toLocaleTimeString(), c = document.getElementById("comment") || 0; window.SIMPALED = {}; window.SIMPALED.Editor = { daka: function() { a(c, "滴！学生卡！打卡时间：" + b, "，请上车的乘客系好安全带~") }, zan: function() { a(c, " 写得好好哟,我要给你点个赞！ ::funny:07:: ") }, cai: function() { a(c, "骚年,我怀疑你写了一篇假的文章！::funny:03:: ") } };打开/usr/themes/handsome/component/comments.php 文件，找到以下内容 <?php _me("评论") ?> * <textarea id="comment" class="textarea form-control OwO-textarea" name="text" rows="5" placeholder="<?php _me("说点什么吧……") ?>" onkeydown="if(event.ctrlKey&&event.keyCode==13){document.getElementById('submit').click();return false};"><?php $this->remember('text'); ?> <?php $options = mget(); if (in_array('ajaxComment', Utils::checkArray( $options->featuresetup))): ?> <div class="secret_comment" id="secret_comment" data-toggle="tooltip" data-original-title="<?php _me("开启该功能，您的评论仅作者和评论双方可见") ?>"> <?php _me("私密评论") ?> <?php endif; ?>替换成下面内容 <?php _me("评论") ?> * <textarea id="comment" class="textarea form-control OwO-textarea" name="text" rows="5" placeholder="<?php _me("说点什么吧……") ?>" onkeydown="if(event.ctrlKey&&event.keyCode==13){document.getElementById('submit').click();return false};"><?php $this->remember('text'); ?> 打卡 <?php $options = mget(); if (in_array('ajaxComment', Utils::checkArray( $options->featuresetup))): ?> <div class="secret_comment" id="secret_comment" data-toggle="tooltip" data-original-title="<?php _me("开启该功能，您的评论仅作者和评论双方可见") ?>"> <?php _me("私密评论") ?> <?php endif; ?>打开后台-更改外观-设置外观-开发者设置-复制代码粘贴至 自定义CSS.secret_comment { top: 5px; } .OwO.OwO-open .OwO-body { display:table }[/collapse]修改深色模式下行内代码字体颜色[collapse status="false" title="点击打开查看"]打开后台-更改外观-设置外观-开发者设置-复制代码粘贴至 自定义 CSShtml.theme-dark :not(pre) > code { color: #ffeb3b !important; }[/collapse]
AI摘要 实现在评论显示评论者基础信息的插件下载和使用教程。 此内容根据文章生成，仅用于文章内容的解释与总结 效果预览实现步骤[collapse status="false" title="插件下载"]作者博客下载：点击前往本文下载：[hide]点击下载[/hide][/collapse]进入handsome/component/comments.php文件，找到82行，添加这条语句<?php UserAgent_Plugin::get_useragent($comments->agent,$comments->ip); ?>添加完成后启用插件，大概和下面配置差不多就好，可以按自己需求来最后刷新一下网站就可以看到了~
AI摘要 介绍一款轻量级插件，用于博客的访问层拦截及验证，防止恶意访问。 此内容根据文章生成，仅用于文章内容的解释与总结 前言最近觉得这个主题有点单调，所以想美化一下，找了一些喜欢的插件美化，所以顺便记录下来备用插件[scode type="yellow" size=""]所有下载下来的插件，解压后上传到你的博客根目录的 /usr/plugins 目录下，然后后台启用及配置插件[/scode]easywaf—访问层拦截及验证插件插件下载：[hide]插件下载[/hide]有两种验证方式，一个是滑动，一个是技术自动模式看自己喜欢的来，建议打开，不然每十分钟再进去都会弹（被攻击时不建议打开）HoerMouse—鼠标美化插件下载：[hide]插件下载[/hide]按自己喜欢的配置就好
AI摘要 文章介绍了如何在Typecho博客中安装和配置AISummary插件，实现文章自动生成摘要功能。 此内容根据文章生成，仅用于文章内容的解释与总结 准备工作首先先弄一个大模型的api Key，这边选的是Kimi，因为它送了15块的余额...，平台地址：Moonshot AI 开放平台Github下载AISummary插件，仓库地址：AISummary插件如果仓库打不开，就下载这个：[hide]点击下载[/hide]实现步骤安装把下载好AISummary插件解压，改名为AISummary，将插件文件夹上传至Typecho的/usr/plugins/目录进入Typecho后台 → 插件 → 启用AISummary插件配置模型名：moonshot-v1-auto（Kimi平台的自动选择模型）API KEY：你的Kimi API密钥（形如sk-xxxxxx）API 地址：https://api.moonshot.cn（注意不需要添加/v1）提示词的话有两种，看自己选择提示词1（详细版，耗钱一点） ：你的任务是生成文章的摘要。请你根据以下文章内容生成150字内的摘要，除了你生成的的摘要内容，请不要输出其他任何无关内容。摘要最大长度：160（建议留点空间）提示词2 （简略版，省钱一点）：你的任务是根据以下文章内容生成一句不超过50个字的简短摘要，只需概括文章主题或核心内容，不要包含具体步骤、教程过程、示例、链接或多余说明。除了摘要外，不要输出任何其他内容。摘要最大长度：60（建议留点空间）是否替换默认摘要：替换文章修改时更新摘要：启用正文摘要显示样式：使用自定义样式自定义样式 正文摘要前后固定文字 <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> <path d="M3 10a4 4 0 0 1 4 -4h10a4 4 0 0 1 4 4v6a4 4 0 0 1 -4 4h-10a4 4 0 0 1 -4 -4v-6z" ></path> <path d="M8 3l2 3" ></path> <path d="M16 3l-2 3" ></path> <path d="M9 13v-2" ></path> <path d="M15 11v2" ></path> AI摘要 {{text}} 此内容根据文章生成，仅用于文章内容的解释与总结 存储字段名称：summary使用配置完成后，就可以使用了首先进入管理-摘要-管理Ai摘要使用要点：在插件配置好启用后，以前的文章是不会自动生成摘要的，需要在摘要管理里面手动生成，或者进入编辑文章后发布文章自动生成新文章只要发布就会自动生成摘要在摘要管理里面不要一下子手动生成太多的摘要，会导致后台卡死在配置里面的文章修改时更新摘要选择启用时，文章每次修改提交都会刷新摘要生成摘要后，刷新一下网站进入对应文章就可以看到了~，示例图如下：
AI摘要 如何在博客侧边栏添加在线人数统计功能。 此内容根据文章生成，仅用于文章内容的解释与总结 效果预览位置在侧边栏的博客信息里面，效果图如下：实现步骤添加统计函数，在/usr/themes/handsome/functions.php文件的末尾添加/** * 在线人数统计函数 */ function online_users() { // 基本配置参数 $filename = 'online.txt'; // 数据文件路径，默认在网站根目录 $cookiename = 'Typecho_Online'; // Cookie名称，用于标识访客 $onlinetime = 30; // 在线有效时间（秒），超过此时间未活动则视为离线 // 读取在线用户数据文件 $online = file_exists($filename) ? file($filename) : array(); $nowtime = $_SERVER['REQUEST_TIME']; $nowonline = array(); // 清理过期的在线记录 foreach($online as $line) { $row = explode('|', $line); $sesstime = trim($row[1]); // 仅保留有效期内的记录 if(($nowtime - $sesstime) <= $onlinetime) { $nowonline[$row[0]] = $sesstime; } } // 处理当前访客的Cookie if(isset($_COOKIE[$cookiename])) { // 已有Cookie，获取访客ID $uid = $_COOKIE[$cookiename]; } else { // 无Cookie，生成新的唯一访客ID $vid = 0; do { $vid++; $uid = 'U'.$vid; } while(array_key_exists($uid, $nowonline)); // 设置Cookie，默认会话期有效 setcookie($cookiename, $uid); } // 更新当前访客的在线时间 $nowonline[$uid] = $nowtime; // 计算在线总人数 $total_online = count($nowonline); // 将更新后的数据写回文件 if($fp = @fopen($filename, 'w')) { if(flock($fp, LOCK_EX)) { // 获取独占锁 rewind($fp); foreach($nowonline as $fuid => $ftime) { $fline = $fuid.'|'.$ftime."\n"; @fputs($fp, $fline); } flock($fp, LOCK_UN); // 释放锁 } fclose($fp); } return $total_online; }在博客信息显示，在/usr/themes/handsome/component/sidebar.php文件中添加 <?php echo online_users() ?> <?php _me("在线人数") ?> 最后刷新一下网站就可以看到了~
AI摘要 在d2admin项目中通过添加Content-Security-Policy元标签实现强制HTTPS调用。 此内容根据文章生成，仅用于文章内容的解释与总结 现在是跟随env文件配置的http来调用的在public目录下的index.html文件增加这句 添加完成后，再次调用可以看到已经转为https调用了
AI摘要 介绍一个Python脚本，用于统计每个人在Git仓库中的提交量，并可导出为CSV文件。 此内容根据文章生成，仅用于文章内容的解释与总结 准备工作[scode type="yellow" size=""]没有安装python的先安装再跑脚本[/scode]使用解压后，在脚本目录cmd，然后输入以下命令启动脚本python main.py 本地git仓库地址或者也可以这样，先调起脚本，进去再输入本地git仓库地址python main.py统计完后也可以把结果输出到csv文件上下载源码包：[hide]下载源码[/hide]import subprocess import sys from collections import defaultdict import os import time def get_git_author_lines(repo_path): # 保存原目录 original_dir = os.getcwd() try: # 切换到仓库目录 os.chdir(repo_path) except FileNotFoundError: print(f"错误：无法找到路径 {repo_path}") return # 查看是否是 Git 仓库 result = subprocess.run( ['git', 'rev-parse', '--is-inside-work-tree'], capture_output=True, text=True) if result.returncode != 0: print("错误：该路径不是 Git 仓库") return # 进度条特效 progress_bar(f"正在统计仓库{repo_path}", 10) # 配置信息 cmd = [ 'git', 'log', # 获取作者和 numstat 信息 '--no-merges', # 排除合并提交 '--pretty=format:%aN', # 输出作者名 '--numstat' # 输出每文件增删行数 ] # 拼接命令并执行 result = subprocess.run(cmd, capture_output=True, text=True, encoding='utf-8', errors='ignore') if result.returncode != 0: print("Git 拼接命令执行失败：", result.stderr) return # 分割result数据 lines = result.stdout.splitlines() # 防止被调用到没有初始化的键，及可以直接使用author_stats[aaa][added]、author_stats[bbb][added] author_stats = defaultdict(lambda: {'added': 0, 'deleted': 0}) # 循环遍历结果 i = 0 while i < len(lines): line = lines[i].strip() if not line: i += 1 continue if line.startswith(('commit', 'Merge:', 'Author:', 'Date:')): # 跳过提交信息头 i += 1 continue # 作者名 author = line.strip() i += 1 # numstat 数据（插入、删除、文件） while i < len(lines) and lines[i].strip() and not lines[i].startswith(('commit', 'Author:', 'Date:', ' ')): parts = lines[i].split('\t') if len(parts) == 3: try: added = int(parts[0]) if parts[0] != '-' else 0 deleted = int(parts[1]) if parts[1] != '-' else 0 author_stats[author]['added'] += added author_stats[author]['deleted'] += deleted except ValueError: pass # 忽略错误 i += 1 else: i += 1 if not author_stats: print("未找到提交记录。") return # 进度条特效 progress_bar("正在输出结果", 10) # 创建抬头 print(f"{'作者':<15} {'新增行数':<10} {'删除行数':<10} {'净增行数':<10}") # # 按新增行数降序排列 sorted_authors = sorted(author_stats.items(), key=lambda x: x[1]['added'], reverse=True) # 输出结果 for author, stats in sorted_authors: added = stats['added'] deleted = stats['deleted'] net = added - deleted print(f"{author:<18} {added:<13} {deleted:<13} {net:<13}") print() # 导出为 CSV export = input("\n是否导出为 CSV 文件？(y/n): ").strip().lower() if export == 'y': csv_file = os.path.join(repo_path, 'git_stats.csv') with open(csv_file, 'w', encoding='utf-8') as f: f.write('提交人,新增行数,删除行数,净增行数\n') for author, stats in sorted_authors: f.write(f'{author},{stats["added"]},{stats["deleted"]},{stats["added"] - stats["deleted"]}\n') print(f"已导出到：{csv_file}") # 回到原来的目录 os.chdir(original_dir) # 进度条特效 def progress_bar(name, sum): print(), print() # 换行 for i in range(5, sum + 1): bar = '█' * i + '.' * (sum - i) print(f"\r{name}: {i}/{sum} [{bar}]", end="", flush=True) time.sleep(0.1) print() # 换行 if __name__ == '__main__': # 如果已经配置了仓库地址，就直接拿取这个地址 if len(sys.argv) > 1: repo_path = sys.argv[1] else: # 配置仓库地址，并且移除空格和引号 repo_path = input("请输入 Git 仓库的本地路径: ").strip().strip('"\'') get_git_author_lines(repo_path)