<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Juch Blog</title>
    <description>很高兴能在这里与你分享我对技术和生活的思考。</description>
    <link>old.blog.vmert.com/</link>
    <atom:link href="old.blog.vmert.com/feed.xml" rel="self" type="application/rss+xml" />
    <pubDate>Sun, 18 Jul 2021 06:44:37 +0000</pubDate>
    <lastBuildDate>Sun, 18 Jul 2021 06:44:37 +0000</lastBuildDate>
    <generator>Jekyll v3.9.0</generator>
    
      <item>
        <title>使用dd生成特定大小文件</title>
        <description>&lt;p&gt;dd if=/dev/zero of=100M bs=1M count=0 seek=100&lt;/p&gt;

&lt;!--excerpt--&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;- /dev/zero 是一个字符设备，会不断返回0值字节
- &lt;span class=&quot;k&quot;&gt;if &lt;/span&gt;代表输入文件。如果不指定if，默认就会从stdin中读取输入
- of 代表输出文件。如果不指定of，默认就会将stdout作为默认输出
- bs 代表字节为单位的块大小
- count 代表被复制的块数
- seek：一开始输出时，跳过指定的区块数
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Sun, 07 Jun 2020 09:21:47 +0000</pubDate>
        <link>old.blog.vmert.com/2020/dd</link>
        <guid isPermaLink="true">old.blog.vmert.com/2020/dd</guid>
        
        <category>MEMO</category>
        
        
        <category>memo</category>
        
      </item>
    
      <item>
        <title>selenium调用Edge的时候如何不写路径</title>
        <description>&lt;p&gt;把”msedgewebdriver.exe”重命名为”MicrosoftWebDriver.exe”可以在调用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Edge()&lt;/code&gt;的时候不用写路径.&lt;/p&gt;

&lt;!--excerpt--&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;WebDriver&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RemoteWebDriver&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;executable_path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'MicrosoftWebDriver.exe'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                 &lt;span class=&quot;n&quot;&gt;capabilities&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;verbose&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;service_log_path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                 &lt;span class=&quot;n&quot;&gt;log_path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keep_alive&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
                 &lt;span class=&quot;err&quot;&gt;······&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;下载”MicrosoftWebDriver”，并放入&lt;strong&gt;Python&lt;/strong&gt;的&lt;strong&gt;Scripts&lt;/strong&gt;目录中。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver&quot;&gt;Download MicrosoftWebDriver&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Sun, 07 Jun 2020 02:12:34 +0000</pubDate>
        <link>old.blog.vmert.com/2020/webdrive</link>
        <guid isPermaLink="true">old.blog.vmert.com/2020/webdrive</guid>
        
        <category>MEMO</category>
        
        
        <category>memo</category>
        
      </item>
    
      <item>
        <title>第一条备忘录</title>
        <description>&lt;p&gt;第一条备忘录。&lt;/p&gt;

&lt;!--excerpt--&gt;

&lt;hr /&gt;

&lt;p&gt;非摘要部分。&lt;/p&gt;
</description>
        <pubDate>Sat, 06 Jun 2020 14:19:21 +0000</pubDate>
        <link>old.blog.vmert.com/2020/first-memo</link>
        <guid isPermaLink="true">old.blog.vmert.com/2020/first-memo</guid>
        
        <category>MEMO</category>
        
        
        <category>memo</category>
        
      </item>
    
      <item>
        <title>使用Microsoft Power Automate 创建自动化的邮件流</title>
        <description>&lt;p&gt;想必大家工作中都有不少的邮件需要处理，而涉及工作的部分邮件多是套用模板或者自动生成的，面对几乎千篇一律的邮件，如何快速处理，是一门技巧，也是工作的艺术。&lt;/p&gt;

&lt;!--excerpt--&gt;

&lt;p&gt;如果你使用过IFTTT那么对Microsoft Flow一定不会陌生，它既有类似于IFTTT的强大和灵活架构，亦继承了微软多年的企业级服务的基因，在团队协作、与企业内部应用集成以及安全性等方面有一些自己的特点。&lt;/p&gt;

&lt;p&gt;首先登入👉🏻&lt;a href=&quot;https://asia.flow.microsoft.com&quot;&gt;Flow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/email_flow/2020-06-05_0004.webp&quot; alt=&quot;Flow Index&quot; /&gt;&lt;/p&gt;

&lt;p&gt;里面有超级多的模板可以直接使用，但是本篇文章的需求是自动回复有特定关键字的邮件。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 需求：&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# 我在Google Drive上分析了许多古典音乐方面的内容，后来共享人数太多，为了避免权限混乱，我把所有资源备份到了Team Drive，现在叫Shared Drive。&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# 但是由于原有资源的共享链接传播太广，导致即使在备份了一年之后的今天也仍然有人去申请这个资源的权限。&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# 旧的处理办法：&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# 刚开始我是通过申请资源的邮件的主题关键字进行贴标签，有空的时候统一回复，由于没有固定的时间，偶尔也会一个月回一次。&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;现在我的处理办法是使用Flow自动回复邮件，经过一个多月的实际使用发现，使用Flow自动回复申请邮件，基本可以在收信后的一分钟内复信给申请的邮箱地址，几乎是刚申请完就收到答复的邮件。&lt;/p&gt;

&lt;h2 id=&quot;步骤一新建自动化流&quot;&gt;步骤一：新建自动化流&lt;/h2&gt;

&lt;p&gt;如图所示，新建一个空白的自动化流，流名称以见名知义为标准，流的触发器搜索关键字&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gmail&lt;/code&gt;，只有一个选项。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/email_flow/2020-06-05_0005.webp&quot; alt=&quot;New Folw&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这里一般需要授权Flow访问Gmail的权限，在Flow里称之为&lt;strong&gt;连接器&lt;/strong&gt;，这里不演示如何操作。&lt;/p&gt;

&lt;h2 id=&quot;步骤二设置触发器&quot;&gt;步骤二：设置触发器&lt;/h2&gt;

&lt;p&gt;根据我在Gmail中定义的分类规则，所有Google Drive的申请邮件都在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Category/Forums&lt;/code&gt;分类中，根据实际情况填写即可。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/email_flow/2020-06-05_0006.webp&quot; alt=&quot;触发器&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;步骤三发送电子邮件&quot;&gt;步骤三：发送电子邮件&lt;/h2&gt;

&lt;p&gt;新增一个步骤，仍然搜索关键字&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gmail&lt;/code&gt;，选择&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;发送电子邮件&lt;/code&gt;这个操作。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/email_flow/2020-06-05_0007.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;如何在众多的邮件中定义收件人？&lt;/p&gt;

&lt;p&gt;经过分析后，我发现这类邮件有的是以申请人邮箱发送的，而有的是通过&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;drive-shares-noreply@google.com&lt;/code&gt;发送的，所以不能直接用现成的API直接获取发件人的Email地址。但是在正文中确实明确写了申请人的Email的，此时可以使用表达式把Email切割出来，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ctrl&lt;/code&gt;+&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Shift&lt;/code&gt;+&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Space&lt;/code&gt;激活表达式面板，我的规则切割如下。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;substring&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;triggerBody&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;?[&lt;span class=&quot;s1&quot;&gt;'Snippet'&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;,0,indexOf&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;triggerBody&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;?[&lt;span class=&quot;s1&quot;&gt;'Snippet'&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;,&lt;span class=&quot;s1&quot;&gt;'申请使用'&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# 邮件的正文开头就是 “test@gmail.com申请使用以下文件夹...” 这个格式的，所以我把“申请使用”前面的字符串剪过来就可以用了&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;主题可以写个模板，替换关键字就行了，我这里是使用表达式把收到的邮件的主题关键字剪了过来，用法与获取发件人地址类似。&lt;/p&gt;

&lt;p&gt;然后是正文的编写，也是固定的模板，再加上&lt;strong&gt;申请时间&lt;/strong&gt;和&lt;strong&gt;申请内容&lt;/strong&gt;这两个个性化的关键字。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 获取并格式化接收邮件时间的表达式&lt;/span&gt;
convertFromUtc&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;replace&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;triggerBody&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;?[&lt;span class=&quot;s1&quot;&gt;'DateTimeReceived'&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'+00:00'&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'.0000000Z'&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'China Standard Time'&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'yyyy年M月d日HH:mm:ss'&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;最后一个&lt;em&gt;substring&lt;/em&gt;和前两个一样，都是通过切割字符串来获取我们想要的信息。&lt;/p&gt;

&lt;h2 id=&quot;效果&quot;&gt;效果&lt;/h2&gt;

&lt;p&gt;到这里，一个自动化的流就写好了，点击保存，新的自动化流在第一次保存的时候一般要测试一下，那么我就不测试了（万一有啥问题就打脸了(&lt;em&gt;/ω＼&lt;/em&gt;)）。&lt;/p&gt;

&lt;p&gt;其实这个工作流我已经运行了两个多月将近70天了，不过一般数据保护条例(GDPR)规定，保留运行日志的时间不得超过 28 天。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/email_flow/2020-06-05_0008.webp&quot; alt=&quot;日志&quot; /&gt;&lt;/p&gt;

&lt;p&gt;下面这个就是我从发件箱看到的内容&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/email_flow/2020-06-05_0009.webp&quot; alt=&quot;发件箱&quot; /&gt;&lt;/p&gt;

&lt;p&gt;更多表达式的文档在这里：&lt;a href=&quot;https://docs.microsoft.com/en-us/azure/logic-apps/workflow-definition-language-functions-reference&quot;&gt;https://docs.microsoft.com&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 05 Jun 2020 12:39:55 +0000</pubDate>
        <link>old.blog.vmert.com/2020/Microsoft-Flow-Email</link>
        <guid isPermaLink="true">old.blog.vmert.com/2020/Microsoft-Flow-Email</guid>
        
        <category>Flow</category>
        
        <category>PowerAutomate</category>
        
        
      </item>
    
      <item>
        <title>PPA实现小One易统计自动打卡</title>
        <description>&lt;p&gt;本程序仅适用于身体健康且活动范围稳定人员使用，请如实填写相关信息。发现身体不适请停止使用并尽早上报！&lt;/p&gt;

&lt;!--excerpt--&gt;

&lt;p&gt;前因后果什么的这次就不讲了，天天被要求打卡，人都疲倦了，偶尔忘了就会被点名。。。&lt;/p&gt;

&lt;p&gt;本文在&lt;a href=&quot;http://blog.jboss.xyz/archives/179&quot;&gt;http://blog.jboss.xyz/archives/179&lt;/a&gt;基础上改进，新增多人**，结果数据置于服务器展示。&lt;/p&gt;

&lt;p&gt;建议有条件的同学在服务器上部署使用。&lt;/p&gt;

&lt;p&gt;在部署之前先获取易统计的&lt;strong&gt;ncov-access-token&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;登录 —&amp;gt; &lt;a href=&quot;https://www.ioteams.com/ncov&quot;&gt;https://www.ioteams.com/ncov&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;一定要保管好这个token，注意屏幕周围有没有眼睛盯着，小心被其他人看到，不然别人就帮你把卡给打了。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/2020-05-30_0001.webp&quot; alt=&quot;ncov-access-token&quot; /&gt;&lt;/p&gt;

&lt;p&gt;复制以下代码保存为&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ncov.py&lt;/code&gt;。&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;requests&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Ncov&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;token&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;headers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;application/json;charset=utf-8&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;ncov-access-token&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;token&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;__get_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;code_id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;address&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;_id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;__clock_in&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# https://www.ioteams.com/ncov/api/companies/default/question 参数
&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# https://www.ioteams.com/ncov/api/users/companies/switch 个人信息
&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# https://www.ioteams.com/ncov/api/users/last-report 历史情况
&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__get_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;last_report&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'https://www.ioteams.com/ncov/api/users/last-report'&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;requests&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;last_report&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;req&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;data&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;data&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;useless&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;_id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;company&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;updated_at&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;__v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;useless&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__clock_in&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;__get_daily_code&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'https://www.ioteams.com/ncov/api/users/dailyReports/{}'&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;requests&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;put&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dumps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__get_daily_code&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;link&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'https://www.ioteams.com/ncov/api/users/dailyReport'&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;requests&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;link&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dumps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;req&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;code_id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'data'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'data'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'_id'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;except&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;KeyError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'msg'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;,&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;except&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;其他错误，请登录后检查是否成功打卡 https://www.ioteams.com/ncov/ &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;,&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'msg'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;,&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;finally&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;strftime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;%Y-%m-%d %H:%M:%S&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;localtime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()))&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;code_id&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__name__&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'__main__'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;ea******************f5e5&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;**豪&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;7a******************e5e5&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;**琨&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;key&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;,&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;Ncov&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;使用者只需修改&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;user&lt;/code&gt;变量即可，通过测试得到的输出信息为&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;**豪,您今天已经创建过日报，无法再次创建,2020-05-30 13:55:33
**琨,您今天已经创建过日报，无法再次创建,2020-05-30 13:55:34
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这个日报的API貌似一天只能创建一次，再次创建就会返回&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;403&lt;/code&gt;了，所以如果当前已经签到过了，接口返回的信息会是&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'code':&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;403&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'msg':&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'您今天已经创建过日报，无法再次创建'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'errors':&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'您今天已经创建过日报，无法再次创建'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;否则&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;msg&lt;/code&gt;则应该是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Success&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;测试没问题之后可以把py文件放到服务器中去，设置定时任务，自动执行。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;crontab &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; 
&lt;span class=&quot;c&quot;&gt;# 新增定时任务，每天凌晨两点半打卡&lt;/span&gt;
30 2 &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; python3 ncov.py &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; ncov.csv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;以上定时任务含义为在服务器时间的每天凌晨两点半运行程序，并把&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;print&lt;/code&gt;的信息输出到&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ncov.csv&lt;/code&gt;文件。&lt;/p&gt;

&lt;p&gt;如果你的服务器上有web服务器和PHP的话，可以在工作目录建立一个名为&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ncov&lt;/code&gt;的子目录，并且把之前的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ncov.csv&lt;/code&gt;链接到该目录下。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;ln&lt;/span&gt; ~/ncov.csv /var/www/html/ncov/ncov.csv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;然后其中新建一个&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.php&lt;/code&gt;，内容如下：&lt;/p&gt;

&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;meta&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;http-equiv=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Content-Type&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;content=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;text/html; charset=utf-8&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;meta&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;http-equiv=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;X-UA-Compatible&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;content=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;IE=edge&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;title&amp;gt;&lt;/span&gt;易统计-打卡记录&lt;span class=&quot;nt&quot;&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;meta&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;viewport&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;content=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;width=device-width, initial-scale=1.0&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;meta&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;property=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;og:type&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;content=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;website&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;meta&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;title&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;content=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;易统计-打卡记录&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;style &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;text/css&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;table&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;nl&quot;&gt;border-collapse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;collapse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;nl&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;80%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;nl&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;auto&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;nl&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;15px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;nl&quot;&gt;text-align&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;center&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;jj_readcsv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$filename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$header&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$handle&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;fopen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$filename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;r&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'&amp;lt;table&amp;gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$header&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$csvcontents&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;fgetcsv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$handle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'&amp;lt;tr&amp;gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$csvcontents&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$headercolumn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&amp;lt;th&amp;gt;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$headercolumn&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;lt;/th&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'&amp;lt;/tr&amp;gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$csvcontents&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;fgetcsv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$handle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'&amp;lt;tr&amp;gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$csvcontents&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$column&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&amp;lt;td&amp;gt;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$column&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;lt;/td&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'&amp;lt;/tr&amp;gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'&amp;lt;/table&amp;gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;fclose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$handle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;jj_readcsv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'ncov.csv'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;?&amp;gt;&lt;/span&gt; 
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;本教程至此结束，如果其他诸如apache和PHP的配置没有问题，那么当你访问&lt;a href=&quot;https://[Your Domain]/ncov&quot;&gt;https://[Your Domain]/ncov&lt;/a&gt;的时候就能看见PY程序每天打卡的信息了。&lt;/p&gt;

&lt;p&gt;附上我的截图，就不放链接地址了，机子太小以防被打。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/2020-05-30_0002.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;参考链接&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;http://blog.jboss.xyz/archives/179&quot;&gt;http://blog.jboss.xyz/archives/179&lt;/a&gt;  &lt;br /&gt;
&lt;a href=&quot;https://stackoverflow.com/questions/518795/dynamically-display-a-csv-file-as-an-html-table-on-a-web-page/8612755#8612755&quot;&gt;Dynamically display a CSV file as an HTML table on a web page&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        <pubDate>Sat, 30 May 2020 13:29:37 +0000</pubDate>
        <link>old.blog.vmert.com/2020/PPA-One</link>
        <guid isPermaLink="true">old.blog.vmert.com/2020/PPA-One</guid>
        
        <category>Python</category>
        
        <category>PHP</category>
        
        
      </item>
    
      <item>
        <title>Ant Jmeter Jenkins 持续集成环境</title>
        <description>&lt;p&gt;本文旨在快速搭建一个Jenkins持续集成的测试环境，其中用到的资料均以编写时最新的稳定版为主。&lt;/p&gt;

&lt;!--excerpt--&gt;

&lt;h1 id=&quot;安装并配置jdk&quot;&gt;安装并配置JDK&lt;/h1&gt;

&lt;p&gt;先检查一本地有没有JDK，有的话就不用下载了，免得浪费时间。
&lt;img src=&quot;/assets/img/AntJJ/2020-05-16_0003.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;可以看到，我本地的一些其他软件自带了JDK，而且应该有三个不同的版本，选择最新的版本设置环境变量就行。如果本地没有现成的JDK，那么建议直接下载最新的长期支持版即可。&lt;/p&gt;

&lt;p&gt;Download：&lt;a href=&quot;https://openjdk.java.net&quot;&gt;https://openjdk.java.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/AntJJ/2020-05-16_0004.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;然后在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;path&lt;/code&gt;里面加一行&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%JAVA_HOME%\bin&lt;/code&gt;,保存并验证。
&lt;img src=&quot;/assets/img/AntJJ/2020-05-16_0005.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;jmeter安装配置&quot;&gt;Jmeter安装配置&lt;/h1&gt;

&lt;h2 id=&quot;下载jmeter&quot;&gt;下载Jmeter&lt;/h2&gt;

&lt;p&gt;Download：&lt;a href=&quot;https://jmeter.apache.org&quot;&gt;https://jmeter.apache.org&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;配置环境&quot;&gt;配置环境&lt;/h2&gt;

&lt;p&gt;新建一个变量名&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Jmeter&lt;/code&gt;，变量值如下：
&lt;img src=&quot;/assets/img/AntJJ/2020-05-16_0008.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;再把变量名加到&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;path&lt;/code&gt;里。
&lt;img src=&quot;/assets/img/AntJJ/2020-05-16_0009.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Jemter默认保存de是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jtl&lt;/code&gt;格式的文件，需要设置&lt;strong&gt;Jmeter/bin/jmeter.properties&lt;/strong&gt;的内容，把&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jmeter.save.saveservice.output_format=csv&lt;/code&gt;改为&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jmeter.save.saveservice.output_format=xml&lt;/code&gt;&lt;/p&gt;

&lt;h1 id=&quot;ant安装配置&quot;&gt;Ant安装配置&lt;/h1&gt;
&lt;h2 id=&quot;下载ant&quot;&gt;下载Ant&lt;/h2&gt;

&lt;p&gt;Download：&lt;a href=&quot;http://ant.apache.org/bindownload.cgi&quot;&gt;http://ant.apache.org/bindownload.cgi&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;配置环境-1&quot;&gt;配置环境&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/assets/img/AntJJ/2020-05-16_0011.webp&quot; alt=&quot;image&quot; /&gt;
然后在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;path&lt;/code&gt;里面加一行&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%ANT%&lt;/code&gt;，保存后打开CMD验证一下。
&lt;img src=&quot;/assets/img/AntJJ/2020-05-16_0013.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;从Jmeter的安装目录中找到&lt;strong&gt;apache-jmeter-5.2.1\extras\ant-jmeter-1.1.1.jar&lt;/strong&gt;，把这个文件复制到Ant的&lt;strong&gt;lib&lt;/strong&gt;目录中。
否则Ant在运行报错说找不到&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;org.programmerplanet.ant.taskdefs.jmeter.JMeterTask&lt;/code&gt;这个类。&lt;/p&gt;

&lt;h1 id=&quot;jenkins安装配置&quot;&gt;Jenkins安装配置&lt;/h1&gt;

&lt;h2 id=&quot;下载jenkins&quot;&gt;下载Jenkins&lt;/h2&gt;
&lt;p&gt;一般情况下，下载的都是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;war&lt;/code&gt;格式的包。&lt;/p&gt;

&lt;p&gt;Download：&lt;a href=&quot;https://www.jenkins.io/download&quot;&gt;https://www.jenkins.io/download&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;安装&quot;&gt;安装&lt;/h2&gt;

&lt;p&gt;emmmmm 直接下载到TomCat的工作目录就可以了，啥是安装？&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;apache-tomcat-9.0.35/webapps&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;jenkins跑起来&quot;&gt;Jenkins跑起来&lt;/h1&gt;

&lt;p&gt;进入TomCat的&lt;strong&gt;bin&lt;/strong&gt;目录，运行&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;startup&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;apache-tomcat-9.0.35&lt;span class=&quot;se&quot;&gt;\b&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;in
&lt;/span&gt;startup.bat
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;对自己有信心的话，就不用看CMD的输出信息了，直接打开网址&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;http://localhost:8080/{{jenkins-2.222.3}}&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;注意这里花括号搞起来的是&lt;strong&gt;webapps&lt;/strong&gt;目录里Jenkins的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;war&lt;/code&gt;包的文件名
&lt;img src=&quot;/assets/img/AntJJ/2020-05-16_0014.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;一般来说，默认的Jenkins插件源在国内都很慢，不用点魔法根本不能玩，对于不会魔法的同学我也要妙招要写出来。&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;找到Jenkins根目录的&lt;strong&gt;hudson.model.UpdateCenter.xml&lt;/strong&gt;文件，把源地址改为&lt;strong&gt;http://mirror.xmission.com/jenkins/updates/update-center.json&lt;/strong&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;编辑&lt;strong&gt;Jenkins\updates\default.json&lt;/strong&gt;，把所有的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;updates.jenkins-ci.org/download&lt;/code&gt;替换为&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mirrors.tuna.tsinghua.edu.cn/jenkins&lt;/code&gt;，把&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://www.google.com/&lt;/code&gt;替换为&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://www.baidu.com/&lt;/code&gt;。&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;然后再去安装插件就超级快了，安装插件的时候也不要闲着，来建一个Jenkins项目目录，结构如下：&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;.
└── JmeterAutoTest //项目根目录
    ├── build.xml //Ant的构建文件
    ├── resultlog //输出结果
    │   ├── html
    │   └── jtl
    └── script //放Jemter的脚本
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;其中&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;build.xml&lt;/code&gt;内容如下：&lt;/p&gt;
&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;project&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;pc&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;default=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;all&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;basedir=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;\JmeterAutoTest&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;tstamp&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;format&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;property=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;time&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;pattern=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;yyyyMMddhhmm&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/tstamp&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- 改成自己本地的 Jmeter 目录--&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jmeter.home&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;\Services\apache-jmeter-5.2.1&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- jmeter生成jtl格式的结果报告的路径--&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jmeter.result.jtl.dir&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;\JmeterAutoTest\resultlog\jtl&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- jmeter生成html格式的结果报告的路径--&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jmeter.result.html.dir&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;\JmeterAutoTest\resultlog\html&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- 生成的报告的前缀 --&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ReportName&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;TestReport&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jmeter.result.jtlName&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${jmeter.result.jtl.dir}/${ReportName}${time}.jtl&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jmeter.result.htmlName&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${jmeter.result.html.dir}/${ReportName}${time}.html&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- 接收测试报告的邮箱 --&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;mail_from&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;support@vmert.com&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;mail_to&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;juch@vmert.com&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;target&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;all&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;antcall&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;target=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;test&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;antcall&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;target=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;report&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
		&lt;span class=&quot;nt&quot;&gt;&amp;lt;antcall&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;target=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;send&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/target&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;target&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;test&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;taskdef&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jmeter&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;classname=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;org.programmerplanet.ant.taskdefs.jmeter.JMeterTask&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;jmeter&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;jmeterhome=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${jmeter.home}&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;resultlog=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${jmeter.result.jtlName}&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- 声明要运行的脚本。&quot;*.jmx&quot;指包含此目录下的所有jmeter脚本 --&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;testplans&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;dir=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;\JmeterAutoTest\script&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/jmeter&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/target&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;nt&quot;&gt;&amp;lt;path&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;xslt.classpath&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;fileset&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;dir=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${jmeter.home}/lib&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;includes=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;xalan*.jar&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;fileset&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;dir=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${jmeter.home}/lib&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;includes=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;serializer*.jar&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/path&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;nt&quot;&gt;&amp;lt;target&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;report&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;xslt&lt;/span&gt;
	    &lt;span class=&quot;na&quot;&gt;classpathref=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;xslt.classpath&quot;&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;force=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;true&quot;&lt;/span&gt;
	    &lt;span class=&quot;na&quot;&gt;in=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${jmeter.result.jtlName}&quot;&lt;/span&gt; 
	    &lt;span class=&quot;na&quot;&gt;out=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${jmeter.result.htmlName}&quot;&lt;/span&gt; 
	    &lt;span class=&quot;na&quot;&gt;style=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${jmeter.home}/extras/jmeter-results-detail-report_21.xsl&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;param&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;dateReport&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;expression=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${time}&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
	&lt;span class=&quot;nt&quot;&gt;&amp;lt;/xslt&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- 因为上面生成报告的时候，不会将相关的图片也一起拷贝至目标目录，所以，需要手动拷贝 --&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;copy&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;todir=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${jmeter.result.html.dir}&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;fileset&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;dir=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${jmeter.home}/extras&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;include&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;collapse.webp&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nt&quot;&gt;&amp;lt;include&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;expand.webp&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;/fileset&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/copy&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/target&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- 发送邮件 --&amp;gt;&lt;/span&gt;
	&lt;span class=&quot;nt&quot;&gt;&amp;lt;target&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;send&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- 填写你发送邮件的邮箱的STMP信息 --&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;mail&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;mailhost=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;smtp.office365.com&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;mailport=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;25&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;subject=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Test Report!&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;messagemimetype=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;text/html&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;user=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;support@vmert.com&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;password=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;****************&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;from&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;address=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${mail_from}&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;to&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;address=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${mail_to}&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;message&amp;gt;&lt;/span&gt;This email was sent automatically by ANT. Please check the automation test report. Thank you!&lt;span class=&quot;nt&quot;&gt;&amp;lt;/message&amp;gt;&lt;/span&gt;
		&lt;span class=&quot;nt&quot;&gt;&amp;lt;attachments&amp;gt;&lt;/span&gt; 
			&lt;span class=&quot;nt&quot;&gt;&amp;lt;fileset&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;dir=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${jmeter.result.html.dir}&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
				&lt;span class=&quot;nt&quot;&gt;&amp;lt;include&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${ReportName}${time}.html&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
			&lt;span class=&quot;nt&quot;&gt;&amp;lt;/fileset&amp;gt;&lt;/span&gt;
		&lt;span class=&quot;nt&quot;&gt;&amp;lt;/attachments&amp;gt;&lt;/span&gt;
		&lt;span class=&quot;nt&quot;&gt;&amp;lt;/mail&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/target&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;项目目录配置好后估计Jenkins也初始化完成了。&lt;/p&gt;

&lt;p&gt;来 Create new jobs 吧！&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/AntJJ/2020-05-16_0015.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;附录&quot;&gt;附录&lt;/h1&gt;

&lt;h2 id=&quot;tomcat&quot;&gt;TomCat&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/AntJJ/tomcat.webp&quot; alt=&quot;image&quot; /&gt;
获得猫咪：&lt;a href=&quot;http://tomcat.apache.org&quot;&gt;http://tomcat.apache.org&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;download-list&quot;&gt;Download List&lt;/h2&gt;

&lt;p class=&quot;btn btn-warning&quot; style=&quot;display:list-item;&quot;&gt;&lt;a href=&quot;https://openjdk.java.net&quot; target=&quot;_blank&quot;&gt;Download JDK&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;btn btn-blue&quot; style=&quot;display:list-item;&quot;&gt;&lt;a href=&quot;https://jmeter.apache.org&quot; target=&quot;_blank&quot;&gt;Download Jmeter&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;btn btn-danger&quot; style=&quot;display:list-item;&quot;&gt;&lt;a href=&quot;http://ant.apache.org/bindownload.cgi&quot; target=&quot;_blank&quot;&gt;Download Ant&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;btn&quot; style=&quot;display:list-item;&quot;&gt;&lt;a href=&quot;https://www.jenkins.io/download&quot; target=&quot;_blank&quot;&gt;Download Jenkins&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Sat, 16 May 2020 03:33:46 +0000</pubDate>
        <link>old.blog.vmert.com/2020/Ant-Jmeter-Jenkins</link>
        <guid isPermaLink="true">old.blog.vmert.com/2020/Ant-Jmeter-Jenkins</guid>
        
        <category>Ant</category>
        
        <category>Jmeter</category>
        
        <category>Jenkins</category>
        
        <category>环境搭建</category>
        
        
      </item>
    
      <item>
        <title>Win10中PHP的安装及配置</title>
        <description>&lt;p&gt;本文非WAMP集成环境，内容为&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Apache&lt;/code&gt;和&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PHP&lt;/code&gt;的安装于配置，所有内容以编写播客时的版本为准。&lt;/p&gt;

&lt;!--excerpt--&gt;

&lt;h1 id=&quot;安装apache&quot;&gt;安装Apache&lt;/h1&gt;

&lt;h2 id=&quot;下载apache&quot;&gt;下载Apache&lt;/h2&gt;

&lt;p&gt;首先下载最新版&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Apache HTTP Server 2.4.43&lt;/code&gt;：&lt;a href=&quot;http://httpd.apache.org/download.cgi&quot; target=&quot;_blank&quot;&gt;http://httpd.apache.org/download.cgi&lt;/a&gt;，找到&lt;a href=&quot;http://httpd.apache.org/docs/current/platform/windows.html#down&quot; target=&quot;_blank&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Files for Microsoft Windows&lt;/code&gt;&lt;/a&gt;，选择&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ApacheHaus&lt;/code&gt;，根据自己电脑的情况下载不同的二进制文件。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/Apache_PHP/2020-05-15_0001.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;下载结果为二进制压缩包，直接解压到自己的工作目录就可以，后文中我将以下面这个目录为例。&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;C:\Users\Juch\Application&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;解压&quot;&gt;解压&lt;/h2&gt;

&lt;p&gt;如图我解压后的安装目录为&lt;strong&gt;C:\Users\Juch\Application\httpd-2.4.43-o111g-x64-vc15\Apache24&lt;/strong&gt;
&lt;img src=&quot;/assets/img/Apache_PHP/2020-05-15_0002.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;配置&quot;&gt;配置&lt;/h2&gt;

&lt;h3 id=&quot;环境变量&quot;&gt;环境变量&lt;/h3&gt;

&lt;p&gt;由于是二进制文件，所以需要自己添加环境变量。&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;根据个人习惯选择是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;用户环境变量&lt;/code&gt;还是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;系统环境变量&lt;/code&gt;；&lt;/li&gt;
  &lt;li&gt;把&lt;strong&gt;C:\Users\Juch\Application\httpd-2.4.43-o111g-x64-vc15\Apache24\bin&lt;/strong&gt;添加到Path；&lt;/li&gt;
  &lt;li&gt;确定Over；&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;配置文件&quot;&gt;配置文件&lt;/h3&gt;

&lt;p&gt;Apache的配置文件在安装目录的&lt;strong&gt;conf&lt;/strong&gt;目录中&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;C:\Users\Juch\Application\httpd-2.4.43-o111g-x64-vc15\Apache24\conf\httpd.conf&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;编辑&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;httpd.conf&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 找到 Define SRVROOT 把 SRVROOT 的值修改为Apache的安装目录&lt;/span&gt;
Define SRVROOT &lt;span class=&quot;s2&quot;&gt;&quot;C:/Users/Juch/Application/httpd-2.4.43-o111g-x64-vc15/Apache24&quot;&lt;/span&gt;
ServerRoot &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SRVROOT&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;保存后以管理员身份打开CMD，输入：&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;httpd &lt;span class=&quot;nt&quot;&gt;-k&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;如无错误信息，即代表安装完毕。此时就可以在Windows的服务中看到&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Apache24&lt;/code&gt;了。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;C:\WINDOWS\system32&amp;gt;httpd -k install&lt;br /&gt;
Installing the ‘Apache2.4’ service&lt;br /&gt;
The ‘Apache2.4’ service is successfully installed.&lt;br /&gt;
Testing httpd.conf….&lt;br /&gt;
Errors reported here must be corrected before the service can be started.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/Apache_PHP/2020-05-15_0003.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;服务启动后，可以使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;httpd&lt;/code&gt;命令启动、停止和重启Apache了&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;httpd &lt;span class=&quot;nt&quot;&gt;-k&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; start | stop | restart | uninstall &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;启动Apache后在浏览器输入&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;localshost&lt;/code&gt;不出意外就会出现下面的页面，表示配置完成。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/Apache_PHP/localhost_index.html.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;安装php&quot;&gt;安装PHP&lt;/h1&gt;

&lt;h2 id=&quot;下载php&quot;&gt;下载PHP&lt;/h2&gt;

&lt;p&gt;下载最新的稳定版&lt;strong&gt;PHP 7.4.6&lt;/strong&gt;，&lt;a href=&quot;https://www.php.net/downloads.php&quot; target=&quot;_blank&quot;&gt;https://www.php.net/downloads.php&lt;/a&gt;，点击&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Windows downloads&lt;/code&gt;建议下载线程安全&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Thread Safe&lt;/code&gt;版本。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/Apache_PHP/2020-05-15_0004.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;解压-1&quot;&gt;解压&lt;/h2&gt;

&lt;p&gt;把下载的二进制文件解压到工作目录&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/Apache_PHP/2020-05-15_0005.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;配置-1&quot;&gt;配置&lt;/h2&gt;

&lt;h3 id=&quot;环境变量-1&quot;&gt;环境变量&lt;/h3&gt;

&lt;p&gt;同样的，安装PHP也需要我们自己设置环境变量&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;根据个人习惯选择是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;用户环境变量&lt;/code&gt;还是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;系统环境变量&lt;/code&gt;；&lt;/li&gt;
  &lt;li&gt;把&lt;strong&gt;C:\Users\Juch\Application\php-7.4.6-Win32-vc15-x64&lt;/strong&gt;添加到Path；&lt;/li&gt;
  &lt;li&gt;确定Over；&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;打开CMD输入&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;php -v&lt;/code&gt;验证一下是否配置成功，出现php版本信息即代表成功。&lt;/p&gt;

&lt;h3 id=&quot;配置文件-1&quot;&gt;配置文件&lt;/h3&gt;

&lt;p&gt;在修改PHP的配置文件之前，首先修改Apache的配置文件，因为PHP要和Web服务配合使用。
修改&lt;strong&gt;C:\Users\Juch\Application\httpd-2.4.43-o111g-x64-vc15\Apache24\conf\httpd.conf&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 修改LoadModul的位置&lt;/span&gt;
LoadModule php5_module &lt;span class=&quot;s2&quot;&gt;&quot;C:&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\U&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;sers&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\J&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;uch&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\A&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;pplication&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\p&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;hp-7.4.6-Win32-vc15-x64&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\p&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;hp7apache2_4.dll&quot;&lt;/span&gt;
PHPIniDir &lt;span class=&quot;s2&quot;&gt;&quot;C:&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\U&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;sers&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\J&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;uch&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\A&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;pplication&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\p&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;hp-7.4.6-Win32-vc15-x64&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\p&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;hp.ini&quot;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# 添加支持&lt;/span&gt;
AddType application/x-httpd-php .php .html

&lt;span class=&quot;c&quot;&gt;# 修改首页文件类型&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# DirectoryIndex: sets the file that Apache will serve if a directory is requested.&lt;/span&gt;
&amp;lt;IfModule dir_module&amp;gt;
    DirectoryIndex index.php index.html
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;接下来将PHP安装目录中的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;php.ini-development&lt;/code&gt;备份一下，重命名为&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;php.ini&lt;/code&gt;开始修改&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; extension_dir &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;./&quot;&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# 修改为&lt;/span&gt;
extension_dir &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;C:&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\U&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;sers&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\J&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;uch&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\A&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;pplication&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\p&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;hp-7.4.6-Win32-vc15-x64&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\e&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;xt&quot;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# 根据自己的需求打开扩展&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;extension&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;curl
&lt;span class=&quot;nv&quot;&gt;extension&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;gd2
&lt;span class=&quot;nv&quot;&gt;extension&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;gmp
&lt;span class=&quot;nv&quot;&gt;extension&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;imap
&lt;span class=&quot;nv&quot;&gt;extension&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;mbstring
&lt;span class=&quot;nv&quot;&gt;extension&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;mysqli
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;记得保存，然后重启Apache服务&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;httpd &lt;span class=&quot;nt&quot;&gt;-k&lt;/span&gt; restart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;验证&quot;&gt;验证&lt;/h3&gt;

&lt;p&gt;在Apache工作目录&lt;strong&gt;C:\Users\Juch\Application\httpd-2.4.43-o111g-x64-vc15\Apache24\htdocs&lt;/strong&gt;新建一个内容为&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;?php phpinfo(); ?&amp;gt;&lt;/code&gt;的php文件，命名为&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.php&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/Apache_PHP/2020-05-15_0006.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;然后在浏览器进入&lt;a href=&quot;http://localhost/index.php&quot; target=&quot;_blank&quot;&gt;http://localhost/index.php&lt;/a&gt;,看到如下内容即表示配置成功。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/Apache_PHP/2020-05-15_0007.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;结语&quot;&gt;结语&lt;/h1&gt;

&lt;p&gt;以上PHP环境搭建的记录，均基于当时的软件版本，现实操作中应根据自己电脑的环境进行修改切勿复制粘贴。&lt;/p&gt;

&lt;p class=&quot;btn btn-blue&quot; style=&quot;display:list-item;&quot;&gt;&lt;a href=&quot;http://httpd.apache.org/download.cgi&quot; target=&quot;_blank&quot;&gt;Download Apache&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;btn&quot; style=&quot;display:list-item;&quot;&gt;&lt;a href=&quot;https://www.php.net/downloads.php&quot; target=&quot;_blank&quot;&gt;Download PHP&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 15 May 2020 04:03:04 +0000</pubDate>
        <link>old.blog.vmert.com/2020/install_PHP</link>
        <guid isPermaLink="true">old.blog.vmert.com/2020/install_PHP</guid>
        
        <category>PHP7</category>
        
        <category>环境搭建</category>
        
        
      </item>
    
      <item>
        <title>gclone配置教程</title>
        <description>&lt;p&gt;由于众说周知的原因，GoogleDrive的资源要比国内某些网盘要丰富不少，并且良心的是其不限速无限容量的特征。由此我便成了GoogleDrive的拥趸，惟一遗憾的就是GoogleDrive限制单用户每日复制量不得超过750GB。&lt;/p&gt;

&lt;!--excerpt--&gt;

&lt;p&gt;不过其实早就有&lt;a href=&quot;https://github.com/xyou365/AutoRclone/&quot; target=&quot;_blank&quot;&gt;AutoRclone&lt;/a&gt;可以突破750的限制，其原理就是使用Google Cloud Platform创建项目，生成服务账号，再用服务账号来copy，达到750的时候自动切换，以此来日存1000TB。但是这个不是和原版的Rclone一样的操作方式，用起来总感觉别扭。于是就有了Gclone，脱胎于rclone，一键安装，无痛切换。&lt;/p&gt;

&lt;h2 id=&quot;gclone能做什么&quot;&gt;Gclone能做什么&lt;/h2&gt;
&lt;p&gt;简而言之，&lt;a href=&quot;https://rclone.org/docs/&quot; target=&quot;_blank&quot;&gt;Rclone&lt;/a&gt;能做的&lt;a href=&quot;https://github.com/donwa/gclone/&quot; target=&quot;_blank&quot;&gt;Gclone&lt;/a&gt;都能做，当然这是相对于GoogleDrive来说的。
并且在通过&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--drive-server-side-across-configs&lt;/code&gt;实现使用GoogleAPI复制资源，不走VPS流量，这在copy团队盘的时候尤其有用。&lt;/p&gt;

&lt;h2 id=&quot;安装gclone&quot;&gt;安装Gclone&lt;/h2&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 安装gclone&lt;/span&gt;
bash &amp;lt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;wget &lt;span class=&quot;nt&quot;&gt;-qO-&lt;/span&gt; https://git.io/gclone.sh&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# View version information&lt;/span&gt;
gclone version
&lt;span class=&quot;c&quot;&gt;# 替换rclone，因为gclone是rclone的增强分支，所以可以兼容rclone&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;cp&lt;/span&gt; /usr/bin/gclone /usr/bin/rclone
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;配置gclone&quot;&gt;配置Gclone&lt;/h2&gt;
&lt;p&gt;由于gclone依赖&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;service_account_file_path&lt;/code&gt;和&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;service_account_file_path&lt;/code&gt;所以这一节放到后面部分，建议按顺序读。&lt;/p&gt;

&lt;p style=&quot;text-indent: 0;font-size: 20px;text-align: center;&quot;&gt;&lt;a href=&quot;#继续配置gclone&quot;&gt;👉🏻直达配置&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;怎么使用gclone&quot;&gt;怎么使用Gclone&lt;/h2&gt;
&lt;p&gt;你得准备Google账号、Google Shared Drive （团队盘）、Python3环境，至于这些怎么安排就不赘述了。
由于单独使用&lt;a href=&quot;https://github.com/donwa/gclone/&quot; target=&quot;_blank&quot;&gt;Gclone&lt;/a&gt;是不能实现自动切换账号的，所以需要先配置一下&lt;a href=&quot;https://github.com/xyou365/AutoRclone/&quot; target=&quot;_blank&quot;&gt;AutoRclone&lt;/a&gt;，因为&lt;a href=&quot;https://github.com/donwa/gclone/&quot; target=&quot;_blank&quot;&gt;Gclone&lt;/a&gt;是需要依赖&lt;a href=&quot;https://github.com/xyou365/AutoRclone/&quot; target=&quot;_blank&quot;&gt;AutoRclone&lt;/a&gt;生成出来的Service Accounts账号的。&lt;/p&gt;

&lt;h3 id=&quot;第一步安装autorclone&quot;&gt;第一步：安装&lt;a href=&quot;https://github.com/xyou365/AutoRclone/&quot;&gt;AutoRclone&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git clone https://github.com/xyou365/AutoRclone &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;AutoRclone &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; pip3 &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;第二步生成service-accounts账号&quot;&gt;第二步：生成Service Accounts账号&lt;/h3&gt;
&lt;p&gt;这个要合理安排，因为每个谷歌账号的项目数是有限制的（25个），不要全部用光了，也要注意看文档，不要把已有的服务账号覆盖了🧐。
首先要打开&lt;a href=&quot;https://developers.google.com/drive/api/v3/quickstart/python/&quot; target=&quot;_blank&quot;&gt;Google Drive API&lt;/a&gt;，点击&lt;strong&gt;Enable the Drive API&lt;/strong&gt;然后将其生成的&lt;strong&gt;credentials.json&lt;/strong&gt;保存到&lt;a href=&quot;https://github.com/xyou365/AutoRclone/&quot; target=&quot;_blank&quot;&gt;AutoRclone&lt;/a&gt;的根目录。&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;In resulting dialog click DOWNLOAD CLIENT CONFIGURATION and save the file credentials.json to your working directory.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/gclone/20200407162911.webp&quot; alt=&quot;Google Drive API&quot; class=&quot;post-image&quot; height=&quot;256px&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;
&lt;p style=&quot;text-indent: 0;font-size: 30px;text-align: center;&quot;&gt;现在开始知识点①🖋&lt;/p&gt;

&lt;p&gt;1，首先确保当前处在AutoRclone根目录，如果你从来没有在Google Cloud Platform创建过项目，可以直接运行&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 新建6个项目&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# 每个项目默认100个Service Accounts（然后你就有600个sa账号了，每天可copy大约439.453125TB的文件）&lt;/span&gt;
python3 gen_sa_accounts.py &lt;span class=&quot;nt&quot;&gt;--quick-setup&lt;/span&gt; 6
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;2，如果你曾经使用过Google Cloud Platform，并且还有项目在使用中，这需要特别说明；&lt;/p&gt;

&lt;p&gt;2.1，在已有的项目之外，新的项目中创建Service Accounts&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 在已有项目之外，新建6个项目&lt;/span&gt;
python3 gen_sa_accounts.py &lt;span class=&quot;nt&quot;&gt;--quick-setup&lt;/span&gt; 6 &lt;span class=&quot;nt&quot;&gt;--new-only&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;2.2，覆盖已有的项目，&lt;strong&gt;使用此命令需慎重&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 这会覆盖已有的项目的Service Accounts，至于覆盖的是哪些，我也不知道😂，所以要慎重&lt;/span&gt;
python3 gen_sa_accounts.py &lt;span class=&quot;nt&quot;&gt;--quick-setup&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p style=&quot;text-indent: 0;font-size: 30px;text-align: center;&quot;&gt;知识点①结束🖋&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;运行以上任意一个命令都会得到一串返回信息，类似于
&lt;img src=&quot;/assets/img/gclone/20200408162455.webp&quot; alt=&quot;&quot; class=&quot;post-image&quot; /&gt;
复制链接后打开，有可能会提示不安全，未经过验证等信息，直接进入，不必理会。然后就可以授权了，直接点允许，最终会获得授权码，贴到终端即可。
注意，如果提示
&lt;img src=&quot;/assets/img/gclone/20200408151101.webp&quot; alt=&quot;&quot; class=&quot;post-image&quot; /&gt;
打开提示信息给出的链接，选择启用&lt;strong&gt;Service Usage API&lt;/strong&gt;，启用之后再回到终端摁个回车即可。
&lt;img src=&quot;/assets/img/gclone/20200408151008.webp&quot; alt=&quot;&quot; class=&quot;post-image&quot; /&gt;
如果顺利运行，可以在&lt;em&gt;accounts&lt;/em&gt;这个文件夹下面看到你生成的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;项目数*100&lt;/code&gt;个json的文件。&lt;/p&gt;

&lt;h3 id=&quot;第三步将sa账号加入团队盘&quot;&gt;第三步：将sa账号加入团队盘&lt;/h3&gt;
&lt;p&gt;由于团队盘最多只能添加600个账号，所以使用&lt;a href=&quot;https://groups.google.com/&quot;&gt;Google Groups&lt;/a&gt;进行管理，既方便又可靠。&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Official limits to the members of Team Drive (Limit for individuals and groups directly added as members is 600).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;先来获取&lt;a href=&quot;https://console.cloud.google.com/iam-admin/serviceaccounts/&quot;&gt;sa&lt;/a&gt;账号对应的&lt;a href=&quot;https://console.cloud.google.com/iam-admin/serviceaccounts/&quot;&gt;email&lt;/a&gt;，在chrome商店下载&lt;a href=&quot;https://chrome.google.com/webstore/detail/emaildrop-extract-emails/peilgijmhiocdmdeglhiljipigamfbjh&quot;&gt;“EmailDrop - 轻松提取电邮”&lt;/a&gt;就能提取到页面里的Email了，一个项目有100个sa的邮箱，通常一页只显示50个。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/gclone/20200407172105.webp&quot; alt=&quot;search Email&quot; class=&quot;post-image&quot; height=&quot;256px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;一次可以获取一个项目（100个sa账号）的email，保存起来再说。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/gclone/20200407173057.webp&quot; alt=&quot;get Email&quot; class=&quot;post-image&quot; width=&quot;512px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;然后在&lt;a href=&quot;https://groups.google.com/&quot;&gt;Groups&lt;/a&gt;新建一个群组，名称什么的随意，主要是新建群组，其实已有的群组也可以。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/gclone/20200407171509.webp&quot; alt=&quot;New Groups&quot; class=&quot;post-image&quot; height=&quot;256px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;再把sa账号对应的email地址加到群组里就可以了，不过普通用户一次只能添加10个账号到群组，一天只能添加100个。那么600个sa要分6天来添加，所以要把sa账号的分组做好，避免时间久了混乱。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/gclone/20200407175345.webp&quot; alt=&quot;Add Email&quot; class=&quot;post-image&quot; height=&quot;256px&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;如果你的Google账号是G Suite账号而不是个人账号的话，可以使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;add_to_google_group.py&lt;/code&gt;批量导入，节省时间。&lt;/p&gt;

&lt;p&gt;群组必须创建在组织中才能调用API不然，出错都不知道为什么。
&lt;img src=&quot;/assets/img/gclone/20200408170306.webp&quot; alt=&quot;在组织中新建群组&quot; class=&quot;post-image&quot; height=&quot;256px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;然后再按照官方文档打开&lt;a href=&quot;https://developers.google.com/admin-sdk/directory/v1/quickstart/python&quot;&gt;Directory API&lt;/a&gt;,这里面生成的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;credentials.json&lt;/code&gt;要放到&lt;strong&gt;credentials&lt;/strong&gt;文件夹里面，而不是AutoRclone的根目录，虽然同名，但是作用不一样，根目录的credentials.json用来创建sa账号，这里的credentials.json这是用来把sa添加进Groups。
&lt;img src=&quot;/assets/img/gclone/20200408151837.webp&quot; alt=&quot;获取Directory API&quot; class=&quot;post-image&quot; height=&quot;256px&quot; /&gt;&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;python3 add_to_google_group.py &lt;span class=&quot;nt&quot;&gt;-g&lt;/span&gt; GroupsName@yourdomain.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;有的时候一次跑完可能会漏掉一点，所以上面的命令可以多运行几遍。
&lt;img src=&quot;/assets/img/gclone/20200408171200.webp&quot; alt=&quot;add_to_google_group&quot; class=&quot;post-image&quot; height=&quot;256px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;假设现在你已经把sa全部添加到群组&lt;/strong&gt;，可以把群组账号添加到团队盘了&lt;/p&gt;

&lt;p&gt;先得到群组电子邮件地址，就是新建群组时设置的，可以安装下图方法找到。
&lt;img src=&quot;/assets/img/gclone/20200407180818.webp&quot; alt=&quot;Group 关于&quot; class=&quot;post-image&quot; height=&quot;256px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/gclone/20200407180625.webp&quot; alt=&quot;search groups email&quot; class=&quot;post-image&quot; height=&quot;256px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;添加进团队盘，相关权限按需设置即可，比如我默认给的是“内容管理员”。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/gclone/20200407181011.webp&quot; alt=&quot;team drive&quot; class=&quot;post-image&quot; height=&quot;256px&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;继续配置gclone&quot;&gt;继续配置Gclone&lt;/h2&gt;
&lt;p&gt;完成上述操作后，我们既获得了批量的sa账号，同时也使sa账号有了操作GoogleDrive的权限。&lt;/p&gt;

&lt;p&gt;这时就可以来配置Gclone&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 直接修改rclone配置文件即可&lt;/span&gt;
vim ~/.config/rclone/rclone.conf

&lt;span class=&quot;c&quot;&gt;# 尾部追加如下语句&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;gc]
&lt;span class=&quot;nb&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; drive  
scope &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; drive  
service_account_file &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; /root/accounts/1.json &lt;span class=&quot;c&quot;&gt;# /AutoRclone/accounts/ 中的随意一个json文件，要填绝对路径&lt;/span&gt;
service_account_file_path &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; /root/accounts/ &lt;span class=&quot;c&quot;&gt;# /AutoRclone/accounts/ 的绝对路径&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# 以上四句是必须的&lt;/span&gt;
root_folder_id &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; root
&lt;span class=&quot;c&quot;&gt;# 可以忽略，也可以把“root”设置为sa对其有权限的GoogldDrive的目录的id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;** 注意，复制可以，但是得改一改&lt;/p&gt;

&lt;p&gt;除了手动写配置文件，还可以自动new一个&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 打开rclone配置&lt;/span&gt;
rclone config
&lt;span class=&quot;c&quot;&gt;# 选择新建一个remote，具体步骤忽略，只需要在设置Client的时候写好路径就可以&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;/assets/img/gclone/20200407222224.webp&quot; alt=&quot;new rclone config&quot; class=&quot;post-image&quot; height=&quot;256px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;更可以进阶地，设置gclone的&lt;strong&gt;client_id&lt;/strong&gt;等，以下是我的gclone配置&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;gc]
&lt;span class=&quot;nb&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; drive
client_id &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; 1072&lt;span class=&quot;k&quot;&gt;********&lt;/span&gt;jtk9.apps.googleusercontent.com
client_secret &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; g87C&lt;span class=&quot;k&quot;&gt;********&lt;/span&gt;QO_a
scope &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; drive
token &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;access_token&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;ya29*****2dQ&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;token_type&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;Bearer&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;refresh_token&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;1//0e*****Qla0&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;expiry&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;2020-03-21T17:18:24.309427971+08:00&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
service_account_file &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; /home/&lt;span class=&quot;k&quot;&gt;****&lt;/span&gt;/&lt;span class=&quot;k&quot;&gt;****&lt;/span&gt;/AutoRclone/accounts/135&lt;span class=&quot;k&quot;&gt;*********&lt;/span&gt;0b15.json
service_account_file_path &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; /home/&lt;span class=&quot;k&quot;&gt;****&lt;/span&gt;/000TEMP/AutoRclone/accounts/
root_folder_id &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; 0ALH&lt;span class=&quot;k&quot;&gt;*********&lt;/span&gt;9PVA
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;使用gclone&quot;&gt;使用Gclone&lt;/h2&gt;
&lt;p&gt;至此大功告成，可以打包&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/AutoRclone/accounts&lt;/code&gt;和&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rclone.conf&lt;/code&gt;随身携带使用了。&lt;/p&gt;

&lt;p&gt;简单使用：复制&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gclone copy gc:&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;源id&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; gc:&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;目标id&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--drive-server-side-across-configs&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-P&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# 一下copy一个盘，岂不是很爽？&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;如果你跟我一样设置了&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;root_folder_id&lt;/code&gt;，那么连目标目录的id都可以不用写&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gclone copy gc:&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;源id&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; gc:/ &lt;span class=&quot;nt&quot;&gt;--drive-server-side-across-configs&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-P&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;** &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gc:{id}&lt;/code&gt;后面还可以加路径，如gc:{id}/videos；&lt;/p&gt;

&lt;p&gt;** 注：想要资源练练手的可以直接留言或者发邮件给我。&lt;/p&gt;

&lt;h2 id=&quot;附录&quot;&gt;附录&lt;/h2&gt;
&lt;p&gt;本文链接一览&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/xyou365/AutoRclone/&quot; target=&quot;_blank&quot;&gt;AutoRclone&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://rclone.org/docs/&quot; target=&quot;_blank&quot;&gt;Rclone&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/donwa/gclone/&quot; target=&quot;_blank&quot;&gt;Gclone&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://developers.google.com/drive/api/v3/quickstart/python/&quot; target=&quot;_blank&quot;&gt;Drive API&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://developers.google.com/admin-sdk/directory/v1/quickstart/python&quot; target=&quot;_blank&quot;&gt;Directory API&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://groups.google.com/&quot; target=&quot;_blank&quot;&gt;Google Groups&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://console.cloud.google.com/iam-admin/serviceaccounts/&quot; target=&quot;_blank&quot;&gt;Service Accounts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Tue, 07 Apr 2020 14:57:47 +0000</pubDate>
        <link>old.blog.vmert.com/2020/gclone-config</link>
        <guid isPermaLink="true">old.blog.vmert.com/2020/gclone-config</guid>
        
        <category>rclone</category>
        
        <category>gclone</category>
        
        <category>GoogleDrive</category>
        
        <category>环境搭建</category>
        
        
      </item>
    
      <item>
        <title>让Jekyll使用懒加载</title>
        <description>&lt;p&gt;什么叫懒加载：&lt;/p&gt;
&lt;blockquote title=&quot;引述自维基百科&quot;&gt;
  &lt;p&gt;惰性加载（英语：lazy loading、infinite scroll，又称延迟加载、懒加载、无限滚动、瀑布流），是一种设计模式，被运用在软件设计和网页设计当中，对于网页界面，其特征为用户透过鼠标，滚动浏览页面，直到页面下方时，就会自动加载更多内容；有多数网站采用这项网页设计，例如Google图片搜索、Google+、Facebook、Twitter、Pinterest和维基百科的Flow讨论系统。也有结合无限滚动和多页，两者特性的网页设计。而对于数据结构而言，惰性加载是指从一个数据对象通过方法获得里面的一个属性对象时，这个对应对象实际并没有随其父数据对象创建时一起保存在运行空间中，而是在其读取方法第一次被调用时才从其他数据源中加载到运行空间中，这样可以避免过早地导入过大的数据对象但并没有使用的空间占用浪费。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;!--excerpt--&gt;

&lt;p&gt;说人话就是指&lt;strong&gt;在网页中延迟加载图像&lt;/strong&gt;，是一种很好优化网页性能的方式。用户滚动到它们之前，可视区域外的图像不会加载。这与图像预加载相反，在网页上使用延迟加载将使网页加载更快。在某些情况下，它还可以帮助减少服务器负载。&lt;/p&gt;

&lt;p&gt;可见懒加载对于比较多图片的网页加速效果是明显的，但是使用懒加载后Markdown的写法会麻烦一点。&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;常用的懒加载懒人包有：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/ApoorvSaxena/lozad.js&quot; target=&quot;_blank&quot;&gt;lozad.js&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/verlok/lazyload&quot; target=&quot;_blank&quot;&gt;lazyload&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/aFarkas/lazysizes&quot; target=&quot;_blank&quot;&gt;lazysizes&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/tuupola/lazyload&quot; target=&quot;_blank&quot;&gt;lazyload&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;
&lt;p&gt;这里分享几个使用懒加载后Markdown的书写方法。 懒加载原理是将真实的图片地址存储在data-src中，当JS监听到该图片元素进入可视窗口时，再将自定义属性中的地址存储到src属性中，以达到加速网页载入的效果。我这里使用的是lazysizes。&lt;/p&gt;

&lt;p&gt;那么首先你应该在你的页面里引入这个js&lt;/p&gt;
&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;text/javascript&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/assets/js/lazysizes.min.js&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;第一种写法也是最基本的html的写法&quot;&gt;第一种写法，也是最基本的html的写法&lt;/h4&gt;
&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data-src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;image.jpg&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;lazyload&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;还可以写成响应式的&lt;/p&gt;
&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;img&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;data-sizes=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;auto&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;data-src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;image2.jpg&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;data-srcset=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;image1.jpg 300w,
    image2.jpg 600w,
    image3.jpg 900w&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;lazyload&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;视频也能搞定&lt;/p&gt;
&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;iframe&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;frameborder=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0&quot;&lt;/span&gt;
	&lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;lazyload&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;allowfullscreen=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;data-src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;//www.youtube.com/embed/ZfV-aYdU4uE&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;第二种写法即把html转化为markdown的语法&quot;&gt;第二种写法，即把html转化为Markdown的语法&lt;/h4&gt;
&lt;div class=&quot;language-md highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;![&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;sx&quot;&gt;){:&lt;/span&gt; class=&quot;lazyload&quot; data-src=&quot;assets/img/image.jpg&quot;}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p style=&quot;text-indent: 0;font-size: 30px;text-align: center;&quot;&gt;&lt;strong&gt;开始划重点&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;可以看到以上两种在Markdown里面使用懒加载的写法实在复杂，我只是想插个图片而已，这样一搞那我岂不是要把所有的图片重写，那么有么有简单的写法呢？&lt;/p&gt;

&lt;h4 id=&quot;第三种写法具有懒人精神的写法&quot;&gt;第三种写法，具有懒人精神的写法&lt;/h4&gt;
&lt;p&gt;因为&lt;strong&gt;Jekyll&lt;/strong&gt;是支持&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;liquid&lt;/code&gt;的，并且我们写的md文件最终都被转换为html格式的了，其在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;post.html&lt;/code&gt;中就是&lt;strong&gt;content&lt;/strong&gt;这个变量，翻一翻Liquid文档可以看到，liquid有一个&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;replace&lt;/code&gt;方法，那么我们就直接修改&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;post.html&lt;/code&gt;把文章的特定内容替换掉好了。&lt;/p&gt;

&lt;p&gt;*注意：这句话要放到&lt;strong&gt;{{ content }}&lt;/strong&gt;的上方&lt;/p&gt;
&lt;div class=&quot;language-liquid highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
&lt;span class=&quot;p&quot;&gt;{%&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;assign&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&amp;lt;img src&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&amp;lt;img class='lazyload' data-src&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;%}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;这句话的意思是，定义一个变量叫&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;content&lt;/code&gt;，然后它的值是把原来那个&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;content&lt;/code&gt;的“&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;img&lt;/code&gt;”标签的部分内容替换为我们上面提到过的懒加载写法，也就是加一个&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;class&lt;/code&gt;属性然后把&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;img&lt;/code&gt;标签的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;src&lt;/code&gt;替换为&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data-src&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;更进一步，虽然这样已经可以用了，但是当图片未加载完的时候始终显示的是文字占位符，这样并不好看，我们可以把它换成一个loading的图片。但是这个图片一定要小，要加载得很快，可以写base64，也可以用gif，啥都可以，但是注意一定要小。
我这里建议去&lt;a href=&quot;https://loading.io&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;loading.io&lt;/strong&gt;&lt;/a&gt;下载。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/loading.gif&quot; alt=&quot;loading.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这是我的&lt;em&gt;loading.gif&lt;/em&gt;，一个不到40k的动图，需要的可以自己下载。&lt;/p&gt;

&lt;p class=&quot;btn btn-warning&quot; style=&quot;padding-bottom:50em;&quot;&gt;&lt;a href=&quot;/assets/img/loading.gif&quot; target=&quot;_blank&quot;&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这时应该更新上面的写法&lt;/p&gt;
&lt;div class=&quot;language-liquid highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
&lt;span class=&quot;p&quot;&gt;{%&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;assign&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&amp;lt;img src&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&amp;lt;img class='lazyload' src='/assets/img/loading.gif' data-src&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;%}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;如此一来，所有的文章图片都不用改了，以后插图片还是按照正常的格式去写。&lt;/p&gt;
</description>
        <pubDate>Fri, 06 Mar 2020 00:00:00 +0000</pubDate>
        <link>old.blog.vmert.com/2020/Lazyload</link>
        <guid isPermaLink="true">old.blog.vmert.com/2020/Lazyload</guid>
        
        <category>Jekyll</category>
        
        <category>lazyload</category>
        
        <category>懒加载</category>
        
        
      </item>
    
      <item>
        <title>IntelliJ IDEA KeyMap 中文 pdf版</title>
        <description>&lt;p&gt;为了方便初从eclipse转到jetbrains的用户，因为两个编辑器的快捷键有诸多不一样，虽然官方有eclipse的快捷键映射，不过用久了发现还是IDEA的快捷键得心应手，所以特意根据最新的官方PDF（2019.3.3）制作了中文解释版的KeyMap。&lt;/p&gt;

&lt;!--excerpt--&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/HEAD/head-IDEA.webp&quot; alt=&quot;IDEA&quot; /&gt;&lt;/p&gt;

&lt;p&gt;可以看到有几个键我没译成中文，因为实在是不知道怎么翻译😥😥&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/ideaKeyMap.webp&quot; alt=&quot;KeyMap&quot; class=&quot;post-image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;话不多说，点击下载：&lt;/p&gt;

&lt;p class=&quot;btn&quot;&gt;&lt;a href=&quot;/assets/docs/ReferenceCard.pdf&quot; target=&quot;_blank&quot;&gt;Download&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Wed, 04 Mar 2020 00:00:00 +0000</pubDate>
        <link>old.blog.vmert.com/2020/IDEA-KeyMap-Chinese</link>
        <guid isPermaLink="true">old.blog.vmert.com/2020/IDEA-KeyMap-Chinese</guid>
        
        <category>IDEA</category>
        
        <category>KeyMap</category>
        
        <category>中文翻译</category>
        
        <category>pdf</category>
        
        
      </item>
    
  </channel>
</rss>