<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>邢平cn&#39;s blog</title>
  
  
  <link href="https://xingpingcn.top/atom.xml" rel="self"/>
  
  <link href="https://xingpingcn.top/"/>
  <updated>2023-10-31T13:28:16.148Z</updated>
  <id>https://xingpingcn.top/</id>
  
  <author>
    <name>邢平cn</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>免费通过NS1利用监控宝平台实现实时基于不同运营商的故障转移</title>
    <link href="https://xingpingcn.top/%E5%85%8D%E8%B4%B9%E9%80%9A%E8%BF%87NS1%E5%88%A9%E7%94%A8%E7%9B%91%E6%8E%A7%E5%AE%9D%E5%B9%B3%E5%8F%B0%E5%AE%9E%E7%8E%B0%E5%AE%9E%E6%97%B6%E5%9F%BA%E4%BA%8E%E4%B8%8D%E5%90%8C%E8%BF%90%E8%90%A5%E5%95%86%E7%9A%84%E6%95%85%E9%9A%9C%E8%BD%AC%E7%A7%BB.html"/>
    <id>https://xingpingcn.top/%E5%85%8D%E8%B4%B9%E9%80%9A%E8%BF%87NS1%E5%88%A9%E7%94%A8%E7%9B%91%E6%8E%A7%E5%AE%9D%E5%B9%B3%E5%8F%B0%E5%AE%9E%E7%8E%B0%E5%AE%9E%E6%97%B6%E5%9F%BA%E4%BA%8E%E4%B8%8D%E5%90%8C%E8%BF%90%E8%90%A5%E5%95%86%E7%9A%84%E6%95%85%E9%9A%9C%E8%BD%AC%E7%A7%BB.html</id>
    <published>2023-10-27T13:14:57.449Z</published>
    <updated>2023-10-31T13:28:16.148Z</updated>
    
    <content type="html"><![CDATA[<p>本教程用到的资源全部都是免费且可持续使用的。NS1.com这个权威DNS服务器能根据ASN、国家或省份、DNS轮询（可加权）等方式解析域名，并且提供了API去控制某个解析（answer）是否响应。监控宝能实时监控网站（通过HTTP、PING、DNS方式等）并输出警告（webhook、Email、短信等），最高监控频率为2分钟。亚马逊的AWS Lambda是一个PssS平台（severless），可以作为连接NS1.com和监控宝之间的桥梁，当监控宝检测到网站速度变慢的时候发送信息到AWS Lambda，AWS Lambda得到信息后再传递给NS1.com，速度恢复的时候也是同样的操作。为什么要夹在一个AWS Lambda呢？这是因为监控宝发送的格式是固定的，并不能直接接入到NS1.com。</p><span id="more"></span><div class="story post-story"><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>需要用到的工具和技能有：</p><div class="note info"><p><strong>工具和技能</strong></p><ul><li><p><a href="https://ns1.com/" target="_blank" rel="noopener external nofollow noreferrer">NS1.com</a>。免费一个<a href="https://help.ns1.com/hc/en-us/articles/360020683013-About-the-NS1-Filter-Chain" target="_blank" rel="noopener external nofollow noreferrer">Filter Chain</a>。Filter Chain就是根据不同条件进行响应的工具。</p></li><li><p><a href="https://www.cloudwise.sg/en/synthetic/" target="_blank" rel="noopener external nofollow noreferrer">监控宝国际版</a>。国际版可以用中国大陆和海外的手机号注册，同样可以用国内电信、移动、联通、教育网的监控节点。免费5个网站监控。</p></li><li><p><a href="https://aws.amazon.com/cn/lambda/getting-started/" target="_blank" rel="noopener external nofollow noreferrer">AWS Lambda</a>。注册使用可能需要visa银行卡或其他银行卡验证。每月一百万次调用。</p></li><li><p>一点点耐心。</p></li><li><p>一点点点python技术。</p></li></ul></div></div><div class="story post-story"><h2 id="NS1-com使用教程"><a href="#NS1-com使用教程" class="headerlink" title="NS1.com使用教程"></a>NS1.com使用教程</h2><h3 id="Filter-Chain的使用"><a href="#Filter-Chain的使用" class="headerlink" title="Filter Chain的使用"></a>Filter Chain的使用</h3><div class="tag link"><a class="link-card" title="NS1.COM官方文档|Filter Chain使用示例" href="https://help.ns1.com/hc/en-us/articles/360020683013"><div class="left"><img src="https://cdn.jsdelivr.net/npm/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/npm/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">NS1.COM官方文档|Filter Chain使用示例</p><p class="url">https://help.ns1.com/hc/en-us/articles/360020683013</p></div></a></div><p>顾名思义就是不断地过滤不符合条件的answer，直到链（Chain）的结尾就是要返回给用户的解析结果。</p><div class="note warning"><p>因此每个过滤器的顺序十分重要（这一点官方文档写到比较隐晦，但是十分重要）</p></div><p>一般而言，以<code>Up</code>开头，<code>Select First N</code>结尾。前者代表是否开启该<code>answer</code>，我们使用监控包如果发现网站速度过慢则可以设置为<code>Up: False</code>；后者表示假如链（Chain）的结尾有多个<code>answer</code>，则返回前N个<code>answer</code>，默认N为1。可以通过调整<code>Priority</code>调整优先级。</p><p>这是我的设置</p><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='default'><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231027/image.2w3ghwje0lw0.webp' data-fancybox='default' data-caption='Filter Chain' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 114.04682274247492%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231027/image.2w3ghwje0lw0.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231027/image.2w3ghwje0lw0.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Filter Chain" loading="lazy">            </a><span class='image-caption'>Filter Chain</span></div></div><p>之后我们要根据不同的运营商或者国家地区来返回DNS解析结果。因为NS1没有提供国内运营商的分类，但是提供了ASN来分类，因此我们使用以下这个项目获取不同运营商的ASN，然后填入到对应区域。</p><div class="note done"><p>建议勾选对应的复选框。因为每个人的设置不一样，请仔细阅读说明决定是否勾选！</p></div><div class="tag link"><a class="link-card" title="中国大陆ASN" href="https://github.com/xingpingcn/china-mainland-asn"><div class="left"><img src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/pngwing.com.yfryst5dm0w.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/pngwing.com.yfryst5dm0w.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">中国大陆ASN</p><p class="url">https://github.com/xingpingcn/china-mainland-asn</p></div></a></div><p>我是创建了<code>answer group</code>来分类不同的运营商的。</p><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='default'><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231027/image.6tza0wmi6k40.webp' data-fancybox='default' data-caption='answer设置' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 48.802083333333336%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231027/image.6tza0wmi6k40.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231027/image.6tza0wmi6k40.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="answer设置" loading="lazy">            </a><span class='image-caption'>answer设置</span></div></div><p>之后可以选择<code>country</code>为<code>CN</code>的<code>answer</code>作为未命中规则的备选。之后再填写一个只有<code>Up</code>的<code>answer</code>作为除中国之外全球的DNS解析结果。</p><div class="note info"><p>建议国内少用<code>country</code>，因为不太准</p></div><h3 id="NS1-API的使用"><a href="#NS1-API的使用" class="headerlink" title="NS1 API的使用"></a>NS1 API的使用</h3><h4 id="设置DNS"><a href="#设置DNS" class="headerlink" title="设置DNS"></a>设置DNS</h4><div class="tag link"><a class="link-card" title="NS1.COM官方文档|NS1 data feed创建" href="https://help.ns1.com/hc/en-us/articles/360020474154-Create-a-data-feed"><div class="left"><img src="https://cdn.jsdelivr.net/npm/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/npm/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">NS1.COM官方文档|NS1 data feed创建</p><p class="url">https://help.ns1.com/hc/en-us/articles/360020474154-Create-a-data-feed</p></div></a></div><p>根据图的指引创建<code>data source</code>和<code>data feed</code>。详细看官方文档。</p><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='default'><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231027/image.6kam8770lhc0.webp' data-fancybox='default' data-caption='NS1 API的使用' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 46.90889370932755%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231027/image.6kam8770lhc0.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231027/image.6kam8770lhc0.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="NS1 API的使用" loading="lazy">            </a><span class='image-caption'>NS1 API的使用</span></div></div><p>可以看到上面的图，在<code>answer</code>里已经设置好了关联的<code>data feed</code>了（绿色箭头表示开启，红色表示关闭）；先关联，之后我们会通过<code>AWS Lambda</code>来控制的。关联的<code>data feed</code>详细操作看官方文档。</p><div class="tag link"><a class="link-card" title="NS1.COM官方文档|answer关联data feed" href="https://help.ns1.com/hc/en-us/articles/360020471154-Automatic-failover"><div class="left"><img src="https://cdn.jsdelivr.net/npm/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/npm/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">NS1.COM官方文档|answer关联data feed</p><p class="url">https://help.ns1.com/hc/en-us/articles/360020471154-Automatic-failover</p></div></a></div><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='default'><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231027/image.6ezli28bbhw0.webp' data-fancybox='default' data-caption='answer关联data feed' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 76.25383828045035%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231027/image.6ezli28bbhw0.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231027/image.6ezli28bbhw0.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="answer关联data feed" loading="lazy">            </a><span class='image-caption'>answer关联data feed</span></div></div><h4 id="编写feed更改请求-python"><a href="#编写feed更改请求-python" class="headerlink" title="编写feed更改请求-python"></a>编写feed更改请求-python</h4><div class="tag link"><a class="link-card" title="NS1 API官方文档|修改data feed" href="https://ns1.com/api?docId=2188"><div class="left"><img src="https://cdn.jsdelivr.net/npm/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/npm/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">NS1 API官方文档|修改data feed</p><p class="url">https://ns1.com/api?docId=2188</p></div></a></div><p>我们可以编写python以请求<code>API</code>来更改<code>UP</code>的状态。之后我们会把代码放到<code>AWS Lambda</code>来控制的。</p><p>注意填写必要的信息。</p><div class="note yellow"><p><strong>参数设置</strong></p><p><code>status</code>为<code>True</code>是开启，<code>False</code>是关闭。<br><code>ns1_api_key</code>需要自己到设置里申请。建议只开启必要的权限。</p><div class="note done"><p><strong>设置`KEY`</strong></p><p>点击右上角的<code>settings</code>里的<code>users&amp;teams</code></p></div><p><code>source_id</code>和<code>label</code>就是上面图中提到要记住的内容。</p></div><figure class="highlight python"><figcaption><span>python</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"></span><br><span class="line">status = <span class="literal">True</span></span><br><span class="line"></span><br><span class="line">source_id = <span class="string">&#x27;&#x27;</span></span><br><span class="line">label=<span class="string">&#x27;&#x27;</span></span><br><span class="line">ns1_api_key = <span class="string">&#x27;&#x27;</span></span><br><span class="line">url = <span class="string">f&#x27;https://api.nsone.net/v1/feed/<span class="subst">&#123;source_id&#125;</span>&#x27;</span></span><br><span class="line">headers = &#123;</span><br><span class="line">    <span class="string">&quot;X-NSONE-Key&quot;</span>:<span class="string">f&quot;<span class="subst">&#123;ns1_api_key&#125;</span>&quot;</span></span><br><span class="line">&#125;</span><br><span class="line">data = &#123;</span><br><span class="line">    <span class="string">f&quot;<span class="subst">&#123;label&#125;</span>&quot;</span>:&#123;<span class="string">&quot;up&quot;</span>:status&#125;</span><br><span class="line">&#125;</span><br><span class="line">res = requests.post(url,headers=headers,json=data)</span><br></pre></td></tr></table></figure></div><div class="story post-story"><h2 id="使用AWS-Lambda"><a href="#使用AWS-Lambda" class="headerlink" title="使用AWS Lambda"></a>使用AWS Lambda</h2><p><code>AWS Lambda</code>支持python且可以通过各种条件来触发，现在我们用监控平台（本教程用的监控宝）的<code>webhook</code>来触发，发送<code>POST</code>请求到<code>NS1</code>来更新<code>answer</code>状态。</p><h3 id="创建函数"><a href="#创建函数" class="headerlink" title="创建函数"></a>创建函数</h3><p>点击创建函数——填写信息——点击高级设置</p><div class="note warning"><p>授权类型选<code>NONE</code>，勾选配置跨源资源共享(CORS)</p></div><div class="tag link"><a class="link-card" title="监控宝官方文档|回调url实例" href="https://help.cloudwise.com/help/38/39/520"><div class="left"><img src="https://cdn.jsdelivr.net/npm/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/npm/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">监控宝官方文档|回调url实例</p><p class="url">https://help.cloudwise.com/help/38/39/520</p></div></a></div><p>如果里选择使用监控宝，那么填入以下代码 ↓</p><div class="note yellow"><p><strong>参数设置</strong></p><p><code>url_token</code>填写监控宝里回调url里的<code>回调token</code>。如果没有监控宝还没有设置，不要紧回来再弄。<br>其他参数请看<a href="#%E7%BC%96%E5%86%99feed%E6%9B%B4%E6%94%B9%E8%AF%B7%E6%B1%82-python">这里</a><br>其中<code>status</code>会根据监控宝的状态自动设置。</p></div><figure class="highlight python"><figcaption><span>python</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> base64</span><br><span class="line"><span class="keyword">import</span> hashlib</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"></span><br><span class="line">source_id = <span class="string">&#x27;&#x27;</span></span><br><span class="line">label=<span class="string">&#x27;&#x27;</span></span><br><span class="line">status = <span class="literal">True</span></span><br><span class="line">ns1_api_key = <span class="string">&#x27;&#x27;</span></span><br><span class="line"></span><br><span class="line">url_token = <span class="string">&#x27;&#x27;</span> <span class="comment">#回调token</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">g_md5</span>(<span class="params">content</span>):</span><br><span class="line">    md5hash = hashlib.md5(content)</span><br><span class="line">    md5 = md5hash.hexdigest()</span><br><span class="line">    <span class="keyword">return</span> md5</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">lambda_handler</span>(<span class="params">event, context</span>):</span><br><span class="line">    json_data = json.loads(event[<span class="string">&#x27;body&#x27;</span>])</span><br><span class="line">    verify = <span class="built_in">str</span>(json_data[<span class="string">&#x27;msg_id&#x27;</span>])+<span class="built_in">str</span>(json_data[<span class="string">&#x27;task_id&#x27;</span>])+<span class="built_in">str</span>(json_data[<span class="string">&#x27;fault_time&#x27;</span>])+url_token</span><br><span class="line">    md5 = g_md5(verify.encode(<span class="string">&#x27;utf-8&#x27;</span>))</span><br><span class="line">    <span class="keyword">if</span> md5==json_data[<span class="string">&#x27;token&#x27;</span>]:</span><br><span class="line">        <span class="keyword">if</span> json_data[<span class="string">&#x27;message_status&#x27;</span>] == <span class="number">1</span> <span class="keyword">or</span> json_data[<span class="string">&#x27;message_status&#x27;</span>] == <span class="string">&#x27;1&#x27;</span>:</span><br><span class="line">            status = <span class="literal">False</span></span><br><span class="line">        <span class="keyword">elif</span> json_data[<span class="string">&#x27;message_status&#x27;</span>] == <span class="number">2</span> <span class="keyword">or</span> json_data[<span class="string">&#x27;message_status&#x27;</span>] == <span class="string">&#x27;2&#x27;</span>:</span><br><span class="line">            status = <span class="literal">True</span></span><br><span class="line">        url = <span class="string">f&#x27;https://api.nsone.net/v1/feed/<span class="subst">&#123;source_id&#125;</span>&#x27;</span></span><br><span class="line">        headers = &#123;</span><br><span class="line">            <span class="string">&quot;X-NSONE-Key&quot;</span>:<span class="string">f&quot;<span class="subst">&#123;ns1_api_key&#125;</span>&quot;</span></span><br><span class="line">        &#125;</span><br><span class="line">        data = &#123;</span><br><span class="line">        <span class="string">f&quot;<span class="subst">&#123;label&#125;</span>&quot;</span>:&#123;<span class="string">&quot;up&quot;</span>:status&#125;</span><br><span class="line">        &#125;</span><br><span class="line">        res = requests.post(url,headers=headers,json=data)</span><br><span class="line">        <span class="built_in">print</span>(res.text,<span class="string">f&#x27;[status] \&#x27;up\&#x27;: <span class="subst">&#123;status&#125;</span>&#x27;</span>)</span><br></pre></td></tr></table></figure><div class="note done"><p>这里不得不吐槽一句监控宝，<code>回调url</code>设置中的测试发送的json和实际应用中发送的json不一样的，如果发现测试报错请使用正常监控方式来测试</p></div><div class="note warning"><p>记得点击<code>deploy</code>！</p></div><h3 id="设置层（layers）"><a href="#设置层（layers）" class="headerlink" title="设置层（layers）"></a>设置层（layers）</h3><p>因为<code>AWS Lambda</code>默认不能使用第三方库，因为用到了<code>requests</code>库，所以要自己上传<code>requests</code>库。或者你也可以自己用python原生库重写。</p><div class="tag link"><a class="link-card" title="AWS官方文档|为依赖项创建Python层" href="https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/python-package.html#python-package-dependencies-layers"><div class="left"><img src="https://cdn.jsdelivr.net/npm/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/npm/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">AWS官方文档|为依赖项创建Python层</p><p class="url">https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/python-package.html#python-package-dependencies-layers</p></div></a></div><p><code>requests.zip</code>可以根据官方文档自己生成，也可以上传我制作的<code>requests.zip</code></p><div class="note download"><p><a href="https://jsd.cdn.zzko.cn/gh/xingpingcn/website.comments@main/requests.zip" target="_blank" rel="noopener external nofollow noreferrer">下载</a>|<a href="https://github.com/xingpingcn/website.comments/raw/main/requests.zip" target="_blank" rel="noopener external nofollow noreferrer">下载（GitHub）</a>|<a href="https://cdn.jsdelivr.us/gh/xingpingcn/website.comments@main/requests.zip" target="_blank" rel="noopener external nofollow noreferrer">下载（备用）</a></p></div><p>之后设置函数的<code>层</code>（layers），选择我们上传的<code>requests.zip</code>包。</p><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='default'><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231027/image.49csmacgss80.webp' data-fancybox='default' data-caption='image' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 35.60673162090345%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231027/image.49csmacgss80.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231027/image.49csmacgss80.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="image" loading="lazy">            </a><span></span></div></div></div><div class="story post-story"><h2 id="使用监控宝作为监控平台"><a href="#使用监控宝作为监控平台" class="headerlink" title="使用监控宝作为监控平台"></a>使用监控宝作为监控平台</h2><p>类似的平台还有观测云，免费版最高30分钟的检测频率，20万次访问每天好像是，节点11个，3网都有。</p><p>或者可以破解一些免费测速网站的js。</p><p>监控宝可以使用<code>回调url</code>（webhook）来传递信息，设置如下图。</p><p><code>回调url</code>就填写<code>AWS Lambda</code>提供的url</p><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='default'><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231027/image.qlhazjpj16o.webp' data-fancybox='default' data-caption='AWS Lambda' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 39.85239852398524%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231027/image.qlhazjpj16o.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231027/image.qlhazjpj16o.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="AWS Lambda" loading="lazy">            </a><span class='image-caption'>AWS Lambda</span></div><br><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231027/image.4iyi2poeafq0.webp' data-fancybox='default' data-caption='回调url' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 43.393393393393396%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231027/image.4iyi2poeafq0.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231027/image.4iyi2poeafq0.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="回调url" loading="lazy">            </a><span class='image-caption'>回调url</span></div></div><p>之后创建监控任务，记得在<code>Webhook通知</code>那里选择你的回调url。</p><div class="tag link"><a class="link-card" title="监控宝官方文档|回调url实例" href="https://help.cloudwise.com/help/38/39/520"><div class="left"><img src="https://cdn.jsdelivr.net/npm/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/npm/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">监控宝官方文档|回调url实例</p><p class="url">https://help.cloudwise.com/help/38/39/520</p></div></a></div></div>]]></content>
    
    
    <summary type="html">免费利用NS1权威DNS服务器实时基于不同运营商故障转移，利用监控宝平台监控指定网站</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>国内各个as自治系统[转]</title>
    <link href="https://xingpingcn.top/%E5%9B%BD%E5%86%85%E5%90%84%E4%B8%AAas%E7%B3%BB%E7%BB%9F.html"/>
    <id>https://xingpingcn.top/%E5%9B%BD%E5%86%85%E5%90%84%E4%B8%AAas%E7%B3%BB%E7%BB%9F.html</id>
    <published>2023-10-14T14:21:10.040Z</published>
    <updated>2023-10-18T08:13:51.067Z</updated>
    
    <content type="html"><![CDATA[<p>国内至国际骨干 ISP 线路整理</p><div class="note red"><p>电信的163骨干网自治系统编号 AS4134；电信的CN2骨干网自治系统编号 AS4809</p></div><div class="note yellow"><p>联通的169骨干网自治系统编号 AS4837；联通的A网骨干网自治系统编号 AS9929</p></div><div class="note blue"><p>移动的CMNET境内骨干网自治系统编号 AS9808；移动的CMI境外骨干网自治系统编号 AS58453</p></div><div class="note cyan"><p>CERNET骨干网自治系统编号 AS4538；CSTNET骨干网自治系统编号 AS7497</p></div><span id="more"></span>]]></content>
    
    
    <summary type="html">&lt;p&gt;国内至国际骨干 ISP 线路整理&lt;/p&gt;
&lt;div class=&quot;note red&quot;&gt;&lt;p&gt;电信的163骨干网自治系统编号 AS4134；电信的CN2骨干网自治系统编号 AS4809&lt;/p&gt;&lt;/div&gt;

&lt;div class=&quot;note yellow&quot;&gt;&lt;p&gt;联通的169骨干网自治系统编号 AS4837；联通的A网骨干网自治系统编号 AS9929&lt;/p&gt;&lt;/div&gt;

&lt;div class=&quot;note blue&quot;&gt;&lt;p&gt;移动的CMNET境内骨干网自治系统编号 AS9808；移动的CMI境外骨干网自治系统编号 AS58453&lt;/p&gt;&lt;/div&gt;

&lt;div class=&quot;note cyan&quot;&gt;&lt;p&gt;CERNET骨干网自治系统编号 AS4538；CSTNET骨干网自治系统编号 AS7497&lt;/p&gt;&lt;/div&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>npm图床（不需要本地部署）</title>
    <link href="https://xingpingcn.top/npm%E5%9B%BE%E5%BA%8A%EF%BC%88%E4%B8%8D%E9%9C%80%E8%A6%81%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2%EF%BC%89.html"/>
    <id>https://xingpingcn.top/npm%E5%9B%BE%E5%BA%8A%EF%BC%88%E4%B8%8D%E9%9C%80%E8%A6%81%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2%EF%BC%89.html</id>
    <published>2023-09-30T16:46:24.404Z</published>
    <updated>2023-09-30T19:51:32.705Z</updated>
    
    <content type="html"><![CDATA[<p>本篇意在建立一个上传到GitHub repo自动发布package到npm空间的npm图床</p><span id="more"></span><div class="story post-story"><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>本篇为<code>picture-bed-using-freecdn</code>脚本的教程之一。脚本意在提高静态博客的cdn稳定性。</p><div class="tag link"><a class="link-card" title="picture-bed-using-freecdn" href="https://github.com/xingpingcn/picture-bed-use-freecdn"><div class="left"><img src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/pngwing.com.yfryst5dm0w.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/pngwing.com.yfryst5dm0w.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">picture-bed-using-freecdn</p><p class="url">https://github.com/xingpingcn/picture-bed-use-freecdn</p></div></a></div><p>脚本的另一篇使用教程在这里<a href="/%E4%BD%BF%E7%94%A8freecdn-js%E6%8F%90%E9%AB%98hexo%E5%8D%9A%E5%AE%A2%E7%9A%84cdn%E7%A8%B3%E5%AE%9A%E6%80%A7.html"> [使用freecdn-js提高hexo博客的cdn稳定性]</a></p></div><div class="story post-story"><h2 id="建立用于储存图片等静态资源的npm图床"><a href="#建立用于储存图片等静态资源的npm图床" class="headerlink" title="建立用于储存图片等静态资源的npm图床"></a>建立用于储存图片等静态资源的npm图床</h2><p>可以放置js、css、图片（最好带上hash）等不经常变动的资源。</p><h3 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h3><div class="note info"><p>准备工作网上有很多教程，这里不重复造轮子。请搜索“npm图床”</p></div><p>需要：</p><ul><li>npm账号，创建一个<code>token</code>；</li><li>GitHub账号：创建一个repo，并在repo的<code>setting</code>创建一个名为<code>NPM_TOKEN</code>的secrets，值为上面的<code>token</code>。</li></ul><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='default'><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231001/image.2zlsco3s1iu0.png' data-fancybox='default' data-caption='添加NPM_TOKEN' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 53.88535031847134%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231001/image.2zlsco3s1iu0.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231001/image.2zlsco3s1iu0.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="添加NPM_TOKEN" loading="lazy">            </a><span class='image-caption'>添加NPM_TOKEN</span></div></div><h3 id="创建package-json"><a href="#创建package-json" class="headerlink" title="创建package.json"></a>创建package.json</h3><p>该文件指定了要上传的图床的名字和图床版本（不需要事先在npm空间创建一个空的package）；其中名字不能和现有的package重复，所以写的尽量长。</p><figure class="highlight json"><figcaption><span>package.json</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;version&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1.0.0&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;description&quot;</span><span class="punctuation">:</span> <span class="string">&quot;DO STUFF&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;author&quot;</span><span class="punctuation">:</span> <span class="string">&quot;XDF&quot;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>看好名称写就行，<code>version</code>尽量和我一样就行。</p><h3 id="创建GitHub-action"><a href="#创建GitHub-action" class="headerlink" title="创建GitHub action"></a>创建GitHub action</h3><p><code>GitHub action</code>可以在你把文件push或者release到repo时自动执行自定义命令，这里我们让他自动把我们push的图片发布到npm空间，使资源能通过npm cdn访问。</p><p>在reop的上方点击<code>Action</code>，然后点击<code>new workflow</code>，之后点击<code>set up a workflow yourself </code>，名字随便（我这里是npm-publish.yml），之后填入以下信息：</p><figure class="highlight yaml"><figcaption><span>npm-publish.yml</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">npm-publish</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">master</span></span><br><span class="line"><span class="attr">permissions:</span></span><br><span class="line">  <span class="attr">contents:</span> <span class="string">write</span></span><br><span class="line">  </span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">publish-npm:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="comment"># Clone 仓库</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Checkout</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/checkout@v2</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">ref:</span> <span class="string">master</span></span><br><span class="line">      <span class="comment"># 安装 Node.js    </span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Setup</span> <span class="string">Node</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/setup-node@v1</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">node-version:</span> <span class="string">&quot;12.x&quot;</span></span><br><span class="line">          <span class="attr">registry-url:</span> <span class="string">https://registry.npmjs.org/</span></span><br><span class="line">        </span><br><span class="line">      <span class="comment"># 发布 NPM 包</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Publish</span> <span class="string">Package</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          git config --global user.email &quot;email@email.com&quot;</span></span><br><span class="line"><span class="string">          git config --global user.name &quot;user_name&quot;</span></span><br><span class="line"><span class="string">          npm version patch</span></span><br><span class="line"><span class="string">          npm publish</span></span><br><span class="line"><span class="string"></span>        <span class="attr">env:</span></span><br><span class="line">          <span class="attr">NODE_AUTH_TOKEN:</span> <span class="string">$</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Push</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line">          <span class="string">git</span> <span class="string">push</span></span><br></pre></td></tr></table></figure><p>其中的<code>master</code>要换成你<code>branch</code>（分支）的名字。<code>NPM_TOKEN</code>就是最开始在secrets填写的<code>token</code>，因此名字要对应上。<code>email</code>和<code>user_name</code>可以随便写。</p><h3 id="上传图片"><a href="#上传图片" class="headerlink" title="上传图片"></a>上传图片</h3><p>使用图床工具或者手动上传到GitHub repo就能自动发布到npm空间，可以看到npm包的版本<code>version</code>变化了（npm不支持覆盖发布，所以版本一定会变化），同时<code>.json</code>文件里面的版本也变化了，这得益于GitHub action。</p><p>这里推荐一个图床工具吧，只用于GitHub的，比较轻量，使用浏览器就行。</p><div class="tag link"><a class="link-card" title="PicX图床工具官方文档" href="https://picx-docs.xpoet.cn"><div class="left"><img src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230420/image.1anm5qwvdhnk.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230420/image.1anm5qwvdhnk.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">PicX图床工具官方文档</p><p class="url">https://picx-docs.xpoet.cn</p></div></a></div><h3 id="使用图片"><a href="#使用图片" class="headerlink" title="使用图片"></a>使用图片</h3><p>提供几个国内能用的npm cdn</p><figure class="highlight yaml"><figcaption><span>npm cdn</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">https://npm.onmicrosoft.cn/,</span></span><br><span class="line"><span class="string">https://jsd.onmicrosoft.cn/npm/,</span></span><br><span class="line"><span class="string">https://cdn.jsdelivr.net/npm/,</span></span><br><span class="line"><span class="string">https://unpkg.com/</span></span><br></pre></td></tr></table></figure><p>使用格式为：</p><figure class="highlight yaml"><figcaption><span>npm cdn</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">https://&#123;cdn&#125;/&#123;npm_name&#125;@&#123;version&#125;/path/to/resource.ext</span></span><br></pre></td></tr></table></figure><p>例如</p><figure class="highlight yaml"><figcaption><span>npm cdn</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">https://unpkg.com/html-hosting-for-xp@1.0.1/%E5%9C%A8python%E4%B8%AD%E8%BF%90%E8%A1%8Cbash%EF%BC%88windows%EF%BC%89.html</span></span><br><span class="line"><span class="string">https://jsd.onmicrosoft.cn/npm/p-hosting-for-xp@1.0.15/20230525/logo%20(2).ln5ua8psy9s.webp</span></span><br></pre></td></tr></table></figure><div class="note done"><p>freecdn-js可以把资源的响应头中的<code>mime</code>改成<code>text/html</code>（而不是原来的text&#x2F;plain），从而能够让浏览器渲染网页。我写的脚本支持自动把用于写作博客.md文件转换为对应的html cdn列表。见前言</p></div></div><div class="story post-story"><h2 id="建立用于储存html静态资源的npm图床"><a href="#建立用于储存html静态资源的npm图床" class="headerlink" title="建立用于储存html静态资源的npm图床"></a>建立用于储存html静态资源的npm图床</h2><p>同样图床可以储存html文件。我是在本地编译好博客然后发布到GitHub repo的，因而在push之后依然可以在action中把html发布到npm空间。</p><figure class="highlight json"><figcaption><span>package.json</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;version&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1.0.0&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;description&quot;</span><span class="punctuation">:</span> <span class="string">&quot;DO STUFF&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;author&quot;</span><span class="punctuation">:</span> <span class="string">&quot;XDF&quot;</span></span><br><span class="line">  <span class="attr">&quot;files&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="string">&quot;*.html&quot;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>这里的<code>package.json</code>多了一个<code>files</code>的<code>key</code>，表示只发布html文件到npm空间。<code>files</code>是一个列表（array），和.gitignore文件的写作规则一样。</p><p>这里的action中的<code>.yml</code>文件和储存图片的repo的<code>.yml</code>一样，但是要删去<code>npm version patch</code>这行。</p><p><code>npm version patch</code>的作用是更新version，在本地发布html之前（hexo d），在命令行输入<code>npm version patch</code>就能更新本地的<code>package.json</code>中的version（换而言之，在更新version之前，本地的<code>package.json</code>和<code>.yml</code>内容和<code>目录</code>要和GitHub repo的一致，然后push更新了version之后的<code>.json</code>之后，让action自动部署，发布html到npm空间）</p><div class="note warning"><p>如果用我的命令行上传博客会多次push本地文件，但是只在push html之前会更新version，那么之后的push会因为没有更新version而action部署失败，但是事实上没有什么影响</p></div></div><div class="story post-story"><h2 id="脚本的使用"><a href="#脚本的使用" class="headerlink" title="脚本的使用"></a>脚本的使用</h2><p>脚本链接见前言。如果你要使用npm空间，要在<code>config.py</code>中写上你的npm包名，用于查询最新的version。</p><div class="note warning"><p>同样需要注意替换你的branch</p></div><figure class="highlight bash"><figcaption><span>bash</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">f:</span><br><span class="line"><span class="built_in">cd</span> f:/blog <span class="comment">#博客根目录</span></span><br><span class="line">hexo clean &amp;&amp; hexo g</span><br><span class="line"><span class="built_in">cd</span> f:/blog/package_json <span class="comment">#储存package.json和.yml的文件夹（注意.yml路径！！）</span></span><br><span class="line">npm version patch</span><br><span class="line"><span class="built_in">cd</span> f:/blog</span><br><span class="line">gulp</span><br><span class="line"><span class="comment"># 上传之前确保./public存在package.json和.yml（注意.yml路径！！）</span></span><br><span class="line">xcopy .\package_json .\public /e/h</span><br><span class="line">hexo d</span><br><span class="line"><span class="built_in">cd</span> f:/blog/.deploy_git</span><br><span class="line">python ../import_to_db_with_hexo_blog.py</span><br><span class="line">python ../import_to_db_with_urls_txt.py</span><br><span class="line">freecdn find --save</span><br><span class="line">freecdn manifest --merge ../pic.conf</span><br><span class="line">freecdn manifest --merge ../custom.conf -o manifest-full.txt <span class="comment">#用于生成外置的freecdn-manifest.txt</span></span><br><span class="line">freecdn js --make --cdn <span class="string">&quot;https://jsd.cdn.zzko.cn/gh/user/repo@main/freecdn-internal/ver/freecdn-main.min.js unpkg jsdelivr elemecdn &quot;</span> <span class="comment">#此命令为配置cdn链接用于加速.min.js文件，详细请查看freecdn项目的GitHub</span></span><br><span class="line">git add --all</span><br><span class="line">git commit -m <span class="string">&quot;update&quot;</span></span><br><span class="line">git push origin main <span class="comment">#如果需要添加origin地址，请自行添加。</span></span><br><span class="line">python ../generate_external_manifest_file.py</span><br><span class="line">git add --all</span><br><span class="line">git commit -m <span class="string">&quot;update&quot;</span></span><br><span class="line">git push origin main  <span class="comment">#如果“is_refresh_tag”为 “True”需要上传多次</span></span><br><span class="line">python ../refresh_cdn_cache.py <span class="comment">#可能没用</span></span><br></pre></td></tr></table></figure></div>]]></content>
    
    
    <summary type="html">不在本地部署npm图床通过cdn加速html、jpg等资源</summary>
    
    
    
    <category term="hexo折腾" scheme="https://xingpingcn.top/categories/hexo%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="npm" scheme="https://xingpingcn.top/tags/npm/"/>
    
  </entry>
  
  <entry>
    <title>在python中运行bash实时输出结果（windows）</title>
    <link href="https://xingpingcn.top/%E5%9C%A8python%E4%B8%AD%E8%BF%90%E8%A1%8Cbash%EF%BC%88windows%EF%BC%89.html"/>
    <id>https://xingpingcn.top/%E5%9C%A8python%E4%B8%AD%E8%BF%90%E8%A1%8Cbash%EF%BC%88windows%EF%BC%89.html</id>
    <published>2023-09-25T17:00:30.846Z</published>
    <updated>2023-10-27T16:45:48.510Z</updated>
    
    <content type="html"><![CDATA[<p>在windows的cmd中是不能运行bash的，我们需要利用git工具的bash来运行，但是用subprocess.run()会出问题，例如不能使用已经添加到环境变量的命令，如nvm、adb等；因此改用subprocess.Popen()</p><span id="more"></span><div class="story post-story"><h2 id="批量输入并且最后输出所有结果"><a href="#批量输入并且最后输出所有结果" class="headerlink" title="批量输入并且最后输出所有结果"></a>批量输入并且最后输出所有结果</h2><p><code>bash_path</code>用于定位你的git工具的<code>bash</code>，参数<code>cwd=</code>用于定位你的工作目录，和在文件夹中右键<code>git bash here</code>是一样的效果。</p><p>输入的命令可以带有空格，但是必须在最后加上<code>\n</code></p><figure class="highlight python"><figcaption><span>example-1</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> subprocess</span><br><span class="line">bash_path = <span class="string">r&#x27;F:\Program Files\Git\bin\bash.exe&#x27;</span></span><br><span class="line">subp = subprocess.Popen(bash_path,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding=<span class="string">&#x27;utf8&#x27;</span>,cwd=<span class="string">&#x27;$your_path&#x27;</span>)</span><br><span class="line"><span class="comment">#输入的命令可以带有空格，但是必须在最后加上`\n`</span></span><br><span class="line">subp.stdin.write(<span class="string">&#x27;nvm -v\n&#x27;</span>)</span><br><span class="line">subp.stdin.flush()</span><br><span class="line">subp.stdin.write(<span class="string">&#x27;nvm -v\n&#x27;</span>)</span><br><span class="line">subp.stdin.flush()</span><br><span class="line">subp.stdin.write(<span class="string">&#x27;nvm -v\n&#x27;</span>)</span><br><span class="line">subp.stdin.flush()</span><br><span class="line"><span class="comment">#不要忘记了关闭subp，否则会阻塞</span></span><br><span class="line">subp.stdin.close()</span><br><span class="line"><span class="built_in">print</span>(subp.stdout.read())</span><br></pre></td></tr></table></figure><figure class="highlight python"><figcaption><span>output</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">1.1</span><span class="number">.11</span></span><br><span class="line"><span class="number">1.1</span><span class="number">.11</span></span><br><span class="line"><span class="number">1.1</span><span class="number">.11</span></span><br></pre></td></tr></table></figure></div><div class="story post-story"><h2 id="实时输入并输出结果"><a href="#实时输入并输出结果" class="headerlink" title="实时输入并输出结果"></a>实时输入并输出结果</h2><p>需要用到多线程<code>threading</code>和队列<code>queue</code>来实时获取输出结果。最后也不要忘记调用子进程的<code>close()</code>方法。</p><figure class="highlight python"><figcaption><span>example-2</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> subprocess</span><br><span class="line"><span class="keyword">import</span> queue</span><br><span class="line"><span class="keyword">import</span> threading,time</span><br><span class="line"></span><br><span class="line">bash_path = <span class="string">r&#x27;F:\Program Files\Git\bin\bash.exe&#x27;</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">thread_for_listen</span>(<span class="params">subp,q</span>):</span><br><span class="line">   <span class="keyword">for</span> line <span class="keyword">in</span> <span class="built_in">iter</span>(subp.stdout.readline,<span class="string">&#x27;&#x27;</span>):</span><br><span class="line">      q.put(line)</span><br><span class="line">subp = subprocess.Popen(bash_path,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding=<span class="string">&#x27;utf8&#x27;</span>,cwd=<span class="string">&#x27;./public&#x27;</span>)</span><br><span class="line">q = queue.Queue()</span><br><span class="line">p1 = threading.Thread(target =thread_for_listen,args=(subp,q))</span><br><span class="line"></span><br><span class="line">p1.start()</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">5</span>):</span><br><span class="line">   subp.stdin.write(<span class="string">&#x27;nvm -v\n&#x27;</span>)</span><br><span class="line">   subp.stdin.flush()</span><br><span class="line">   <span class="built_in">print</span>(q.get(),end=<span class="string">&#x27;&#x27;</span>)</span><br><span class="line">   time.sleep(<span class="number">0.3</span>)</span><br><span class="line">   <span class="built_in">print</span>(<span class="string">&#x27;wake up after 0.3s&#x27;</span>)</span><br><span class="line">subp.stdin.close()</span><br><span class="line">q.task_done()</span><br></pre></td></tr></table></figure><figure class="highlight python"><figcaption><span>output</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">1.1</span><span class="number">.11</span></span><br><span class="line">wake up after <span class="number">0.3</span>s</span><br><span class="line"><span class="number">1.1</span><span class="number">.11</span></span><br><span class="line">wake up after <span class="number">0.3</span>s</span><br><span class="line"><span class="number">1.1</span><span class="number">.11</span></span><br><span class="line">wake up after <span class="number">0.3</span>s</span><br><span class="line"><span class="number">1.1</span><span class="number">.11</span></span><br><span class="line">wake up after <span class="number">0.3</span>s</span><br><span class="line"><span class="number">1.1</span><span class="number">.11</span></span><br><span class="line">wake up after <span class="number">0.3</span>s</span><br></pre></td></tr></table></figure></div>]]></content>
    
    
    <summary type="html">在windows系统下的python中使用环境变量运行bash</summary>
    
    
    
    <category term="python学习笔记" scheme="https://xingpingcn.top/categories/python%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="python" scheme="https://xingpingcn.top/tags/python/"/>
    
  </entry>
  
  <entry>
    <title>使用freecdn-js提高hexo博客的cdn稳定性（接入透明模式）</title>
    <link href="https://xingpingcn.top/%E4%BD%BF%E7%94%A8freecdn-js%E6%8F%90%E9%AB%98hexo%E5%8D%9A%E5%AE%A2%E7%9A%84cdn%E7%A8%B3%E5%AE%9A%E6%80%A7.html"/>
    <id>https://xingpingcn.top/%E4%BD%BF%E7%94%A8freecdn-js%E6%8F%90%E9%AB%98hexo%E5%8D%9A%E5%AE%A2%E7%9A%84cdn%E7%A8%B3%E5%AE%9A%E6%80%A7.html</id>
    <published>2023-09-21T03:16:39.596Z</published>
    <updated>2023-11-06T16:25:43.882Z</updated>
    
    <content type="html"><![CDATA[<p>由于<code>cdn.jsdelivr.net</code>在国内不太稳定，替代的<code>jsd.cdn.zzko.cn</code>稳定性稍好，但是也不是100%稳定，因而需要一个脚本实时切换到合适的CDN。<a href="https://github.com/EtherDream/freecdn" target="_blank" rel="noopener external nofollow noreferrer">freecdn-js</a>能实现这个需求，但是我的文件（图片、js等）储存在GitHub图床，而<code>freecdn-js</code>本身需要被加速的文件的<code>hash</code>，因此需要自己写脚本处理下载图片并计算。因为图片等文件的cdn链接是直接写在<code>.md</code>文件中的，所以写了一个正则脚本来提取cdn的链接。</p><span id="more"></span><div class="story post-story"><h2 id="脚本使用方法"><a href="#脚本使用方法" class="headerlink" title="脚本使用方法"></a>脚本使用方法</h2><div class="tag link"><a class="link-card" title="cdn链接处理脚本" href="https://github.com/xingpingcn/picture-bed-use-freecdn"><div class="left"><img src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/pngwing.com.yfryst5dm0w.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/pngwing.com.yfryst5dm0w.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">cdn链接处理脚本</p><p class="url">https://github.com/xingpingcn/picture-bed-use-freecdn</p></div></a></div><p>我写的脚本发布在GitHub上，匹配了<code>![img](url)</code>、<code>&#123;%link%&#125;</code>、<code>&#123;%image%&#125;</code>、<code>headimg</code>四个<code>tag</code>。脚本请到GitHub下载。</p><p>可以屏蔽相关<code>cdn</code>（更改host或用v2rayN路由屏蔽）测试<code>freecdn-js</code>是否能切换备用cdn。</p><p>扩展教程在这里：<a href="https://xingpingcn.top/npm%E5%9B%BE%E5%BA%8A%EF%BC%88%E4%B8%8D%E9%9C%80%E8%A6%81%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2%EF%BC%89.html">使用npm空间存放图片和html并利用cdn加速</a></p><p>需要的包版本</p><figure class="highlight json"><figcaption><span>package version</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">urllib3   <span class="number">1.25</span><span class="number">.11</span></span><br><span class="line">nodejs    <span class="number">16.10</span><span class="number">.0</span></span><br><span class="line">freecdn   <span class="number">0.3</span><span class="number">.1</span></span><br></pre></td></tr></table></figure><div class="note info"><p>以下引用GitHub上的README.md文件</p></div><details green><summary> 点击查看README.md </summary>              <div class='content'>              <div id="md-09837e86-112a-714e-8f9a-9d3bcd5cfc81" class="tag-md markdown-body"></div><script>(()=>{  volantis.css("https://unpkg.com/github-markdown-css@5.1.0/github-markdown.min.css");  const contentEl = document.getElementById("md-09837e86-112a-714e-8f9a-9d3bcd5cfc81");  const loadMarkdown = (url) => {    if (!window.fetch) {      contentEl.innerHTML =        '<div style="font-size: 24px"><p>Your browser outdated. Please use the latest version of Chrome or Firefox!</p><p>您的浏览器版本过低，请使用最新版的 Chrome 或 Firefox 浏览器！</p></div>';    } else {      contentEl.innerHTML =        '<div style="font-size: 24px">Loading ... | 加载中。。。</div>';      fetch(url, { method: "GET" })        .then((resp) => {          return Promise.all([            resp.ok,            resp.status,            resp.text(),            resp.headers,          ]);        })        .then(([ok, status, data, headers]) => {          if (ok) {            return {              ok,              status,              data,              headers,            };          } else {            throw new Error(JSON.stringify(json.error));          }        })        .then((resp) => {          let data = marked.parse(resp.data);          contentEl.innerHTML = data;        })        .catch((error) => {          console.log(error);          contentEl.innerHTML =            '<div style="font-size: 24px"><p>There was a problem loading the file!</p><p>加载文件时出现问题！</p></div>';        });    };  };  volantis.js("https://unpkg.com/marked@4.0.10/marked.min.js").then(()=>{    loadMarkdown("https://jsd.cdn.zzko.cn/gh/xingpingcn/picture-bed-using-freecdn@main/README.md?t=" + new Date().getTime());  })})();</script>              </div>            </details><div class="tag link"><a class="link-card" title="README.md|打不开请到源站查看" href="https://github.com/xingpingcn/picture-bed-use-freecdn"><div class="left"><img src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/pngwing.com.yfryst5dm0w.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/pngwing.com.yfryst5dm0w.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">README.md|打不开请到源站查看</p><p class="url">https://github.com/xingpingcn/picture-bed-use-freecdn</p></div></a></div></div><div class="story post-story"><h2 id="Windows的大坑！"><a href="#Windows的大坑！" class="headerlink" title="Windows的大坑！"></a>Windows的大坑！</h2><div class="note warning red"><p>此为大坑！务必阅读</p></div><p>如果利用Windows来写博客，那么提交<code>git</code>的时候会出现<code>LF will be replaced by CRLF the next time Git touches it</code>的提示，<code>CR</code>（回车）就是<code>\r</code>，<code>LF</code>（换行）就是<code>\n</code>，Windows平台默认换行符就是<code>CRLF</code>(<code>\r\n</code>)，此变换会导致本地文件的<code>hash</code>和存放在npm或者git空间的文件的<code>hash</code>不一致；需要运行以下命令行:</p><figure class="highlight bash"><figcaption><span>BASH</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#提交检出均不转换</span></span><br><span class="line">git config --global core.autocrlf <span class="literal">false</span></span><br></pre></td></tr></table></figure><div class="note info"><p>适用于Windows系统，且只在Windows上开发的情况。在提交、检出时不会对<code>CRLF</code>&#x2F;<code>LF</code>换行符进行转换</p></div></div><div class="story post-story"><h2 id="接入透明模式【可选】"><a href="#接入透明模式【可选】" class="headerlink" title="接入透明模式【可选】"></a>接入透明模式【可选】</h2><h3 id="配置透明模式"><a href="#配置透明模式" class="headerlink" title="配置透明模式"></a>配置透明模式</h3><p>freecdn透明模式的优势和<code>配置文件</code>看下面的链接</p><div class="tag link"><a class="link-card" title="freecdn透明模式" href="https://github.com/EtherDream/freecdn/tree/master/docs/transparent-mode"><div class="left"><img src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/pngwing.com.yfryst5dm0w.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/pngwing.com.yfryst5dm0w.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">freecdn透明模式</p><p class="url">https://github.com/EtherDream/freecdn/tree/master/docs/transparent-mode</p></div></a></div><p>博客使用<a href="https://render.com/" target="_blank" rel="noopener external nofollow noreferrer">render.com</a>托管静态资源；因为freecdn的透明模式仅仅提供了<code>nginx</code>配置，而且<code>render</code>刚刚好也支持<code>docker</code>，那就直接用<a href="https://hub.docker.com/_/nginx" target="_blank" rel="noopener external nofollow noreferrer">nginx-docker</a>吧。</p><div class="note done"><p>render.com免费提供每月100g流量、750小时实例时间、500min构建时间、0.1<code>cpu</code>和512m<code>RAM</code></p></div><div class="note warning"><p>Render spins down a Free web service that goes 15 minutes without receiving inbound traffic. Render spins the service back up whenever it next receives a request to process.<a href="https://render.com/docs/free#spinning-down-on-idle" target="_blank" rel="noopener external nofollow noreferrer">Learn more</a></p></div><p>首先在你的博客根目录下的<code>source</code>创建<code>Dockerfile</code>文件。（生成博客的时候会把<code>source</code>内的文件移动到将要被上传到repo的文件夹内）</p><figure class="highlight plaintext"><figcaption><span>./source/Dockerfile</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">FROM nginx</span><br><span class="line">COPY ./ /usr/share/nginx/html</span><br><span class="line">COPY ./freecdn-boot.conf /etc/nginx</span><br><span class="line">COPY ./nginx.conf /etc/nginx/nginx.conf</span><br><span class="line">EXPOSE 443</span><br></pre></td></tr></table></figure><p>然后下载freecdn的两个<code>配置文件</code>，<code>freecdn-boot.conf</code>和<code>nginx.conf</code>，同样放在博客根目录，只需要改动<code>nginx.conf</code>。</p><figure class="highlight plaintext"><figcaption><span>./source/nginx.conf</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line">events &#123;</span><br><span class="line">  worker_connections      1024;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">http &#123;</span><br><span class="line">  server &#123;</span><br><span class="line">    # freecdn nginx conf</span><br><span class="line">    include freecdn-boot.conf;</span><br><span class="line"></span><br><span class="line">    root                  /usr/share/nginx/html;</span><br><span class="line"></span><br><span class="line">    expires               1h;</span><br><span class="line">    default_type          text/plain;</span><br><span class="line">    include               mime.types;</span><br><span class="line"></span><br><span class="line">    # HTTPS conf</span><br><span class="line">    listen                443;</span><br><span class="line"></span><br><span class="line">    location /works &#123;</span><br><span class="line">      return              200  &quot;it works&quot;;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    gzip                  on;</span><br><span class="line">    gzip_static           on;</span><br><span class="line">    gzip_types</span><br><span class="line">      text/plain</span><br><span class="line">      text/xml</span><br><span class="line">      text/javascript</span><br><span class="line">      text/css</span><br><span class="line">      application/x-javascript</span><br><span class="line">      application/json</span><br><span class="line">      application/xml</span><br><span class="line">      application/xml+rss</span><br><span class="line">    ;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>br和gzip压缩在render平台自动开启，见官网<a href="https://render.com/docs/native-runtimes" target="_blank" rel="noopener external nofollow noreferrer">docs</a>。</p><p>上传到GitHub reop（hexo d）后，在render.com创建一个<code>web service</code>，然后选择你的repo部署就可以了。</p><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='default'><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231009/image.5xld6kv7rco0.png' data-fancybox='default' data-caption='render.com' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 97.01230228471002%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231009/image.5xld6kv7rco0.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231009/image.5xld6kv7rco0.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="render.com" loading="lazy">            </a><span class='image-caption'>render.com</span></div></div><h3 id="白嫖到底！"><a href="#白嫖到底！" class="headerlink" title="白嫖到底！"></a>白嫖到底！</h3><p>由于免费的render web service会在15分钟之内没有连接访问的情况下断开，并在下一次访问之后重启启动，而重新启动需要较长时间；因此用cf worker去定时访问网站。</p><p>需要一个cf账号，没有的先去<a href="https://dash.cloudflare.com/" target="_blank" rel="noopener external nofollow noreferrer">注册</a></p><p>点击左侧的<code>worker and page</code>，创建一个worker，这个时候不能改动代码，先确认创建。之后点击<code>触发器</code>标签，并找到<code>Cron 触发器</code>，填入<code>3/13 * * * *</code>，这行代码表示在每个小时过3分钟之后触发一次定时器，然后每过13分钟再触发一次（如果和<code>每个小时过3分钟</code>这一条件冲突，则重置触发器，即在每个小时过3分钟之后再次触发，如此反复）。设置效果如下图所示</p><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='default'><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231010/image.39t23jxed3q0.png' data-fancybox='default' data-caption='image' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 17.526315789473685%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231010/image.39t23jxed3q0.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20231010/image.39t23jxed3q0.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="image" loading="lazy">            </a><span></span></div></div><p>之后编辑worker。点击<code>快速编辑</code>，写入以下代码</p><figure class="highlight js"><figcaption><span>./worker.js</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> &#123;</span><br><span class="line">  <span class="keyword">async</span> <span class="title function_">scheduled</span>(<span class="params">event, env, ctx</span>) &#123;</span><br><span class="line">    <span class="keyword">var</span> res = <span class="keyword">await</span> <span class="title function_">fetch</span>(<span class="string">&#x27;https://xxx.com/favicon.ico&#x27;</span>);</span><br><span class="line">    <span class="keyword">var</span> data = res.<span class="title function_">json</span>();</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(data);</span><br><span class="line">  &#125;,</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p><code>async scheduled</code>表时当触发器触发时运行代码（题外话：这是不是可以当作一个免费的攻击服务器？？），<code>fetch</code>代表访问你的网站的资源，<code>await</code>似乎是必需的，因为没有<code>await</code>的话在render的log里面看不到<code>worker</code>的访问记录。</p></div>]]></content>
    
    
    <summary type="html">根据md文件内的cdn链接（图片等并不在本地）自动生成cdn列表，若图片、js、html等文件cdn失效则尝试连接列表内的其他cdn，并接入透明模式</summary>
    
    
    
    <category term="hexo折腾" scheme="https://xingpingcn.top/categories/hexo%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="volantis" scheme="https://xingpingcn.top/tags/volantis/"/>
    
  </entry>
  
  <entry>
    <title>v2ray+ws+tls太慢解决方法</title>
    <link href="https://xingpingcn.top/v2raywstls%E5%A4%AA%E6%85%A2%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95.html"/>
    <id>https://xingpingcn.top/v2raywstls%E5%A4%AA%E6%85%A2%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95.html</id>
    <published>2023-05-25T09:41:15.519Z</published>
    <updated>2023-09-03T07:10:54.539Z</updated>
    
    <content type="html"><![CDATA[<p>目前推荐hysteria，一个比较新的协议，gfw似乎还没有针对这个做出限制。<br>我自己搭建梯子的话感觉kcp和ws+tls是比较快的，但是kcp容易被墙，而且掉包有点高，ws+tls需要用上cf的cdn加速才能快，而且要筛选速度快的cf的ip才能快（目前来看稳定性较差，建议用hysteria搭建梯子）。</p><span id="more"></span><p>先看优化结果</p><div class="note success"><p>如果用hysteria在非晚高峰可以秒开4k60fps，晚高峰秒开1080p60fps。cf的cdn则看运气</p></div><div class="note warning"><p>如果用hysteria会时不时变卡，建议vps设置自动在凌晨重启</p></div><div class="tag link"><a class="link-card" title="hysteria一键搭建" href="https://github.com/emptysuns/Hi_Hysteria"><div class="left"><img src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/pngwing.com.yfryst5dm0w.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/pngwing.com.yfryst5dm0w.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">hysteria一键搭建</p><p class="url">https://github.com/emptysuns/Hi_Hysteria</p></div></a></div><p>下面是加了cdn的结果</p><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='default'><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230525/image.5rkudgvs3rk0.png' data-fancybox='default' data-caption='cf-cdn优化后的速度（速度在一直增加，峰值跑到200m不是问题）' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 51.35782747603834%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230525/image.5rkudgvs3rk0.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230525/image.5rkudgvs3rk0.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="cf-cdn优化后的速度（速度在一直增加，峰值跑到200m不是问题）" loading="lazy">            </a><span class='image-caption'>cf-cdn优化后的速度（速度在一直增加，峰值跑到200m不是问题）</span></div></div><p>没有优化的话速度简直不能看。</p><div class="story post-story"><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>推荐使用hysteria（区别于ws+tls+cdn，这个协议不能添加也不需要添加cdn）。</p><div class="tag link"><a class="link-card" title="hysteria一键搭建" href="https://github.com/emptysuns/Hi_Hysteria"><div class="left"><img src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/pngwing.com.yfryst5dm0w.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/pngwing.com.yfryst5dm0w.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">hysteria一键搭建</p><p class="url">https://github.com/emptysuns/Hi_Hysteria</p></div></a></div><p>如要添加cdn则需要：<br>1、<code>vps</code>，我用的是免费的亚马逊云香港服务器ec2（2c1g）<br>2、一个域名，可以到<a href="https://www.namesilo.com/domain/search-domains?rid=e824566hn" target="_blank" rel="noopener external nofollow noreferrer">namesilo(点击购买域名)</a>，<code>.xyz</code>域名只需要0.99刀一年，第二年重新换一个就可以。支持支付宝付费，还不用实名，送邮箱域名和隐私保护。<br>3、<code>cloudflare</code>账号（没有的账号的，去<code>谷歌</code>搜索然后注册）<br>4、cf ip自选工具<a href="https://github.com/XIU2/CloudflareSpeedTest" target="_blank" rel="noopener external nofollow noreferrer">点击查看</a><br>5、 <a href="https://github.com/jinwyp/one_click_script" target="_blank" rel="noopener external nofollow noreferrer">Easy install latest or LTS linux kernel and enable BBR or BBR plus</a><br><a href="https://roov.org/2020/03/bbr-bbrplus-bbr2/#toc_3" target="_blank" rel="noopener external nofollow noreferrer">BBR vs BBRplus vs BBR2 一般网络速度对比</a></p><p>默认已经搭建v2ray，没有搭建的可以查看<a href="https://github.com/233boy/v2ray" target="_blank" rel="noopener external nofollow noreferrer">这里</a></p></div><div class="story post-story"><h2 id="域名添加a记录到vps的ip"><a href="#域名添加a记录到vps的ip" class="headerlink" title="域名添加a记录到vps的ip"></a>域名添加a记录到vps的ip</h2><p>因为我们要用到<code>cloudflare</code>的<code>cdn</code>，所以买到域名之后直接把<code>nameserver</code>（NS）改成<code>cloudflare</code>提供的<code>NS</code>。</p><p>需要在<code>cloudflare</code>账号中添加你的域名，<code>cf</code>会给你<code>NS</code>，然后到域名供应商的设置页面更换域名的<code>NS</code>。</p><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='default'><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230525/image.68re7eh8w2k0.webp' data-fancybox='default' data-caption='cloudflare提供的NS' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 25.530035335689046%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230525/image.68re7eh8w2k0.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230525/image.68re7eh8w2k0.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="cloudflare提供的NS" loading="lazy">            </a><span class='image-caption'>cloudflare提供的NS</span></div></div><p>如果是在<code>namesilo</code>买的，更换<code>NS</code>的入口还比较隐蔽，点击看下图可以查看入口。</p><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='default'><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230525/image.6yhg5c0hr6w0.webp' data-fancybox='default' data-caption='namesilo NS更换入口' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 23.04075235109718%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230525/image.6yhg5c0hr6w0.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230525/image.6yhg5c0hr6w0.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="namesilo NS更换入口" loading="lazy">            </a><span class='image-caption'>namesilo NS更换入口</span></div></div><p>之后自定义一个二级域名，例如<code>forv2ray.example.com</code>，添加<code>A</code>记录到你的<code>vps ip</code>。并且开启<code>cdn</code>（如出现下图<code>代理状态</code>的图标，则开启成功。或需要等一段时间才能生效）</p><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='default'><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230525/image.4kwet6hmt6e0.webp' data-fancybox='default' data-caption='cloudflare添加A记录' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 8.690869086908691%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230525/image.4kwet6hmt6e0.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230525/image.4kwet6hmt6e0.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="cloudflare添加A记录" loading="lazy">            </a><span class='image-caption'>cloudflare添加A记录</span></div></div><p>之后把证书加密模式改成完全（full）</p><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='default'><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230525/image.42rhvl10gk00.webp' data-fancybox='default' data-caption='把证书加密模式改成完全（full）' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 28.774120317820657%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230525/image.42rhvl10gk00.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230525/image.42rhvl10gk00.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="把证书加密模式改成完全（full）" loading="lazy">            </a><span class='image-caption'>把证书加密模式改成完全（full）</span></div></div><p>这个时候可以<code>ping</code>一下你的二级域名，或者测一下<code>v2ray</code>的速度了，不过应该很慢。</p><p>证书的话我是脚本自动生成的，当然也可以到cf设置 -&gt; SSL&#x2F;TLS -&gt; 源服务器生成。</p></div><div class="story post-story"><h2 id="筛选适合的cloudflare-ip"><a href="#筛选适合的cloudflare-ip" class="headerlink" title="筛选适合的cloudflare ip"></a>筛选适合的cloudflare ip</h2><div class="tag link"><a class="link-card" title="ip筛选工具" href="https://github.com/XIU2/CloudflareSpeedTest"><div class="left"><img src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/pngwing.com.yfryst5dm0w.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/pngwing.com.yfryst5dm0w.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">ip筛选工具</p><p class="url">https://github.com/XIU2/CloudflareSpeedTest</p></div></a></div><p>下载后打开运行，记得关掉你的梯子，然后将最快的ip填写到你的<code>v2ray</code>客户端的地址（addres）位置。</p><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='default'><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230525/image.5k737u1z06c0.webp' data-fancybox='default' data-caption='更改v2ray设置' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 100.89058524173028%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230525/image.5k737u1z06c0.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230525/image.5k737u1z06c0.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="更改v2ray设置" loading="lazy">            </a><span class='image-caption'>更改v2ray设置</span></div></div><p>其中的伪装域名填写你在<code>cf</code>添加<code>A</code>记录到<code>vps IP</code>的二级域名。  </p><p>这个时候你就可以去测速了（或需要等待一段时间生效）</p></div>]]></content>
    
    
    <summary type="html">v2ray太慢 用自选cloudflare 自选ip解决 ws+tls</summary>
    
    
    
    
    <category term="v2ray" scheme="https://xingpingcn.top/tags/v2ray/"/>
    
  </entry>
  
  <entry>
    <title>在GIT中忽略文件操作[转]</title>
    <link href="https://xingpingcn.top/%E5%9C%A8GIT%E4%B8%AD%E5%BF%BD%E7%95%A5%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C[%E8%BD%AC].html"/>
    <id>https://xingpingcn.top/%E5%9C%A8GIT%E4%B8%AD%E5%BF%BD%E7%95%A5%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C[%E8%BD%AC].html</id>
    <published>2023-05-08T15:32:18.776Z</published>
    <updated>2023-05-08T15:38:36.136Z</updated>
    
    <content type="html"><![CDATA[]]></content>
    
    
      
      
    <summary type="html">
</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>为hexo博客添加自适应图片占位图（配合lazyload）</title>
    <link href="https://xingpingcn.top/%E4%B8%BAhexo%E5%8D%9A%E5%AE%A2%E6%B7%BB%E5%8A%A0%E8%87%AA%E9%80%82%E5%BA%94%E5%9B%BE%E7%89%87%E5%8D%A0%E4%BD%8D%E5%9B%BE.html"/>
    <id>https://xingpingcn.top/%E4%B8%BAhexo%E5%8D%9A%E5%AE%A2%E6%B7%BB%E5%8A%A0%E8%87%AA%E9%80%82%E5%BA%94%E5%9B%BE%E7%89%87%E5%8D%A0%E4%BD%8D%E5%9B%BE.html</id>
    <published>2023-05-06T08:10:46.753Z</published>
    <updated>2023-09-03T07:10:53.554Z</updated>
    
    <content type="html"><![CDATA[<p>我们要得到的结果如封面所示</p><p>由于博客采用了图片懒加载（lazyload）插件，在加载dom后和图片加载成功之前，图片占位图为1px的像素，图片加载成功之后，则会把布局撑开，造成布局抖动。如果把和要加载的图片（本博客所有图片都放在了GitHub图床上，所以要用到<code>image-size</code>库访问远程图片）一样大小的占位图替代1px大小的占位图，则能解决布局抖动问题。本post将会占位图以硬编码的方式写到<code>dom</code>中，这需要修改在生成hexo博客时会用到的<code>fancybox.js</code>（或许每个主题用到的文件里都不一样，但最终都会使用<code>hexo.extend.tag.register()</code>方法；本博客使用<code>volantis</code>主题）。</p><span id="more"></span><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='default'><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/image.p9bxtn3d6ww.webp' data-fancybox='default' data-caption='为hexo博客添加自适应图片占位图' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 49.21875%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/image.p9bxtn3d6ww.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/image.p9bxtn3d6ww.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="为hexo博客添加自适应图片占位图" loading="lazy">            </a><span class='image-caption'>为hexo博客添加自适应图片占位图</span></div></div><div class="story post-story"><h2 id="为图片添加占位图的基本结构"><a href="#为图片添加占位图的基本结构" class="headerlink" title="为图片添加占位图的基本结构"></a>为图片添加占位图的基本结构</h2><p>以全宽图片为例：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">style</span>=<span class="string">&#x27;position: relative; width: 100%;&#x27;</span>&gt;</span></span><br><span class="line">    <span class="comment">&lt;!-- padding-bottom设置占位图大小 --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">a</span> <span class="attr">style</span>=<span class="string">&quot;position: relative; height: 0; padding-bottom: $&#123;h_divide_w_str&#125;;color:gray;background-color: rgb(204, 204, 204);&quot;</span>&gt;</span></span><br><span class="line">        <span class="comment">&lt;!-- 占位图中的文字  --&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">style</span>=<span class="string">&quot;position: absolute; left: 50%; top: 50%;transform: translate(-50%, -50%);&quot;</span>&gt;</span>loading picture...<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="comment">&lt;!-- 图片 --&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">img</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><p>其中<code>position</code>、<code>width</code>、<code>height</code>、<code>padding</code>为必要属性，<code>$&#123;h_divide_w_str&#125;</code>为占位图的<code>宽高比</code>。因为需要解决布局抖动问题，所以占位图的<code>宽高比</code>要与图片一致，如何动态获取<code>宽高比</code>呢？这需要在生成hexo博客之前获取，然后代入到<code>$&#123;h_divide_w_str&#125;</code>中。</p></div><div class="story post-story"><h2 id="volantis主题动态获取远程图片的宽高比"><a href="#volantis主题动态获取远程图片的宽高比" class="headerlink" title="volantis主题动态获取远程图片的宽高比"></a>volantis主题动态获取远程图片的宽高比</h2><div class="note info"><p>有些时候可能读取不了图片就出错，可以试多几次就没有问题，或者自己写一个失败重试的代码</p></div><p>在编写博客的时候用到了<code>gallery</code>标签插件，这个插件可以在点击图片的时候放大（这是由<code>fancybox.js</code>和<code>fancybox.css</code>驱动。<code>注意：</code>这里的<code>fancybox.js</code>是<code>JavaScript</code>文件，而生成hexo博客用到的同名文件是<code>Nodejs</code>文件）</p><p>我们需要修改的，就是生成html对应的文件，而生成<code>gallery</code>的文件位于<code>blog\node_modules\hexo-theme-volantis\scripts\tags\fancybox.js</code>（nodejs文件）。</p><p>点击链接可以下载我修改好的<code>fancybox.js</code></p><div class="tag link"><a class="link-card" title="fancybox.js" href="https://github.com/xingpingcn/picx-images-hosting/blob/master/fancybox.js"><div class="left"><img src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/pngwing.com.yfryst5dm0w.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/pngwing.com.yfryst5dm0w.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">fancybox.js</p><p class="url">https://github.com/xingpingcn/picx-images-hosting/blob/master/fancybox.js</p></div></a></div><h3 id="以下是使用image-size库访问远程图片得到宽高比的代码示例。"><a href="#以下是使用image-size库访问远程图片得到宽高比的代码示例。" class="headerlink" title="以下是使用image-size库访问远程图片得到宽高比的代码示例。"></a>以下是使用<code>image-size</code>库访问远程图片得到<code>宽高比</code>的代码示例。</h3><div class="tag link"><a class="link-card" title="image-size" href="https://www.npmjs.com/package/image-size"><div class="left"><img src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/image.6tgypdie8x40.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/image.6tgypdie8x40.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">image-size</p><p class="url">https://www.npmjs.com/package/image-size</p></div></a></div><figure class="highlight javascript"><figcaption><span>blog\node_modules\hexo-theme-volantis\scripts\tags\fancybox.js</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> url = <span class="built_in">require</span>(<span class="string">&#x27;url&#x27;</span>)</span><br><span class="line"><span class="keyword">const</span> http = <span class="built_in">require</span>(<span class="string">&#x27;http&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> sizeOf = <span class="built_in">require</span>(<span class="string">&#x27;image-size&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> imgUrl = <span class="string">&#x27;http://my-amazing-website.com/image.jpeg&#x27;</span></span><br><span class="line"><span class="keyword">const</span> options = url.<span class="title function_">parse</span>(imgUrl)</span><br><span class="line"></span><br><span class="line">http.<span class="title function_">get</span>(options, <span class="keyword">function</span> (<span class="params">response</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> chunks = []</span><br><span class="line">  response.<span class="title function_">on</span>(<span class="string">&#x27;data&#x27;</span>, <span class="keyword">function</span> (<span class="params">chunk</span>) &#123;</span><br><span class="line">    chunks.<span class="title function_">push</span>(chunk)</span><br><span class="line">  &#125;).<span class="title function_">on</span>(<span class="string">&#x27;end&#x27;</span>, <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> buffer = <span class="title class_">Buffer</span>.<span class="title function_">concat</span>(chunks)</span><br><span class="line">    <span class="keyword">const</span> dimensions = <span class="title function_">sizeOf</span>(buffer);</span><br><span class="line">    <span class="keyword">const</span> h_divide_w = <span class="number">100</span> * dimensions.<span class="property">height</span> / dimensions.<span class="property">width</span>;</span><br><span class="line">    <span class="keyword">const</span> h_divide_w_str = h_divide_w.<span class="title function_">toString</span>() + <span class="string">&#x27;%&#x27;</span>; <span class="comment">//宽高比</span></span><br><span class="line">  &#125;)</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h3 id="修改宽高比"><a href="#修改宽高比" class="headerlink" title="修改宽高比"></a>修改宽高比</h3><p>得到<code>宽高比</code>后自定义css样式，以下以<code>volantis</code>主题为例</p><figure class="highlight javascript"><figcaption><span>blog\node_modules\hexo-theme-volantis\scripts\tags\fancybox.js</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> result = <span class="string">`&lt;div class=&#x27;fancybox&#x27; style=&#x27;position: relative; width: 100%;&#x27;&gt;</span></span><br><span class="line"><span class="string">            &lt;a class=&#x27;fancybox&#x27; pjax-fancybox itemscope itemtype=&quot;http://schema.org/ImageObject&quot; itemprop=&quot;url&quot; href=&#x27;<span class="subst">$&#123;url&#125;</span>&#x27; data-fancybox=&#x27;<span class="subst">$&#123;group&#125;</span>&#x27; data-caption=&#x27;<span class="subst">$&#123;alt&#125;</span>&#x27; style=&quot;position: relative;background-color: rgb(204, 204, 204);border-radius: 4px; padding-bottom: <span class="subst">$&#123;h_divide_w_str&#125;</span>;color:gray;&quot;&gt;</span></span><br><span class="line"><span class="string">            &lt;div style=&quot;position: absolute; left: 50%; top: 50%;transform: translate(-50%, -50%);&quot;&gt;loading picture...&lt;/div&gt;</span></span><br><span class="line"><span class="string">            <span class="subst">$&#123;newItem&#125;</span></span></span><br><span class="line"><span class="string">            &lt;/a&gt;<span class="subst">$&#123;buidAlt(imageTags || alt)&#125;</span>&lt;/div&gt;`</span>;</span><br></pre></td></tr></table></figure><div class="note warning"><p>此代码只是实例，不同主题的class和变量名称可能不一样</p></div><p>因为是获取图片<code>宽高比</code>异步进行的，所以要在<code>hexo.extend.tag.register()</code>方法中添加<code>async: true</code>以堵塞博客的生成，这样才能在得到<code>宽高比</code>后生成博客。此方法点击以下链接查看更多。</p><div class="tag link"><a class="link-card" title="hexo标签插件（Tag）" href="https://hexo.io/zh-cn/api/tag.html"><div class="left"><img src="https://cdn.jsdelivr.net/npm/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/npm/volantis-static@0.0.1654736714924/media/org.volantis/logo/256/safari.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">hexo标签插件（Tag）</p><p class="url">https://hexo.io/zh-cn/api/tag.html</p></div></a></div><figure class="highlight javascript"><figcaption><span>blog\node_modules\hexo-theme-volantis\scripts\tags\fancybox.js</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo.<span class="property">extend</span>.<span class="property">tag</span>.<span class="title function_">register</span>(<span class="string">&#x27;gallery&#x27;</span>, postFancybox, &#123; <span class="attr">ends</span>: <span class="literal">true</span> ,<span class="attr">async</span>: <span class="literal">true</span>&#125;);</span><br></pre></td></tr></table></figure><p>其中<code>postFancybox</code>是返回值是<code>promise</code>类型。（点击以上的hexo标签插件（Tag）查看更多）</p><p>如果在一个<code>gallery</code>内有多个图片，或许需要用到<code>for</code>循环，那么需要<code>promise.all()</code>确保所有占位图生成完成后再生成网页。</p></div><div class="story post-story"><h2 id="修改fancybox-css"><a href="#修改fancybox-css" class="headerlink" title="修改fancybox.css"></a>修改fancybox.css</h2><p><code>hexo</code>的<code>css</code>是用<code>styl</code>编写的，而<code>volantis</code>主题的<code>fancybox.css</code>位于<code>blog\node_modules\hexo-theme-volantis\source\css\_style\_tag-plugins\fancybox.styl</code>。</p><p>点击链接查看更多</p><div class="tag link"><a class="link-card" title="fancybox.styl" href="https://github.com/xingpingcn/picx-images-hosting/blob/master/fancybox.styl"><div class="left"><img src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/pngwing.com.yfryst5dm0w.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230506/pngwing.com.yfryst5dm0w.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">fancybox.styl</p><p class="url">https://github.com/xingpingcn/picx-images-hosting/blob/master/fancybox.styl</p></div></a></div><p>主要就是把影响自定义<code>css</code>的<code>height</code>属性删去（我大概也忘了修改过什么了，，，）。</p></div><div class="story post-story"><h2 id="添加动画"><a href="#添加动画" class="headerlink" title="添加动画"></a>添加动画</h2><div >  <svg style="position: relative;top: 0%;left: 0%;margin:0;" class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg></div><p>将<code>html</code>代码添加到<code>fancybox.js</code>对应位置就能得到以上效果</p><figure class="highlight javascript"><figcaption><span>blog\node_modules\hexo-theme-volantis\scripts\tags\fancybox.js</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;svg <span class="keyword">class</span>=<span class="string">&quot;spinner0&quot;</span> viewBox=<span class="string">&quot;0 0 50 50&quot;</span>&gt; <span class="language-xml"><span class="tag">&lt;<span class="name">circle</span> <span class="attr">class</span>=<span class="string">&quot;path0&quot;</span> <span class="attr">cx</span>=<span class="string">&quot;25&quot;</span> <span class="attr">cy</span>=<span class="string">&quot;25&quot;</span> <span class="attr">r</span>=<span class="string">&quot;20&quot;</span> <span class="attr">fill</span>=<span class="string">&quot;none&quot;</span> <span class="attr">stroke-width</span>=<span class="string">&quot;4&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">circle</span>&gt;</span></span>&lt;/svg&gt;</span><br></pre></td></tr></table></figure><p>然后修改<code>css</code>样式</p><figure class="highlight styl"><figcaption><span>blog\node_modules\hexo-theme-volantis\source\css\_first\base_first.styl</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.spinner0</span> &#123;</span><br><span class="line">  <span class="attribute">animation</span>: rotate <span class="number">2s</span> linear infinite;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">top</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">left</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">margin</span>: -<span class="number">25px</span> <span class="number">0</span> <span class="number">0</span> -<span class="number">25px</span>;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">50px</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">50px</span>;</span><br><span class="line">  </span><br><span class="line">  &amp; <span class="selector-class">.path0</span> &#123;</span><br><span class="line">    stroke: <span class="selector-tag">var</span>(<span class="attr">--color-list-hl</span>);</span><br><span class="line">    stroke-linecap: round;</span><br><span class="line">    <span class="attribute">animation</span>: dash <span class="number">1.5s</span> ease-in-out infinite;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">@keyframes</span> rotate &#123;</span><br><span class="line">  <span class="number">100%</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">360deg</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">@keyframes</span> dash &#123;</span><br><span class="line">  <span class="number">0%</span> &#123;</span><br><span class="line">    stroke-dasharray: <span class="number">1</span>, <span class="number">150</span>;</span><br><span class="line">    stroke-dashoffset: <span class="number">0</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="number">50%</span> &#123;</span><br><span class="line">    stroke-dasharray: <span class="number">90</span>, <span class="number">150</span>;</span><br><span class="line">    stroke-dashoffset: -<span class="number">35</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="number">100%</span> &#123;</span><br><span class="line">    stroke-dasharray: <span class="number">90</span>, <span class="number">150</span>;</span><br><span class="line">    stroke-dashoffset: -<span class="number">124</span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 加载图片后暂停动画</span></span><br><span class="line"><span class="selector-class">.spinner0</span><span class="selector-pseudo">:has</span>(+ <span class="selector-tag">img</span>.loaded)&#123;</span><br><span class="line">  <span class="attribute">animation-play-state</span>: paused;</span><br><span class="line">  &gt; circle &#123;</span><br><span class="line">    <span class="attribute">animation-play-state</span>: paused;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br></pre></td></tr></table></figure></div>]]></content>
    
    
    <summary type="html">为hexo博客解决图片抖动问题添加自适应图片占位图</summary>
    
    
    
    <category term="hexo折腾" scheme="https://xingpingcn.top/categories/hexo%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="volantis" scheme="https://xingpingcn.top/tags/volantis/"/>
    
  </entry>
  
  <entry>
    <title>优化部署在github page的hexo-volantis的国内访问速度（dom、图片、js、css等）</title>
    <link href="https://xingpingcn.top/%E4%B8%BAvolantis%E6%B7%BB%E5%8A%A0cdn%E5%8A%A0%E9%80%9F.html"/>
    <id>https://xingpingcn.top/%E4%B8%BAvolantis%E6%B7%BB%E5%8A%A0cdn%E5%8A%A0%E9%80%9F.html</id>
    <published>2023-04-21T08:35:18.593Z</published>
    <updated>2023-10-31T13:08:56.443Z</updated>
    
    <content type="html"><![CDATA[<p>国内直连访问自己的网站太慢了，发现官方推荐使用cdn加速，于是试了一下，也踩了一些坑，弄完之后确实快了许多</p><span id="more"></span><div class="story post-story"><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>进阶的设置请以下文章：</p><ul><li><a href="https://xingpingcn.top/%E4%BD%BF%E7%94%A8freecdn-js%E6%8F%90%E9%AB%98hexo%E5%8D%9A%E5%AE%A2%E7%9A%84cdn%E7%A8%B3%E5%AE%9A%E6%80%A7.html">使用freecdn-js提高hexo博客的cdn稳定性</a></li><li><a href="https://xingpingcn.top/%E5%85%8D%E8%B4%B9%E9%80%9A%E8%BF%87NS1%E5%88%A9%E7%94%A8%E7%9B%91%E6%8E%A7%E5%AE%9D%E5%B9%B3%E5%8F%B0%E5%AE%9E%E7%8E%B0%E5%AE%9E%E6%97%B6%E5%9F%BA%E4%BA%8E%E4%B8%8D%E5%90%8C%E8%BF%90%E8%90%A5%E5%95%86%E7%9A%84%E6%95%85%E9%9A%9C%E8%BD%AC%E7%A7%BB.html">免费通过NS1利用监控宝平台实现实时基于不同运营商的故障转移</a></li></ul></div><div class="story post-story"><h2 id="寻找访问慢的根源"><a href="#寻找访问慢的根源" class="headerlink" title="寻找访问慢的根源"></a>寻找访问慢的根源</h2><p>打开<code>调试台</code>-<code>网络</code>，查看原因</p><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='default'><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230420/image.az5hs7zk4ck.png' data-fancybox='default' data-caption='寻找访问慢的根源' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 38.59375%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230420/image.az5hs7zk4ck.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230420/image.az5hs7zk4ck.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="寻找访问慢的根源" loading="lazy">            </a><span class='image-caption'>寻找访问慢的根源</span></div></div><p>可以看到，访问<code>GitHub page</code>、<code>css</code>文件和<code>js</code>文件都超过了1秒以上，加载图片更是慢的不得了，这几个问题都是要解决的。</p></div><div class="story post-story"><h2 id="使用netlify部署网页"><a href="#使用netlify部署网页" class="headerlink" title="使用netlify部署网页"></a>使用netlify部署网页</h2><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='default'><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230508/image.7j23eumhawg0.webp' data-fancybox='default' data-caption='netlify page访问速度' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 53.708133971291865%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230508/image.7j23eumhawg0.webp" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230508/image.7j23eumhawg0.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="netlify page访问速度" loading="lazy">            </a><span class='image-caption'>netlify page访问速度</span></div></div><p>访问<code>GitHub page</code>很慢，使用使用<code>netlify</code>部署网页能加快访问速度<a href="https://xingpingcn.netlify.app/" target="_blank" rel="noopener external nofollow noreferrer">【netlify示例】</a>，<code>netlify</code>支持从<code>GitHub</code>抓取<code>repo</code>并部署，也就是说<code>hexo</code>生成并上传网页到<code>GitHub</code>，<code>netlify</code>就能同步部署，而且速度还很快。<code>netlify</code>每个月有100g免费流量，把图片、<code>js</code>等静态资源放在<code>GitHub</code>，然后用<code>cdn</code>加速（下面会讲到），会节省不少流量。</p><p>可以从上图看到，<code>netlify</code>托管的网页国内访问速度非常快，比<code>cf page</code>（平均2+秒，较为稳定）和<code>vercel</code>（<a href="https://xingpingcn-github-io-xingpingcn.vercel.app/" target="_blank" rel="noopener external nofollow noreferrer">【vercel示例】</a>电信很慢，其他还行；容易被墙，访问跳转到反诈平台）好多了。看了一下，访问慢的似乎是因为刚刚换了<code>netlify</code>的<code>dns</code>，还有缓存所以域名解析到<code>vercel</code>了，所以慢的都是vercel()。</p><p><code>netlify</code>可以<code>免费</code>给你分配一个二级域名，也可以换成自己买的域名（我没有备案速度也很快），真的很良心了。</p><p>域名我在<a href="https://www.namesilo.com/domain/search-domains?rid=e824566hn" target="_blank" rel="noopener external nofollow noreferrer">namesilo(点击购买域名)</a>买的，<code>.top</code>后缀续费4.8刀，和阿里云国际版价格差不多，国内版要便宜很多，不过要实名。当然<code>namesilo</code>这个价格比很多国外域名注册商便宜了。</p><p><code>.xyz</code>只要0.99刀更加便宜。</p><div class="note success"><p>其他免费的静态网站托管平台<a href="https://render.com/" target="_blank" rel="noopener external nofollow noreferrer">render.com</a>（<a href="https://xingpingcn-blog.onrender.com/" target="_blank" rel="noopener external nofollow noreferrer">【示例】</a>国内比较快，100g每月流量，自定义域名，ca证书。）、<a href="https://4everland.org/" target="_blank" rel="noopener external nofollow noreferrer">4everland.org</a>（<a href="https://xingpingcn-blog-ipfs.4everland.app/" target="_blank" rel="noopener external nofollow noreferrer">【示例1】</a><a href="https://d2xso-naaaa-aaaag-ab3hq-cai.raw.icp0.io/" target="_blank" rel="noopener external nofollow noreferrer">【示例2】</a>去中心化托管平台，国内速度一般般；支持自定义域名，ca证书未知）</p></div></div><div class="story post-story"><h2 id="使用jsd-cdn-zzko-cnjsd-cdn-zzko-cn替代cdn-jsdelivr-net进行cdn加速css和js"><a href="#使用jsd-cdn-zzko-cnjsd-cdn-zzko-cn替代cdn-jsdelivr-net进行cdn加速css和js" class="headerlink" title="使用jsd.cdn.zzko.cnjsd.cdn.zzko.cn替代cdn.jsdelivr.net进行cdn加速css和js"></a>使用<code>jsd.cdn.zzko.cnjsd.cdn.zzko.cn</code>替代<code>cdn.jsdelivr.net</code>进行cdn加速<code>css</code>和<code>js</code></h2><p>主题默认配置用的<code>cdn.jsdelivr.net</code>现在似乎不会突然抽筋了，但是依然很慢，<code>jsd.cdn.zzko.cn</code>是一个免费面向中国境内外的高速<code>jsdelivr</code>镜像站，访问速度很快，可以作为理想的替代方案。</p><div class="note"><p>备用域名<code>cdn.jsdelivr.ren</code>、<code>gcore.jsdelivr.net</code> 等</p></div><p><code> </code></p><a class="ghcard" rel="external nofollow noopener noreferrer" href="https://github.com/54ayao/Chinajsdelivr"><img src="https://github-readme-stats.vercel.app/api/pin/?username=54ayao&repo=Chinajsdelivr&show_owner=true" class="lazyload" data-srcset="https://github-readme-stats.vercel.app/api/pin/?username=54ayao&repo=Chinajsdelivr&show_owner=true" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></a><p><code> </code></p><div class="note success"><p>现在<code>jsd.cdn.zzko.cn</code>应该是修复了，所以不需要改了。直接在配置中添加一下代码即可。</p></div><del>如果仔细观察上面的图，可以发现访问的`style.css`变成了`style.xxxx.css`，同理`app.js`。这个是hexo在生成`public`文件夹的时候生成的，而怎么样不让他改为这种类型的名字，我不知道怎么样做。出于保险，我用了一个替代的方案，把`blog\public\css\style.xxxx.css`复制出来，并重命名为`style.css`，同理`app.js`。（这个是因为设置了`cdn_version: true`）</del><del>由于访问`jsd.cdn.zzko.cn`的响应头（response）中没有指定`content-type: charset=utf-8`，因而浏览器在解析的时候会出错。这时需要在`style.css`手动添加代码</del><p><code> </code></p><del>如果在配置文件中修改了`css`布局，如`sidebar`从左边移到了右边，则需要重新添加代码并上传至GitHub，因而推荐弄好布局后再上传</del><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">@charset</span> <span class="string">&quot;UTF-8&quot;</span>;</span><br></pre></td></tr></table></figure><div class="note warning"><p>需要在第一行顶格填写</p></div><p>这时我们有了能正常访问的<code>css</code>文件（<code>js</code>不需要改）</p><p>之后需要cdn加速<code>css</code>和<code>js</code>文件，直接把<code>css</code>和<code>js</code>文件放在<code>blog\source</code>下，上传网页的时候hexo会把这些一起上传到根目录<code>/</code>。</p><p>或者在GitHub新开一个不同于个人GitHub page的<code>repo</code>，之后在根目录<code>/</code>上传这两个改了名字后的<code>css</code>和<code>js</code>文件。</p><p>使用</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://jsd.cdn.zzko.cn/gh/user/repo/style.css</span><br></pre></td></tr></table></figure><p>就能访问<code>style.css</code>了，同理<code>app.js</code>。</p><p>要让<code>volantis</code>访问cdn加速链接，需要在配置中添加一下代码。</p><figure class="highlight yml"><figcaption><span>_config.volantis.yml</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">cdn:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  </span><br><span class="line">  <span class="attr">set:</span></span><br><span class="line">    <span class="attr">js:</span></span><br><span class="line">      <span class="attr">app:</span> <span class="string">https://jsd.cdn.zzko.cn/gh/user/repo/app.js</span></span><br><span class="line">    <span class="attr">css:</span></span><br><span class="line">      <span class="attr">style:</span> <span class="string">https://jsd.cdn.zzko.cn/gh/user/repo/style.css</span> <span class="comment"># (异步加载样式)</span></span><br><span class="line"></span><br><span class="line"><span class="attr">cdn_version:</span> <span class="literal">false</span></span><br><span class="line"></span><br><span class="line"><span class="attr">volantis_static_cdn:</span> <span class="string">https://jsd.cdn.zzko.cn/npm/volantis-static@0.0.1654736714924/</span></span><br></pre></td></tr></table></figure><p><code>user</code>和<code>repo</code>都改为自己的。如果没有刷新没有变化记得设置<code>cdn_version: false</code>然后重启服务器。</p><p><code>volantis_static_cdn</code>的值或许需要根据默认配置中的静态文件版本去更改，也就是<code>@</code>后面的一串数字。</p></div><div class="story post-story"><h2 id="使用PicX图床工具"><a href="#使用PicX图床工具" class="headerlink" title="使用PicX图床工具"></a>使用PicX图床工具</h2><a class="ghcard" rel="external nofollow noopener noreferrer" href="https://github.com/XPoet/picx"><img src="https://github-readme-stats.vercel.app/api/pin/?username=XPoet&repo=picx&show_owner=true" class="lazyload" data-srcset="https://github-readme-stats.vercel.app/api/pin/?username=XPoet&repo=picx&show_owner=true" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></a><p>使用方便管理的图床让你编辑文章更加得心应手，此图床可以自动压缩图片，添加md格式等，配置也十分简单，直接看官方文档就ok。</p><p>其图床还有多种cdn加速可选，十分方便。</p><div class="tag link"><a class="link-card" title="PicX图床工具官方文档" href="https://picx-docs.xpoet.cn"><div class="left"><img src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230420/image.1anm5qwvdhnk.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230420/image.1anm5qwvdhnk.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></div><div class="right"><p class="text">PicX图床工具官方文档</p><p class="url">https://picx-docs.xpoet.cn</p></div></a></div></div><div class="story post-story"><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>最后看看访问速度</p><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='default'><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230420/image.7grs1emx5ok0.png' data-fancybox='default' data-caption='访问速度快' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 48.489583333333336%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230420/image.7grs1emx5ok0.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230420/image.7grs1emx5ok0.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="访问速度快" loading="lazy">            </a><span class='image-caption'>访问速度快</span></div></div><p><code>shift+F5</code>强制刷新，速度还挺满意，dom打开速度很快了，只是没更新图片（），，懒，可以直接试试测我的网站速度看看。</p></div>]]></content>
    
    
    <summary type="html">部署在github page的volantis国内访问太慢 cdn加速 图床cdn加速 弄完之后确实快了许多</summary>
    
    
    
    <category term="hexo折腾" scheme="https://xingpingcn.top/categories/hexo%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="volantis" scheme="https://xingpingcn.top/tags/volantis/"/>
    
  </entry>
  
  <entry>
    <title>使用volantis中遇到的坑</title>
    <link href="https://xingpingcn.top/hexo%E6%8A%98%E8%85%BE.html"/>
    <id>https://xingpingcn.top/hexo%E6%8A%98%E8%85%BE.html</id>
    <published>2023-04-20T15:00:16.000Z</published>
    <updated>2023-10-13T08:36:13.279Z</updated>
    
    <content type="html"><![CDATA[<p>使用volantis中遇到几个坑，如volantis404页面不生效，sidebar效果不生效，如何更改图片尺寸，手机模式下toc会被遮挡等，这里做了笔记</p><span id="more"></span><div class="story post-story"><h2 id="写在前面"><a href="#写在前面" class="headerlink" title="写在前面"></a>写在前面</h2><div class="note warning"><p>更改配置的时候记得刷新页面，如果不生效，记得重启本地服务器！</p></div><div class="note warning red"><p>更改配置的时候记得刷新页面，如果不生效，记得重启本地服务器！</p></div><div class="note warning"><p>更改配置的时候记得刷新页面，如果不生效，记得重启本地服务器！</p></div></div><div class="story post-story"><h2 id="404页面不生效"><a href="#404页面不生效" class="headerlink" title="404页面不生效"></a>404页面不生效</h2><p>按照官方的<a href="https://volantis.js.org/v6/page-settings/#404%E9%A1%B5%E9%9D%A2" target="_blank" rel="noopener external nofollow noreferrer">文档</a>配置404页面，在本地打开一个不存在的页面，并不显示404页面，重启服务器依然不行。干脆直接放到GitHub page上，结果<a href="https://xingpingcn.github.io/23423451dfs" target="_blank" rel="noopener external nofollow noreferrer">404页面</a>能生效</p><div class="note success"><p>结论：如果本地404页面不生效，就上传到服务器端查看是否生效</p></div></div><div class="story post-story"><h2 id="sidebar效果不生效"><a href="#sidebar效果不生效" class="headerlink" title="sidebar效果不生效"></a>sidebar效果不生效</h2><p>我的volantis版本是volantis<code>5.7</code>，主题文件设置中的sidebar的<code>shadow</code>, <code>floatable</code>, <code>blur</code>效果不生效</p><figure class="highlight yml"><figcaption><span>_config.volantis.yml</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">sidebar:</span></span><br><span class="line">    <span class="attr">effect:</span> [<span class="string">shadow</span>, <span class="string">floatable</span>, <span class="string">blur</span>]</span><br></pre></td></tr></table></figure><p>我的方法是打开<code>blog\node_modules\hexo-theme-volantis\layout\_widget</code>，这里存放着<code>sidebar</code>的各个组件。</p><p>以下以修改<code>blogger</code>组件为例：</p><p>找到代码</p><figure class="highlight html"><figcaption><span>blog\node_modules\hexo-theme-volantis\layout\_widget\blogger.ejs</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">section</span> <span class="attr">class</span>=<span class="string">&quot;widget &lt;%- item.class %&gt;  &lt;%- page.widget_platform %&gt; &lt;%- page.widget_pjax %&gt;&quot;</span>&gt;</span></span><br></pre></td></tr></table></figure><p>可以看到<code>class</code>中是没有<code>shadow</code>, <code>floatable</code>, <code>blur</code>的，只需要我们手动添加关键词就能生效</p><figure class="highlight html"><figcaption><span>blog\node_modules\hexo-theme-volantis\layout\_widget\blogger.ejs</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">section</span> <span class="attr">class</span>=<span class="string">&quot;widget blur floatable shadow &lt;%- item.class %&gt;  &lt;%- page.widget_platform %&gt; &lt;%- page.widget_pjax %&gt;&quot;</span>&gt;</span></span><br></pre></td></tr></table></figure><p>刷新就可以看到效果生效，左边的<code>blogger</code>组件有高斯模糊并且有阴影效果了。</p><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230420/image.3ezxjhosk9i.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230420/image.3ezxjhosk9i.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="效果" style="width:80%;"/></div><span class="image-caption">效果</span></div><p>其他组件也是同样的方法，关键是要找到这行代码</p><figure class="highlight html"><figcaption><span>blog\node_modules\hexo-theme-volantis\layout\_widget\xxx.ejs</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">section</span> <span class="attr">class</span>=<span class="string">&quot;widget ...&quot;</span>&gt;</span></span><br></pre></td></tr></table></figure><p>这行代码可以在浏览器打开元素查看器找到</p><div class="note info"><p>按<kbd>F12</kbd>可以打开元素查看器</p></div><div class="img-wrap"><div class="img-bg"><img class="img lazyload" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230420/image.2v43xxro3vs0.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230420/image.2v43xxro3vs0.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="效果" style="width:80%;"/></div><span class="image-caption">效果</span></div></div><div class="story post-story"><h2 id="更改图片显示尺寸和圆角半径"><a href="#更改图片显示尺寸和圆角半径" class="headerlink" title="更改图片显示尺寸和圆角半径"></a>更改图片显示尺寸和圆角半径</h2><h3 id="图片显示尺寸"><a href="#图片显示尺寸" class="headerlink" title="图片显示尺寸"></a>图片显示尺寸</h3><p>使用以下代码，则能显示如本post中的图片一样的效果</p><pre><code>&#123;% image https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230420/image.2v43xxro3vs0.png::width=80%::alt=效果 %&#125;</code></pre><p>其中的<code>url</code>，<code>width</code>和<code>alt</code>可以自己修改。<code>width</code>的单位可以是<code>px</code>也可以是百分比<code>%</code></p><h3 id="图片圆角半径"><a href="#图片圆角半径" class="headerlink" title="图片圆角半径"></a>图片圆角半径</h3><p>打开<code>\img.styl</code>就可以修改圆角半径</p><figure class="highlight plaintext"><figcaption><span>blog\node_modules\hexo-theme-volantis\source\css\_style\_layout\img.styl</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">.md</span><br><span class="line">  img</span><br><span class="line">    position: relative</span><br><span class="line">    trans()</span><br><span class="line">    @media screen and (max-width: $device-mobile)</span><br><span class="line">      box-shadow: none</span><br><span class="line">  div&gt;img,p&gt;img,a&gt;img</span><br><span class="line">    display: block</span><br><span class="line">    margin: auto</span><br><span class="line">    border-radius: 4px</span><br><span class="line">    @media screen and (max-width: $device-mobile)</span><br><span class="line">      border-radius: 4px</span><br><span class="line">  span</span><br><span class="line">    img</span><br><span class="line">      display: inline</span><br><span class="line">      margin: auto</span><br></pre></td></tr></table></figure><p>其中的<code>border-radius</code>就是半径的<code>key</code>（默认的配置文件中应该有3个，我没有复制全），修改你想要的<code>value</code>。</p><p>如果在像我一样在第7行行尾添加<code>a&gt;img</code>，则可以修改使用<code>gallery</code>标签插件的图片中<code>border-radius</code>的值。</p></div><div class="story post-story"><h2 id="解决手机模式下toc会被遮挡的问题"><a href="#解决手机模式下toc会被遮挡的问题" class="headerlink" title="解决手机模式下toc会被遮挡的问题"></a>解决手机模式下toc会被遮挡的问题</h2><div galleryFlag itemscope itemtype="http://schema.org/ImageGallery" class="gallery " data-group='default'><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230420/image.64ovonl779w0.png' data-fancybox='default' data-caption='toc被遮挡' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 97.81477627471384%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230420/image.64ovonl779w0.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230420/image.64ovonl779w0.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="toc被遮挡" loading="lazy">            </a><span class='image-caption'>toc被遮挡</span></div><br><div class='fancybox' style='position: relative; width: 100%;'>            <a class='fancybox' pjax-fancybox itemscope itemtype="http://schema.org/ImageObject" itemprop="url" href='https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230420/image.30uajx353wa0.png' data-fancybox='default' data-caption='解决后' style="position: relative;background-color: rgb(204, 204, 204); padding-bottom: 97.81477627471384%;color:gray;">            <svg class="spinner0" viewBox="0 0 50 50"> <circle class="path0" cx="25" cy="25" r="20" fill="none" stroke-width="4"></circle></svg>            <img fancybox itemprop="contentUrl" src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230420/image.30uajx353wa0.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230420/image.30uajx353wa0.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="解决后" loading="lazy">            </a><span class='image-caption'>解决后</span></div></div><p>只需要在<code>\navbar_first.styl</code>中修改<code>z-index</code>值为一个较小的数字。</p><figure class="highlight plaintext"><figcaption><span>blog\node_modules\hexo-theme-volantis\source\css\_first</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">.l_header</span><br><span class="line">  $iconW = 36px</span><br><span class="line">  $iconMargin = 4px</span><br><span class="line">  position: fixed</span><br><span class="line">  z-index: 10</span><br></pre></td></tr></table></figure></div>]]></content>
    
    
    <summary type="html">volantis404页面不生效？sidebar效果不生效？如何更改图片尺寸？手机模式下toc会被遮挡</summary>
    
    
    
    <category term="hexo折腾" scheme="https://xingpingcn.top/categories/hexo%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="volantis" scheme="https://xingpingcn.top/tags/volantis/"/>
    
  </entry>
  
  <entry>
    <title>test</title>
    <link href="https://xingpingcn.top/test4.html"/>
    <id>https://xingpingcn.top/test4.html</id>
    <published>2023-04-19T16:51:16.000Z</published>
    <updated>2023-09-03T07:10:58.596Z</updated>
    
    <content type="html"><![CDATA[<p>a cat</p><span id="more"></span><div class="story post-story"><h2 id="a-cat"><a href="#a-cat" class="headerlink" title="a cat"></a>a cat</h2><del>删除线</del><p><img src="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230419/%E8%87%AD%E5%8D%B7%E5%AE%9D.74vk4cdjex40.jpg" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230419/%E8%87%AD%E5%8D%B7%E5%AE%9D.74vk4cdjex40.jpg" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="臭卷宝" loading="lazy">  </p><p><a href="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230419/%E8%87%AD%E5%8D%B7%E5%AE%9D.74vk4cdjex40.jpg" target="_blank" rel="noopener external nofollow noreferrer"><code>臭卷宝</code></a><br><em>hh</em>  </p><p><strong>More info: <a href="https://cdn.jsdelivr.net/gh/xingpingcn/picx-images-hosting@master/20230419/%E8%87%AD%E5%8D%B7%E5%AE%9D.74vk4cdjex40.jpg" target="_blank" rel="noopener external nofollow noreferrer">bilibi</a></strong></p><blockquote><p>123<br>222</p><blockquote><p>2311</p></blockquote><div class="note info"><p>info about a cat</p></div></blockquote><p>视频</p><div style="position: relative; padding: 30% 45%;"><iframe style="position: absolute; width: 100%; height: 100%; left: 0; top: 0;" src="//player.bilibili.com/player.html?aid=312255001&bvid=BV1uN411w7yY&cid=1091054572&page=1&as_wide=1&high_quality=1&danmaku=0" frameborder="no" scrolling="no"></iframe></div><p>轮转（科学上网）</p><div class="tag-plugin swiper-container"><div class="swiper-wrapper"><div class="swiper-slide"><img no-lazy src="https://gcore.jsdelivr.net/gh/cdn-x/wiki@1.0.2/prohud/screenshot11.png" loading="lazy"></div><div class="swiper-slide"><img no-lazy src="https://gcore.jsdelivr.net/gh/cdn-x/wiki@1.0.2/prohud/screenshot12.png" loading="lazy"></div><div class="swiper-slide"><img no-lazy src="https://gcore.jsdelivr.net/gh/cdn-x/wiki@1.0.2/prohud/screenshot13.png" loading="lazy"></div></div><div class="swiper-pagination"></div><div class="swiper-button-prev blur"></div><div class="swiper-button-next blur"></div></div></div>]]></content>
    
    
    <summary type="html">&lt;p&gt;a cat&lt;/p&gt;</summary>
    
    
    
    
    <category term="test" scheme="https://xingpingcn.top/tags/test/"/>
    
  </entry>
  
</feed>
