-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
There are no files selected for viewing
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,194 @@ | ||
<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0,viewport-fit=cover"><title>关于 | Serene</title><meta name="author" content="sz134055"><meta name="copyright" content="sz134055"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="description" content="README这是一个使用Hexo驱动的个人博客,主题使用Quiet。"> | ||
<meta property="og:type" content="website"> | ||
<meta property="og:title" content="关于"> | ||
<meta property="og:url" content="https://sz134055.github.io/about/index.html"> | ||
<meta property="og:site_name" content="Serene"> | ||
<meta property="og:description" content="README这是一个使用Hexo驱动的个人博客,主题使用Quiet。"> | ||
<meta property="og:locale" content="zh_CN"> | ||
<meta property="og:image" content="https://sz134055.github.io/image/logo.png"> | ||
<meta property="article:published_time" content="2024-10-06T16:00:00.000Z"> | ||
<meta property="article:modified_time" content="2024-10-07T12:21:21.611Z"> | ||
<meta property="article:author" content="sz134055"> | ||
<meta property="article:tag" content="Web,逆向,爬虫,Python"> | ||
<meta name="twitter:card" content="summary"> | ||
<meta name="twitter:image" content="https://sz134055.github.io/image/logo.png"><link rel="shortcut icon" href="/image/favicon.ico"><link rel="canonical" href="https://sz134055.github.io/about/index.html"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css"><script> | ||
(() => { | ||
|
||
const saveToLocal = { | ||
set: (key, value, ttl) => { | ||
if (!ttl) return | ||
const expiry = Date.now() + ttl * 86400000 | ||
localStorage.setItem(key, JSON.stringify({ value, expiry })) | ||
}, | ||
get: key => { | ||
const itemStr = localStorage.getItem(key) | ||
if (!itemStr) return undefined | ||
const { value, expiry } = JSON.parse(itemStr) | ||
if (Date.now() > expiry) { | ||
localStorage.removeItem(key) | ||
return undefined | ||
} | ||
return value | ||
} | ||
} | ||
|
||
window.btf = { | ||
saveToLocal, | ||
getScript: (url, attr = {}) => new Promise((resolve, reject) => { | ||
const script = document.createElement('script') | ||
script.src = url | ||
script.async = true | ||
Object.entries(attr).forEach(([key, val]) => script.setAttribute(key, val)) | ||
script.onload = script.onreadystatechange = () => { | ||
if (!script.readyState || /loaded|complete/.test(script.readyState)) resolve() | ||
} | ||
script.onerror = reject | ||
document.head.appendChild(script) | ||
}), | ||
getCSS: (url, id) => new Promise((resolve, reject) => { | ||
const link = document.createElement('link') | ||
link.rel = 'stylesheet' | ||
link.href = url | ||
if (id) link.id = id | ||
link.onload = link.onreadystatechange = () => { | ||
if (!link.readyState || /loaded|complete/.test(link.readyState)) resolve() | ||
} | ||
link.onerror = reject | ||
document.head.appendChild(link) | ||
}), | ||
addGlobalFn: (key, fn, name = false, parent = window) => { | ||
if (!false && key.startsWith('pjax')) return | ||
const globalFn = parent.globalFn || {} | ||
globalFn[key] = globalFn[key] || {} | ||
if (name && globalFn[key][name]) return | ||
globalFn[key][name || Object.keys(globalFn[key]).length] = fn | ||
parent.globalFn = globalFn | ||
} | ||
} | ||
|
||
|
||
const activateDarkMode = () => { | ||
document.documentElement.setAttribute('data-theme', 'dark') | ||
if (document.querySelector('meta[name="theme-color"]') !== null) { | ||
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d') | ||
} | ||
} | ||
const activateLightMode = () => { | ||
document.documentElement.setAttribute('data-theme', 'light') | ||
if (document.querySelector('meta[name="theme-color"]') !== null) { | ||
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff') | ||
} | ||
} | ||
|
||
btf.activateDarkMode = activateDarkMode | ||
btf.activateLightMode = activateLightMode | ||
|
||
const theme = saveToLocal.get('theme') | ||
|
||
theme === 'dark' ? activateDarkMode() : theme === 'light' ? activateLightMode() : null | ||
|
||
|
||
const asideStatus = saveToLocal.get('aside-status') | ||
if (asideStatus !== undefined) { | ||
document.documentElement.classList.toggle('hide-aside', asideStatus === 'hide') | ||
} | ||
|
||
|
||
const detectApple = () => { | ||
if (/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)) { | ||
document.documentElement.classList.add('apple') | ||
} | ||
} | ||
detectApple() | ||
|
||
})() | ||
</script><script>const GLOBAL_CONFIG = { | ||
root: '/', | ||
algolia: undefined, | ||
localSearch: undefined, | ||
translate: undefined, | ||
noticeOutdate: {"limitDay":365,"position":"top","messagePrev":"距离文章上传日期已过去","messageNext":"天,其内容可能已过时。"}, | ||
highlight: {"plugin":"highlight.js","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":false,"highlightFullpage":false,"highlightMacStyle":false}, | ||
copy: { | ||
success: '复制成功', | ||
error: '复制失败', | ||
noSupport: '浏览器不支持' | ||
}, | ||
relativeDate: { | ||
homepage: false, | ||
post: false | ||
}, | ||
runtime: '', | ||
dateSuffix: { | ||
just: '刚刚', | ||
min: '分钟前', | ||
hour: '小时前', | ||
day: '天前', | ||
month: '个月前' | ||
}, | ||
copyright: undefined, | ||
lightbox: 'null', | ||
Snackbar: undefined, | ||
infinitegrid: { | ||
js: 'https://cdn.jsdelivr.net/npm/@egjs/infinitegrid/dist/infinitegrid.min.js', | ||
buttonText: '加载更多' | ||
}, | ||
isPhotoFigcaption: false, | ||
islazyload: false, | ||
isAnchor: false, | ||
percent: { | ||
toc: true, | ||
rightside: false, | ||
}, | ||
autoDarkmode: false | ||
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = { | ||
title: '关于', | ||
isPost: false, | ||
isHome: false, | ||
isHighlightShrink: false, | ||
isToc: false, | ||
postUpdate: '2024-10-07 20:21:21' | ||
}</script><meta name="generator" content="Hexo 7.3.0"></head><body><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img is-center"><img src="/image/logo.png" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="site-data is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">17</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">5</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">2</div></a></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 主页</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 文章分类</span></a></div></div></div></div><div class="page type-about" id="body-wrap"><header class="not-top-img" id="page-header"><nav id="nav"><span id="blog-info"><a class="nav-site-title" href="/"><img class="site-icon" src="/image/logo.png" alt="Logo"><span class="site-name">Serene</span></a></span><div id="menus"><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 主页</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 文章分类</span></a></div></div><div id="toggle-menu"><span class="site-page"><i class="fas fa-bars fa-fw"></i></span></div></div></nav><h1 class="title-seo">关于</h1></header><main class="layout" id="content-inner"><div id="page"><div class="page-title">关于</div><div id="article-container"><h1 id="README"><a href="#README" class="headerlink" title="README"></a>README</h1><p>这是一个使用Hexo驱动的个人博客,主题使用<a target="_blank" rel="noopener" href="https://github.com/79E/hexo-theme-quiet">Quiet</a>。</p> | ||
</div></div><div class="aside-content" id="aside-content"><div class="sticky_layout"><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item"><a class="thumbnail" href="/2024/10/08/youdao-api-2024/" title="2024更新-有道翻译API逆向"><img src="https://is4-ssl.mzstatic.com/image/thumb/Purple111/v4/8c/fc/61/8cfc6181-0548-4ef6-ed7c-35727cf53d27/source/512x512bb.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="2024更新-有道翻译API逆向"/></a><div class="content"><a class="title" href="/2024/10/08/youdao-api-2024/" title="2024更新-有道翻译API逆向">2024更新-有道翻译API逆向</a><time datetime="2024-10-08T05:27:00.000Z" title="发表于 2024-10-08 13:27:00">2024-10-08</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2024/10/07/disable-devtool-reverse/" title="disable-devtool绕过">disable-devtool绕过</a><time datetime="2024-10-07T12:35:10.000Z" title="发表于 2024-10-07 20:35:10">2024-10-07</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2023/01/31/scrapy-try/" title="Scrapy爬虫框架初探">Scrapy爬虫框架初探</a><time datetime="2023-01-31T03:38:20.000Z" title="发表于 2023-01-31 11:38:20">2023-01-31</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2023/01/09/js-rpc-try/" title="JS RPC学习及实战">JS RPC学习及实战</a><time datetime="2023-01-09T10:21:13.000Z" title="发表于 2023-01-09 18:21:13">2023-01-09</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2023/01/07/websocket-try/" title="Websocket在爬虫中的应用">Websocket在爬虫中的应用</a><time datetime="2023-01-07T11:27:30.000Z" title="发表于 2023-01-07 19:27:30">2023-01-07</time></div></div></div></div><div class="card-widget card-categories"><div class="item-headline"> | ||
<i class="fas fa-folder-open"></i> | ||
<span>分类</span> | ||
|
||
</div> | ||
<ul class="card-category-list" id="aside-cat-list"> | ||
<li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E7%88%AC%E8%99%AB/"><span class="card-category-list-name">爬虫</span><span class="card-category-list-count">8</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E9%80%86%E5%90%91/"><span class="card-category-list-name">逆向</span><span class="card-category-list-count">11</span></a></li> | ||
</ul></div><div class="card-widget card-tags"><div class="item-headline"><i class="fas fa-tags"></i><span>标签</span></div><div class="card-tag-cloud"><a href="/tags/javascript/" style="font-size: 1.1em; color: #999">javascript</a> <a href="/tags/JavaScript/" style="font-size: 1.5em; color: #99a9bf">JavaScript</a> <a href="/tags/%E7%88%AC%E8%99%AB/" style="font-size: 1.23em; color: #999ea6">爬虫</a> <a href="/tags/Python/" style="font-size: 1.23em; color: #999ea6">Python</a> <a href="/tags/%E9%80%86%E5%90%91/" style="font-size: 1.37em; color: #99a4b2">逆向</a></div></div><div class="card-widget card-archives"> | ||
<div class="item-headline"> | ||
<i class="fas fa-archive"></i> | ||
<span>归档</span> | ||
|
||
</div> | ||
<ul class="card-archive-list"> | ||
|
||
<li class="card-archive-list-item"> | ||
<a class="card-archive-list-link" href="/archives/2024/10/"> | ||
<span class="card-archive-list-date">十月 2024</span> | ||
<span class="card-archive-list-count">2</span> | ||
</a> | ||
</li> | ||
|
||
<li class="card-archive-list-item"> | ||
<a class="card-archive-list-link" href="/archives/2023/01/"> | ||
<span class="card-archive-list-date">一月 2023</span> | ||
<span class="card-archive-list-count">6</span> | ||
</a> | ||
</li> | ||
|
||
<li class="card-archive-list-item"> | ||
<a class="card-archive-list-link" href="/archives/2022/12/"> | ||
<span class="card-archive-list-date">十二月 2022</span> | ||
<span class="card-archive-list-count">3</span> | ||
</a> | ||
</li> | ||
|
||
<li class="card-archive-list-item"> | ||
<a class="card-archive-list-link" href="/archives/2022/11/"> | ||
<span class="card-archive-list-date">十一月 2022</span> | ||
<span class="card-archive-list-count">6</span> | ||
</a> | ||
</li> | ||
</ul></div><div class="card-widget card-webinfo"><div class="item-headline"><i class="fas fa-chart-line"></i><span>网站信息</span></div><div class="webinfo"><div class="webinfo-item"><div class="item-name">文章数目 :</div><div class="item-count">17</div></div><div class="webinfo-item"><div class="item-name">本站访客数 :</div><div class="item-count" id="busuanzi_value_site_uv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">本站总浏览量 :</div><div class="item-count" id="busuanzi_value_site_pv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">最后更新时间 :</div><div class="item-count" id="last-push-date" data-lastPushDate="2024-10-16T04:23:08.255Z"><i class="fa-solid fa-spinner fa-spin"></i></div></div></div></div></div></div></main><footer id="footer"><div id="footer-wrap"><div class="copyright">©2022 - 2024 By sz134055</div><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="darkmode" type="button" title="日间和夜间模式切换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside-config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button id="go-up" type="button" title="回到顶部"><span class="scroll-percent"></span><i class="fas fa-arrow-up"></i></button></div></div><div><script src="/js/utils.js"></script><script src="/js/main.js"></script><div class="js-pjax"></div><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script></div></body></html> |
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,193 @@ | ||
<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0,viewport-fit=cover"><title>文章分类 | Serene</title><meta name="author" content="sz134055"><meta name="copyright" content="sz134055"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="description" content="个人学习笔记博客"> | ||
<meta property="og:type" content="website"> | ||
<meta property="og:title" content="文章分类"> | ||
<meta property="og:url" content="https://sz134055.github.io/categories/index.html"> | ||
<meta property="og:site_name" content="Serene"> | ||
<meta property="og:description" content="个人学习笔记博客"> | ||
<meta property="og:locale" content="zh_CN"> | ||
<meta property="og:image" content="https://sz134055.github.io/image/logo.png"> | ||
<meta property="article:published_time" content="2024-10-06T16:00:00.000Z"> | ||
<meta property="article:modified_time" content="2024-10-07T11:05:21.397Z"> | ||
<meta property="article:author" content="sz134055"> | ||
<meta property="article:tag" content="Web,逆向,爬虫,Python"> | ||
<meta name="twitter:card" content="summary"> | ||
<meta name="twitter:image" content="https://sz134055.github.io/image/logo.png"><link rel="shortcut icon" href="/image/favicon.ico"><link rel="canonical" href="https://sz134055.github.io/categories/index.html"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css"><script> | ||
(() => { | ||
|
||
const saveToLocal = { | ||
set: (key, value, ttl) => { | ||
if (!ttl) return | ||
const expiry = Date.now() + ttl * 86400000 | ||
localStorage.setItem(key, JSON.stringify({ value, expiry })) | ||
}, | ||
get: key => { | ||
const itemStr = localStorage.getItem(key) | ||
if (!itemStr) return undefined | ||
const { value, expiry } = JSON.parse(itemStr) | ||
if (Date.now() > expiry) { | ||
localStorage.removeItem(key) | ||
return undefined | ||
} | ||
return value | ||
} | ||
} | ||
|
||
window.btf = { | ||
saveToLocal, | ||
getScript: (url, attr = {}) => new Promise((resolve, reject) => { | ||
const script = document.createElement('script') | ||
script.src = url | ||
script.async = true | ||
Object.entries(attr).forEach(([key, val]) => script.setAttribute(key, val)) | ||
script.onload = script.onreadystatechange = () => { | ||
if (!script.readyState || /loaded|complete/.test(script.readyState)) resolve() | ||
} | ||
script.onerror = reject | ||
document.head.appendChild(script) | ||
}), | ||
getCSS: (url, id) => new Promise((resolve, reject) => { | ||
const link = document.createElement('link') | ||
link.rel = 'stylesheet' | ||
link.href = url | ||
if (id) link.id = id | ||
link.onload = link.onreadystatechange = () => { | ||
if (!link.readyState || /loaded|complete/.test(link.readyState)) resolve() | ||
} | ||
link.onerror = reject | ||
document.head.appendChild(link) | ||
}), | ||
addGlobalFn: (key, fn, name = false, parent = window) => { | ||
if (!false && key.startsWith('pjax')) return | ||
const globalFn = parent.globalFn || {} | ||
globalFn[key] = globalFn[key] || {} | ||
if (name && globalFn[key][name]) return | ||
globalFn[key][name || Object.keys(globalFn[key]).length] = fn | ||
parent.globalFn = globalFn | ||
} | ||
} | ||
|
||
|
||
const activateDarkMode = () => { | ||
document.documentElement.setAttribute('data-theme', 'dark') | ||
if (document.querySelector('meta[name="theme-color"]') !== null) { | ||
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d') | ||
} | ||
} | ||
const activateLightMode = () => { | ||
document.documentElement.setAttribute('data-theme', 'light') | ||
if (document.querySelector('meta[name="theme-color"]') !== null) { | ||
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff') | ||
} | ||
} | ||
|
||
btf.activateDarkMode = activateDarkMode | ||
btf.activateLightMode = activateLightMode | ||
|
||
const theme = saveToLocal.get('theme') | ||
|
||
theme === 'dark' ? activateDarkMode() : theme === 'light' ? activateLightMode() : null | ||
|
||
|
||
const asideStatus = saveToLocal.get('aside-status') | ||
if (asideStatus !== undefined) { | ||
document.documentElement.classList.toggle('hide-aside', asideStatus === 'hide') | ||
} | ||
|
||
|
||
const detectApple = () => { | ||
if (/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)) { | ||
document.documentElement.classList.add('apple') | ||
} | ||
} | ||
detectApple() | ||
|
||
})() | ||
</script><script>const GLOBAL_CONFIG = { | ||
root: '/', | ||
algolia: undefined, | ||
localSearch: undefined, | ||
translate: undefined, | ||
noticeOutdate: {"limitDay":365,"position":"top","messagePrev":"距离文章上传日期已过去","messageNext":"天,其内容可能已过时。"}, | ||
highlight: {"plugin":"highlight.js","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":false,"highlightFullpage":false,"highlightMacStyle":false}, | ||
copy: { | ||
success: '复制成功', | ||
error: '复制失败', | ||
noSupport: '浏览器不支持' | ||
}, | ||
relativeDate: { | ||
homepage: false, | ||
post: false | ||
}, | ||
runtime: '', | ||
dateSuffix: { | ||
just: '刚刚', | ||
min: '分钟前', | ||
hour: '小时前', | ||
day: '天前', | ||
month: '个月前' | ||
}, | ||
copyright: undefined, | ||
lightbox: 'null', | ||
Snackbar: undefined, | ||
infinitegrid: { | ||
js: 'https://cdn.jsdelivr.net/npm/@egjs/infinitegrid/dist/infinitegrid.min.js', | ||
buttonText: '加载更多' | ||
}, | ||
isPhotoFigcaption: false, | ||
islazyload: false, | ||
isAnchor: false, | ||
percent: { | ||
toc: true, | ||
rightside: false, | ||
}, | ||
autoDarkmode: false | ||
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = { | ||
title: '文章分类', | ||
isPost: false, | ||
isHome: false, | ||
isHighlightShrink: false, | ||
isToc: false, | ||
postUpdate: '2024-10-07 19:05:21' | ||
}</script><meta name="generator" content="Hexo 7.3.0"></head><body><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img is-center"><img src="/image/logo.png" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="site-data is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">17</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">5</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">2</div></a></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 主页</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 文章分类</span></a></div></div></div></div><div class="page type-categories" id="body-wrap"><header class="not-top-img" id="page-header"><nav id="nav"><span id="blog-info"><a class="nav-site-title" href="/"><img class="site-icon" src="/image/logo.png" alt="Logo"><span class="site-name">Serene</span></a></span><div id="menus"><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 主页</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 文章分类</span></a></div></div><div id="toggle-menu"><span class="site-page"><i class="fas fa-bars fa-fw"></i></span></div></div></nav><h1 class="title-seo">文章分类</h1></header><main class="layout" id="content-inner"><div id="page"><div class="page-title">文章分类</div><div class="category-lists"><ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/%E7%88%AC%E8%99%AB/">爬虫</a><span class="category-list-count">8</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E9%80%86%E5%90%91/">逆向</a><span class="category-list-count">11</span></li></ul></div></div><div class="aside-content" id="aside-content"><div class="sticky_layout"><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item"><a class="thumbnail" href="/2024/10/08/youdao-api-2024/" title="2024更新-有道翻译API逆向"><img src="https://is4-ssl.mzstatic.com/image/thumb/Purple111/v4/8c/fc/61/8cfc6181-0548-4ef6-ed7c-35727cf53d27/source/512x512bb.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="2024更新-有道翻译API逆向"/></a><div class="content"><a class="title" href="/2024/10/08/youdao-api-2024/" title="2024更新-有道翻译API逆向">2024更新-有道翻译API逆向</a><time datetime="2024-10-08T05:27:00.000Z" title="发表于 2024-10-08 13:27:00">2024-10-08</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2024/10/07/disable-devtool-reverse/" title="disable-devtool绕过">disable-devtool绕过</a><time datetime="2024-10-07T12:35:10.000Z" title="发表于 2024-10-07 20:35:10">2024-10-07</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2023/01/31/scrapy-try/" title="Scrapy爬虫框架初探">Scrapy爬虫框架初探</a><time datetime="2023-01-31T03:38:20.000Z" title="发表于 2023-01-31 11:38:20">2023-01-31</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2023/01/09/js-rpc-try/" title="JS RPC学习及实战">JS RPC学习及实战</a><time datetime="2023-01-09T10:21:13.000Z" title="发表于 2023-01-09 18:21:13">2023-01-09</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2023/01/07/websocket-try/" title="Websocket在爬虫中的应用">Websocket在爬虫中的应用</a><time datetime="2023-01-07T11:27:30.000Z" title="发表于 2023-01-07 19:27:30">2023-01-07</time></div></div></div></div><div class="card-widget card-categories"><div class="item-headline"> | ||
<i class="fas fa-folder-open"></i> | ||
<span>分类</span> | ||
|
||
</div> | ||
<ul class="card-category-list" id="aside-cat-list"> | ||
<li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E7%88%AC%E8%99%AB/"><span class="card-category-list-name">爬虫</span><span class="card-category-list-count">8</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E9%80%86%E5%90%91/"><span class="card-category-list-name">逆向</span><span class="card-category-list-count">11</span></a></li> | ||
</ul></div><div class="card-widget card-tags"><div class="item-headline"><i class="fas fa-tags"></i><span>标签</span></div><div class="card-tag-cloud"><a href="/tags/javascript/" style="font-size: 1.1em; color: #999">javascript</a> <a href="/tags/JavaScript/" style="font-size: 1.5em; color: #99a9bf">JavaScript</a> <a href="/tags/%E7%88%AC%E8%99%AB/" style="font-size: 1.23em; color: #999ea6">爬虫</a> <a href="/tags/Python/" style="font-size: 1.23em; color: #999ea6">Python</a> <a href="/tags/%E9%80%86%E5%90%91/" style="font-size: 1.37em; color: #99a4b2">逆向</a></div></div><div class="card-widget card-archives"> | ||
<div class="item-headline"> | ||
<i class="fas fa-archive"></i> | ||
<span>归档</span> | ||
|
||
</div> | ||
<ul class="card-archive-list"> | ||
|
||
<li class="card-archive-list-item"> | ||
<a class="card-archive-list-link" href="/archives/2024/10/"> | ||
<span class="card-archive-list-date">十月 2024</span> | ||
<span class="card-archive-list-count">2</span> | ||
</a> | ||
</li> | ||
|
||
<li class="card-archive-list-item"> | ||
<a class="card-archive-list-link" href="/archives/2023/01/"> | ||
<span class="card-archive-list-date">一月 2023</span> | ||
<span class="card-archive-list-count">6</span> | ||
</a> | ||
</li> | ||
|
||
<li class="card-archive-list-item"> | ||
<a class="card-archive-list-link" href="/archives/2022/12/"> | ||
<span class="card-archive-list-date">十二月 2022</span> | ||
<span class="card-archive-list-count">3</span> | ||
</a> | ||
</li> | ||
|
||
<li class="card-archive-list-item"> | ||
<a class="card-archive-list-link" href="/archives/2022/11/"> | ||
<span class="card-archive-list-date">十一月 2022</span> | ||
<span class="card-archive-list-count">6</span> | ||
</a> | ||
</li> | ||
</ul></div><div class="card-widget card-webinfo"><div class="item-headline"><i class="fas fa-chart-line"></i><span>网站信息</span></div><div class="webinfo"><div class="webinfo-item"><div class="item-name">文章数目 :</div><div class="item-count">17</div></div><div class="webinfo-item"><div class="item-name">本站访客数 :</div><div class="item-count" id="busuanzi_value_site_uv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">本站总浏览量 :</div><div class="item-count" id="busuanzi_value_site_pv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">最后更新时间 :</div><div class="item-count" id="last-push-date" data-lastPushDate="2024-10-16T04:23:08.255Z"><i class="fa-solid fa-spinner fa-spin"></i></div></div></div></div></div></div></main><footer id="footer"><div id="footer-wrap"><div class="copyright">©2022 - 2024 By sz134055</div><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="darkmode" type="button" title="日间和夜间模式切换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside-config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button id="go-up" type="button" title="回到顶部"><span class="scroll-percent"></span><i class="fas fa-arrow-up"></i></button></div></div><div><script src="/js/utils.js"></script><script src="/js/main.js"></script><div class="js-pjax"></div><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script></div></body></html> |
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,173 @@ | ||
window.addEventListener('load', () => { | ||
const { algolia } = GLOBAL_CONFIG | ||
const { appId, apiKey, indexName, hitsPerPage = 5, languages } = algolia | ||
|
||
if (!appId || !apiKey || !indexName) { | ||
return console.error('Algolia setting is invalid!') | ||
} | ||
|
||
const $searchMask = document.getElementById('search-mask') | ||
const $searchDialog = document.querySelector('#algolia-search .search-dialog') | ||
|
||
const animateElements = show => { | ||
const action = show ? 'animateIn' : 'animateOut' | ||
const maskAnimation = show ? 'to_show 0.5s' : 'to_hide 0.5s' | ||
const dialogAnimation = show ? 'titleScale 0.5s' : 'search_close .5s' | ||
btf[action]($searchMask, maskAnimation) | ||
btf[action]($searchDialog, dialogAnimation) | ||
} | ||
|
||
const fixSafariHeight = () => { | ||
if (window.innerWidth < 768) { | ||
$searchDialog.style.setProperty('--search-height', `${window.innerHeight}px`) | ||
} | ||
} | ||
|
||
const openSearch = () => { | ||
btf.overflowPaddingR.add() | ||
animateElements(true) | ||
setTimeout(() => { document.querySelector('#algolia-search .ais-SearchBox-input').focus() }, 100) | ||
|
||
const handleEscape = event => { | ||
if (event.code === 'Escape') { | ||
closeSearch() | ||
document.removeEventListener('keydown', handleEscape) | ||
} | ||
} | ||
|
||
document.addEventListener('keydown', handleEscape) | ||
fixSafariHeight() | ||
window.addEventListener('resize', fixSafariHeight) | ||
} | ||
|
||
const closeSearch = () => { | ||
btf.overflowPaddingR.remove() | ||
animateElements(false) | ||
window.removeEventListener('resize', fixSafariHeight) | ||
} | ||
|
||
const searchClickFn = () => { | ||
btf.addEventListenerPjax(document.querySelector('#search-button > .search'), 'click', openSearch) | ||
} | ||
|
||
const searchFnOnce = () => { | ||
$searchMask.addEventListener('click', closeSearch) | ||
document.querySelector('#algolia-search .search-close-button').addEventListener('click', closeSearch) | ||
} | ||
|
||
const cutContent = (content) => { | ||
if (!content) return '' | ||
const firstOccur = content.indexOf('<mark>') | ||
let start = firstOccur - 30 | ||
let end = firstOccur + 120 | ||
let pre = '' | ||
let post = '' | ||
|
||
if (start <= 0) { | ||
start = 0 | ||
end = 140 | ||
} else { | ||
pre = '...' | ||
} | ||
|
||
if (end > content.length) { | ||
end = content.length | ||
} else { | ||
post = '...' | ||
} | ||
|
||
return `${pre}${content.substring(start, end)}${post}` | ||
} | ||
|
||
const disableDiv = [ | ||
document.getElementById('algolia-hits'), | ||
document.getElementById('algolia-pagination'), | ||
document.querySelector('#algolia-info .algolia-stats') | ||
] | ||
|
||
const search = instantsearch({ | ||
indexName, | ||
searchClient: algoliasearch(appId, apiKey), | ||
searchFunction (helper) { | ||
disableDiv.forEach(item => { | ||
item.style.display = helper.state.query ? '' : 'none' | ||
}) | ||
if (helper.state.query) helper.search() | ||
} | ||
}) | ||
|
||
const widgets = [ | ||
instantsearch.widgets.configure({ hitsPerPage }), | ||
instantsearch.widgets.searchBox({ | ||
container: '#algolia-search-input', | ||
showReset: false, | ||
showSubmit: false, | ||
placeholder: languages.input_placeholder, | ||
showLoadingIndicator: true | ||
}), | ||
instantsearch.widgets.hits({ | ||
container: '#algolia-hits', | ||
templates: { | ||
item (data) { | ||
const link = data.permalink || (GLOBAL_CONFIG.root + data.path) | ||
const result = data._highlightResult | ||
const content = result.contentStripTruncate | ||
? cutContent(result.contentStripTruncate.value) | ||
: result.contentStrip | ||
? cutContent(result.contentStrip.value) | ||
: result.content | ||
? cutContent(result.content.value) | ||
: '' | ||
return ` | ||
<a href="${link}" class="algolia-hit-item-link"> | ||
<span class="algolia-hits-item-title">${result.title.value || 'no-title'}</span> | ||
${content ? `<div class="algolia-hit-item-content">${content}</div>` : ''} | ||
</a>` | ||
}, | ||
empty (data) { | ||
return `<div id="algolia-hits-empty">${languages.hits_empty.replace(/\$\{query}/, data.query)}</div>` | ||
} | ||
} | ||
}), | ||
instantsearch.widgets.stats({ | ||
container: '#algolia-info > .algolia-stats', | ||
templates: { | ||
text (data) { | ||
const stats = languages.hits_stats | ||
.replace(/\$\{hits}/, data.nbHits) | ||
.replace(/\$\{time}/, data.processingTimeMS) | ||
return `<hr>${stats}` | ||
} | ||
} | ||
}), | ||
instantsearch.widgets.poweredBy({ | ||
container: '#algolia-info > .algolia-poweredBy' | ||
}), | ||
instantsearch.widgets.pagination({ | ||
container: '#algolia-pagination', | ||
totalPages: 5, | ||
templates: { | ||
first: '<i class="fas fa-angle-double-left"></i>', | ||
last: '<i class="fas fa-angle-double-right"></i>', | ||
previous: '<i class="fas fa-angle-left"></i>', | ||
next: '<i class="fas fa-angle-right"></i>' | ||
} | ||
}) | ||
] | ||
|
||
search.addWidgets(widgets) | ||
search.start() | ||
searchClickFn() | ||
searchFnOnce() | ||
|
||
window.addEventListener('pjax:complete', () => { | ||
if (!btf.isHidden($searchMask)) closeSearch() | ||
searchClickFn() | ||
}) | ||
|
||
if (window.pjax) { | ||
search.on('render', () => { | ||
window.pjax.refresh(document.getElementById('algolia-hits')) | ||
}) | ||
} | ||
}) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,360 @@ | ||
/** | ||
* Refer to hexo-generator-searchdb | ||
* https://github.com/next-theme/hexo-generator-searchdb/blob/main/dist/search.js | ||
* Modified by hexo-theme-butterfly | ||
*/ | ||
|
||
class LocalSearch { | ||
constructor ({ | ||
path = '', | ||
unescape = false, | ||
top_n_per_article = 1 | ||
}) { | ||
this.path = path | ||
this.unescape = unescape | ||
this.top_n_per_article = top_n_per_article | ||
this.isfetched = false | ||
this.datas = null | ||
} | ||
|
||
getIndexByWord (words, text, caseSensitive = false) { | ||
const index = [] | ||
const included = new Set() | ||
|
||
if (!caseSensitive) { | ||
text = text.toLowerCase() | ||
} | ||
words.forEach(word => { | ||
if (this.unescape) { | ||
const div = document.createElement('div') | ||
div.innerText = word | ||
word = div.innerHTML | ||
} | ||
const wordLen = word.length | ||
if (wordLen === 0) return | ||
let startPosition = 0 | ||
let position = -1 | ||
if (!caseSensitive) { | ||
word = word.toLowerCase() | ||
} | ||
while ((position = text.indexOf(word, startPosition)) > -1) { | ||
index.push({ position, word }) | ||
included.add(word) | ||
startPosition = position + wordLen | ||
} | ||
}) | ||
// Sort index by position of keyword | ||
index.sort((left, right) => { | ||
if (left.position !== right.position) { | ||
return left.position - right.position | ||
} | ||
return right.word.length - left.word.length | ||
}) | ||
return [index, included] | ||
} | ||
|
||
// Merge hits into slices | ||
mergeIntoSlice (start, end, index) { | ||
let item = index[0] | ||
let { position, word } = item | ||
const hits = [] | ||
const count = new Set() | ||
while (position + word.length <= end && index.length !== 0) { | ||
count.add(word) | ||
hits.push({ | ||
position, | ||
length: word.length | ||
}) | ||
const wordEnd = position + word.length | ||
|
||
// Move to next position of hit | ||
index.shift() | ||
while (index.length !== 0) { | ||
item = index[0] | ||
position = item.position | ||
word = item.word | ||
if (wordEnd > position) { | ||
index.shift() | ||
} else { | ||
break | ||
} | ||
} | ||
} | ||
return { | ||
hits, | ||
start, | ||
end, | ||
count: count.size | ||
} | ||
} | ||
|
||
// Highlight title and content | ||
highlightKeyword (val, slice) { | ||
let result = '' | ||
let index = slice.start | ||
for (const { position, length } of slice.hits) { | ||
result += val.substring(index, position) | ||
index = position + length | ||
result += `<mark class="search-keyword">${val.substr(position, length)}</mark>` | ||
} | ||
result += val.substring(index, slice.end) | ||
return result | ||
} | ||
|
||
getResultItems (keywords) { | ||
const resultItems = [] | ||
this.datas.forEach(({ title, content, url }) => { | ||
// The number of different keywords included in the article. | ||
const [indexOfTitle, keysOfTitle] = this.getIndexByWord(keywords, title) | ||
const [indexOfContent, keysOfContent] = this.getIndexByWord(keywords, content) | ||
const includedCount = new Set([...keysOfTitle, ...keysOfContent]).size | ||
|
||
// Show search results | ||
const hitCount = indexOfTitle.length + indexOfContent.length | ||
if (hitCount === 0) return | ||
|
||
const slicesOfTitle = [] | ||
if (indexOfTitle.length !== 0) { | ||
slicesOfTitle.push(this.mergeIntoSlice(0, title.length, indexOfTitle)) | ||
} | ||
|
||
let slicesOfContent = [] | ||
while (indexOfContent.length !== 0) { | ||
const item = indexOfContent[0] | ||
const { position } = item | ||
// Cut out 120 characters. The maxlength of .search-input is 80. | ||
const start = Math.max(0, position - 20) | ||
const end = Math.min(content.length, position + 100) | ||
slicesOfContent.push(this.mergeIntoSlice(start, end, indexOfContent)) | ||
} | ||
|
||
// Sort slices in content by included keywords' count and hits' count | ||
slicesOfContent.sort((left, right) => { | ||
if (left.count !== right.count) { | ||
return right.count - left.count | ||
} else if (left.hits.length !== right.hits.length) { | ||
return right.hits.length - left.hits.length | ||
} | ||
return left.start - right.start | ||
}) | ||
|
||
// Select top N slices in content | ||
const upperBound = parseInt(this.top_n_per_article, 10) | ||
if (upperBound >= 0) { | ||
slicesOfContent = slicesOfContent.slice(0, upperBound) | ||
} | ||
|
||
let resultItem = '' | ||
|
||
url = new URL(url, location.origin) | ||
url.searchParams.append('highlight', keywords.join(' ')) | ||
|
||
if (slicesOfTitle.length !== 0) { | ||
resultItem += `<div class="local-search-hit-item"><a href="${url.href}"><span class="search-result-title">${this.highlightKeyword(title, slicesOfTitle[0])}</span>` | ||
} else { | ||
resultItem += `<div class="local-search-hit-item"><a href="${url.href}"><span class="search-result-title">${title}</span>` | ||
} | ||
|
||
slicesOfContent.forEach(slice => { | ||
resultItem += `<p class="search-result">${this.highlightKeyword(content, slice)}...</p></a>` | ||
}) | ||
|
||
resultItem += '</div>' | ||
resultItems.push({ | ||
item: resultItem, | ||
id: resultItems.length, | ||
hitCount, | ||
includedCount | ||
}) | ||
}) | ||
return resultItems | ||
} | ||
|
||
fetchData () { | ||
const isXml = !this.path.endsWith('json') | ||
fetch(this.path) | ||
.then(response => response.text()) | ||
.then(res => { | ||
// Get the contents from search data | ||
this.isfetched = true | ||
this.datas = isXml | ||
? [...new DOMParser().parseFromString(res, 'text/xml').querySelectorAll('entry')].map(element => ({ | ||
title: element.querySelector('title').textContent, | ||
content: element.querySelector('content').textContent, | ||
url: element.querySelector('url').textContent | ||
})) | ||
: JSON.parse(res) | ||
// Only match articles with non-empty titles | ||
this.datas = this.datas.filter(data => data.title).map(data => { | ||
data.title = data.title.trim() | ||
data.content = data.content ? data.content.trim().replace(/<[^>]+>/g, '') : '' | ||
data.url = decodeURIComponent(data.url).replace(/\/{2,}/g, '/') | ||
return data | ||
}) | ||
// Remove loading animation | ||
window.dispatchEvent(new Event('search:loaded')) | ||
}) | ||
} | ||
|
||
// Highlight by wrapping node in mark elements with the given class name | ||
highlightText (node, slice, className) { | ||
const val = node.nodeValue | ||
let index = slice.start | ||
const children = [] | ||
for (const { position, length } of slice.hits) { | ||
const text = document.createTextNode(val.substring(index, position)) | ||
index = position + length | ||
const mark = document.createElement('mark') | ||
mark.className = className | ||
mark.appendChild(document.createTextNode(val.substr(position, length))) | ||
children.push(text, mark) | ||
} | ||
node.nodeValue = val.substring(index, slice.end) | ||
children.forEach(element => { | ||
node.parentNode.insertBefore(element, node) | ||
}) | ||
} | ||
|
||
// Highlight the search words provided in the url in the text | ||
highlightSearchWords (body) { | ||
const params = new URL(location.href).searchParams.get('highlight') | ||
const keywords = params ? params.split(' ') : [] | ||
if (!keywords.length || !body) return | ||
const walk = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, null) | ||
const allNodes = [] | ||
while (walk.nextNode()) { | ||
if (!walk.currentNode.parentNode.matches('button, select, textarea, .mermaid')) allNodes.push(walk.currentNode) | ||
} | ||
allNodes.forEach(node => { | ||
const [indexOfNode] = this.getIndexByWord(keywords, node.nodeValue) | ||
if (!indexOfNode.length) return | ||
const slice = this.mergeIntoSlice(0, node.nodeValue.length, indexOfNode) | ||
this.highlightText(node, slice, 'search-keyword') | ||
}) | ||
} | ||
} | ||
|
||
window.addEventListener('load', () => { | ||
// Search | ||
const { path, top_n_per_article, unescape, languages } = GLOBAL_CONFIG.localSearch | ||
const localSearch = new LocalSearch({ | ||
path, | ||
top_n_per_article, | ||
unescape | ||
}) | ||
|
||
const input = document.querySelector('#local-search-input input') | ||
const statsItem = document.getElementById('local-search-stats-wrap') | ||
const $loadingStatus = document.getElementById('loading-status') | ||
const isXml = !path.endsWith('json') | ||
|
||
const inputEventFunction = () => { | ||
if (!localSearch.isfetched) return | ||
let searchText = input.value.trim().toLowerCase() | ||
isXml && (searchText = searchText.replace(/</g, '<').replace(/>/g, '>')) | ||
if (searchText !== '') $loadingStatus.innerHTML = '<i class="fas fa-spinner fa-pulse"></i>' | ||
const keywords = searchText.split(/[-\s]+/) | ||
const container = document.getElementById('local-search-results') | ||
let resultItems = [] | ||
if (searchText.length > 0) { | ||
// Perform local searching | ||
resultItems = localSearch.getResultItems(keywords) | ||
} | ||
if (keywords.length === 1 && keywords[0] === '') { | ||
container.textContent = '' | ||
statsItem.textContent = '' | ||
} else if (resultItems.length === 0) { | ||
container.textContent = '' | ||
const statsDiv = document.createElement('div') | ||
statsDiv.className = 'search-result-stats' | ||
statsDiv.textContent = languages.hits_empty.replace(/\$\{query}/, searchText) | ||
statsItem.innerHTML = statsDiv.outerHTML | ||
} else { | ||
resultItems.sort((left, right) => { | ||
if (left.includedCount !== right.includedCount) { | ||
return right.includedCount - left.includedCount | ||
} else if (left.hitCount !== right.hitCount) { | ||
return right.hitCount - left.hitCount | ||
} | ||
return right.id - left.id | ||
}) | ||
|
||
const stats = languages.hits_stats.replace(/\$\{hits}/, resultItems.length) | ||
|
||
container.innerHTML = `<div class="search-result-list">${resultItems.map(result => result.item).join('')}</div>` | ||
statsItem.innerHTML = `<hr><div class="search-result-stats">${stats}</div>` | ||
window.pjax && window.pjax.refresh(container) | ||
} | ||
|
||
$loadingStatus.textContent = '' | ||
} | ||
|
||
let loadFlag = false | ||
const $searchMask = document.getElementById('search-mask') | ||
const $searchDialog = document.querySelector('#local-search .search-dialog') | ||
|
||
// fix safari | ||
const fixSafariHeight = () => { | ||
if (window.innerWidth < 768) { | ||
$searchDialog.style.setProperty('--search-height', window.innerHeight + 'px') | ||
} | ||
} | ||
|
||
const openSearch = () => { | ||
btf.overflowPaddingR.add() | ||
btf.animateIn($searchMask, 'to_show 0.5s') | ||
btf.animateIn($searchDialog, 'titleScale 0.5s') | ||
setTimeout(() => { input.focus() }, 300) | ||
if (!loadFlag) { | ||
!localSearch.isfetched && localSearch.fetchData() | ||
input.addEventListener('input', inputEventFunction) | ||
loadFlag = true | ||
} | ||
// shortcut: ESC | ||
document.addEventListener('keydown', function f (event) { | ||
if (event.code === 'Escape') { | ||
closeSearch() | ||
document.removeEventListener('keydown', f) | ||
} | ||
}) | ||
|
||
fixSafariHeight() | ||
window.addEventListener('resize', fixSafariHeight) | ||
} | ||
|
||
const closeSearch = () => { | ||
btf.overflowPaddingR.remove() | ||
btf.animateOut($searchDialog, 'search_close .5s') | ||
btf.animateOut($searchMask, 'to_hide 0.5s') | ||
window.removeEventListener('resize', fixSafariHeight) | ||
} | ||
|
||
const searchClickFn = () => { | ||
btf.addEventListenerPjax(document.querySelector('#search-button > .search'), 'click', openSearch) | ||
} | ||
|
||
const searchFnOnce = () => { | ||
document.querySelector('#local-search .search-close-button').addEventListener('click', closeSearch) | ||
$searchMask.addEventListener('click', closeSearch) | ||
if (GLOBAL_CONFIG.localSearch.preload) { | ||
localSearch.fetchData() | ||
} | ||
localSearch.highlightSearchWords(document.getElementById('article-container')) | ||
} | ||
|
||
window.addEventListener('search:loaded', () => { | ||
const $loadDataItem = document.getElementById('loading-database') | ||
$loadDataItem.nextElementSibling.style.display = 'block' | ||
$loadDataItem.remove() | ||
}) | ||
|
||
searchClickFn() | ||
searchFnOnce() | ||
|
||
// pjax | ||
window.addEventListener('pjax:complete', () => { | ||
!btf.isHidden($searchMask) && closeSearch() | ||
localSearch.highlightSearchWords(document.getElementById('article-container')) | ||
searchClickFn() | ||
}) | ||
}) |
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,297 @@ | ||
(() => { | ||
const btfFn = { | ||
debounce: (func, wait = 0, immediate = false) => { | ||
let timeout | ||
return (...args) => { | ||
const later = () => { | ||
timeout = null | ||
if (!immediate) func(...args) | ||
} | ||
const callNow = immediate && !timeout | ||
clearTimeout(timeout) | ||
timeout = setTimeout(later, wait) | ||
if (callNow) func(...args) | ||
} | ||
}, | ||
|
||
throttle: function (func, wait, options = {}) { | ||
let timeout, context, args | ||
let previous = 0 | ||
|
||
const later = () => { | ||
previous = options.leading === false ? 0 : new Date().getTime() | ||
timeout = null | ||
func.apply(context, args) | ||
if (!timeout) context = args = null | ||
} | ||
|
||
const throttled = (...params) => { | ||
const now = new Date().getTime() | ||
if (!previous && options.leading === false) previous = now | ||
const remaining = wait - (now - previous) | ||
context = this | ||
args = params | ||
if (remaining <= 0 || remaining > wait) { | ||
if (timeout) { | ||
clearTimeout(timeout) | ||
timeout = null | ||
} | ||
previous = now | ||
func.apply(context, args) | ||
if (!timeout) context = args = null | ||
} else if (!timeout && options.trailing !== false) { | ||
timeout = setTimeout(later, remaining) | ||
} | ||
} | ||
|
||
return throttled | ||
}, | ||
|
||
overflowPaddingR: { | ||
add: () => { | ||
const paddingRight = window.innerWidth - document.body.clientWidth | ||
|
||
if (paddingRight > 0) { | ||
document.body.style.paddingRight = `${paddingRight}px` | ||
document.body.style.overflow = 'hidden' | ||
const menuElement = document.querySelector('#page-header.nav-fixed #menus') | ||
if (menuElement) { | ||
menuElement.style.paddingRight = `${paddingRight}px` | ||
} | ||
} | ||
}, | ||
remove: () => { | ||
document.body.style.paddingRight = '' | ||
document.body.style.overflow = '' | ||
const menuElement = document.querySelector('#page-header.nav-fixed #menus') | ||
if (menuElement) { | ||
menuElement.style.paddingRight = '' | ||
} | ||
} | ||
}, | ||
|
||
snackbarShow: (text, showAction = false, duration = 2000) => { | ||
const { position, bgLight, bgDark } = GLOBAL_CONFIG.Snackbar | ||
const bg = document.documentElement.getAttribute('data-theme') === 'light' ? bgLight : bgDark | ||
Snackbar.show({ | ||
text, | ||
backgroundColor: bg, | ||
showAction, | ||
duration, | ||
pos: position, | ||
customClass: 'snackbar-css' | ||
}) | ||
}, | ||
|
||
diffDate: (inputDate, more = false) => { | ||
const dateNow = new Date() | ||
const datePost = new Date(inputDate) | ||
const diffMs = dateNow - datePost | ||
const diffSec = diffMs / 1000 | ||
const diffMin = diffSec / 60 | ||
const diffHour = diffMin / 60 | ||
const diffDay = diffHour / 24 | ||
const diffMonth = diffDay / 30 | ||
const { dateSuffix } = GLOBAL_CONFIG | ||
|
||
if (!more) return Math.floor(diffDay) | ||
|
||
if (diffMonth > 12) return datePost.toISOString().slice(0, 10) | ||
if (diffMonth >= 1) return `${Math.floor(diffMonth)} ${dateSuffix.month}` | ||
if (diffDay >= 1) return `${Math.floor(diffDay)} ${dateSuffix.day}` | ||
if (diffHour >= 1) return `${Math.floor(diffHour)} ${dateSuffix.hour}` | ||
if (diffMin >= 1) return `${Math.floor(diffMin)} ${dateSuffix.min}` | ||
return dateSuffix.just | ||
}, | ||
|
||
loadComment: (dom, callback) => { | ||
if ('IntersectionObserver' in window) { | ||
const observerItem = new IntersectionObserver((entries) => { | ||
if (entries[0].isIntersecting) { | ||
callback() | ||
observerItem.disconnect() | ||
} | ||
}, { threshold: [0] }) | ||
observerItem.observe(dom) | ||
} else { | ||
callback() | ||
} | ||
}, | ||
|
||
scrollToDest: (pos, time = 500) => { | ||
const currentPos = window.scrollY | ||
const isNavFixed = document.getElementById('page-header').classList.contains('fixed') | ||
if (currentPos > pos || isNavFixed) pos = pos - 70 | ||
|
||
if ('scrollBehavior' in document.documentElement.style) { | ||
window.scrollTo({ | ||
top: pos, | ||
behavior: 'smooth' | ||
}) | ||
return | ||
} | ||
|
||
const startTime = performance.now() | ||
const animate = currentTime => { | ||
const timeElapsed = currentTime - startTime | ||
const progress = Math.min(timeElapsed / time, 1) | ||
window.scrollTo(0, currentPos + (pos - currentPos) * progress) | ||
if (progress < 1) { | ||
requestAnimationFrame(animate) | ||
} | ||
} | ||
requestAnimationFrame(animate) | ||
}, | ||
|
||
animateIn: (ele, animation) => { | ||
ele.style.display = 'block' | ||
ele.style.animation = animation | ||
}, | ||
|
||
animateOut: (ele, animation) => { | ||
const handleAnimationEnd = () => { | ||
ele.style.display = '' | ||
ele.style.animation = '' | ||
ele.removeEventListener('animationend', handleAnimationEnd) | ||
} | ||
ele.addEventListener('animationend', handleAnimationEnd) | ||
ele.style.animation = animation | ||
}, | ||
|
||
wrap: (selector, eleType, options) => { | ||
const createEle = document.createElement(eleType) | ||
for (const [key, value] of Object.entries(options)) { | ||
createEle.setAttribute(key, value) | ||
} | ||
selector.parentNode.insertBefore(createEle, selector) | ||
createEle.appendChild(selector) | ||
}, | ||
|
||
isHidden: ele => ele.offsetHeight === 0 && ele.offsetWidth === 0, | ||
|
||
getEleTop: ele => { | ||
let actualTop = ele.offsetTop | ||
let current = ele.offsetParent | ||
|
||
while (current !== null) { | ||
actualTop += current.offsetTop | ||
current = current.offsetParent | ||
} | ||
|
||
return actualTop | ||
}, | ||
|
||
loadLightbox: ele => { | ||
const service = GLOBAL_CONFIG.lightbox | ||
|
||
if (service === 'medium_zoom') { | ||
mediumZoom(ele, { background: 'var(--zoom-bg)' }) | ||
} | ||
|
||
if (service === 'fancybox') { | ||
Array.from(ele).forEach(i => { | ||
if (i.parentNode.tagName !== 'A') { | ||
const dataSrc = i.dataset.lazySrc || i.src | ||
const dataCaption = i.title || i.alt || '' | ||
btf.wrap(i, 'a', { href: dataSrc, 'data-fancybox': 'gallery', 'data-caption': dataCaption, 'data-thumb': dataSrc }) | ||
} | ||
}) | ||
|
||
if (!window.fancyboxRun) { | ||
Fancybox.bind('[data-fancybox]', { | ||
Hash: false, | ||
Thumbs: { | ||
showOnStart: false | ||
}, | ||
Images: { | ||
Panzoom: { | ||
maxScale: 4 | ||
} | ||
}, | ||
Carousel: { | ||
transition: 'slide' | ||
}, | ||
Toolbar: { | ||
display: { | ||
left: ['infobar'], | ||
middle: [ | ||
'zoomIn', | ||
'zoomOut', | ||
'toggle1to1', | ||
'rotateCCW', | ||
'rotateCW', | ||
'flipX', | ||
'flipY' | ||
], | ||
right: ['slideshow', 'thumbs', 'close'] | ||
} | ||
} | ||
}) | ||
window.fancyboxRun = true | ||
} | ||
} | ||
}, | ||
|
||
setLoading: { | ||
add: ele => { | ||
const html = ` | ||
<div class="loading-container"> | ||
<div class="loading-item"> | ||
<div></div><div></div><div></div><div></div><div></div> | ||
</div> | ||
</div> | ||
` | ||
ele.insertAdjacentHTML('afterend', html) | ||
}, | ||
remove: ele => { | ||
ele.nextElementSibling.remove() | ||
} | ||
}, | ||
|
||
updateAnchor: anchor => { | ||
if (anchor !== window.location.hash) { | ||
if (!anchor) anchor = location.pathname | ||
const title = GLOBAL_CONFIG_SITE.title | ||
window.history.replaceState({ | ||
url: location.href, | ||
title | ||
}, title, anchor) | ||
} | ||
}, | ||
|
||
getScrollPercent: (() => { | ||
let docHeight, winHeight, headerHeight, contentMath | ||
|
||
return (currentTop, ele) => { | ||
if (!docHeight || ele.clientHeight !== docHeight) { | ||
docHeight = ele.clientHeight | ||
winHeight = window.innerHeight | ||
headerHeight = ele.offsetTop | ||
contentMath = Math.max(docHeight - winHeight, document.documentElement.scrollHeight - winHeight) | ||
} | ||
|
||
const scrollPercent = (currentTop - headerHeight) / contentMath | ||
return Math.max(0, Math.min(100, Math.round(scrollPercent * 100))) | ||
} | ||
})(), | ||
|
||
addEventListenerPjax: (ele, event, fn, option = false) => { | ||
ele.addEventListener(event, fn, option) | ||
btf.addGlobalFn('pjaxSendOnce', () => { | ||
ele.removeEventListener(event, fn, option) | ||
}) | ||
}, | ||
|
||
removeGlobalFnEvent: (key, parent = window) => { | ||
const globalFn = parent.globalFn || {} | ||
const keyObj = globalFn[key] | ||
if (!keyObj) return | ||
|
||
Object.keys(keyObj).forEach(i => keyObj[i]()) | ||
|
||
delete globalFn[key] | ||
} | ||
} | ||
|
||
window.btf = { ...window.btf, ...btfFn } | ||
})() |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,193 @@ | ||
<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0,viewport-fit=cover"><title>友情链接 | Serene</title><meta name="author" content="sz134055"><meta name="copyright" content="sz134055"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="description" content="个人学习笔记博客"> | ||
<meta property="og:type" content="website"> | ||
<meta property="og:title" content="友情链接"> | ||
<meta property="og:url" content="https://sz134055.github.io/link/index.html"> | ||
<meta property="og:site_name" content="Serene"> | ||
<meta property="og:description" content="个人学习笔记博客"> | ||
<meta property="og:locale" content="zh_CN"> | ||
<meta property="og:image" content="https://sz134055.github.io/image/logo.png"> | ||
<meta property="article:published_time" content="2024-10-08T02:09:00.000Z"> | ||
<meta property="article:modified_time" content="2024-10-08T02:09:44.200Z"> | ||
<meta property="article:author" content="sz134055"> | ||
<meta property="article:tag" content="Web,逆向,爬虫,Python"> | ||
<meta name="twitter:card" content="summary"> | ||
<meta name="twitter:image" content="https://sz134055.github.io/image/logo.png"><link rel="shortcut icon" href="/image/favicon.ico"><link rel="canonical" href="https://sz134055.github.io/link/index.html"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css"><script> | ||
(() => { | ||
|
||
const saveToLocal = { | ||
set: (key, value, ttl) => { | ||
if (!ttl) return | ||
const expiry = Date.now() + ttl * 86400000 | ||
localStorage.setItem(key, JSON.stringify({ value, expiry })) | ||
}, | ||
get: key => { | ||
const itemStr = localStorage.getItem(key) | ||
if (!itemStr) return undefined | ||
const { value, expiry } = JSON.parse(itemStr) | ||
if (Date.now() > expiry) { | ||
localStorage.removeItem(key) | ||
return undefined | ||
} | ||
return value | ||
} | ||
} | ||
|
||
window.btf = { | ||
saveToLocal, | ||
getScript: (url, attr = {}) => new Promise((resolve, reject) => { | ||
const script = document.createElement('script') | ||
script.src = url | ||
script.async = true | ||
Object.entries(attr).forEach(([key, val]) => script.setAttribute(key, val)) | ||
script.onload = script.onreadystatechange = () => { | ||
if (!script.readyState || /loaded|complete/.test(script.readyState)) resolve() | ||
} | ||
script.onerror = reject | ||
document.head.appendChild(script) | ||
}), | ||
getCSS: (url, id) => new Promise((resolve, reject) => { | ||
const link = document.createElement('link') | ||
link.rel = 'stylesheet' | ||
link.href = url | ||
if (id) link.id = id | ||
link.onload = link.onreadystatechange = () => { | ||
if (!link.readyState || /loaded|complete/.test(link.readyState)) resolve() | ||
} | ||
link.onerror = reject | ||
document.head.appendChild(link) | ||
}), | ||
addGlobalFn: (key, fn, name = false, parent = window) => { | ||
if (!false && key.startsWith('pjax')) return | ||
const globalFn = parent.globalFn || {} | ||
globalFn[key] = globalFn[key] || {} | ||
if (name && globalFn[key][name]) return | ||
globalFn[key][name || Object.keys(globalFn[key]).length] = fn | ||
parent.globalFn = globalFn | ||
} | ||
} | ||
|
||
|
||
const activateDarkMode = () => { | ||
document.documentElement.setAttribute('data-theme', 'dark') | ||
if (document.querySelector('meta[name="theme-color"]') !== null) { | ||
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d') | ||
} | ||
} | ||
const activateLightMode = () => { | ||
document.documentElement.setAttribute('data-theme', 'light') | ||
if (document.querySelector('meta[name="theme-color"]') !== null) { | ||
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff') | ||
} | ||
} | ||
|
||
btf.activateDarkMode = activateDarkMode | ||
btf.activateLightMode = activateLightMode | ||
|
||
const theme = saveToLocal.get('theme') | ||
|
||
theme === 'dark' ? activateDarkMode() : theme === 'light' ? activateLightMode() : null | ||
|
||
|
||
const asideStatus = saveToLocal.get('aside-status') | ||
if (asideStatus !== undefined) { | ||
document.documentElement.classList.toggle('hide-aside', asideStatus === 'hide') | ||
} | ||
|
||
|
||
const detectApple = () => { | ||
if (/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)) { | ||
document.documentElement.classList.add('apple') | ||
} | ||
} | ||
detectApple() | ||
|
||
})() | ||
</script><script>const GLOBAL_CONFIG = { | ||
root: '/', | ||
algolia: undefined, | ||
localSearch: undefined, | ||
translate: undefined, | ||
noticeOutdate: {"limitDay":365,"position":"top","messagePrev":"距离文章上传日期已过去","messageNext":"天,其内容可能已过时。"}, | ||
highlight: {"plugin":"highlight.js","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":false,"highlightFullpage":false,"highlightMacStyle":false}, | ||
copy: { | ||
success: '复制成功', | ||
error: '复制失败', | ||
noSupport: '浏览器不支持' | ||
}, | ||
relativeDate: { | ||
homepage: false, | ||
post: false | ||
}, | ||
runtime: '', | ||
dateSuffix: { | ||
just: '刚刚', | ||
min: '分钟前', | ||
hour: '小时前', | ||
day: '天前', | ||
month: '个月前' | ||
}, | ||
copyright: undefined, | ||
lightbox: 'null', | ||
Snackbar: undefined, | ||
infinitegrid: { | ||
js: 'https://cdn.jsdelivr.net/npm/@egjs/infinitegrid/dist/infinitegrid.min.js', | ||
buttonText: '加载更多' | ||
}, | ||
isPhotoFigcaption: false, | ||
islazyload: false, | ||
isAnchor: false, | ||
percent: { | ||
toc: true, | ||
rightside: false, | ||
}, | ||
autoDarkmode: false | ||
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = { | ||
title: '友情链接', | ||
isPost: false, | ||
isHome: false, | ||
isHighlightShrink: false, | ||
isToc: false, | ||
postUpdate: '2024-10-08 10:09:44' | ||
}</script><meta name="generator" content="Hexo 7.3.0"></head><body><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img is-center"><img src="/image/logo.png" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="site-data is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">17</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">5</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">2</div></a></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 主页</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 文章分类</span></a></div></div></div></div><div class="page type-link" id="body-wrap"><header class="not-top-img" id="page-header"><nav id="nav"><span id="blog-info"><a class="nav-site-title" href="/"><img class="site-icon" src="/image/logo.png" alt="Logo"><span class="site-name">Serene</span></a></span><div id="menus"><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 主页</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 文章分类</span></a></div></div><div id="toggle-menu"><span class="site-page"><i class="fas fa-bars fa-fw"></i></span></div></div></nav><h1 class="title-seo">友情链接</h1></header><main class="layout" id="content-inner"><div id="page"><div class="page-title">友情链接</div><div id="article-container"><div class="flink"></div></div></div><div class="aside-content" id="aside-content"><div class="sticky_layout"><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item"><a class="thumbnail" href="/2024/10/08/youdao-api-2024/" title="2024更新-有道翻译API逆向"><img src="https://is4-ssl.mzstatic.com/image/thumb/Purple111/v4/8c/fc/61/8cfc6181-0548-4ef6-ed7c-35727cf53d27/source/512x512bb.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="2024更新-有道翻译API逆向"/></a><div class="content"><a class="title" href="/2024/10/08/youdao-api-2024/" title="2024更新-有道翻译API逆向">2024更新-有道翻译API逆向</a><time datetime="2024-10-08T05:27:00.000Z" title="发表于 2024-10-08 13:27:00">2024-10-08</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2024/10/07/disable-devtool-reverse/" title="disable-devtool绕过">disable-devtool绕过</a><time datetime="2024-10-07T12:35:10.000Z" title="发表于 2024-10-07 20:35:10">2024-10-07</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2023/01/31/scrapy-try/" title="Scrapy爬虫框架初探">Scrapy爬虫框架初探</a><time datetime="2023-01-31T03:38:20.000Z" title="发表于 2023-01-31 11:38:20">2023-01-31</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2023/01/09/js-rpc-try/" title="JS RPC学习及实战">JS RPC学习及实战</a><time datetime="2023-01-09T10:21:13.000Z" title="发表于 2023-01-09 18:21:13">2023-01-09</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2023/01/07/websocket-try/" title="Websocket在爬虫中的应用">Websocket在爬虫中的应用</a><time datetime="2023-01-07T11:27:30.000Z" title="发表于 2023-01-07 19:27:30">2023-01-07</time></div></div></div></div><div class="card-widget card-categories"><div class="item-headline"> | ||
<i class="fas fa-folder-open"></i> | ||
<span>分类</span> | ||
|
||
</div> | ||
<ul class="card-category-list" id="aside-cat-list"> | ||
<li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E7%88%AC%E8%99%AB/"><span class="card-category-list-name">爬虫</span><span class="card-category-list-count">8</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E9%80%86%E5%90%91/"><span class="card-category-list-name">逆向</span><span class="card-category-list-count">11</span></a></li> | ||
</ul></div><div class="card-widget card-tags"><div class="item-headline"><i class="fas fa-tags"></i><span>标签</span></div><div class="card-tag-cloud"><a href="/tags/javascript/" style="font-size: 1.1em; color: #999">javascript</a> <a href="/tags/JavaScript/" style="font-size: 1.5em; color: #99a9bf">JavaScript</a> <a href="/tags/%E7%88%AC%E8%99%AB/" style="font-size: 1.23em; color: #999ea6">爬虫</a> <a href="/tags/Python/" style="font-size: 1.23em; color: #999ea6">Python</a> <a href="/tags/%E9%80%86%E5%90%91/" style="font-size: 1.37em; color: #99a4b2">逆向</a></div></div><div class="card-widget card-archives"> | ||
<div class="item-headline"> | ||
<i class="fas fa-archive"></i> | ||
<span>归档</span> | ||
|
||
</div> | ||
<ul class="card-archive-list"> | ||
|
||
<li class="card-archive-list-item"> | ||
<a class="card-archive-list-link" href="/archives/2024/10/"> | ||
<span class="card-archive-list-date">十月 2024</span> | ||
<span class="card-archive-list-count">2</span> | ||
</a> | ||
</li> | ||
|
||
<li class="card-archive-list-item"> | ||
<a class="card-archive-list-link" href="/archives/2023/01/"> | ||
<span class="card-archive-list-date">一月 2023</span> | ||
<span class="card-archive-list-count">6</span> | ||
</a> | ||
</li> | ||
|
||
<li class="card-archive-list-item"> | ||
<a class="card-archive-list-link" href="/archives/2022/12/"> | ||
<span class="card-archive-list-date">十二月 2022</span> | ||
<span class="card-archive-list-count">3</span> | ||
</a> | ||
</li> | ||
|
||
<li class="card-archive-list-item"> | ||
<a class="card-archive-list-link" href="/archives/2022/11/"> | ||
<span class="card-archive-list-date">十一月 2022</span> | ||
<span class="card-archive-list-count">6</span> | ||
</a> | ||
</li> | ||
</ul></div><div class="card-widget card-webinfo"><div class="item-headline"><i class="fas fa-chart-line"></i><span>网站信息</span></div><div class="webinfo"><div class="webinfo-item"><div class="item-name">文章数目 :</div><div class="item-count">17</div></div><div class="webinfo-item"><div class="item-name">本站访客数 :</div><div class="item-count" id="busuanzi_value_site_uv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">本站总浏览量 :</div><div class="item-count" id="busuanzi_value_site_pv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">最后更新时间 :</div><div class="item-count" id="last-push-date" data-lastPushDate="2024-10-16T04:23:08.255Z"><i class="fa-solid fa-spinner fa-spin"></i></div></div></div></div></div></div></main><footer id="footer"><div id="footer-wrap"><div class="copyright">©2022 - 2024 By sz134055</div><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="darkmode" type="button" title="日间和夜间模式切换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside-config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button id="go-up" type="button" title="回到顶部"><span class="scroll-percent"></span><i class="fas fa-arrow-up"></i></button></div></div><div><script src="/js/utils.js"></script><script src="/js/main.js"></script><div class="js-pjax"></div><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script></div></body></html> |
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,191 @@ | ||
<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0,viewport-fit=cover"><title>标签: javascript | Serene</title><meta name="author" content="sz134055"><meta name="copyright" content="sz134055"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="description" content="个人学习笔记博客"> | ||
<meta property="og:type" content="website"> | ||
<meta property="og:title" content="Serene"> | ||
<meta property="og:url" content="https://sz134055.github.io/tags/javascript/index.html"> | ||
<meta property="og:site_name" content="Serene"> | ||
<meta property="og:description" content="个人学习笔记博客"> | ||
<meta property="og:locale" content="zh_CN"> | ||
<meta property="og:image" content="https://sz134055.github.io/image/logo.png"> | ||
<meta property="article:author" content="sz134055"> | ||
<meta property="article:tag" content="Web,逆向,爬虫,Python"> | ||
<meta name="twitter:card" content="summary"> | ||
<meta name="twitter:image" content="https://sz134055.github.io/image/logo.png"><link rel="shortcut icon" href="/image/favicon.ico"><link rel="canonical" href="https://sz134055.github.io/tags/javascript/index.html"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css"><script> | ||
(() => { | ||
|
||
const saveToLocal = { | ||
set: (key, value, ttl) => { | ||
if (!ttl) return | ||
const expiry = Date.now() + ttl * 86400000 | ||
localStorage.setItem(key, JSON.stringify({ value, expiry })) | ||
}, | ||
get: key => { | ||
const itemStr = localStorage.getItem(key) | ||
if (!itemStr) return undefined | ||
const { value, expiry } = JSON.parse(itemStr) | ||
if (Date.now() > expiry) { | ||
localStorage.removeItem(key) | ||
return undefined | ||
} | ||
return value | ||
} | ||
} | ||
|
||
window.btf = { | ||
saveToLocal, | ||
getScript: (url, attr = {}) => new Promise((resolve, reject) => { | ||
const script = document.createElement('script') | ||
script.src = url | ||
script.async = true | ||
Object.entries(attr).forEach(([key, val]) => script.setAttribute(key, val)) | ||
script.onload = script.onreadystatechange = () => { | ||
if (!script.readyState || /loaded|complete/.test(script.readyState)) resolve() | ||
} | ||
script.onerror = reject | ||
document.head.appendChild(script) | ||
}), | ||
getCSS: (url, id) => new Promise((resolve, reject) => { | ||
const link = document.createElement('link') | ||
link.rel = 'stylesheet' | ||
link.href = url | ||
if (id) link.id = id | ||
link.onload = link.onreadystatechange = () => { | ||
if (!link.readyState || /loaded|complete/.test(link.readyState)) resolve() | ||
} | ||
link.onerror = reject | ||
document.head.appendChild(link) | ||
}), | ||
addGlobalFn: (key, fn, name = false, parent = window) => { | ||
if (!false && key.startsWith('pjax')) return | ||
const globalFn = parent.globalFn || {} | ||
globalFn[key] = globalFn[key] || {} | ||
if (name && globalFn[key][name]) return | ||
globalFn[key][name || Object.keys(globalFn[key]).length] = fn | ||
parent.globalFn = globalFn | ||
} | ||
} | ||
|
||
|
||
const activateDarkMode = () => { | ||
document.documentElement.setAttribute('data-theme', 'dark') | ||
if (document.querySelector('meta[name="theme-color"]') !== null) { | ||
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d') | ||
} | ||
} | ||
const activateLightMode = () => { | ||
document.documentElement.setAttribute('data-theme', 'light') | ||
if (document.querySelector('meta[name="theme-color"]') !== null) { | ||
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff') | ||
} | ||
} | ||
|
||
btf.activateDarkMode = activateDarkMode | ||
btf.activateLightMode = activateLightMode | ||
|
||
const theme = saveToLocal.get('theme') | ||
|
||
theme === 'dark' ? activateDarkMode() : theme === 'light' ? activateLightMode() : null | ||
|
||
|
||
const asideStatus = saveToLocal.get('aside-status') | ||
if (asideStatus !== undefined) { | ||
document.documentElement.classList.toggle('hide-aside', asideStatus === 'hide') | ||
} | ||
|
||
|
||
const detectApple = () => { | ||
if (/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)) { | ||
document.documentElement.classList.add('apple') | ||
} | ||
} | ||
detectApple() | ||
|
||
})() | ||
</script><script>const GLOBAL_CONFIG = { | ||
root: '/', | ||
algolia: undefined, | ||
localSearch: undefined, | ||
translate: undefined, | ||
noticeOutdate: {"limitDay":365,"position":"top","messagePrev":"距离文章上传日期已过去","messageNext":"天,其内容可能已过时。"}, | ||
highlight: {"plugin":"highlight.js","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":false,"highlightFullpage":false,"highlightMacStyle":false}, | ||
copy: { | ||
success: '复制成功', | ||
error: '复制失败', | ||
noSupport: '浏览器不支持' | ||
}, | ||
relativeDate: { | ||
homepage: false, | ||
post: false | ||
}, | ||
runtime: '', | ||
dateSuffix: { | ||
just: '刚刚', | ||
min: '分钟前', | ||
hour: '小时前', | ||
day: '天前', | ||
month: '个月前' | ||
}, | ||
copyright: undefined, | ||
lightbox: 'null', | ||
Snackbar: undefined, | ||
infinitegrid: { | ||
js: 'https://cdn.jsdelivr.net/npm/@egjs/infinitegrid/dist/infinitegrid.min.js', | ||
buttonText: '加载更多' | ||
}, | ||
isPhotoFigcaption: false, | ||
islazyload: false, | ||
isAnchor: false, | ||
percent: { | ||
toc: true, | ||
rightside: false, | ||
}, | ||
autoDarkmode: false | ||
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = { | ||
title: '标签: javascript', | ||
isPost: false, | ||
isHome: false, | ||
isHighlightShrink: false, | ||
isToc: false, | ||
postUpdate: '2024-10-16 12:23:08' | ||
}</script><meta name="generator" content="Hexo 7.3.0"></head><body><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img is-center"><img src="/image/logo.png" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="site-data is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">17</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">5</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">2</div></a></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 主页</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 文章分类</span></a></div></div></div></div><div class="page" id="body-wrap"><header class="not-top-img" id="page-header"><nav id="nav"><span id="blog-info"><a class="nav-site-title" href="/"><img class="site-icon" src="/image/logo.png" alt="Logo"><span class="site-name">Serene</span></a></span><div id="menus"><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 主页</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 文章分类</span></a></div></div><div id="toggle-menu"><span class="site-page"><i class="fas fa-bars fa-fw"></i></span></div></div></nav><h1 class="title-seo">javascript</h1></header><main class="layout" id="content-inner"><div id="tag"><div class="article-sort-title">标签 - javascript</div><div class="article-sort"><div class="article-sort-item year">2023</div><div class="article-sort-item no-article-cover"><div class="article-sort-item-info"><div class="article-sort-item-time"><i class="far fa-calendar-alt"></i><time class="post-meta-date-created" datetime="2023-01-09T10:21:13.000Z" title="发表于 2023-01-09 18:21:13">2023-01-09</time></div><a class="article-sort-item-title" href="/2023/01/09/js-rpc-try/" title="JS RPC学习及实战">JS RPC学习及实战</a></div></div></div><nav id="pagination"><div class="pagination"><span class="page-number current">1</span></div></nav></div><div class="aside-content" id="aside-content"><div class="sticky_layout"><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item"><a class="thumbnail" href="/2024/10/08/youdao-api-2024/" title="2024更新-有道翻译API逆向"><img src="https://is4-ssl.mzstatic.com/image/thumb/Purple111/v4/8c/fc/61/8cfc6181-0548-4ef6-ed7c-35727cf53d27/source/512x512bb.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="2024更新-有道翻译API逆向"/></a><div class="content"><a class="title" href="/2024/10/08/youdao-api-2024/" title="2024更新-有道翻译API逆向">2024更新-有道翻译API逆向</a><time datetime="2024-10-08T05:27:00.000Z" title="发表于 2024-10-08 13:27:00">2024-10-08</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2024/10/07/disable-devtool-reverse/" title="disable-devtool绕过">disable-devtool绕过</a><time datetime="2024-10-07T12:35:10.000Z" title="发表于 2024-10-07 20:35:10">2024-10-07</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2023/01/31/scrapy-try/" title="Scrapy爬虫框架初探">Scrapy爬虫框架初探</a><time datetime="2023-01-31T03:38:20.000Z" title="发表于 2023-01-31 11:38:20">2023-01-31</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2023/01/09/js-rpc-try/" title="JS RPC学习及实战">JS RPC学习及实战</a><time datetime="2023-01-09T10:21:13.000Z" title="发表于 2023-01-09 18:21:13">2023-01-09</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2023/01/07/websocket-try/" title="Websocket在爬虫中的应用">Websocket在爬虫中的应用</a><time datetime="2023-01-07T11:27:30.000Z" title="发表于 2023-01-07 19:27:30">2023-01-07</time></div></div></div></div><div class="card-widget card-categories"><div class="item-headline"> | ||
<i class="fas fa-folder-open"></i> | ||
<span>分类</span> | ||
|
||
</div> | ||
<ul class="card-category-list" id="aside-cat-list"> | ||
<li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E7%88%AC%E8%99%AB/"><span class="card-category-list-name">爬虫</span><span class="card-category-list-count">8</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E9%80%86%E5%90%91/"><span class="card-category-list-name">逆向</span><span class="card-category-list-count">11</span></a></li> | ||
</ul></div><div class="card-widget card-tags"><div class="item-headline"><i class="fas fa-tags"></i><span>标签</span></div><div class="card-tag-cloud"><a href="/tags/javascript/" style="font-size: 1.1em; color: #999">javascript</a> <a href="/tags/JavaScript/" style="font-size: 1.5em; color: #99a9bf">JavaScript</a> <a href="/tags/%E7%88%AC%E8%99%AB/" style="font-size: 1.23em; color: #999ea6">爬虫</a> <a href="/tags/Python/" style="font-size: 1.23em; color: #999ea6">Python</a> <a href="/tags/%E9%80%86%E5%90%91/" style="font-size: 1.37em; color: #99a4b2">逆向</a></div></div><div class="card-widget card-archives"> | ||
<div class="item-headline"> | ||
<i class="fas fa-archive"></i> | ||
<span>归档</span> | ||
|
||
</div> | ||
<ul class="card-archive-list"> | ||
|
||
<li class="card-archive-list-item"> | ||
<a class="card-archive-list-link" href="/archives/2024/10/"> | ||
<span class="card-archive-list-date">十月 2024</span> | ||
<span class="card-archive-list-count">2</span> | ||
</a> | ||
</li> | ||
|
||
<li class="card-archive-list-item"> | ||
<a class="card-archive-list-link" href="/archives/2023/01/"> | ||
<span class="card-archive-list-date">一月 2023</span> | ||
<span class="card-archive-list-count">6</span> | ||
</a> | ||
</li> | ||
|
||
<li class="card-archive-list-item"> | ||
<a class="card-archive-list-link" href="/archives/2022/12/"> | ||
<span class="card-archive-list-date">十二月 2022</span> | ||
<span class="card-archive-list-count">3</span> | ||
</a> | ||
</li> | ||
|
||
<li class="card-archive-list-item"> | ||
<a class="card-archive-list-link" href="/archives/2022/11/"> | ||
<span class="card-archive-list-date">十一月 2022</span> | ||
<span class="card-archive-list-count">6</span> | ||
</a> | ||
</li> | ||
</ul></div><div class="card-widget card-webinfo"><div class="item-headline"><i class="fas fa-chart-line"></i><span>网站信息</span></div><div class="webinfo"><div class="webinfo-item"><div class="item-name">文章数目 :</div><div class="item-count">17</div></div><div class="webinfo-item"><div class="item-name">本站访客数 :</div><div class="item-count" id="busuanzi_value_site_uv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">本站总浏览量 :</div><div class="item-count" id="busuanzi_value_site_pv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">最后更新时间 :</div><div class="item-count" id="last-push-date" data-lastPushDate="2024-10-16T04:23:08.255Z"><i class="fa-solid fa-spinner fa-spin"></i></div></div></div></div></div></div></main><footer id="footer"><div id="footer-wrap"><div class="copyright">©2022 - 2024 By sz134055</div><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="darkmode" type="button" title="日间和夜间模式切换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside-config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button id="go-up" type="button" title="回到顶部"><span class="scroll-percent"></span><i class="fas fa-arrow-up"></i></button></div></div><div><script src="/js/utils.js"></script><script src="/js/main.js"></script><div class="js-pjax"></div><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script></div></body></html> |
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,193 @@ | ||
<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0,viewport-fit=cover"><title>标签 | Serene</title><meta name="author" content="sz134055"><meta name="copyright" content="sz134055"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="description" content="个人学习笔记博客"> | ||
<meta property="og:type" content="website"> | ||
<meta property="og:title" content="标签"> | ||
<meta property="og:url" content="https://sz134055.github.io/tags/index.html"> | ||
<meta property="og:site_name" content="Serene"> | ||
<meta property="og:description" content="个人学习笔记博客"> | ||
<meta property="og:locale" content="zh_CN"> | ||
<meta property="og:image" content="https://sz134055.github.io/image/logo.png"> | ||
<meta property="article:published_time" content="2024-10-07T07:01:08.000Z"> | ||
<meta property="article:modified_time" content="2024-10-08T02:08:38.823Z"> | ||
<meta property="article:author" content="sz134055"> | ||
<meta property="article:tag" content="Web,逆向,爬虫,Python"> | ||
<meta name="twitter:card" content="summary"> | ||
<meta name="twitter:image" content="https://sz134055.github.io/image/logo.png"><link rel="shortcut icon" href="/image/favicon.ico"><link rel="canonical" href="https://sz134055.github.io/tags/index.html"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css"><script> | ||
(() => { | ||
|
||
const saveToLocal = { | ||
set: (key, value, ttl) => { | ||
if (!ttl) return | ||
const expiry = Date.now() + ttl * 86400000 | ||
localStorage.setItem(key, JSON.stringify({ value, expiry })) | ||
}, | ||
get: key => { | ||
const itemStr = localStorage.getItem(key) | ||
if (!itemStr) return undefined | ||
const { value, expiry } = JSON.parse(itemStr) | ||
if (Date.now() > expiry) { | ||
localStorage.removeItem(key) | ||
return undefined | ||
} | ||
return value | ||
} | ||
} | ||
|
||
window.btf = { | ||
saveToLocal, | ||
getScript: (url, attr = {}) => new Promise((resolve, reject) => { | ||
const script = document.createElement('script') | ||
script.src = url | ||
script.async = true | ||
Object.entries(attr).forEach(([key, val]) => script.setAttribute(key, val)) | ||
script.onload = script.onreadystatechange = () => { | ||
if (!script.readyState || /loaded|complete/.test(script.readyState)) resolve() | ||
} | ||
script.onerror = reject | ||
document.head.appendChild(script) | ||
}), | ||
getCSS: (url, id) => new Promise((resolve, reject) => { | ||
const link = document.createElement('link') | ||
link.rel = 'stylesheet' | ||
link.href = url | ||
if (id) link.id = id | ||
link.onload = link.onreadystatechange = () => { | ||
if (!link.readyState || /loaded|complete/.test(link.readyState)) resolve() | ||
} | ||
link.onerror = reject | ||
document.head.appendChild(link) | ||
}), | ||
addGlobalFn: (key, fn, name = false, parent = window) => { | ||
if (!false && key.startsWith('pjax')) return | ||
const globalFn = parent.globalFn || {} | ||
globalFn[key] = globalFn[key] || {} | ||
if (name && globalFn[key][name]) return | ||
globalFn[key][name || Object.keys(globalFn[key]).length] = fn | ||
parent.globalFn = globalFn | ||
} | ||
} | ||
|
||
|
||
const activateDarkMode = () => { | ||
document.documentElement.setAttribute('data-theme', 'dark') | ||
if (document.querySelector('meta[name="theme-color"]') !== null) { | ||
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d') | ||
} | ||
} | ||
const activateLightMode = () => { | ||
document.documentElement.setAttribute('data-theme', 'light') | ||
if (document.querySelector('meta[name="theme-color"]') !== null) { | ||
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff') | ||
} | ||
} | ||
|
||
btf.activateDarkMode = activateDarkMode | ||
btf.activateLightMode = activateLightMode | ||
|
||
const theme = saveToLocal.get('theme') | ||
|
||
theme === 'dark' ? activateDarkMode() : theme === 'light' ? activateLightMode() : null | ||
|
||
|
||
const asideStatus = saveToLocal.get('aside-status') | ||
if (asideStatus !== undefined) { | ||
document.documentElement.classList.toggle('hide-aside', asideStatus === 'hide') | ||
} | ||
|
||
|
||
const detectApple = () => { | ||
if (/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)) { | ||
document.documentElement.classList.add('apple') | ||
} | ||
} | ||
detectApple() | ||
|
||
})() | ||
</script><script>const GLOBAL_CONFIG = { | ||
root: '/', | ||
algolia: undefined, | ||
localSearch: undefined, | ||
translate: undefined, | ||
noticeOutdate: {"limitDay":365,"position":"top","messagePrev":"距离文章上传日期已过去","messageNext":"天,其内容可能已过时。"}, | ||
highlight: {"plugin":"highlight.js","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":false,"highlightFullpage":false,"highlightMacStyle":false}, | ||
copy: { | ||
success: '复制成功', | ||
error: '复制失败', | ||
noSupport: '浏览器不支持' | ||
}, | ||
relativeDate: { | ||
homepage: false, | ||
post: false | ||
}, | ||
runtime: '', | ||
dateSuffix: { | ||
just: '刚刚', | ||
min: '分钟前', | ||
hour: '小时前', | ||
day: '天前', | ||
month: '个月前' | ||
}, | ||
copyright: undefined, | ||
lightbox: 'null', | ||
Snackbar: undefined, | ||
infinitegrid: { | ||
js: 'https://cdn.jsdelivr.net/npm/@egjs/infinitegrid/dist/infinitegrid.min.js', | ||
buttonText: '加载更多' | ||
}, | ||
isPhotoFigcaption: false, | ||
islazyload: false, | ||
isAnchor: false, | ||
percent: { | ||
toc: true, | ||
rightside: false, | ||
}, | ||
autoDarkmode: false | ||
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = { | ||
title: '标签', | ||
isPost: false, | ||
isHome: false, | ||
isHighlightShrink: false, | ||
isToc: false, | ||
postUpdate: '2024-10-08 10:08:38' | ||
}</script><meta name="generator" content="Hexo 7.3.0"></head><body><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img is-center"><img src="/image/logo.png" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="site-data is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">17</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">5</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">2</div></a></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 主页</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 文章分类</span></a></div></div></div></div><div class="page" id="body-wrap"><header class="not-top-img" id="page-header"><nav id="nav"><span id="blog-info"><a class="nav-site-title" href="/"><img class="site-icon" src="/image/logo.png" alt="Logo"><span class="site-name">Serene</span></a></span><div id="menus"><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 主页</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 文章分类</span></a></div></div><div id="toggle-menu"><span class="site-page"><i class="fas fa-bars fa-fw"></i></span></div></div></nav><h1 class="title-seo">标签</h1></header><main class="layout" id="content-inner"><div id="page"><div class="page-title">标签</div><div id="article-container"></div></div><div class="aside-content" id="aside-content"><div class="sticky_layout"><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item"><a class="thumbnail" href="/2024/10/08/youdao-api-2024/" title="2024更新-有道翻译API逆向"><img src="https://is4-ssl.mzstatic.com/image/thumb/Purple111/v4/8c/fc/61/8cfc6181-0548-4ef6-ed7c-35727cf53d27/source/512x512bb.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="2024更新-有道翻译API逆向"/></a><div class="content"><a class="title" href="/2024/10/08/youdao-api-2024/" title="2024更新-有道翻译API逆向">2024更新-有道翻译API逆向</a><time datetime="2024-10-08T05:27:00.000Z" title="发表于 2024-10-08 13:27:00">2024-10-08</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2024/10/07/disable-devtool-reverse/" title="disable-devtool绕过">disable-devtool绕过</a><time datetime="2024-10-07T12:35:10.000Z" title="发表于 2024-10-07 20:35:10">2024-10-07</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2023/01/31/scrapy-try/" title="Scrapy爬虫框架初探">Scrapy爬虫框架初探</a><time datetime="2023-01-31T03:38:20.000Z" title="发表于 2023-01-31 11:38:20">2023-01-31</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2023/01/09/js-rpc-try/" title="JS RPC学习及实战">JS RPC学习及实战</a><time datetime="2023-01-09T10:21:13.000Z" title="发表于 2023-01-09 18:21:13">2023-01-09</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2023/01/07/websocket-try/" title="Websocket在爬虫中的应用">Websocket在爬虫中的应用</a><time datetime="2023-01-07T11:27:30.000Z" title="发表于 2023-01-07 19:27:30">2023-01-07</time></div></div></div></div><div class="card-widget card-categories"><div class="item-headline"> | ||
<i class="fas fa-folder-open"></i> | ||
<span>分类</span> | ||
|
||
</div> | ||
<ul class="card-category-list" id="aside-cat-list"> | ||
<li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E7%88%AC%E8%99%AB/"><span class="card-category-list-name">爬虫</span><span class="card-category-list-count">8</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E9%80%86%E5%90%91/"><span class="card-category-list-name">逆向</span><span class="card-category-list-count">11</span></a></li> | ||
</ul></div><div class="card-widget card-tags"><div class="item-headline"><i class="fas fa-tags"></i><span>标签</span></div><div class="card-tag-cloud"><a href="/tags/javascript/" style="font-size: 1.1em; color: #999">javascript</a> <a href="/tags/JavaScript/" style="font-size: 1.5em; color: #99a9bf">JavaScript</a> <a href="/tags/%E7%88%AC%E8%99%AB/" style="font-size: 1.23em; color: #999ea6">爬虫</a> <a href="/tags/Python/" style="font-size: 1.23em; color: #999ea6">Python</a> <a href="/tags/%E9%80%86%E5%90%91/" style="font-size: 1.37em; color: #99a4b2">逆向</a></div></div><div class="card-widget card-archives"> | ||
<div class="item-headline"> | ||
<i class="fas fa-archive"></i> | ||
<span>归档</span> | ||
|
||
</div> | ||
<ul class="card-archive-list"> | ||
|
||
<li class="card-archive-list-item"> | ||
<a class="card-archive-list-link" href="/archives/2024/10/"> | ||
<span class="card-archive-list-date">十月 2024</span> | ||
<span class="card-archive-list-count">2</span> | ||
</a> | ||
</li> | ||
|
||
<li class="card-archive-list-item"> | ||
<a class="card-archive-list-link" href="/archives/2023/01/"> | ||
<span class="card-archive-list-date">一月 2023</span> | ||
<span class="card-archive-list-count">6</span> | ||
</a> | ||
</li> | ||
|
||
<li class="card-archive-list-item"> | ||
<a class="card-archive-list-link" href="/archives/2022/12/"> | ||
<span class="card-archive-list-date">十二月 2022</span> | ||
<span class="card-archive-list-count">3</span> | ||
</a> | ||
</li> | ||
|
||
<li class="card-archive-list-item"> | ||
<a class="card-archive-list-link" href="/archives/2022/11/"> | ||
<span class="card-archive-list-date">十一月 2022</span> | ||
<span class="card-archive-list-count">6</span> | ||
</a> | ||
</li> | ||
</ul></div><div class="card-widget card-webinfo"><div class="item-headline"><i class="fas fa-chart-line"></i><span>网站信息</span></div><div class="webinfo"><div class="webinfo-item"><div class="item-name">文章数目 :</div><div class="item-count">17</div></div><div class="webinfo-item"><div class="item-name">本站访客数 :</div><div class="item-count" id="busuanzi_value_site_uv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">本站总浏览量 :</div><div class="item-count" id="busuanzi_value_site_pv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">最后更新时间 :</div><div class="item-count" id="last-push-date" data-lastPushDate="2024-10-16T04:23:08.255Z"><i class="fa-solid fa-spinner fa-spin"></i></div></div></div></div></div></div></main><footer id="footer"><div id="footer-wrap"><div class="copyright">©2022 - 2024 By sz134055</div><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="darkmode" type="button" title="日间和夜间模式切换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside-config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button id="go-up" type="button" title="回到顶部"><span class="scroll-percent"></span><i class="fas fa-arrow-up"></i></button></div></div><div><script src="/js/utils.js"></script><script src="/js/main.js"></script><div class="js-pjax"></div><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script></div></body></html> |
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.