一言star精选
一言 hitokoto
image效果截图
点击放大notes详细介绍
每天一句:同一天内反复进后台都用缓存里那句
换一句:强制重新请求并覆盖当天缓存
复制:连同出处一起复制
降级:接口超时 / 被墙 / 被浏览器插件拦截时,自动用内置的本地句子,并在卡片里给一条可读的中文提示条 —— 卡片永远不会空白。
code配置代码
<div class="abq"><div class="abq-main"><div class="abq-mark"><span class="material-icons-round">format_quote</span></div><blockquote class="abq-quote" id="abq-quote">正在取一句话…</blockquote><div class="abq-meta"><span class="abq-from" id="abq-from"></span><span class="abq-day" id="abq-day"></span></div><div class="abq-tip" id="abq-tip"></div></div><div class="abq-tools"><button class="abq-btn" type="button" id="abq-copy"><span class="material-icons-round">content_copy</span>复制</button><button class="abq-btn is-primary" type="button" id="abq-next"><span class="material-icons-round">refresh</span>换一句</button></div></div><style>.ab-custom-card > .ab-custom-body:has(> .abq){flex:1 1 auto;display:flex;flex-direction:column;min-height:0}.abq{--abq-ease:cubic-bezier(.2,0,0,1);position:relative;display:flex;flex-direction:column;gap:12px;flex:1 1 auto;min-height:176px;padding:16px 18px;border-radius:24px;background:var(--md-surface-container-high);background:color-mix(in srgb,var(--md-primary) 10%,var(--md-surface-container-high));color:var(--md-on-surface)}.abq-main{position:relative;flex:1 1 auto;display:flex;flex-direction:column;justify-content:center;gap:10px;min-height:0;padding-right:34px}.abq-mark{position:absolute;top:0;right:0;color:color-mix(in srgb,var(--md-primary) 45%,transparent);pointer-events:none}.abq-mark .material-icons-round{font-size:44px;line-height:1}.abq-quote{margin:0;font-size:15.5px;line-height:1.75;font-weight:500;color:var(--md-on-surface);word-break:break-word}.abq-quote.is-long{font-size:15px;line-height:1.7}.abq-meta{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:12.5px;color:var(--md-on-surface-variant)}.abq-from{min-height:1em}.abq-from::before{content:'';display:inline-block;width:18px;height:1px;margin-right:6px;vertical-align:middle;background:var(--md-primary)}.abq-day{margin-left:auto;white-space:nowrap;font-variant-numeric:tabular-nums}.abq-tip:empty{display:none}.abq-tools{display:flex;gap:8px;flex-wrap:wrap;margin-top:auto}.abq-btn{display:inline-flex;align-items:center;gap:5px;height:34px;padding:0 14px;border:1px solid var(--md-outline-variant);border-radius:9999px;background:transparent;color:var(--md-on-surface);font-size:13px;font-weight:500;cursor:pointer;transition:background-color .2s var(--abq-ease),border-color .2s var(--abq-ease),transform .2s var(--abq-ease)}.abq-btn:hover{background:var(--md-surface-container-highest)}.abq-btn:active{transform:scale(.97)}.abq-btn:focus-visible{outline:2px solid color-mix(in srgb,var(--md-primary) 55%,transparent);outline-offset:2px}.abq-btn.is-primary{border-color:transparent;background:var(--md-primary);color:var(--md-on-primary)}.abq-btn.is-primary:hover{filter:brightness(1.06)}.abq-btn .material-icons-round{display:block;font-size:17px;line-height:1}.abq-btn.is-busy .material-icons-round{animation:abq-spin 1s linear infinite}.abq-quote.is-fresh{animation:abq-in .4s var(--abq-ease) both}@keyframes abq-spin{to{transform:rotate(360deg)}}@keyframes abq-in{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}@media (prefers-reduced-motion:reduce){ .abq-btn{transition:none} .abq-btn.is-busy .material-icons-round{animation:none} .abq-quote.is-fresh{animation:none}}</style>
(function(){'use strict';if(typeof card.__abqBoot==='function'){card.__abqBoot();return}var KEY='quote-of-day';var API='https://v1.hitokoto.cn/?encode=json&c=d&c=i&c=k';var TIMEOUT=8000;var LOCAL=['把每一天当成一个新的开始。','慢一点也没关系,只要方向是对的。','写下来,就算数。','先把事情做完,再把它做漂亮。','认真做事的人,运气都不会太差。'];var el=ab.ui.el;var current=null;var busy=false;function $(id){return card.querySelector('#'+id)}function pad(n){return(n<10?'0':'')+n}function say(text,tone){if(ab.notify)ab.notify(text,tone||'info')}function today(){var d=new Date();return d.getFullYear()+'-'+pad(d.getMonth()+1)+'-'+pad(d.getDate())}function fetchQuote(){return new Promise(function(resolve,reject){if(typeof window.fetch!=='function'){reject(new Error('当前浏览器不支持 fetch'));return}var timer=ab.timeout(function(){reject(new Error('请求超时'))},TIMEOUT);window.fetch(API,{credentials:'omit'}).then(function(r){if(!r.ok)throw new Error('HTTP '+r.status);return r.json()}).then(function(d){window.clearTimeout(timer);if(!d||!d.hitokoto)throw new Error('接口没有返回内容');resolve({text:String(d.hitokoto),from:String(d.from||''),who:String(d.from_who||'')})}).catch(function(err){window.clearTimeout(timer);reject(err)})})}function renderTip(text,tone){var box=$('abq-tip');if(!box)return;if(!text){ab.ui.mount(box,'');return}ab.ui.mount(box,ab.ui.notice({icon:'cloud_off',tone:tone||'warn',text:text}))}function render(quote,fresh){current=quote;var q=$('abq-quote'),from=$('abq-from'),day=$('abq-day');if(q){q.textContent=quote.text;q.classList.toggle('is-long',quote.text.length>60);q.classList.toggle('is-fresh',!!fresh&&q.classList.contains('is-fresh')===false)}if(from){var src=quote.from?(quote.who?quote.who+'《'+quote.from+'》':quote.from):(quote.who||'');from.textContent=src||'未署名';from.title=src}if(day){var d=new Date();day.textContent='第 '+Math.ceil((d-new Date(d.getFullYear(),0,0))/86400000)+' 天 · 每日一句'}}function load(force){if(busy)return Promise.resolve();if(!force){return ab.data.get(KEY,null).then(function(saved){if(saved&&saved.text&&saved.date===today()){render(saved,false);renderTip('');return null}return load(true)}).catch(function(){return load(true)})}busy=true;var btn=$('abq-next');if(btn)btn.classList.add('is-busy');var q=$('abq-quote');if(q&&!current)q.textContent='正在取一句话…';return fetchQuote().then(function(quote){var payload={date:today(),text:quote.text,from:quote.from,who:quote.who};ab.data.save(KEY,payload).catch(function(){});render(payload,true);renderTip('')}).catch(function(err){var i=Math.floor(Math.random()*LOCAL.length);var fallback={date:today(),text:LOCAL[i],from:'本地兜底',who:''};render(fallback,true);renderTip('取句子失败(已用本地兜底):'+((err&&err.message)||'未知错误'),'warn');say('网络不可用,已用本地句子','warn')}).then(function(){busy=false;if(btn)btn.classList.remove('is-busy')})}function copyQuote(){if(!current){say('还没取到句子','warn');return}var text=current.text+(current.from?' —— '+(current.who?current.who+'《'+current.from+'》':current.from):'');if(ab.copyText){ab.copyText(text,'已复制');return}if(ab.copy)ab.copy(text).then(function(ok){say(ok?'已复制':'复制失败',ok?'success':'danger')})}function bind(){var next=$('abq-next');if(next)next.addEventListener('click',function(){load(true)});var copy=$('abq-copy');if(copy)copy.addEventListener('click',copyQuote)}function boot(){return load(false)}card.__abqBoot=boot;bind();boot()})();
download_for_offline如何导入
Typecho 后台 → 控制台 → 插件 → AB Admin(AdminBeautify)→「概要页卡片设置」
找到 自定义卡片 区域,打开总开关(默认关闭)
点 添加卡片,按下表填写:
| 图标 | format_quote |
| 卡片标题 | 一言 |
| HTML 内容 | 见上方「HTML 内容」标签页 |
| JavaScript | 见上方「JavaScript」标签页 |
点右下角 保存设置,回到概要页即可看到卡片(顺序可在排序列表里拖动调整)
shield安全信息
error
带告警项(已人工确认)
warning
卡片 JavaScript 会在你的后台页面里执行。本站已做敏感信息、站外请求与越权操作的自动扫描 + 人工审核,但仍请在使用前自行阅读上方代码;发现可疑卡片请到
GitHub 反馈。