<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://tech.havocfuture.tw/zh-hans/blog</id>
    <title>havocFuture Blog</title>
    <updated>2025-06-09T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://tech.havocfuture.tw/zh-hans/blog"/>
    <subtitle>havocFuture Blog</subtitle>
    <icon>https://tech.havocfuture.tw/zh-hans/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[docker 常用指令整理]]></title>
        <id>https://tech.havocfuture.tw/zh-hans/blog/docker-common-commands</id>
        <link href="https://tech.havocfuture.tw/zh-hans/blog/docker-common-commands"/>
        <updated>2025-06-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[整理一下 docker 常用的指令，方便自己查询使用]]></summary>
        <content type="html"><![CDATA[<p>整理一下 docker 常用的指令，方便自己查询使用</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="映像档image相关指令">映像档（Image）相关指令<a href="https://tech.havocfuture.tw/zh-hans/blog/docker-common-commands#%E6%98%A0%E5%83%8F%E6%A1%A3image%E7%9B%B8%E5%85%B3%E6%8C%87%E4%BB%A4" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>指令</th><th>说明</th></tr></thead><tbody><tr><td>docker pull &lt;image&gt;</td><td>下载映像档</td></tr><tr><td>docker images</td><td>列出本地映像档</td></tr><tr><td>docker rmi &lt;image&gt;</td><td>删除映像档</td></tr><tr><td>docker build -t &lt;名称&gt;:&lt;标签&gt; .</td><td>由 Dockerfile 建立映像档</td></tr><tr><td>docker tag &lt;image&gt; &lt;newtag&gt;</td><td>重新标记一个映像档</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="容器container相关指令">容器（Container）相关指令<a href="https://tech.havocfuture.tw/zh-hans/blog/docker-common-commands#%E5%AE%B9%E5%99%A8container%E7%9B%B8%E5%85%B3%E6%8C%87%E4%BB%A4" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>指令</th><th>说明</th></tr></thead><tbody><tr><td>docker run -it --name &lt;name&gt; &lt;image&gt;</td><td>启动并进入交互式容器</td></tr><tr><td>docker run -d --name &lt;name&gt; &lt;image&gt;</td><td>后台执行容器</td></tr><tr><td>docker ps</td><td>查看正在运行的容器</td></tr><tr><td>docker ps -a</td><td>查看所有容器（包含已停止）</td></tr><tr><td>docker stop &lt;container&gt;</td><td>停止容器</td></tr><tr><td>docker start &lt;container&gt;</td><td>启动已停止容器</td></tr><tr><td>docker restart &lt;container&gt;</td><td>重新启动容器</td></tr><tr><td>docker rm &lt;container&gt;</td><td>删除容器（需先停止）</td></tr><tr><td>docker exec -it &lt;container&gt; bash</td><td>进入正在运行的容器 bash</td></tr><tr><td>docker logs &lt;container&gt;</td><td>查看容器日志</td></tr><tr><td>docker inspect &lt;container&gt;</td><td>查看容器详细资讯</td></tr><tr><td>docker cp &lt;container&gt;:&lt;path&gt; &lt;host_path&gt;</td><td>从容器复制档案到主机</td></tr><tr><td>docker cp &lt;host_path&gt; &lt;container&gt;:&lt;path&gt;</td><td>从主机复制档案到容器</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="资料卷volume与网路-相关指令">资料卷（Volume）与网路 相关指令<a href="https://tech.havocfuture.tw/zh-hans/blog/docker-common-commands#%E8%B5%84%E6%96%99%E5%8D%B7volume%E4%B8%8E%E7%BD%91%E8%B7%AF-%E7%9B%B8%E5%85%B3%E6%8C%87%E4%BB%A4" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>指令</th><th>说明</th></tr></thead><tbody><tr><td>docker volume create &lt;volume&gt;</td><td>建立资料卷</td></tr><tr><td>docker volume ls</td><td>列出所有资料卷</td></tr><tr><td>docker volume rm &lt;volume&gt;</td><td>删除资料卷</td></tr><tr><td>docker network ls</td><td>查看所有 Docker 网路</td></tr><tr><td>docker network create &lt;network&gt;</td><td>建立新的网路</td></tr><tr><td>docker network rm &lt;network&gt;</td><td>删除网路</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="系统与其他-相关指令">系统与其他 相关指令<a href="https://tech.havocfuture.tw/zh-hans/blog/docker-common-commands#%E7%B3%BB%E7%BB%9F%E4%B8%8E%E5%85%B6%E4%BB%96-%E7%9B%B8%E5%85%B3%E6%8C%87%E4%BB%A4" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>指令</th><th>说明</th></tr></thead><tbody><tr><td>docker info</td><td>查看 Docker 系统资讯</td></tr><tr><td>docker version</td><td>查看 Docker 版本</td></tr><tr><td>docker system df</td><td>查看磁碟空间使用状况</td></tr><tr><td>docker system prune</td><td>清理未使用的资源（映像档、容器、网路等）</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="docker-compose-相关指令">Docker Compose 相关指令<a href="https://tech.havocfuture.tw/zh-hans/blog/docker-common-commands#docker-compose-%E7%9B%B8%E5%85%B3%E6%8C%87%E4%BB%A4" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>指令</th><th>说明</th></tr></thead><tbody><tr><td>docker-compose up -d</td><td>依照 docker-compose.yml 启动服务（背景）</td></tr><tr><td>docker-compose down</td><td>停止并删除所有服务</td></tr><tr><td>docker-compose logs</td><td>查看 Compose 服务日志</td></tr><tr><td>docker-compose exec &lt;svc&gt; bash</td><td>进入某个服务的 bash</td></tr><tr><td>docker-compose ps</td><td>查看 Compose 服务状态</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="补充常用参数">补充常用参数<a href="https://tech.havocfuture.tw/zh-hans/blog/docker-common-commands#%E8%A1%A5%E5%85%85%E5%B8%B8%E7%94%A8%E5%8F%82%E6%95%B0" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<ul>
<li class="">-d：背景执行（detached）</li>
<li class="">-p &lt;主机 port&gt;:&lt;容器 port&gt;：port对映</li>
<li class="">-v &lt;主机路径&gt;:&lt;容器路径&gt;：挂载资料卷</li>
<li class="">--name &lt;名称&gt;：自订容器名称</li>
<li class="">--rm：容器停止后自动移除</li>
<li class="">-e &lt;环境变数&gt;=&lt;值&gt;：指定环境变数</li>
</ul>
<!-- -->
<div><iframe src="https://button.like.co/in/embed/havocfuture/button?referrer=https://tech.havocfuture.tw/zh-hans/blog/docker-common-commands"></iframe><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>版权声明</h5></div><div class="admonition-content"><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh_CN" target="_blank" rel="noopener noreferrer" title="CC BY-NC-SA 4.0"><img src="data:image/png;base64,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"></a>，转载请注明出处<br>本文键接: <a href="https://tech.havocfuture.tw/zh-hans/blog/docker-common-commands" target="_blank" rel="noopener noreferrer">https://tech.havocfuture.tw/zh-hans/blog/docker-common-commands</a></p></div></div><br><div class="row"><div class="col col--12"><div class="banner_m8Vh"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="9057051535" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div><br><div id="cusdis_thread" data-host="https://cusdis.com" data-app-id="60a126c4-a58f-4510-a5f4-c3d3d182b735" data-page-id="docker-common-commands" data-page-url="https://tech.havocfuture.tw/blog/docker-common-commands" data-page-title="docker 常用指令整理"></div><div class="row"><div class="col col--2"><div class="leftAd_demG"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="4460531054" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div></div>]]></content>
        <author>
            <name>Eric Cheng</name>
        </author>
        <category label="Docker" term="Docker"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[如何在 windows 开发环境切换 NodeJS 版本]]></title>
        <id>https://tech.havocfuture.tw/zh-hans/blog/switch-nodejs-version</id>
        <link href="https://tech.havocfuture.tw/zh-hans/blog/switch-nodejs-version"/>
        <updated>2025-04-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[原来开发环境和线上环境的 NodeJS 版本不一样，开发环境较新，但又不想把开发环境的版本降级，Python 可以用 conda 做版本控制，查了一下 NodeJS 也有类似的东西，叫做 nvm，简单做一下笔记]]></summary>
        <content type="html"><![CDATA[<p>原来开发环境和线上环境的 NodeJS 版本不一样，开发环境较新，但又不想把开发环境的版本降级，Python 可以用 conda 做版本控制，查了一下 NodeJS 也有类似的东西，叫做 nvm，简单做一下笔记</p>
<p>以下内容适用 windows 的环境</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="下载-nvm-windows">下载 nvm-windows<a href="https://tech.havocfuture.tw/zh-hans/blog/switch-nodejs-version#%E4%B8%8B%E8%BD%BD-nvm-windows" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>前往 GitHub 官方页面下载安装程式
🔗 <a href="https://github.com/coreybutler/nvm-windows/releases" target="_blank" rel="noopener noreferrer" class="">https://github.com/coreybutler/nvm-windows/releases</a>
下载 <code>nvm-setup.exe</code> 安装即可。</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="安装其他版本-nodejs">安装其他版本 NodeJS<a href="https://tech.havocfuture.tw/zh-hans/blog/switch-nodejs-version#%E5%AE%89%E8%A3%85%E5%85%B6%E4%BB%96%E7%89%88%E6%9C%AC-nodejs" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>选择要安装的其他版本 Node.js，ex 我想装和线上环境同样版本的 18.x</p>
<p>打开 <strong>Command Prompt</strong> 或 <strong>PowerShell</strong> 输入：</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">nvm install 18.20.8</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="切换成其他版本-nodejs">切换成其他版本 NodeJS<a href="https://tech.havocfuture.tw/zh-hans/blog/switch-nodejs-version#%E5%88%87%E6%8D%A2%E6%88%90%E5%85%B6%E4%BB%96%E7%89%88%E6%9C%AC-nodejs" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">nvm use 18.20.8</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="确认目前版本">确认目前版本<a href="https://tech.havocfuture.tw/zh-hans/blog/switch-nodejs-version#%E7%A1%AE%E8%AE%A4%E7%9B%AE%E5%89%8D%E7%89%88%E6%9C%AC" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">node -v</span><br></div></code></pre></div></div>
<p>应该会显示类似：</p>
<div class="language-text codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-text codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">v18.20.8</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="查询已安装版本">查询已安装版本<a href="https://tech.havocfuture.tw/zh-hans/blog/switch-nodejs-version#%E6%9F%A5%E8%AF%A2%E5%B7%B2%E5%AE%89%E8%A3%85%E7%89%88%E6%9C%AC" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">nvm list</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="范例输出">范例输出：<a href="https://tech.havocfuture.tw/zh-hans/blog/switch-nodejs-version#%E8%8C%83%E4%BE%8B%E8%BE%93%E5%87%BA" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<div class="language-plaintext codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-plaintext codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain"> * 18.20.8 (Currently using 64-bit executable)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> 22.14.0</span><br></div></code></pre></div></div>
<ul>
<li class=""><code>*</code> 表示目前正在使用的版本</li>
<li class="">每一行显示的是透过 nvm 安装过的版本</li>
</ul>
<!-- -->
<div><iframe src="https://button.like.co/in/embed/havocfuture/button?referrer=https://tech.havocfuture.tw/zh-hans/blog/switch-nodejs-version"></iframe><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>版权声明</h5></div><div class="admonition-content"><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh_CN" target="_blank" rel="noopener noreferrer" title="CC BY-NC-SA 4.0"><img src="data:image/png;base64,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"></a>，转载请注明出处<br>本文键接: <a href="https://tech.havocfuture.tw/zh-hans/blog/switch-nodejs-version" target="_blank" rel="noopener noreferrer">https://tech.havocfuture.tw/zh-hans/blog/switch-nodejs-version</a></p></div></div><br><div class="row"><div class="col col--12"><div class="banner_m8Vh"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="9057051535" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div><br><div id="cusdis_thread" data-host="https://cusdis.com" data-app-id="60a126c4-a58f-4510-a5f4-c3d3d182b735" data-page-id="switch-nodejs-version" data-page-url="https://tech.havocfuture.tw/blog/switch-nodejs-version" data-page-title="如何在 windows 开发环境切换 NodeJS 版本"></div><div class="row"><div class="col col--2"><div class="leftAd_demG"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="4460531054" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div></div>]]></content>
        <author>
            <name>Eric Cheng</name>
        </author>
        <category label="NodeJS" term="NodeJS"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[如何在 Linux 使用 iptables 封锁 IP]]></title>
        <id>https://tech.havocfuture.tw/zh-hans/blog/block-ip-iptables</id>
        <link href="https://tech.havocfuture.tw/zh-hans/blog/block-ip-iptables"/>
        <updated>2025-04-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[原因是一台放在 AWS EC2 的 Linux(CentOS) Server 莫名奇妙被攻击了，log 上有记录攻击方的 IP，所以查了一下怎么直接把对方的 IP 封锁掉，简单做个记录]]></summary>
        <content type="html"><![CDATA[<p>原因是一台放在 AWS EC2 的 Linux(CentOS) Server 莫名其妙被攻击了，log 上有记录攻击方的 IP，所以查了一下怎么直接把对方的 IP 封锁掉，简单做个记录</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="用-iptables-封锁-ip">用 <code>iptables</code> 封锁 IP<a href="https://tech.havocfuture.tw/zh-hans/blog/block-ip-iptables#%E7%94%A8-iptables-%E5%B0%81%E9%94%81-ip" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">sudo iptables -A INPUT -s &lt;攻击者IP&gt; -j DROP</span><br></div></code></pre></div></div>
<p>范例：</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">sudo iptables -A INPUT -s 192.168.1.100 -j DROP</span><br></div></code></pre></div></div>
<p>这会阻止该 IP 的任何连线进入 Server，包括 HTTP、SSH 等。</p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="封锁之后确认">封锁之后确认：<a href="https://tech.havocfuture.tw/zh-hans/blog/block-ip-iptables#%E5%B0%81%E9%94%81%E4%B9%8B%E5%90%8E%E7%A1%AE%E8%AE%A4" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">sudo iptables -L -n</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="如果想解除封锁">如果想解除封锁：<a href="https://tech.havocfuture.tw/zh-hans/blog/block-ip-iptables#%E5%A6%82%E6%9E%9C%E6%83%B3%E8%A7%A3%E9%99%A4%E5%B0%81%E9%94%81" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">sudo iptables -D INPUT -s 192.168.1.100 -j DROP</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="储存规则不然重启会失效">储存规则（不然重启会失效）<a href="https://tech.havocfuture.tw/zh-hans/blog/block-ip-iptables#%E5%82%A8%E5%AD%98%E8%A7%84%E5%88%99%E4%B8%8D%E7%84%B6%E9%87%8D%E5%90%AF%E4%BC%9A%E5%A4%B1%E6%95%88" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">sudo service iptables save</span><br></div></code></pre></div></div>
<p>只确定在 CentOS 可以执行，其他系统要再查</p>
<!-- -->
<div><iframe src="https://button.like.co/in/embed/havocfuture/button?referrer=https://tech.havocfuture.tw/zh-hans/blog/block-ip-iptables"></iframe><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>版权声明</h5></div><div class="admonition-content"><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh_CN" target="_blank" rel="noopener noreferrer" title="CC BY-NC-SA 4.0"><img src="data:image/png;base64,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"></a>，转载请注明出处<br>本文键接: <a href="https://tech.havocfuture.tw/zh-hans/blog/block-ip-iptables" target="_blank" rel="noopener noreferrer">https://tech.havocfuture.tw/zh-hans/blog/block-ip-iptables</a></p></div></div><br><div class="row"><div class="col col--12"><div class="banner_m8Vh"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="9057051535" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div><br><div id="cusdis_thread" data-host="https://cusdis.com" data-app-id="60a126c4-a58f-4510-a5f4-c3d3d182b735" data-page-id="block-ip-iptables" data-page-url="https://tech.havocfuture.tw/blog/block-ip-iptables" data-page-title="如何在 Linux 使用 iptables 封锁 IP"></div><div class="row"><div class="col col--2"><div class="leftAd_demG"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="4460531054" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div></div>]]></content>
        <author>
            <name>Eric Cheng</name>
        </author>
        <category label="Linux" term="Linux"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[如何在 Ubuntu 上更改时区为本地时间]]></title>
        <id>https://tech.havocfuture.tw/zh-hans/blog/ubuntu-set-timezone</id>
        <link href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-set-timezone"/>
        <updated>2025-02-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[在云端新建一台 VM 时，预设时区通常会是 UTC，和习惯 Local 时间是不一样的，以台北时间来说就会差八个小时，简单记录一下怎么修改时区]]></summary>
        <content type="html"><![CDATA[<p>在云端新建一台 VM 时，预设时区通常会是 UTC，和习惯 Local 时间是不一样的，以台北时间来说就会差八个小时，简单记录一下怎么修改时区</p>
<!-- -->
<p>查询时间</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">timedatectl</span><br></div></code></pre></div></div>
<p>这时会看到像这样的结果</p>
<div class="language-text codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-text codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">               Local time: Mon 2025-02-10 01:19:25 UTC</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           Universal time: Mon 2025-02-10 01:19:25 UTC</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                 RTC time: Mon 2025-02-10 01:19:25    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                Time zone: Etc/UTC (UTC, +0000)       </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">System clock synchronized: yes                        </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              NTP service: active                     </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          RTC in local TZ: no</span><br></div></code></pre></div></div>
<p>列出所有可用时区，查询台北时间的名称</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">timedatectl list-timezones ## 列出全部时区</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">timedatectl list-timezones | grep Taipei ## 列出台北时区</span><br></div></code></pre></div></div>
<p>会看到结果如下</p>
<div class="language-text codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-text codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">Asia/Taipei</span><br></div></code></pre></div></div>
<p>执行</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">sudo timedatectl set-timezone Asia/Taipei</span><br></div></code></pre></div></div>
<p>重新查询时间</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">timedatectl</span><br></div></code></pre></div></div>
<p>重新得到结果</p>
<div class="language-text codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-text codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">               Local time: Mon 2025-02-10 09:20:09 CST</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">           Universal time: Mon 2025-02-10 01:20:09 UTC</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                 RTC time: Mon 2025-02-10 01:20:09    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                Time zone: Asia/Taipei (CST, +0800)   </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">System clock synchronized: yes                        </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              NTP service: active                     </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          RTC in local TZ: no</span><br></div></code></pre></div></div>
<p>就可以看到 Time zone 更改为 Asia/Taipei (CST, +0800)，Local time 也成功更改为台北时间了</p>
<!-- -->
<div><iframe src="https://button.like.co/in/embed/havocfuture/button?referrer=https://tech.havocfuture.tw/zh-hans/blog/ubuntu-set-timezone"></iframe><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>版权声明</h5></div><div class="admonition-content"><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh_CN" target="_blank" rel="noopener noreferrer" title="CC BY-NC-SA 4.0"><img src="data:image/png;base64,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"></a>，转载请注明出处<br>本文键接: <a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-set-timezone" target="_blank" rel="noopener noreferrer">https://tech.havocfuture.tw/zh-hans/blog/ubuntu-set-timezone</a></p></div></div><br><div class="row"><div class="col col--12"><div class="banner_m8Vh"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="9057051535" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div><br><div id="cusdis_thread" data-host="https://cusdis.com" data-app-id="60a126c4-a58f-4510-a5f4-c3d3d182b735" data-page-id="ubuntu-set-timezone" data-page-url="https://tech.havocfuture.tw/blog/ubuntu-set-timezone" data-page-title="如何在 Ubuntu 上更改时区为本地时间"></div><div class="row"><div class="col col--2"><div class="leftAd_demG"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="4460531054" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div></div>]]></content>
        <author>
            <name>Eric Cheng</name>
        </author>
        <category label="Linux" term="Linux"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[如何快速将服务从 Line Notify 转换至 Line 官方帐号及 Messaging API]]></title>
        <id>https://tech.havocfuture.tw/zh-hans/blog/line-notify-to-messaging-api</id>
        <link href="https://tech.havocfuture.tw/zh-hans/blog/line-notify-to-messaging-api"/>
        <updated>2024-10-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Line Notify 在十月初宣布【LINE Notify结束服务公告】，将于2025年3月31日停止服务，还给了半年的缓冲期，不幸的，因为Line Notify 很好用加上又是免费，不止公司，连我自己都有一堆小服务是用Line Notify 来做告警，从上面Line 官方连结写的「关于发送通知的替代方法，建议可考虑操作Messaging API 透过LINE官方帐号来传送讯息」，只好花点时间，把原来Line Notify 的程式用Messaging API 改写，简单写个笔记纪录]]></summary>
        <content type="html"><![CDATA[<p>Line Notify 在十月初宣布【<a href="https://notify-bot.line.me/closing-announce" target="_blank" rel="noopener noreferrer" class="">LINE Notify结束服务公告</a>】，将于2025年3月31日停止服务，还给了半年的缓冲期，不幸的，因为Line Notify 很好用加上又是免费，不止公司，连我自己都有一堆小服务是用Line Notify 来做告警，从上面Line 官方连结写的「关于发送通知的替代方法，建议可考虑操作<a href="https://developers.line.biz/en/services/messaging-api/" target="_blank" rel="noopener noreferrer" class="">Messaging API</a> 透过LINE官方帐号来传送讯息」，只好花点时间，把原来Line Notify 的程式用Messaging API 改写，简单写个笔记纪录</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="原-line-notify-程式">原 Line Notify 程式<a href="https://tech.havocfuture.tw/zh-hans/blog/line-notify-to-messaging-api#%E5%8E%9F-line-notify-%E7%A8%8B%E5%BC%8F" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>会看这篇文章的，应该都是原Line Notify 的用户，对Line Notify 就不多做介绍了，有兴趣可以看旧文：【<a class="" href="https://tech.havocfuture.tw/zh-hans/blog/line-notify">Line Notify 测试笔记</a>】，然后同样用<strong>Google Apps Script</strong> 来做测试，先来看一下旧程式，详细内容也可以参考旧文：【[Google Apps Script 测试笔记，实作监控网站发送Line Notify](/blog/google -app-script-monitor)】</p>
<div class="language-jsx codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-jsx codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> * 發送 Line Notify 訊息</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">*/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sendLineNotify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">lineToken</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> lineUrl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'https://notify-api.line.me/api/notify'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> option </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">method</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'post'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">headers</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">Authorization</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Bearer '</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> lineToken </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">payload</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">message</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> message</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token maybe-class-name">UrlFetchApp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lineUrl</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> option</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>从这个程式来看，程式很简单，只需要取得 line notify 的 token (权杖) 就可以了</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="改写后的-messaging-api">改写后的 Messaging API<a href="https://tech.havocfuture.tw/zh-hans/blog/line-notify-to-messaging-api#%E6%94%B9%E5%86%99%E5%90%8E%E7%9A%84-messaging-api" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>也不难，直接贴程式码</p>
<div class="language-jsx codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-jsx codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> * Messaging API 發送訊息到 Line 群組</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">*/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sendLineGroupMsg</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">accessToken</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> groupId</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> messageText</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> lineUrl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'https://api.line.me/v2/bot/message/push'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> headers </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string-property property" style="color:#36acaa">'Content-Type'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'application/json'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string-property property" style="color:#36acaa">'Authorization'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Bearer </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">accessToken</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> messageData </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">to</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> groupId</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">messages</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token literal-property property" style="color:#36acaa">type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"text"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token literal-property property" style="color:#36acaa">text</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> messageText</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> option </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">method</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'post'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">headers</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> headers</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">payload</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token known-class-name class-name">JSON</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">stringify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">messageData</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token maybe-class-name">UrlFetchApp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lineUrl</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> option</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>注意一下，这支程式是传送讯息到「群组」的，如果是要传到个人的话，请改成 userId 即可，程式其实是一样的</p>
<p>然后他和原来 Line Notify 的差别主要是它需要两个参数：<strong>accessToken</strong> 和 <strong>groupId</strong>，所以基本上只要知道这两个参数该怎么找到，把 function 换掉就完工了</p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="channel-access-token">Channel Access Token<a href="https://tech.havocfuture.tw/zh-hans/blog/line-notify-to-messaging-api#channel-access-token" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>请参考【<a class="" href="https://tech.havocfuture.tw/zh-hans/blog/line-bot-messaging-api">Line Bot Messaging API 测试笔记</a>】这篇文章，需要先注册 Line 官方帐号，然后到 Line Developers 就能取得该官方帐号的 channel access token 了</p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="group-id--user-id">Group ID / User ID<a href="https://tech.havocfuture.tw/zh-hans/blog/line-notify-to-messaging-api#group-id--user-id" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>这个比较麻烦一点，用过Line 官方帐号的人应该知道官方帐号是看不到会员名单的(我还是不理解他们的理由)，所以就需要从webhook 的程式着手，同样参考【Line Bot Messaging API 测试笔记】这篇文章，我们先把原来的程式增加一行log</p>
<div class="language-jsx codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-jsx codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// event handler</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">handleEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">event</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>基本上只要有什么动作，就可以看到这一行印出讯息</p>
<p>将官方帐号加入好友会看到</p>
<div class="language-json codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-json codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> 'follow'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  webhookEventId</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> ''</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  deliveryContext</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> isRedelivery</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  timestamp</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1730174569813</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  source</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> 'user'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> userId</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> '使用者ID' </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  replyToken</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> ''</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  mode</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> 'active'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>将官方帐号邀请到群组会看到</p>
<div class="language-json codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-json codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> 'join'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  webhookEventId</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> ''</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  deliveryContext</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> isRedelivery</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  timestamp</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1730174437255</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  source</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> 'group'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> groupId</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> '群组ID' </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  replyToken</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> ''</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  mode</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> 'active'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>手动的记录一下 userId 和 groupId 或写支程式去 parser json 就可以取得资料，发送讯息给个人或群组了</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="其他设定">其他设定<a href="https://tech.havocfuture.tw/zh-hans/blog/line-notify-to-messaging-api#%E5%85%B6%E4%BB%96%E8%AE%BE%E5%AE%9A" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>请到 Line 官方帐号，在帐号设定将加入群组或多人聊天室改成「接受邀请」，要不然是没有办法将官方帐号邀请到群组的</p>
<p><img decoding="async" loading="lazy" alt="2024-10-29_115956.png" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-10-29_115956-878dbfccba83f8c6e6b1b13e94bffe22.png" width="1393" height="364" class="img_blrk"></p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="结论">结论<a href="https://tech.havocfuture.tw/zh-hans/blog/line-notify-to-messaging-api#%E7%BB%93%E8%AE%BA" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>Line Messaging API 要完全取代Line Notify 看起来应该是没有问题，转换过程还算顺利，主要的差别就只有费用，Line Notify 是免费服务，Messaging API 的免费额度则只有200则/月，再来就要付费了，不过使用者付费其实还算合理啦，如果真的还是要找免费服务，大概就只能换Telegram 或Discord 了，但我没打算试就是</p>
<!-- -->
<div><iframe src="https://button.like.co/in/embed/havocfuture/button?referrer=https://tech.havocfuture.tw/zh-hans/blog/line-notify-to-messaging-api"></iframe><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>版权声明</h5></div><div class="admonition-content"><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh_CN" target="_blank" rel="noopener noreferrer" title="CC BY-NC-SA 4.0"><img src="data:image/png;base64,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"></a>，转载请注明出处<br>本文键接: <a href="https://tech.havocfuture.tw/zh-hans/blog/line-notify-to-messaging-api" target="_blank" rel="noopener noreferrer">https://tech.havocfuture.tw/zh-hans/blog/line-notify-to-messaging-api</a></p></div></div><br><div class="row"><div class="col col--12"><div class="banner_m8Vh"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="9057051535" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div><br><div id="cusdis_thread" data-host="https://cusdis.com" data-app-id="60a126c4-a58f-4510-a5f4-c3d3d182b735" data-page-id="line-notify-to-messaging-api" data-page-url="https://tech.havocfuture.tw/blog/line-notify-to-messaging-api" data-page-title="如何快速将服务从 Line Notify 转换至 Line 官方帐号及 Messaging API"></div><div class="row"><div class="col col--2"><div class="leftAd_demG"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="4460531054" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div></div>]]></content>
        <author>
            <name>Eric Cheng</name>
        </author>
        <category label="Line" term="Line"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Line Bot Messaging API 测试笔记]]></title>
        <id>https://tech.havocfuture.tw/zh-hans/blog/line-bot-messaging-api</id>
        <link href="https://tech.havocfuture.tw/zh-hans/blog/line-bot-messaging-api"/>
        <updated>2024-10-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[因为Line Notify 即将停止服务，原本是在写【如何快速将服务从Line Notify 转换至Line 官方帐号及Messaging API】，不过文章太长了，所以把Line Bot Messaging API 的部份独立出来，写成一篇笔记]]></summary>
        <content type="html"><![CDATA[<p>因为Line Notify 即将停止服务，原本是在写【<a class="" href="https://tech.havocfuture.tw/zh-hans/blog/line-notify-to-messaging-api">如何快速将服务从Line Notify 转换至Line 官方帐号及Messaging API</a>】，不过文章太长了，所以把Line Bot Messaging API 的部份独立出来，写成一篇笔记</p>
<!-- -->
<p>一开始接触Line Bot 可能会让人有点困惑的是有不同的入口，一般的区分Line 官方帐号是给一般管理者使用的，Line Developers 则是开发者专用，但是有部份功能会同时重覆出现在这两个网站，这篇文章简单的做了一下使用Line Bot Messagin API 会用到的功能</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="line-官方帐号">Line 官方帐号<a href="https://tech.havocfuture.tw/zh-hans/blog/line-bot-messaging-api#line-%E5%AE%98%E6%96%B9%E5%B8%90%E5%8F%B7" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p><a href="https://manager.line.biz/" target="_blank" rel="noopener noreferrer" class="">https://tw.linebiz.com/</a></p>
<p>这个介面是给一般使用者管理官方帐号，但是要使用 Line Bot Messaging API 要有官方帐号，所以需要先建立一个官方帐号</p>
<p>在建立好官方帐号后，点「聊天」的 Tab，点选后选取「前往回应设定页面」</p>
<p><img decoding="async" loading="lazy" alt="2024-10-28_172049.png" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-10-28_172049-b778ae4107a2950b4dc6013bfbbbdf41.png" width="1586" height="842" class="img_blrk"></p>
<p>选单选取「Messaging API」，然后点选「启用 Messaging API」</p>
<p><img decoding="async" loading="lazy" alt="2024-10-28_172317.png" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-10-28_172317-e270a11fff84f157b74868b58cf6c1da.png" width="1365" height="626" class="img_blrk"></p>
<p>就会看到以下的画面，这里的重点是「<strong>Channel secret</strong>」，后面会用到，然后是「<strong>Webhook 网址</strong>」，我们会需要写支程式，后面再说</p>
<p>先点下面的「Line Developers」进行其他设定，这时就会跳到 Line Developers 这个网站</p>
<p><img decoding="async" loading="lazy" alt="2024-10-29_101728.png" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-10-29_101728-3faebafa8573d15543a7b69e0685dfb9.png" width="1404" height="749" class="img_blrk"></p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="line-developers">Line Developers<a href="https://tech.havocfuture.tw/zh-hans/blog/line-bot-messaging-api#line-developers" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p><a href="https://developers.line.biz/" target="_blank" rel="noopener noreferrer" class="">https://developers.line.biz/</a></p>
<p>第一个印象就是没有中文版本，语言只有英文和日文可以选</p>
<p>一样选到「Messaging API」的 tab</p>
<p><img decoding="async" loading="lazy" alt="2024-10-29_093352.png" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-10-29_093352-78eeb9f0065171489c22d8f366c4f7ef.png" width="1509" height="719" class="img_blrk"></p>
<p>拉到最下方，找到最重要的 「<strong>Channel access token」</strong>，有了这个 token 才能发送讯息</p>
<p><img decoding="async" loading="lazy" alt="2024-10-29_093434.png" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-10-29_093434-da08043a83e0a5a6c0d2a55ab780c509.png" width="1497" height="837" class="img_blrk"></p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="line-webhook-做什么用的怎么写">Line Webhook 做什么用的？怎么写？<a href="https://tech.havocfuture.tw/zh-hans/blog/line-bot-messaging-api#line-webhook-%E5%81%9A%E4%BB%80%E4%B9%88%E7%94%A8%E7%9A%84%E6%80%8E%E4%B9%88%E5%86%99" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>Webhook 是一种通知机制，当用户在 LINE 上与 bot 进行互动时，LINE 平台会将这些事件（如讯息、加入、离开等）以 HTTP POST 请求的形式推送至设定的 Webhook URL。透过 Webhook，后端应用可以接收到事件并作出对应的回应或动作，例如自动回覆讯息。</p>
<p>这里用 NodeJS 加上 Express 写一个简单的范例</p>
<p>请先安装 @line/bot-sdk</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">npm install express body-parser @line/bot-sdk</span><br></div></code></pre></div></div>
<p>范例档如下，这里会需要「<strong>Channel access token</strong>」和「<strong>Channel secret</strong>」，分别在前面的说明可以取得</p>
<div class="language-jsx codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-jsx codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports operator" style="color:#393A34">*</span><span class="token imports"> </span><span class="token imports keyword module" style="color:#00009f">as</span><span class="token imports"> line</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@line/bot-sdk'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">express</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'express'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">CHANNEL_ACCESS_TOKEN</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'YOUR_CHANNEL_ACCESS_TOKEN'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">CHANNEL_SECRET</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'YOUR_CHANNEL_SECRET'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// create LINE SDK config from env variables</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> config </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">channelSecret</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">CHANNEL_SECRET</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// create LINE SDK client</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> client </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">line</span><span class="token class-name punctuation" style="color:#393A34">.</span><span class="token class-name">messagingApi</span><span class="token class-name punctuation" style="color:#393A34">.</span><span class="token class-name">MessagingApiClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">channelAccessToken</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">CHANNEL_ACCESS_TOKEN</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// create Express app</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> app </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">express</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// register a webhook handler with middleware about the middleware, please refer to doc</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">post</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'/callback'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> line</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">middleware</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">req</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> res</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token known-class-name class-name">Promise</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">all</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">req</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">body</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">events</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">handleEvent</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">then</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">result</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">// 設置 response header</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            res</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">set</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'ngrok-skip-browser-warning'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'true'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 忽略 ngrok 警告</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            res</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">result</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword control-flow" style="color:#00009f">catch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            res</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">status</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">500</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">end</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// event handler</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">handleEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">event</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">		</span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">event</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'message'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> event</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">message</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">type</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'text'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// ignore non-text-message event</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token known-class-name class-name">Promise</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">resolve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword null nil" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// create an echoing text message</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> reply </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"您說了："</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> event</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">message</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">text</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> echo </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'text'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">text</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> reply </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// use reply API</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">replyMessage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">replyToken</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> event</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">replyToken</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">messages</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">echo</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// listen on port</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> port </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3000</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">listen</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">port</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">listening on </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">port</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>这支 webhook 做的事相当简单，只有在收到文字讯息，ex: 收到「hello」，然后回传「您说了: hello」</p>
<p>要注意的是webhook 必须要有个公开的URL，在开发的时候，建议可以使用<a href="https://ngrok.com/" target="_blank" rel="noopener noreferrer" class="">ngrok</a> 来测试，正式环境的话，可以参考【<a class="" href="https://tech.havocfuture.tw/zh-hans/blog/serverless-framework-with-aws"><strong>如何使用Serverless Framework 将Express 部署到AWS Lambda</strong></a>】使用AWS  Lambda 或自行架设express server</p>
<p>有了 webhook 公开的 URL 后，回到刚才 Line 官方帐号，将 URL 填入</p>
<p><img decoding="async" loading="lazy" alt="2024-10-29_113259.png" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-10-29_113259-866884166f06042e1c845255c15ae43a.png" width="1403" height="762" class="img_blrk"></p>
<p>然后到「回应设定」，将「Webhook」打开和预设开启的「自动回应讯息」关闭</p>
<p><img decoding="async" loading="lazy" alt="2024-10-29_113341.png" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-10-29_113341-aa540bade0b7da04ba1443ca7af19fbb.png" width="1412" height="837" class="img_blrk"></p>
<p>这时候直接从 Line 传一则讯息，就可以看到回应的结果了</p>
<p><img decoding="async" loading="lazy" alt="2024-10-29_113414.png" src="data:image/png;base64,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" width="460" height="153" class="img_blrk"></p>
<p>再来就可以做不同的运用，像是比较常见的接 OpenAI 的 API，马上就可以变成 AI 聊天机器人了…</p>
<!-- -->
<div><iframe src="https://button.like.co/in/embed/havocfuture/button?referrer=https://tech.havocfuture.tw/zh-hans/blog/line-bot-messaging-api"></iframe><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>版权声明</h5></div><div class="admonition-content"><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh_CN" target="_blank" rel="noopener noreferrer" title="CC BY-NC-SA 4.0"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFgAAAAfCAMAAABUFvrSAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAEZ0FNQQAAsY58+1GTAAAAAXNSR0IB2cksfwAAAf5QTFRF////////////////8fHx7+/v6Ofn4+Pj4N/g39/f1tXV09bS0tXS0tXR0dTR0dTQ0NTQ0NPPz9PPztLOztHNzdHNzdHMz8/PzdDMzNDMzNDLzM/Ly8/Ly8/Ky87Kys3Jyc3Jyc3Iy8rLyMzIyMzHx8vHxsrGycjIxsrFxcnFyMfHxcnExMnExMjDw8jDxMfDw8fCwsfCwcXAwMXAwMW/wMS/v8S+v8O+vsO+vsK9vcK9vcK8v7+/vMG8vMG7vMC8u8C7u8C6ur+6ur+5ub65ub64uL23t7y2urm5tru1tbq0tLqztLmzs7iysrixtbW1srexsbewsLavsLWvr7Wur7SusLOvrrStrrOtr7KvrbOsrLKrr6+vq7GqrKurpqqmo6ijoqaho6Ghn6OenqCdn5+fnp2dn5aampiZlpmWlZmUmJaXk5iTkZSRkZORkY+Pj4+PiYyJjIqLjoeLh4aHhIaEhIWEgoWChIGCf4F+gICAfX98fH98fnt8en15eXx5eHV2dnN0dXJzcHJvcHBwbmxsaGVmY19hYGBgXV5dWldYUFFQUFBQQ0RDQEBAPj8+Pzs8Pzc5NTY1MjMxMjExMDAwMS0uLS0tKioqKSopKSkpKCkoKCgoKicnKCUmJCQkIx8gICAgHxscGxsbGRkZEBAQDg4ODQ4NDQwNAAAA4LK4NQAAAAN0Uk5TAAoO5yEBUwAAA+1JREFUeNq1lot3GkUUxlcviEDS7bYbKxC2oaWKSUmRpkkrSBvzIMGkJjGamoSobROtNqRVWyOppli0NBBSHxst+JiYUvr9l57dheVx8ESpncOeOfvbnW92vjv3DtyzeCqN44BIeCh02t/tcXdIDpvN4Tzs9nj9faHBcGR88u2Z2dm56H9vAIdIeCBwyudxOUWBb7FaW/YJYrvL4+sJDCjK0zOzc00pcwgPBE56j0kif3OzqCyiuHmDP+h0H/e/NhCOnJ+avjA7t55THuTWK+P2JOAwFDjpdduF2G7FoN1lwebq8gcGw2MTUzOf5IFsMpkF8le1UVf3JuAQOuV12/g0gEIqHgzGUwUA6RMvuI73hIZGxyc/fISMmYjInMEjddSlf0HA4bTvmF3RLcSNpLXFApA/YXP7+vqHIxM5pIgIUB4grwzKq2Rlo46YOjtNOgEHv0cS0oBsJr0ZZSAtOD3+wNDoGjKWsjBlsB6NruPnj4lWHj5OmHSSsdBFxhgbKRFFuPuoGANkI1Gt8vJBl7e3P/wAVTOakYtGc/iD3f8e8S+woBMzdbIf7iYYW9GIIuxx8rsoHKKaZixgl2/3+F8fQla5T0FdPmURjSL77W3GWMJkqRAyfMQ+J1pi2xpRhN1tN4E41bVF4Ibo9p0ZQJJUJzQvkopMkqgzASBhqRDDn+w3IhNjz6lEEe44sImCkSiYyWbjWneNiArYFA57e/sbCxOZEtuMbYzo5K1fgqrw87qwxBeVZQbVHZydV7uUsvjiPmdXz7lGVhCRYYksSrTul8nIxZeJFhirWOFoBa4RydgxB3cWZcjm+Z1F1YsWh8cf+lULnvbBeqhog21vI7Hw9V9lssTY6urv7NNK8OxWIKiMjGsCJbuDgNX2kj/0FTJUv90yRKbVh49XDNVkVVnAd4bKdttDePhBJUGS1Qny2UYdObKwYNFJjRXGQztxGbLSVawYfr/ZlC4FrxQ1PXhJFHmpq+fc8Jsf5AA5lZQrJedSfk+ibrc0CqRvt/ms2tEONoUOb+8b4bHJd75pqmy622KqF40S5NUzg6PjUzNNHCLg8Iqa0uZ/SunI+WaFu4+KlxsVoZjo6u7rD49NTF+Ya0oYtyThHiBXlSGzWjalL5/omAZwx7G/utAb4wXgR95+C08qjDXb/nt1RxP/4hX9HS0/oF0a0S4i1L1EtcJYcwiXqw/TmGC/UjWm9KMqldJ9zVQ1QBPGHUnkY+Xjf5kXpWofymWzeiqqmag8F1G9MH56z9l2gG+1Wlt5QWx/d6tmTJ0RZRuohtUtgdP51vWzksNud0hnr2/VxqHRF9d7XI5DA+H/+1/hM09J92+7pmyRGJsTpgAAAABJRU5ErkJggg=="></a>，转载请注明出处<br>本文键接: <a href="https://tech.havocfuture.tw/zh-hans/blog/line-bot-messaging-api" target="_blank" rel="noopener noreferrer">https://tech.havocfuture.tw/zh-hans/blog/line-bot-messaging-api</a></p></div></div><br><div class="row"><div class="col col--12"><div class="banner_m8Vh"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="9057051535" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div><br><div id="cusdis_thread" data-host="https://cusdis.com" data-app-id="60a126c4-a58f-4510-a5f4-c3d3d182b735" data-page-id="line-bot-messaging-api" data-page-url="https://tech.havocfuture.tw/blog/line-bot-messaging-api" data-page-title="Line Bot Messaging API 测试笔记"></div><div class="row"><div class="col col--2"><div class="leftAd_demG"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="4460531054" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div></div>]]></content>
        <author>
            <name>Eric Cheng</name>
        </author>
        <category label="Line" term="Line"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[如何解决 SourceTree 突然无法启动问题]]></title>
        <id>https://tech.havocfuture.tw/zh-hans/blog/sourcetree-cannot-open</id>
        <link href="https://tech.havocfuture.tw/zh-hans/blog/sourcetree-cannot-open"/>
        <updated>2024-10-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[不是第一次发生了，SourceTree 在启动后，闪了一下就没有反应，简单做了笔记，记录一下解决方法]]></summary>
        <content type="html"><![CDATA[<p>不是第一次发生了，SourceTree 在启动后，闪了一下就没有反应，简单做了笔记，记录一下解决方法</p>
<!-- -->
<p>到目录 C:\Users\你的帐号\AppData\Local\Atlassian，会看到如下截图的目录</p>
<p><img decoding="async" loading="lazy" alt="sourcetree folder" src="data:image/png;base64,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" width="814" height="86" class="img_blrk"></p>
<p>再往下点名称比较长的目录，会看到如下截图，将红框的 Composition.cache 这个快取档案删除，然后重新启动 SourceTree 就可以了</p>
<p><img decoding="async" loading="lazy" alt="sourcetree folder 2" src="data:image/png;base64,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" width="800" height="203" class="img_blrk"></p>
<b style="color:tomato">2026/01/02 更新</b>
<p>同样的状况又再发生一次，这次删 Composition.cache 没用，改删掉 user.config 重新启动 SourceTree 就可以了</p>
<p>如果不放心直接删除 user.config 的话可以先备份，不过我删是没事，会看到再重新生成一个 user.config 档</p>
<!-- -->
<div><iframe src="https://button.like.co/in/embed/havocfuture/button?referrer=https://tech.havocfuture.tw/zh-hans/blog/sourcetree-cannot-open"></iframe><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>版权声明</h5></div><div class="admonition-content"><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh_CN" target="_blank" rel="noopener noreferrer" title="CC BY-NC-SA 4.0"><img src="data:image/png;base64,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"></a>，转载请注明出处<br>本文键接: <a href="https://tech.havocfuture.tw/zh-hans/blog/sourcetree-cannot-open" target="_blank" rel="noopener noreferrer">https://tech.havocfuture.tw/zh-hans/blog/sourcetree-cannot-open</a></p></div></div><br><div class="row"><div class="col col--12"><div class="banner_m8Vh"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="9057051535" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div><br><div id="cusdis_thread" data-host="https://cusdis.com" data-app-id="60a126c4-a58f-4510-a5f4-c3d3d182b735" data-page-id="sourcetree-cannot-open" data-page-url="https://tech.havocfuture.tw/blog/sourcetree-cannot-open" data-page-title="如何解决 SourceTree 突然无法启动问题"></div><div class="row"><div class="col col--2"><div class="leftAd_demG"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="4460531054" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div></div>]]></content>
        <author>
            <name>Eric Cheng</name>
        </author>
        <category label="Git" term="Git"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[如何在 Ubuntu 上安装 docker 和 docker-compose]]></title>
        <id>https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose</id>
        <link href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose"/>
        <updated>2024-10-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[简单做个记录，如何在 Ubuntu 上安装 docker 和 docker-compose，以后有同样需求直接照做就好]]></summary>
        <content type="html"><![CDATA[<p>简单做个记录，如何在 Ubuntu 上安装 docker 和 docker-compose，以后有同样需求直接照做就好</p>
<!-- -->
<p>以下记录包括安装 Docker、安装 Docker Compose，以及如何使用 <code>docker-compose.yml</code> 启动 container、如何停止及删除 <code>docker-compose.yml</code> 启动的 container</p>
<b style="color:tomato">2025-01-24 更新：</b>
<br>
<span style="color:tomato">较新版本(20.04之后)的 ubuntu 指令有些不一样，更新一下内容</span>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="步骤-1安装-docker-旧版">步骤 1：安装 Docker (旧版)<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#%E6%AD%A5%E9%AA%A4-1%E5%AE%89%E8%A3%85-docker-%E6%97%A7%E7%89%88" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="11-更新">1.1. 更新<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#11-%E6%9B%B4%E6%96%B0" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">sudo apt update</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="12-安装-dependencies">1.2. 安装 dependencies<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#12-%E5%AE%89%E8%A3%85-dependencies" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">sudo apt install apt-transport-https ca-certificates curl software-properties-common</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="13-添加-docker-的官方-gpg-密钥">1.3. 添加 Docker 的官方 GPG 密钥<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#13-%E6%B7%BB%E5%8A%A0-docker-%E7%9A%84%E5%AE%98%E6%96%B9-gpg-%E5%AF%86%E9%92%A5" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="14-设置-docker-官方稳定版-lib">1.4. 设置 Docker 官方稳定版 lib<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#14-%E8%AE%BE%E7%BD%AE-docker-%E5%AE%98%E6%96%B9%E7%A8%B3%E5%AE%9A%E7%89%88-lib" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="15-安装-docker">1.5. 安装 Docker<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#15-%E5%AE%89%E8%A3%85-docker" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">sudo apt update</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sudo apt install docker-ce docker-ce-cli containerd.io</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="16-启动-docker-并设置开机自动启动">1.6. 启动 Docker 并设置开机自动启动<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#16-%E5%90%AF%E5%8A%A8-docker-%E5%B9%B6%E8%AE%BE%E7%BD%AE%E5%BC%80%E6%9C%BA%E8%87%AA%E5%8A%A8%E5%90%AF%E5%8A%A8" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">sudo systemctl start docker</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sudo systemctl enable docker</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="17-验证-docker-是否安装成功">1.7. 验证 Docker 是否安装成功<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#17-%E9%AA%8C%E8%AF%81-docker-%E6%98%AF%E5%90%A6%E5%AE%89%E8%A3%85%E6%88%90%E5%8A%9F" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<p>通过以下命令检查 Docker 版本，确认是否安装成功：</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">docker --version</span><br></div></code></pre></div></div>
<p>如果看到类似于 <code>Docker version 2x.xx.x, build xxxxx</code> 的讯息，表示 Docker 安装成功。</p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="步骤-1安装-docker-新版">步骤 1：安装 Docker (新版)<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#%E6%AD%A5%E9%AA%A4-1%E5%AE%89%E8%A3%85-docker-%E6%96%B0%E7%89%88" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="11-更新-1">1.1. 更新<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#11-%E6%9B%B4%E6%96%B0-1" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">sudo apt update</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="12-安装-dependencies-1">1.2. 安装 dependencies<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#12-%E5%AE%89%E8%A3%85-dependencies-1" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">sudo apt install apt-transport-https ca-certificates curl software-properties-common</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="13-建立目录存放-gpg-金钥">1.3. 建立目录存放 GPG 金钥<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#13-%E5%BB%BA%E7%AB%8B%E7%9B%AE%E5%BD%95%E5%AD%98%E6%94%BE-gpg-%E9%87%91%E9%92%A5" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">sudo mkdir -p /etc/apt/keyrings</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="14-添加-docker-的官方-gpg-密钥">1.4. 添加 Docker 的官方 GPG 密钥<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#14-%E6%B7%BB%E5%8A%A0-docker-%E7%9A%84%E5%AE%98%E6%96%B9-gpg-%E5%AF%86%E9%92%A5" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="15-设置-docker-官方稳定版-lib">1.5. 设置 Docker 官方稳定版 lib<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#15-%E8%AE%BE%E7%BD%AE-docker-%E5%AE%98%E6%96%B9%E7%A8%B3%E5%AE%9A%E7%89%88-lib" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable " | sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="16-安装-docker">1.6. 安装 Docker<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#16-%E5%AE%89%E8%A3%85-docker" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">sudo apt update</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sudo apt install docker-ce docker-ce-cli containerd.io</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="17-启动-docker-并设置开机自动启动">1.7. 启动 Docker 并设置开机自动启动<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#17-%E5%90%AF%E5%8A%A8-docker-%E5%B9%B6%E8%AE%BE%E7%BD%AE%E5%BC%80%E6%9C%BA%E8%87%AA%E5%8A%A8%E5%90%AF%E5%8A%A8" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">sudo systemctl start docker</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sudo systemctl enable docker</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="18-验证-docker-是否安装成功">1.8. 验证 Docker 是否安装成功<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#18-%E9%AA%8C%E8%AF%81-docker-%E6%98%AF%E5%90%A6%E5%AE%89%E8%A3%85%E6%88%90%E5%8A%9F" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<p>通过以下命令检查 Docker 版本，确认是否安装成功：</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">docker --version</span><br></div></code></pre></div></div>
<p>如果看到类似于 <code>Docker version 2x.xx.x, build xxxxx</code> 的讯息，表示 Docker 安装成功。</p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="步骤-2安装-docker-compose">步骤 2：安装 Docker Compose<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#%E6%AD%A5%E9%AA%A4-2%E5%AE%89%E8%A3%85-docker-compose" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="21-下载-docker-compose">2.1. 下载 Docker Compose<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#21-%E4%B8%8B%E8%BD%BD-docker-compose" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<p>下载最新版本的 Docker Compose。使用以下命令来下载并安装：</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">sudo curl -L "https://github.com/docker/compose/releases/download/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' | cut -d\" -f4)/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="22-为-docker-compose-文件设置可执行权限">2.2. 为 Docker Compose 文件设置可执行权限<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#22-%E4%B8%BA-docker-compose-%E6%96%87%E4%BB%B6%E8%AE%BE%E7%BD%AE%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%9D%83%E9%99%90" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">sudo chmod +x /usr/local/bin/docker-compose</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="23-验证-docker-compose-是否安装成功">2.3. 验证 Docker Compose 是否安装成功<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#23-%E9%AA%8C%E8%AF%81-docker-compose-%E6%98%AF%E5%90%A6%E5%AE%89%E8%A3%85%E6%88%90%E5%8A%9F" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<p>检查 Docker Compose 的版本：</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">docker-compose --version</span><br></div></code></pre></div></div>
<p>如果安装成功，应该看到类似于 <code>Docker Compose version 2.xx.x</code> 的讯息。</p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="步骤-3执行-docker-composeyml">步骤 3：执行 <code>docker-compose.yml</code><a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#%E6%AD%A5%E9%AA%A4-3%E6%89%A7%E8%A1%8C-docker-composeyml" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>假设已经有一个 <code>docker-compose.yml</code> 文件，可以按照以下步骤来启动 Docker container。</p>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="31-将-docker-composeyml-文件放在项目目录中">3.1. 将 <code>docker-compose.yml</code> 文件放在项目目录中<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#31-%E5%B0%86-docker-composeyml-%E6%96%87%E4%BB%B6%E6%94%BE%E5%9C%A8%E9%A1%B9%E7%9B%AE%E7%9B%AE%E5%BD%95%E4%B8%AD" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<p>首先，将 <code>docker-compose.yml</code> 文件放到一个新的项目目录中，比如：</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">mkdir my_project</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cd my_project</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="32-启动-docker-compose">3.2. 启动 Docker Compose<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#32-%E5%90%AF%E5%8A%A8-docker-compose" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<p>在 <code>docker-compose.yml</code> 文件所在的目录中执行以下命令，这会启动 <code>docker-compose.yml</code> 中定义的所有服务：</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">sudo docker-compose up</span><br></div></code></pre></div></div>
<p>这个命令会下载所有需要的 Docker image，并启动对应的 container。</p>
<ul>
<li class="">如果你希望在后台运行 Docker Compose，使用 <code>-d</code> 参数：</li>
</ul>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">sudo docker-compose up -d</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="33-检查运行中的-container">3.3. 检查运行中的 container<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#33-%E6%A3%80%E6%9F%A5%E8%BF%90%E8%A1%8C%E4%B8%AD%E7%9A%84-container" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<p>使用 <code>docker ps</code> 命令来检查哪些 container 正在运行：</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">docker ps</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Ab5Z" id="34-停止并删除-container">3.4. 停止并删除 container<a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose#34-%E5%81%9C%E6%AD%A2%E5%B9%B6%E5%88%A0%E9%99%A4-container" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h4>
<p>如果想停止运行的服务，可以使用以下命令停止 Docker Compose：</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">sudo docker-compose down</span><br></div></code></pre></div></div>
<p>如果你想删除所有 container 和 volume，可以使用：</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">sudo docker-compose down -v</span><br></div></code></pre></div></div>
<!-- -->
<div><iframe src="https://button.like.co/in/embed/havocfuture/button?referrer=https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose"></iframe><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>版权声明</h5></div><div class="admonition-content"><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh_CN" target="_blank" rel="noopener noreferrer" title="CC BY-NC-SA 4.0"><img src="data:image/png;base64,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"></a>，转载请注明出处<br>本文键接: <a href="https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose" target="_blank" rel="noopener noreferrer">https://tech.havocfuture.tw/zh-hans/blog/ubuntu-install-docker-compose</a></p></div></div><br><div class="row"><div class="col col--12"><div class="banner_m8Vh"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="9057051535" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div><br><div id="cusdis_thread" data-host="https://cusdis.com" data-app-id="60a126c4-a58f-4510-a5f4-c3d3d182b735" data-page-id="ubuntu-install-docker-compose" data-page-url="https://tech.havocfuture.tw/blog/ubuntu-install-docker-compose" data-page-title="如何在 Ubuntu 上安装 docker 和 docker-compose"></div><div class="row"><div class="col col--2"><div class="leftAd_demG"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="4460531054" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div></div>]]></content>
        <author>
            <name>Eric Cheng</name>
        </author>
        <category label="Docker" term="Docker"/>
        <category label="Linux" term="Linux"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[如何使用 Serverless Framework 将 Express 部署到 AWS Lambda]]></title>
        <id>https://tech.havocfuture.tw/zh-hans/blog/serverless-framework-with-aws</id>
        <link href="https://tech.havocfuture.tw/zh-hans/blog/serverless-framework-with-aws"/>
        <updated>2024-09-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[其实我的需求是使用 AWS Lambda 部署 Line Bot 的 Webhook NodeJS 环境，不过这篇笔记为了简化，把重点放在如何部署到 AWS Lambda，所以先改成最简单的 NodeJS Express]]></summary>
        <content type="html"><![CDATA[<p>其实我的需求是使用 AWS Lambda 部署 Line Bot 的 Webhook NodeJS 环境，不过这篇笔记为了简化，把重点放在如何部署到 AWS Lambda，所以先改成最简单的 NodeJS Express</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="什么是-serverless-framework">什么是 Serverless Framework<a href="https://tech.havocfuture.tw/zh-hans/blog/serverless-framework-with-aws#%E4%BB%80%E4%B9%88%E6%98%AF-serverless-framework" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>【<a href="https://www.serverless.com/" target="_blank" rel="noopener noreferrer" class="">Serverless Framework 官网</a>】</p>
<p>Serverless Framework 是一个 open source 工具，用于简化开发、部署和管理 serverless 应用。</p>
<p>虽然在官网首页上就写着 Zero-Friction Serverless Apps on AWS Lambda，但其实和 AWS 官方并没有关系，就是个第三方的工具。</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="测试记录">测试记录<a href="https://tech.havocfuture.tw/zh-hans/blog/serverless-framework-with-aws#%E6%B5%8B%E8%AF%95%E8%AE%B0%E5%BD%95" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="step-1-申请-aws-帐号及安装-aws-cli">Step 1 申请 AWS 帐号及安装 AWS CLI<a href="https://tech.havocfuture.tw/zh-hans/blog/serverless-framework-with-aws#step-1-%E7%94%B3%E8%AF%B7-aws-%E5%B8%90%E5%8F%B7%E5%8F%8A%E5%AE%89%E8%A3%85-aws-cli" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>这个就不多说了，要测试 AWS Lambda 当然要先有 AWS 帐号，也请先安装 <a href="https://aws.amazon.com/tw/cli/" target="_blank" rel="noopener noreferrer" class="">AWS CLI</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="step-2-安装-serverless-framework">Step 2 安装 Serverless Framework<a href="https://tech.havocfuture.tw/zh-hans/blog/serverless-framework-with-aws#step-2-%E5%AE%89%E8%A3%85-serverless-framework" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>使用 npm 安装</p>
<div class="language-text codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-text codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">npm i serverless -g</span><br></div></code></pre></div></div>
<p>如果之前安装过，先请先 update 到最新的版本</p>
<div class="language-text codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-text codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">serverless update</span><br></div></code></pre></div></div>
<p>建议在安装后，直接执行 login</p>
<div class="language-text codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-text codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">serverless login</span><br></div></code></pre></div></div>
<p>选择「Login/Register」</p>
<p><img decoding="async" loading="lazy" alt="serverless login" src="data:image/png;base64,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" width="659" height="191" class="img_blrk"></p>
<p>会在浏览器开一个网页导到 <a href="https://app.serverless.com/" target="_blank" rel="noopener noreferrer" class="">https://app.serverless.com/</a> ，先把帐号注册好</p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="step-3-建立专案">Step 3 建立专案<a href="https://tech.havocfuture.tw/zh-hans/blog/serverless-framework-with-aws#step-3-%E5%BB%BA%E7%AB%8B%E4%B8%93%E6%A1%88" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>先建立空目录，以下测试目录名称为 test-express-aws，然后进到新建的目录</p>
<div class="language-text codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-text codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">mkdir test-express-aws</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cd test-express-aws</span><br></div></code></pre></div></div>
<p>直接执行 serverless</p>
<div class="language-text codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-text codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">serveless</span><br></div></code></pre></div></div>
<p>有很多选项可以选，请依照想要建立的专案种类决定，这个测试范例选择「Node.js / Express API」</p>
<p><img decoding="async" loading="lazy" alt="serverless project type" src="data:image/png;base64,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" width="937" height="340" class="img_blrk"></p>
<p>输入 project 和 app 名称，如果之前有建过其他 app，可以直接选或者再重新建立一个新的 app</p>
<p><img decoding="async" loading="lazy" alt="serverless project name" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-09-10_170109-e777d697bd490727f81daa0b40ab7984.png" width="1200" height="652" class="img_blrk"></p>
<p>执行完后，会发现执行的目录下多了一个刚才建的 project 名称的目录，底下有几支由程式新增的档案</p>
<p><img decoding="async" loading="lazy" alt="serverless file" src="data:image/png;base64,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" width="322" height="148" class="img_blrk"></p>
<p>学过 node js 应该就不陌生了，看一下 package.json 已经帮我们写好 dependencies，有 express 和 serverless-http</p>
<div class="language-json codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-json codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"test-project-0910"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token property" style="color:#36acaa">"version"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1.0.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token property" style="color:#36acaa">"description"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token property" style="color:#36acaa">"dependencies"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token property" style="color:#36acaa">"express"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^4.19.2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token property" style="color:#36acaa">"serverless-http"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"^3.2.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>也自动生成了一支简单的 express 程式 handler.js</p>
<div class="language-javascript codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-javascript codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> serverless </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"serverless-http"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> express </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"express"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> app </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">express</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">req</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> res</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> next</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> res</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">status</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">message</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Hello from root!"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/hello"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">req</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> res</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> next</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> res</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">status</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">message</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Hello from path!"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">use</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">req</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> res</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> next</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> res</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">status</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">404</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">error</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Not Found"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">exports</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">handler</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">serverless</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>直接在专案下执行 npm install 安装 dependencies library，大致上就可以用了</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">npm install</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="step-4-部署到-aws-lambda">Step 4 部署到 AWS Lambda<a href="https://tech.havocfuture.tw/zh-hans/blog/serverless-framework-with-aws#step-4-%E9%83%A8%E7%BD%B2%E5%88%B0-aws-lambda" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>执行</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">serverless deploy</span><br></div></code></pre></div></div>
<p>成功后会显示 endpoint 网址</p>
<p><img decoding="async" loading="lazy" alt="serverless endpoint" src="data:image/png;base64,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" width="754" height="160" class="img_blrk"></p>
<p>直接用浏览器点选网址，可以看到 handler.js 写的内容就在这边，之后要修改内容，就直接改 handler.js 这支程式就可以
<img decoding="async" loading="lazy" alt="serverless endpoint 2" src="data:image/png;base64,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" width="649" height="184" class="img_blrk"></p>
<p>登入到 AWS Lambda，也可以看到原来在 local 的档案，已经被上传上来了
<img decoding="async" loading="lazy" alt="serverless aws lambda" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-09-12_112514-82f6707e5ce5db21d991c62170c656f3.png" width="810" height="586" class="img_blrk"></p>
<p>可以看到自动连结到 API Gateway，不需要自己设定
<img decoding="async" loading="lazy" alt="serverless api" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-09-12_114032-2d5ba2d1af0593a7dc30768561c22208.png" width="770" height="442" class="img_blrk"></p>
<p>到 应用程式-&gt;监控 就可以看到这支 API 的使用状况了
<img decoding="async" loading="lazy" alt="serverless 监控" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-09-12_114344-737b376b19223a13becffb2bdad8c0e7.png" width="1192" height="719" class="img_blrk"></p>
<!-- -->
<div><iframe src="https://button.like.co/in/embed/havocfuture/button?referrer=https://tech.havocfuture.tw/zh-hans/blog/serverless-framework-with-aws"></iframe><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>版权声明</h5></div><div class="admonition-content"><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh_CN" target="_blank" rel="noopener noreferrer" title="CC BY-NC-SA 4.0"><img src="data:image/png;base64,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"></a>，转载请注明出处<br>本文键接: <a href="https://tech.havocfuture.tw/zh-hans/blog/serverless-framework-with-aws" target="_blank" rel="noopener noreferrer">https://tech.havocfuture.tw/zh-hans/blog/serverless-framework-with-aws</a></p></div></div><br><div class="row"><div class="col col--12"><div class="banner_m8Vh"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="9057051535" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div><br><div id="cusdis_thread" data-host="https://cusdis.com" data-app-id="60a126c4-a58f-4510-a5f4-c3d3d182b735" data-page-id="serverless-framework-with-aws" data-page-url="https://tech.havocfuture.tw/blog/serverless-framework-with-aws" data-page-title="如何使用 Serverless Framework 将 Express 部署到 AWS Lambda"></div><div class="row"><div class="col col--2"><div class="leftAd_demG"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="4460531054" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div></div>]]></content>
        <author>
            <name>Eric Cheng</name>
        </author>
        <category label="JavaScript" term="JavaScript"/>
        <category label="AWS" term="AWS"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[分享到 Line 的网址，如何用外部(预设)浏览器开启]]></title>
        <id>https://tech.havocfuture.tw/zh-hans/blog/line-open-external-browser</id>
        <link href="https://tech.havocfuture.tw/zh-hans/blog/line-open-external-browser"/>
        <updated>2024-05-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[应该很多人注意到如果你将网址分享到Line，朋友打开时用的不是平常常用的预设浏览器，像是Chrome、Safari，而是Line 自己内建的浏览器，这其实会造成有些困扰，一来是可能比较不习惯，一来网站有些javascript 会因此不能执行]]></summary>
        <content type="html"><![CDATA[<p>应该很多人注意到如果你将网址分享到Line，朋友打开时用的不是平常常用的预设浏览器，像是Chrome、Safari，而是Line 自己内建的浏览器，这其实会造成有些困扰，一来是可能比较不习惯，一来网站有些javascript 会因此不能执行</p>
<!-- -->
<p>其实还算好理解为什么 Line 还什么要做自己的浏览器，差别在</p>
<ul>
<li class="">使用 Line 内建浏览器，使用者还会留在 Line，当看完网页内容，按个 X，就会回到 Line</li>
<li class="">使用外部(预设)浏览器，使用者就直接去 Chrome、Safari，看完网页内容可能就去做别的事了</li>
</ul>
<p>所以希望 Line 修改不太实际，如果希望朋友能够直接使用外部(预设)浏览器开启网址还是自己调整连结比较快，修改方法其实很简单，只需要在网址加上</p>
<p>?openExternalBrowser=1</p>
<p>就可以了，ex 要分享</p>
<p><a href="https://tech.havocfuture.tw/blog/line-open-external-browser" target="_blank" rel="noopener noreferrer" class="">https://tech.havocfuture.tw/blog/line-open-external-browser</a></p>
<p>改成</p>
<p><a href="https://tech.havocfuture.tw/blog/line-open-external-browser?openExternalBrowser=1" target="_blank" rel="noopener noreferrer" class="">https://tech.havocfuture.tw/blog/line-open-external-browser?openExternalBrowser=1</a></p>
<p>这样用 Line 开启连结时，就不会呼叫 Line 的内建浏览器，而使用使用者习惯的 Chrome、Safari 了</p>
<!-- -->
<div><iframe src="https://button.like.co/in/embed/havocfuture/button?referrer=https://tech.havocfuture.tw/zh-hans/blog/line-open-external-browser"></iframe><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>版权声明</h5></div><div class="admonition-content"><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh_CN" target="_blank" rel="noopener noreferrer" title="CC BY-NC-SA 4.0"><img src="data:image/png;base64,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"></a>，转载请注明出处<br>本文键接: <a href="https://tech.havocfuture.tw/zh-hans/blog/line-open-external-browser" target="_blank" rel="noopener noreferrer">https://tech.havocfuture.tw/zh-hans/blog/line-open-external-browser</a></p></div></div><br><div class="row"><div class="col col--12"><div class="banner_m8Vh"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="9057051535" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div><br><div id="cusdis_thread" data-host="https://cusdis.com" data-app-id="60a126c4-a58f-4510-a5f4-c3d3d182b735" data-page-id="line-open-external-browser" data-page-url="https://tech.havocfuture.tw/blog/line-open-external-browser" data-page-title="分享到 Line 的网址，如何用外部(预设)浏览器开启"></div><div class="row"><div class="col col--2"><div class="leftAd_demG"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="4460531054" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div></div>]]></content>
        <author>
            <name>Eric Cheng</name>
        </author>
        <category label="Line" term="Line"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Vite 如何对开发环境和正式环境设定不同变数值]]></title>
        <id>https://tech.havocfuture.tw/zh-hans/blog/vite-env-setting</id>
        <link href="https://tech.havocfuture.tw/zh-hans/blog/vite-env-setting"/>
        <updated>2024-05-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Create React App 转到 Vite，有很多不熟悉的地方，这篇文章简单的对 Vite 在不同环境设定不同变数做简单的笔记]]></summary>
        <content type="html"><![CDATA[<p>从使用 Create React App 转到 Vite，有很多不熟悉的地方，这篇文章简单的对 Vite 在不同环境设定不同变数做简单的笔记</p>
<p>不同的环境有不同的环境变数值是很正常的，ex 开发环境连开发环境的后端，正式环境连正式的环境的后端，开发环境有开发环境的api key，正式环境有正式环境的api key，
之前用过 <a href="https://github.com/node-config/node-config" target="_blank" rel="noopener noreferrer" class="">npm-config</a>，处理过类似的需求，不过 Vite 自己就内建处理这类需求的方法</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="env-文件">.env 文件<a href="https://tech.havocfuture.tw/zh-hans/blog/vite-env-setting#env-%E6%96%87%E4%BB%B6" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>vite 预设有两种环境：development(开发环境)、production(正式环境)，先在根目录下建立两支程式 .env.development、.env.production，如下图
<img decoding="async" loading="lazy" alt="Vite .env 文件1" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-05-15_143734-c3b76fc9e42098b426d845a927b555ce.png" width="251" height="531" class="img_blrk"></p>
<p>.env 的内容大概长这样，内容就是在不同环境会不一样，要自行定义的值
<img decoding="async" loading="lazy" alt="Vite .env 文件2" src="data:image/png;base64,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" width="1153" height="141" class="img_blrk"></p>
<p>注意，<code>key 值需要用 VITE_ 开头</code> 才会读的到</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="内建环境变量">内建环境变量<a href="https://tech.havocfuture.tw/zh-hans/blog/vite-env-setting#%E5%86%85%E5%BB%BA%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>Vite 有几个内建的环境变量</p>
<ul>
<li class="">import.meta.env.MODE: <code>{string}</code> 应用运作的模式。</li>
<li class="">import.meta.env.BASE_URL: <code>{string}</code> 部署应用程式时的基本 URL。 他由base 配置项决定。</li>
<li class="">import.meta.env.PROD: <code>{boolean}</code> 应用是否运行在生产环境（使用 NODE_ENV='production' 运行开发伺服器或建置应用程式时使用 NODE_ENV='production' ）。</li>
<li class="">import.meta.env.DEV: <code>{boolean}</code> 应用是否运行在开发环境 (永远与 import.meta.env.PROD相反)。</li>
<li class="">import.meta.env.SSR: <code>{boolean}</code> 应用程式是否运行在 server 上</li>
</ul>
<p>直接来测试，在开发环境执行 npm run dev，用 console.log 将这些值印出来
<img decoding="async" loading="lazy" alt="Vite 内建环境变量" src="data:image/png;base64,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" width="334" height="146" class="img_blrk"></p>
<p>就可以看到这是在 development 环境，如果是在正式环境就可以看到 import.meta.env.MODE 的值是 production</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="读取设定值">读取设定值<a href="https://tech.havocfuture.tw/zh-hans/blog/vite-env-setting#%E8%AF%BB%E5%8F%96%E8%AE%BE%E5%AE%9A%E5%80%BC" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>举例我要取得 .env.development 的 VITE_API_HOST 这个值</p>
<div class="language-javascript codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-javascript codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> apiHost </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">import</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">meta</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">env</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">VITE_API_HOST</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// http://localhost:8085</span><br></div></code></pre></div></div>
<p>这样就简单可以取得值</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="build">Build<a href="https://tech.havocfuture.tw/zh-hans/blog/vite-env-setting#build" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>一般执行</p>
<div class="language-text codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-text codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">npm run build</span><br></div></code></pre></div></div>
<p>建置后的结果是读取 .env.production 这个档案的环境变量</p>
<p>如果要建置读取 .env.development 开发环境，可以执行</p>
<div class="language-text codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-text codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">npm run build -- --mode development</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="两个以上的环境">两个以上的环境<a href="https://tech.havocfuture.tw/zh-hans/blog/vite-env-setting#%E4%B8%A4%E4%B8%AA%E4%BB%A5%E4%B8%8A%E7%9A%84%E7%8E%AF%E5%A2%83" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>如果有两个以上的环境，像是 qa 测试环境</p>
<ul>
<li class="">建立 .env.qa 档案</li>
<li class="">执行 npm run build -- --mode qa</li>
</ul>
<p>这样就会加载 .env.qa 的环境变量</p>
<!-- -->
<div><iframe src="https://button.like.co/in/embed/havocfuture/button?referrer=https://tech.havocfuture.tw/zh-hans/blog/vite-env-setting"></iframe><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>版权声明</h5></div><div class="admonition-content"><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh_CN" target="_blank" rel="noopener noreferrer" title="CC BY-NC-SA 4.0"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFgAAAAfCAMAAABUFvrSAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAEZ0FNQQAAsY58+1GTAAAAAXNSR0IB2cksfwAAAf5QTFRF////////////////8fHx7+/v6Ofn4+Pj4N/g39/f1tXV09bS0tXS0tXR0dTR0dTQ0NTQ0NPPz9PPztLOztHNzdHNzdHMz8/PzdDMzNDMzNDLzM/Ly8/Ly8/Ky87Kys3Jyc3Jyc3Iy8rLyMzIyMzHx8vHxsrGycjIxsrFxcnFyMfHxcnExMnExMjDw8jDxMfDw8fCwsfCwcXAwMXAwMW/wMS/v8S+v8O+vsO+vsK9vcK9vcK8v7+/vMG8vMG7vMC8u8C7u8C6ur+6ur+5ub65ub64uL23t7y2urm5tru1tbq0tLqztLmzs7iysrixtbW1srexsbewsLavsLWvr7Wur7SusLOvrrStrrOtr7KvrbOsrLKrr6+vq7GqrKurpqqmo6ijoqaho6Ghn6OenqCdn5+fnp2dn5aampiZlpmWlZmUmJaXk5iTkZSRkZORkY+Pj4+PiYyJjIqLjoeLh4aHhIaEhIWEgoWChIGCf4F+gICAfX98fH98fnt8en15eXx5eHV2dnN0dXJzcHJvcHBwbmxsaGVmY19hYGBgXV5dWldYUFFQUFBQQ0RDQEBAPj8+Pzs8Pzc5NTY1MjMxMjExMDAwMS0uLS0tKioqKSopKSkpKCkoKCgoKicnKCUmJCQkIx8gICAgHxscGxsbGRkZEBAQDg4ODQ4NDQwNAAAA4LK4NQAAAAN0Uk5TAAoO5yEBUwAAA+1JREFUeNq1lot3GkUUxlcviEDS7bYbKxC2oaWKSUmRpkkrSBvzIMGkJjGamoSobROtNqRVWyOppli0NBBSHxst+JiYUvr9l57dheVx8ESpncOeOfvbnW92vjv3DtyzeCqN44BIeCh02t/tcXdIDpvN4Tzs9nj9faHBcGR88u2Z2dm56H9vAIdIeCBwyudxOUWBb7FaW/YJYrvL4+sJDCjK0zOzc00pcwgPBE56j0kif3OzqCyiuHmDP+h0H/e/NhCOnJ+avjA7t55THuTWK+P2JOAwFDjpdduF2G7FoN1lwebq8gcGw2MTUzOf5IFsMpkF8le1UVf3JuAQOuV12/g0gEIqHgzGUwUA6RMvuI73hIZGxyc/fISMmYjInMEjddSlf0HA4bTvmF3RLcSNpLXFApA/YXP7+vqHIxM5pIgIUB4grwzKq2Rlo46YOjtNOgEHv0cS0oBsJr0ZZSAtOD3+wNDoGjKWsjBlsB6NruPnj4lWHj5OmHSSsdBFxhgbKRFFuPuoGANkI1Gt8vJBl7e3P/wAVTOakYtGc/iD3f8e8S+woBMzdbIf7iYYW9GIIuxx8rsoHKKaZixgl2/3+F8fQla5T0FdPmURjSL77W3GWMJkqRAyfMQ+J1pi2xpRhN1tN4E41bVF4Ibo9p0ZQJJUJzQvkopMkqgzASBhqRDDn+w3IhNjz6lEEe44sImCkSiYyWbjWneNiArYFA57e/sbCxOZEtuMbYzo5K1fgqrw87qwxBeVZQbVHZydV7uUsvjiPmdXz7lGVhCRYYksSrTul8nIxZeJFhirWOFoBa4RydgxB3cWZcjm+Z1F1YsWh8cf+lULnvbBeqhog21vI7Hw9V9lssTY6urv7NNK8OxWIKiMjGsCJbuDgNX2kj/0FTJUv90yRKbVh49XDNVkVVnAd4bKdttDePhBJUGS1Qny2UYdObKwYNFJjRXGQztxGbLSVawYfr/ZlC4FrxQ1PXhJFHmpq+fc8Jsf5AA5lZQrJedSfk+ibrc0CqRvt/ms2tEONoUOb+8b4bHJd75pqmy622KqF40S5NUzg6PjUzNNHCLg8Iqa0uZ/SunI+WaFu4+KlxsVoZjo6u7rD49NTF+Ya0oYtyThHiBXlSGzWjalL5/omAZwx7G/utAb4wXgR95+C08qjDXb/nt1RxP/4hX9HS0/oF0a0S4i1L1EtcJYcwiXqw/TmGC/UjWm9KMqldJ9zVQ1QBPGHUnkY+Xjf5kXpWofymWzeiqqmag8F1G9MH56z9l2gG+1Wlt5QWx/d6tmTJ0RZRuohtUtgdP51vWzksNud0hnr2/VxqHRF9d7XI5DA+H/+1/hM09J92+7pmyRGJsTpgAAAABJRU5ErkJggg=="></a>，转载请注明出处<br>本文键接: <a href="https://tech.havocfuture.tw/zh-hans/blog/vite-env-setting" target="_blank" rel="noopener noreferrer">https://tech.havocfuture.tw/zh-hans/blog/vite-env-setting</a></p></div></div><br><div class="row"><div class="col col--12"><div class="banner_m8Vh"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="9057051535" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div><br><div id="cusdis_thread" data-host="https://cusdis.com" data-app-id="60a126c4-a58f-4510-a5f4-c3d3d182b735" data-page-id="vite-env-setting" data-page-url="https://tech.havocfuture.tw/blog/vite-env-setting" data-page-title="Vite 如何对开发环境和正式环境设定不同变数值"></div><div class="row"><div class="col col--2"><div class="leftAd_demG"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="4460531054" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div></div>]]></content>
        <author>
            <name>Eric Cheng</name>
        </author>
        <category label="React" term="React"/>
        <category label="JavaScript" term="JavaScript"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Google Apps Script 测试笔记，实作监控网站发送 Line Notify]]></title>
        <id>https://tech.havocfuture.tw/zh-hans/blog/google-app-script-monitor</id>
        <link href="https://tech.havocfuture.tw/zh-hans/blog/google-app-script-monitor"/>
        <updated>2024-03-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[之前测试了一下Line Notify，思考了一下有什么能够实际运用的地方，于是想到拿来做为发送网站如果不小心挂点后的告警通知，原来想用AWS Lambda 来写，后来不小心看 Google 也有类似的免费服务Google Apps Script，测试了一下，简单做个笔记]]></summary>
        <content type="html"><![CDATA[<p>之前测试了一下Line Notify，见前文【<a class="" href="https://tech.havocfuture.tw/zh-hans/blog/line-notify">Line Notify 测试笔记</a>】，思考了一下有什么能够实际运用的地方，于是想到拿来做为发送网站如果不小心挂点 后的告警通知，原来想用AWS Lambda 来写，后来不小心看Google 也有类似的免费服务Google Apps Script，测试了一下，简单做个笔记</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="什么是-google-apps-script">什么是 Google Apps Script<a href="https://tech.havocfuture.tw/zh-hans/blog/google-app-script-monitor#%E4%BB%80%E4%B9%88%E6%98%AF-google-apps-script" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>Google Apps Script是一种基于云的脚本语言，允许你自动化和扩展Google Workspace（包括Gmail、Calendar、Drive、Sheets、Docs等）以及其他Google服务的功能。 它提供了一种简单的方式来进行自动化处理、集成外部API和创建自定义函数、菜单和扩展功能，无需安装任何软体。</p>
<p>以上是 ChatGPT4 说的，不过这篇文章没那么复杂，也没要连动 Google 的其他服务，只要是用 Line Notify 发个告警而已</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="测试执行-google-apps-script">测试执行 Google Apps Script<a href="https://tech.havocfuture.tw/zh-hans/blog/google-app-script-monitor#%E6%B5%8B%E8%AF%95%E6%89%A7%E8%A1%8C-google-apps-script" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>首先先连到网址：<a href="https://script.google.com/" target="_blank" rel="noopener noreferrer" class="">Google Apps Script</a></p>
<p>如果之前没使用过的话，可以先开个新专案，之后会看到像这样的画面</p>
<p><img decoding="async" loading="lazy" alt="google-app-script 1" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-03-14_104910-552f1ac8a3ac7cd5ff7111662ef2c4c4.png" width="1373" height="386" class="img_blrk"></p>
<p>在 Google Apps Script 程式码用的是 gs，但体感上和 javascript 很像，在 javascript 能跑的语法大致上都能用</p>
<p>简单写了两个 function ，会发现下拉式选单可选择要执行哪一个</p>
<p><img decoding="async" loading="lazy" alt="google-app-script 2" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-03-14_105401-c7a19af4d0dfdfed1b6c2953853793cd.png" width="586" height="262" class="img_blrk"></p>
<p>点选执行后，可以看到执行结果</p>
<p><img decoding="async" loading="lazy" alt="google-app-script 3" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-03-14_105813-004ca3f69de012fc645bff99f4d50faf.png" width="598" height="546" class="img_blrk"></p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="监控网站发送-line-notify-程式码">监控网站发送 Line Notify 程式码<a href="https://tech.havocfuture.tw/zh-hans/blog/google-app-script-monitor#%E7%9B%91%E6%8E%A7%E7%BD%91%E7%AB%99%E5%8F%91%E9%80%81-line-notify-%E7%A8%8B%E5%BC%8F%E7%A0%81" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>简单写了支程式如下</p>
<div class="language-javascript codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-javascript codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token doc-comment comment" style="color:#999988;font-style:italic">/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token doc-comment comment" style="color:#999988;font-style:italic"> * 排程</span><br></div><div class="token-line" style="color:#393A34"><span class="token doc-comment comment" style="color:#999988;font-style:italic">*/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">doMonitorCrontab</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> lineToken </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'您的 line token'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> monitors </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'https://havocfuture.tw'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'https://tech.havocfuture.tw'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">doMonitor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">monitors</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">lineToken</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token doc-comment comment" style="color:#999988;font-style:italic">/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token doc-comment comment" style="color:#999988;font-style:italic"> * 執行監控網站</span><br></div><div class="token-line" style="color:#393A34"><span class="token doc-comment comment" style="color:#999988;font-style:italic">*/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">doMonitor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">monitors</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> lineToken</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">for</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> len </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> monitors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">length</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> len</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> monitorRes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">monitorUrl</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">monitors</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">monitorRes</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">status</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'success'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">sendLineNotify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lineToken</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> monitorRes</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">msg</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token doc-comment comment" style="color:#999988;font-style:italic">/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token doc-comment comment" style="color:#999988;font-style:italic"> * 監控網站 URL</span><br></div><div class="token-line" style="color:#393A34"><span class="token doc-comment comment" style="color:#999988;font-style:italic">*/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">monitorUrl</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">url</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> res </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token literal-property property" style="color:#36acaa">status</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'none'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">msg</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">''</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> fetchUrlCode </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token maybe-class-name">UrlFetchApp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">url</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getResponseCode</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fetchUrlCode </span><span class="token operator" style="color:#393A34">!==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      res </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token literal-property property" style="color:#36acaa">status</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'fail'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">msg</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> url </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'\n回應碼異常：'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> fetchUrlCode</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      res </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token literal-property property" style="color:#36acaa">status</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'success'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">msg</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">''</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    res </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token literal-property property" style="color:#36acaa">status</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'fail'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">msg</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> url </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'\n異常：'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'['</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> res</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">status</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">']'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> url</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> res</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">msg</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> res</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token doc-comment comment" style="color:#999988;font-style:italic">/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token doc-comment comment" style="color:#999988;font-style:italic"> * 發送 Line Notify 訊息</span><br></div><div class="token-line" style="color:#393A34"><span class="token doc-comment comment" style="color:#999988;font-style:italic">*/</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sendLineNotify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">lineToken</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> option </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">method</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'post'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">headers</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">Authorization</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Bearer '</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> lineToken </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">payload</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">message</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> message</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token maybe-class-name">UrlFetchApp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'https://notify-api.line.me/api/notify'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> option</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>程式很简单，大致说明如下</p>
<ul>
<li class="">function sendLineNotify 负责放送 Line Notify，当然首先需要有 Line Token，如何取得 Line Token 可以参考之前的文章：【<a class="" href="https://tech.havocfuture.tw/zh-hans/blog/line-notify">Line Notify 测试笔记</a>】</li>
<li class="">UrlFetchApp.fetch 在 GAS 上直接就可以使用，不用再 import 其他的 library</li>
<li class="">在 function doMonitorCrontab 填入 lineToken 和要监控的网站 URL Array 后，点选执行就可以看到结果，如果网站有 exception 或回传码不是 200，就可以在 Line 的群组收到告警通知</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="在-google-apps-script-设立排程">在 Google Apps Script 设立排程<a href="https://tech.havocfuture.tw/zh-hans/blog/google-app-script-monitor#%E5%9C%A8-google-apps-script-%E8%AE%BE%E7%AB%8B%E6%8E%92%E7%A8%8B" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>在左侧 menu 的「触发条件」，点选「新增触发条件」</p>
<p><img decoding="async" loading="lazy" alt="google-app-script 4" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-03-14_112606-8820b308080983a6f20db4bf40bd8fb0.png" width="1675" height="936" class="img_blrk"></p>
<p>填写排程内容，以下设定为每小时执行一次 doMonitorCrontab 这个 function</p>
<p><img decoding="async" loading="lazy" alt="google-app-script 5" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-03-14_112948-37b288cd0d151f22b195998fa936506e.png" width="618" height="699" class="img_blrk"></p>
<p>执行后就可以看到结果了</p>
<p><img decoding="async" loading="lazy" alt="google-app-script 6" src="data:image/png;base64,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" width="1390" height="237" class="img_blrk"></p>
<p>结论是 Google Apps Script 是好东西，相当简单也相当实用，至于如何连动处理 Google 其他服务的资料就改天再研究了</p>
<!-- -->
<div><iframe src="https://button.like.co/in/embed/havocfuture/button?referrer=https://tech.havocfuture.tw/zh-hans/blog/google-app-script-monitor"></iframe><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>版权声明</h5></div><div class="admonition-content"><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh_CN" target="_blank" rel="noopener noreferrer" title="CC BY-NC-SA 4.0"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFgAAAAfCAMAAABUFvrSAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAEZ0FNQQAAsY58+1GTAAAAAXNSR0IB2cksfwAAAf5QTFRF////////////////8fHx7+/v6Ofn4+Pj4N/g39/f1tXV09bS0tXS0tXR0dTR0dTQ0NTQ0NPPz9PPztLOztHNzdHNzdHMz8/PzdDMzNDMzNDLzM/Ly8/Ly8/Ky87Kys3Jyc3Jyc3Iy8rLyMzIyMzHx8vHxsrGycjIxsrFxcnFyMfHxcnExMnExMjDw8jDxMfDw8fCwsfCwcXAwMXAwMW/wMS/v8S+v8O+vsO+vsK9vcK9vcK8v7+/vMG8vMG7vMC8u8C7u8C6ur+6ur+5ub65ub64uL23t7y2urm5tru1tbq0tLqztLmzs7iysrixtbW1srexsbewsLavsLWvr7Wur7SusLOvrrStrrOtr7KvrbOsrLKrr6+vq7GqrKurpqqmo6ijoqaho6Ghn6OenqCdn5+fnp2dn5aampiZlpmWlZmUmJaXk5iTkZSRkZORkY+Pj4+PiYyJjIqLjoeLh4aHhIaEhIWEgoWChIGCf4F+gICAfX98fH98fnt8en15eXx5eHV2dnN0dXJzcHJvcHBwbmxsaGVmY19hYGBgXV5dWldYUFFQUFBQQ0RDQEBAPj8+Pzs8Pzc5NTY1MjMxMjExMDAwMS0uLS0tKioqKSopKSkpKCkoKCgoKicnKCUmJCQkIx8gICAgHxscGxsbGRkZEBAQDg4ODQ4NDQwNAAAA4LK4NQAAAAN0Uk5TAAoO5yEBUwAAA+1JREFUeNq1lot3GkUUxlcviEDS7bYbKxC2oaWKSUmRpkkrSBvzIMGkJjGamoSobROtNqRVWyOppli0NBBSHxst+JiYUvr9l57dheVx8ESpncOeOfvbnW92vjv3DtyzeCqN44BIeCh02t/tcXdIDpvN4Tzs9nj9faHBcGR88u2Z2dm56H9vAIdIeCBwyudxOUWBb7FaW/YJYrvL4+sJDCjK0zOzc00pcwgPBE56j0kif3OzqCyiuHmDP+h0H/e/NhCOnJ+avjA7t55THuTWK+P2JOAwFDjpdduF2G7FoN1lwebq8gcGw2MTUzOf5IFsMpkF8le1UVf3JuAQOuV12/g0gEIqHgzGUwUA6RMvuI73hIZGxyc/fISMmYjInMEjddSlf0HA4bTvmF3RLcSNpLXFApA/YXP7+vqHIxM5pIgIUB4grwzKq2Rlo46YOjtNOgEHv0cS0oBsJr0ZZSAtOD3+wNDoGjKWsjBlsB6NruPnj4lWHj5OmHSSsdBFxhgbKRFFuPuoGANkI1Gt8vJBl7e3P/wAVTOakYtGc/iD3f8e8S+woBMzdbIf7iYYW9GIIuxx8rsoHKKaZixgl2/3+F8fQla5T0FdPmURjSL77W3GWMJkqRAyfMQ+J1pi2xpRhN1tN4E41bVF4Ibo9p0ZQJJUJzQvkopMkqgzASBhqRDDn+w3IhNjz6lEEe44sImCkSiYyWbjWneNiArYFA57e/sbCxOZEtuMbYzo5K1fgqrw87qwxBeVZQbVHZydV7uUsvjiPmdXz7lGVhCRYYksSrTul8nIxZeJFhirWOFoBa4RydgxB3cWZcjm+Z1F1YsWh8cf+lULnvbBeqhog21vI7Hw9V9lssTY6urv7NNK8OxWIKiMjGsCJbuDgNX2kj/0FTJUv90yRKbVh49XDNVkVVnAd4bKdttDePhBJUGS1Qny2UYdObKwYNFJjRXGQztxGbLSVawYfr/ZlC4FrxQ1PXhJFHmpq+fc8Jsf5AA5lZQrJedSfk+ibrc0CqRvt/ms2tEONoUOb+8b4bHJd75pqmy622KqF40S5NUzg6PjUzNNHCLg8Iqa0uZ/SunI+WaFu4+KlxsVoZjo6u7rD49NTF+Ya0oYtyThHiBXlSGzWjalL5/omAZwx7G/utAb4wXgR95+C08qjDXb/nt1RxP/4hX9HS0/oF0a0S4i1L1EtcJYcwiXqw/TmGC/UjWm9KMqldJ9zVQ1QBPGHUnkY+Xjf5kXpWofymWzeiqqmag8F1G9MH56z9l2gG+1Wlt5QWx/d6tmTJ0RZRuohtUtgdP51vWzksNud0hnr2/VxqHRF9d7XI5DA+H/+1/hM09J92+7pmyRGJsTpgAAAABJRU5ErkJggg=="></a>，转载请注明出处<br>本文键接: <a href="https://tech.havocfuture.tw/zh-hans/blog/google-app-script-monitor" target="_blank" rel="noopener noreferrer">https://tech.havocfuture.tw/zh-hans/blog/google-app-script-monitor</a></p></div></div><br><div class="row"><div class="col col--12"><div class="banner_m8Vh"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="9057051535" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div><br><div id="cusdis_thread" data-host="https://cusdis.com" data-app-id="60a126c4-a58f-4510-a5f4-c3d3d182b735" data-page-id="google-app-script-monitor" data-page-url="https://tech.havocfuture.tw/blog/google-app-script-monitor" data-page-title="Google Apps Script 测试笔记，实作监控网站发送 Line Notify"></div><div class="row"><div class="col col--2"><div class="leftAd_demG"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="4460531054" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div></div>]]></content>
        <author>
            <name>Eric Cheng</name>
        </author>
        <category label="JavaScript" term="JavaScript"/>
        <category label="Tools" term="Tools"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[实测 ChatGPT4 和 Google Gemini 在对答上的表现差异]]></title>
        <id>https://tech.havocfuture.tw/zh-hans/blog/chatgpt4-vs-gemini</id>
        <link href="https://tech.havocfuture.tw/zh-hans/blog/chatgpt4-vs-gemini"/>
        <updated>2024-02-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[好的以上是我用Gemini 请它自我介绍它的回答，简单的说，这一年多来Google 应该是感受到Microsoft + OpenAI 强大的压力，不得不推出对应的工具来应战，简单的测试一些问题 ，看看两者回答上有什么落差]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="什么是-gemini">什么是 Gemini<a href="https://tech.havocfuture.tw/zh-hans/blog/chatgpt4-vs-gemini#%E4%BB%80%E4%B9%88%E6%98%AF-gemini" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>Gemini 是 Google AI 于 2023 年 12 月推出的多模态大型语言模型（LLM）。 它是在大量的文字、代码、影像、音讯和影片数据集上进行训练的。 Gemini 可以生成文字、翻译语言、编写不同类型的创意内容，并以信息丰富的方式回答您的问题。</p>
<p>Gemini 的主要功能包括：</p>
<ul>
<li class="">生成文字：Gemini 可以生成各种风格的文字，包括新闻报导、诗歌、小说、代码、脚本、音乐作品、电子邮件、信件等。</li>
<li class="">翻译语言：Gemini 可以翻译 100 多种语言。</li>
<li class="">编写不同类型的创意内容：Gemini 可以编写各种不同类型的创意内容，包括诗歌、小说、脚本、音乐作品等。</li>
<li class="">以信息丰富的方式回答您的问题：Gemini 可以以信息丰富的方式回答您的问题，即使这些问题是开放式的、具有挑战性的或奇怪的。</li>
</ul>
<!-- -->
<p>Gemini 的优势包括：</p>
<ul>
<li class="">它可以访问和处理来自 Google 搜索的信息：这意味着 Gemini 可以提供更广泛的知识。</li>
<li class="">它可以生成各种创意内容：这使得 Gemini 具有更广泛的应用范围。</li>
<li class="">它仍在开发中：这意味着 Gemini 还有很大的改进空间。</li>
</ul>
<p>Gemini 的局限性包括：</p>
<ul>
<li class="">它需要付费使用：这可能限制了一些用户的使用。</li>
<li class="">它仍在开发中：这意味着 Gemini 可能不总是能够提供准确或可靠的信息。</li>
</ul>
<p>总体而言，Gemini 是一个强大的语言模型，具有广泛的功能和应用范围。 它仍在开发中，但它已经具有了很大的潜力。</p>
<hr>
<p><strong>好的以上是我用 Gemini 请它自我介绍它的回答</strong></p>
<p>简单的说，这一年多来 Google 应该是感受到 Microsoft + OpenAI 强大的压力，不得不推出对应的工具来应战，简单的测试一些问题，看看两者回答上有什么落差</p>
<p>先声明一下，因为我没买 Gemini Advanced，所以用的是免费的 Gemini，免费版对上付费版的 ChatGPT4 可能有点不公平，加上测试只是好玩为主，之间的差距就大家自行评量吧</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="chatgpt4-vs-google-gemini">ChatGPT4 vs Google Gemini<a href="https://tech.havocfuture.tw/zh-hans/blog/chatgpt4-vs-gemini#chatgpt4-vs-google-gemini" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<ul>
<li class="">问题一：ChatGPT4 和 Google Gemini 谁比较厉害</li>
</ul>
<p><span style="color:#00748e;font-weight:bold">ChatGPT4：</span>
<img decoding="async" loading="lazy" alt="chatgpt4-q1" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-02-16_162819-e1d7707c2030aaa81cfae5efa7fa51ab.png" width="827" height="555" class="img_blrk"></p>
<p><span style="color:#00748e;font-weight:bold">Gemini：</span>
<img decoding="async" loading="lazy" alt="Gemini-q1" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-02-16_163249-c944aa6f6321459913d1e410e77b1cc6.png" width="635" height="612" class="img_blrk"></p>
<span style="color:#00748e;font-weight:bold">个人觉得 ChatGPT4 回答的完整不少，Gemini 的回答有点在凑字数的感觉</span>
<br>
<br>
<ul>
<li class="">问题二：请简单介绍「老哈的量化投资笔记」这个网站</li>
</ul>
<p><span style="color:#00748e;font-weight:bold">ChatGPT4：</span>
<img decoding="async" loading="lazy" alt="chatgpt4-q2" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-02-16_163250-c3643018e5bc44d57e01e1280fb795fc.jpg" width="752" height="387" class="img_blrk"></p>
<p><span style="color:#00748e;font-weight:bold">Gemini：</span>
<img decoding="async" loading="lazy" alt="Gemini-q2" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-02-16_164125-284e85eda503fcddc112ec752b9ac4e7.png" width="668" height="544" class="img_blrk"></p>
<span style="color:#00748e;font-weight:bold">这一题ChatGPT4 完胜，ChatGPT4 很明确的有找到我的网站，然后还整理了我的网站的相关内容重新帮我 写网站介绍，Gemini 看起来比较像是用标题来猜测我的网站内容</span>
<br>
<br>
<ul>
<li class="">问题三：分析图片</li>
</ul>
<p><span style="color:#00748e;font-weight:bold">ChatGPT4：</span>
<img decoding="async" loading="lazy" alt="chatgpt4-q3" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-02-16_164126-f2f4ef975fa11d57efdfef19c9a9b97e.jpg" width="577" height="711" class="img_blrk"></p>
<p><span style="color:#00748e;font-weight:bold">Gemini：</span>
同样一张图
<img decoding="async" loading="lazy" alt="Gemini-q3-1" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-02-16_165545-9814e9a45de0231e991ea244290e4870.png" width="673" height="488" class="img_blrk">
<img decoding="async" loading="lazy" alt="Gemini-q3-2" src="https://tech.havocfuture.tw/zh-hans/assets/images/2024-02-16_165611-af8c2d6c886dfb293efda7ea47401de2.png" width="689" height="582" class="img_blrk"></p>
<span style="color:#00748e;font-weight:bold">这一题个人认为也是ChatGPT4 完胜，ChatGPT4 很明确的知道这张海报一半是真人，一半是动画，而Gemini 判断有点 问题，电影还判断成壮志凌云(捍卫战士)，明明是不可能的任务，虽然同样是汤姆克鲁斯演的</span>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="结论">结论<a href="https://tech.havocfuture.tw/zh-hans/blog/chatgpt4-vs-gemini#%E7%BB%93%E8%AE%BA" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>就好玩为主，非常不精确的测试，但从这几题还看，Gemini 和ChatGPT4 还有不小的差距，但就如同前面说的，用免费版比付费版其实有点不公平，如果是免费 版互比的话，Gemini 就比ChatGPT 3.5 强多了，毕竟ChatGPT 3.5 连搜寻都做不到，总之Gemini 只是刚起步，再看看Google 还能不能端出什么黑科技出来吧</p>
<!-- -->
<div><iframe src="https://button.like.co/in/embed/havocfuture/button?referrer=https://tech.havocfuture.tw/zh-hans/blog/chatgpt4-vs-gemini"></iframe><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>版权声明</h5></div><div class="admonition-content"><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh_CN" target="_blank" rel="noopener noreferrer" title="CC BY-NC-SA 4.0"><img src="data:image/png;base64,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"></a>，转载请注明出处<br>本文键接: <a href="https://tech.havocfuture.tw/zh-hans/blog/chatgpt4-vs-gemini" target="_blank" rel="noopener noreferrer">https://tech.havocfuture.tw/zh-hans/blog/chatgpt4-vs-gemini</a></p></div></div><br><div class="row"><div class="col col--12"><div class="banner_m8Vh"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="9057051535" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div><br><div id="cusdis_thread" data-host="https://cusdis.com" data-app-id="60a126c4-a58f-4510-a5f4-c3d3d182b735" data-page-id="chatgpt4-vs-gemini" data-page-url="https://tech.havocfuture.tw/blog/chatgpt4-vs-gemini" data-page-title="实测 ChatGPT4 和 Google Gemini 在对答上的表现差异"></div><div class="row"><div class="col col--2"><div class="leftAd_demG"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="4460531054" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div></div>]]></content>
        <author>
            <name>Eric Cheng</name>
        </author>
        <category label="AI" term="AI"/>
        <category label="Tools" term="Tools"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[如何使用 Docker 在 Nginx 上部署 React 专案]]></title>
        <id>https://tech.havocfuture.tw/zh-hans/blog/react-vite-docker</id>
        <link href="https://tech.havocfuture.tw/zh-hans/blog/react-vite-docker"/>
        <updated>2024-01-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[有个需求是要将 React 专案 Deploy 在公司开发用的 Docker 上，简单写个笔记，以后有类似的需求可以直接复制贴上使用]]></summary>
        <content type="html"><![CDATA[<p>有个需求是要将 React 专案 Deploy 在公司开发用的 Docker 上，简单写个笔记，以后有类似的需求可以直接复制贴上使用</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="新建-react-专案">新建 React 专案<a href="https://tech.havocfuture.tw/zh-hans/blog/react-vite-docker#%E6%96%B0%E5%BB%BA-react-%E4%B8%93%E6%A1%88" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>现在主流大致上就是以【<a href="https://create-react-app.dev/" target="_blank" rel="noopener noreferrer" class="">Create React App</a>】 或【<a href="https://vitejs.dev/" target="_blank" rel="noopener noreferrer" class="">Vite</a>】 来建置，这篇文章的范例是使用Vite，如果是使用Create React App 麻烦自行做对应的调整</p>
<p>新建测试专案 test-vite-docker，执行指令</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">npm create vite@latest</span><br></div></code></pre></div></div>
<p>大家很熟的东西就不再多说</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="docker-设定">Docker 设定<a href="https://tech.havocfuture.tw/zh-hans/blog/react-vite-docker#docker-%E8%AE%BE%E5%AE%9A" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="新增-dockerfile">新增 Dockerfile<a href="https://tech.havocfuture.tw/zh-hans/blog/react-vite-docker#%E6%96%B0%E5%A2%9E-dockerfile" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>在新建的 React 专案目录下新增一支 Dockerfile 档案，内容如下</p>
<div class="language-dockerfile codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-dockerfile codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">FROM node:20.11-alpine as build</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">WORKDIR /app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">COPY . /app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">RUN npm install</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">RUN npm run build</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">FROM nginx:alpine</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">COPY --from=build /app/dist /usr/share/nginx/html</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">EXPOSE 80</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">CMD ["nginx","-g","daemon off;"]</span><br></div></code></pre></div></div>
<p>简单说明一下，这里node 用的版本是20.11.0 LTS，如果需要用别的版本请自行更换，docker image 用的都是alpline，其实我一直搞不懂差在哪里，只知道档案比较小，跑起来没什么问题就一直用下去了</p>
<p>docker 是使用 multi-stage builds 的语法，简单说就是将拆成两个 stage</p>
<ul>
<li class="">node stage：build react 专案</li>
<li class="">nginx stage：将 node build 后的结果复制到 nginx，然后执行</li>
</ul>
<p>multi-stage builds 的详细说明，可参考官方文件【<a href="https://docs.docker.com/build/building/multi-stage/" target="_blank" rel="noopener noreferrer" class="">Multi-stage builds</a>】</p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="新增-dockerignore">新增 .dockerignore<a href="https://tech.havocfuture.tw/zh-hans/blog/react-vite-docker#%E6%96%B0%E5%A2%9E-dockerignore" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>在 Dockerfile 同一个目录下增加一支 .dockerignore 档案，作用很像 git 的 .gitignore，在上传 docker 时会忽略掉这些目录和档案，内容如下，可以自行新增或减少内容</p>
<div class="language-text codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-text codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">build</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dist</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">node_modules</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">package-lock.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">README.md</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="建立-docker-image-档案">建立 Docker Image 档案<a href="https://tech.havocfuture.tw/zh-hans/blog/react-vite-docker#%E5%BB%BA%E7%AB%8B-docker-image-%E6%A1%A3%E6%A1%88" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>范例 image 名称叫做 test-vite-docker</p>
<div class="language-text codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-text codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">docker build -t test-vite-docker .</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="建立-docker-container-且执行">建立 Docker Container 且执行<a href="https://tech.havocfuture.tw/zh-hans/blog/react-vite-docker#%E5%BB%BA%E7%AB%8B-docker-container-%E4%B8%94%E6%89%A7%E8%A1%8C" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>范例 container 名称也叫 test-vite-docker，port 改成 8081</p>
<div class="language-text codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-text codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">docker run --name test-vite-docker -p 8081:80 test-vite-docker</span><br></div></code></pre></div></div>
<p>然后点选浏览器，port 用 8081 就可以看到测试网页了</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="解决-nginx-配置正确处理-router-的-history-模式">解决 Nginx 配置正确处理 Router 的 history 模式<a href="https://tech.havocfuture.tw/zh-hans/blog/react-vite-docker#%E8%A7%A3%E5%86%B3-nginx-%E9%85%8D%E7%BD%AE%E6%AD%A3%E7%A1%AE%E5%A4%84%E7%90%86-router-%E7%9A%84-history-%E6%A8%A1%E5%BC%8F" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>不过 deploy 后有点问题，直接在浏览器点连结时会出现 404 (从首页的连结点击就会正常)，同时记录一下解决方法</p>
<p>在根目录增加一支档案 nginx.conf，内容如下：</p>
<div class="language-text codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-text codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">server {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> listen 80;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> server_name localhost;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> root /usr/share/nginx/html;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> index index.html;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> location / {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> try_files $uri $uri/ /index.html;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p>然后修改 Dockerfile，增加一行如下</p>
<div class="language-dockerfile codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-dockerfile codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">FROM node:20.11-alpine as build</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">WORKDIR /app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">COPY . /app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">RUN npm install</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">RUN npm run build</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">FROM nginx:alpine</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">COPY --from=build /app/dist /usr/share/nginx/html</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">COPY nginx.conf /etc/nginx/conf.d/default.conf # 增加这一行</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">EXPOSE 80</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">CMD ["nginx","-g","daemon off;"]</span><br></div></code></pre></div></div>
<p>重新建立 Docker Image 档案和建立 Docker Container 且执行，问题解决</p>
<!-- -->
<div><iframe src="https://button.like.co/in/embed/havocfuture/button?referrer=https://tech.havocfuture.tw/zh-hans/blog/react-vite-docker"></iframe><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>版权声明</h5></div><div class="admonition-content"><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh_CN" target="_blank" rel="noopener noreferrer" title="CC BY-NC-SA 4.0"><img src="data:image/png;base64,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"></a>，转载请注明出处<br>本文键接: <a href="https://tech.havocfuture.tw/zh-hans/blog/react-vite-docker" target="_blank" rel="noopener noreferrer">https://tech.havocfuture.tw/zh-hans/blog/react-vite-docker</a></p></div></div><br><div class="row"><div class="col col--12"><div class="banner_m8Vh"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="9057051535" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div><br><div id="cusdis_thread" data-host="https://cusdis.com" data-app-id="60a126c4-a58f-4510-a5f4-c3d3d182b735" data-page-id="react-vite-docker" data-page-url="https://tech.havocfuture.tw/blog/react-vite-docker" data-page-title="如何使用 Docker 在 Nginx 上部署 React 专案"></div><div class="row"><div class="col col--2"><div class="leftAd_demG"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="4460531054" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div></div>]]></content>
        <author>
            <name>Eric Cheng</name>
        </author>
        <category label="React" term="React"/>
        <category label="Docker" term="Docker"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Line Notify 测试笔记]]></title>
        <id>https://tech.havocfuture.tw/zh-hans/blog/line-notify</id>
        <link href="https://tech.havocfuture.tw/zh-hans/blog/line-notify"/>
        <updated>2024-01-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[公司有需求要用 Line 发告警讯息，本来在研究 Line Bot，但后来突然发现 Line Notify 似乎比较符合需求也比较简单，重点还免费，测试了一下，简单做个笔记]]></summary>
        <content type="html"><![CDATA[<p>公司有需求要用 Line 发告警讯息，本来在研究 Line Bot，但后来突然发现 Line Notify 似乎比较符合需求也比较简单，重点还免费，测试了一下，简单做个笔记</p>
<!-- -->
<p>网址：<a href="https://notify-bot.line.me/zh_TW/" target="_blank" rel="noopener noreferrer" class="">https://notify-bot.line.me/zh_TW/</a></p>
<p>请先登入自己的帐号</p>
<p>登入后选择「<strong>个人页面</strong>」</p>
<p><img decoding="async" loading="lazy" alt="line-notify-1" src="https://tech.havocfuture.tw/zh-hans/assets/images/2023-12-28_110545-c15a7390de9d3dfbb852048e21547514.png" width="1284" height="315" class="img_blrk"></p>
<p>选择「<strong>发行存取权杖(开发人员用)</strong>」</p>
<p><img decoding="async" loading="lazy" alt="line-notify-1" src="https://tech.havocfuture.tw/zh-hans/assets/images/2023-12-28_111115-a4c459267b41000423d5f0c946b014bf.png" width="914" height="365" class="img_blrk"></p>
<p>填写权杖名称和要接受的聊天室</p>
<p><img decoding="async" loading="lazy" alt="line-notify-1" src="data:image/png;base64,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" width="586" height="849" class="img_blrk"></p>
<p>点选「<strong>发行</strong>」后，会取得一个权杖，请 复制并储存下来</p>
<p><img decoding="async" loading="lazy" alt="line-notify-1" src="data:image/png;base64,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" width="582" height="488" class="img_blrk"></p>
<p>这时手机会出现「<strong>Line Notify</strong>」这个官方帐号，讯息显示已发行个人权杖，然后 请将这个帐号邀请至刚才发行权杖时的群组聊天室</p>
<p><img decoding="async" loading="lazy" alt="line-notify-1" src="data:image/png;base64,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" width="465" height="275" class="img_blrk"></p>
<p>测试方法
可以使用 postman 来测试</p>
<p>URL 输入 <a href="https://notify-api.line.me/api/notify" target="_blank" rel="noopener noreferrer" class="">https://notify-api.line.me/api/notify</a> ，方法选用「POST」，Headers 填入 Key: Authorization，Value：Bearer + 刚才的权杖，截图如下</p>
<p><img decoding="async" loading="lazy" alt="line-notify-1" src="https://tech.havocfuture.tw/zh-hans/assets/images/2023-12-28_113220-daf0b66488e401a088a5c4aed5dc94ea.png" width="1141" height="233" class="img_blrk"></p>
<p>Body 选 form-data，Key: message，Value 写要传的讯息，截图如下</p>
<p><img decoding="async" loading="lazy" alt="line-notify-1" src="https://tech.havocfuture.tw/zh-hans/assets/images/2023-12-28_113452-93663b0e7974e5149c53898fab1ca8a1.png" width="1145" height="286" class="img_blrk"></p>
<p>成功就会看到群组收到刚才的发送讯息</p>
<!-- -->
<div><iframe src="https://button.like.co/in/embed/havocfuture/button?referrer=https://tech.havocfuture.tw/zh-hans/blog/line-notify"></iframe><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>版权声明</h5></div><div class="admonition-content"><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh_CN" target="_blank" rel="noopener noreferrer" title="CC BY-NC-SA 4.0"><img src="data:image/png;base64,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"></a>，转载请注明出处<br>本文键接: <a href="https://tech.havocfuture.tw/zh-hans/blog/line-notify" target="_blank" rel="noopener noreferrer">https://tech.havocfuture.tw/zh-hans/blog/line-notify</a></p></div></div><br><div class="row"><div class="col col--12"><div class="banner_m8Vh"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="9057051535" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div><br><div id="cusdis_thread" data-host="https://cusdis.com" data-app-id="60a126c4-a58f-4510-a5f4-c3d3d182b735" data-page-id="line-notify" data-page-url="https://tech.havocfuture.tw/blog/line-notify" data-page-title="Line Notify 测试笔记"></div><div class="row"><div class="col col--2"><div class="leftAd_demG"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="4460531054" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div></div>]]></content>
        <author>
            <name>Eric Cheng</name>
        </author>
        <category label="Line" term="Line"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Docusaurus 常用设定笔记]]></title>
        <id>https://tech.havocfuture.tw/zh-hans/blog/docusaurus-common-setting</id>
        <link href="https://tech.havocfuture.tw/zh-hans/blog/docusaurus-common-setting"/>
        <updated>2023-12-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[不知不觉用 docusaurus 建了好几个网站，整理一下一些常用的设定]]></summary>
        <content type="html"><![CDATA[<p>不知不觉用 docusaurus 建了好几个网站，整理一下一些常用的设定</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="ga-设定">GA 设定<a href="https://tech.havocfuture.tw/zh-hans/blog/docusaurus-common-setting#ga-%E8%AE%BE%E5%AE%9A" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>请先申请好GA 的<strong>评估ID</strong>，可参考<a href="https://tech.havocfuture.tw/zh-hans/blog/ga-gsc-setting#google-analysis-%E7%B0%A1%E5%AF%AB-ga" target="_blank" rel="noopener noreferrer" class="">GA 申请流程</a></p>
<p>然后只需要在 docusaurus.config.js 增加 gtag 的 trackingID，将刚才 GA 产生的 评估ID 填入就可以 (或者填 GTM 的 <strong>容器ID</strong> 也有一样效果)</p>
<div class="language-javascript codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-javascript codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">module</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">exports</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">presets</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'@docusaurus/preset-classic'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">gtag</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">trackingID</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'G-&lt;YOUR-NEW-GA4-ID&gt;'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="主色系调整">主色系调整<a href="https://tech.havocfuture.tw/zh-hans/blog/docusaurus-common-setting#%E4%B8%BB%E8%89%B2%E7%B3%BB%E8%B0%83%E6%95%B4" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>预设的主色系为绿色<span style="background-color:#25c2a0">&nbsp;#25c2a0&nbsp;</span>，设定在/src/css/custom.css 这一个档案中</p>
<p>要置换的话，可以先去挑选一个自己喜欢的颜色，可参考 <a href="https://tw.toolser.net/rgb-hex-converter" target="_blank" rel="noopener noreferrer" class="">色码转换器</a></p>
<p>然后到 docusaurus 的工具：<a href="https://docusaurus.io/zh-CN/docs/styling-layout#styling-your-site-with-infima" target="_blank" rel="noopener noreferrer" class="">Styling your site with Infima</a></p>
<p>贴上你挑的颜色后，会产生像以下的 code</p>
<div class="language-css codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-css codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token selector pseudo-class" style="color:#00009f">:root</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--ifm-color-primary</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token hexcode color">#6c7a69</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--ifm-color-primary-dark</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token hexcode color">#616e5e</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--ifm-color-primary-darker</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token hexcode color">#5c6859</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--ifm-color-primary-darkest</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token hexcode color">#4c554a</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--ifm-color-primary-light</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token hexcode color">#778673</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--ifm-color-primary-lighter</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token hexcode color">#7c8c79</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--ifm-color-primary-lightest</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token hexcode color">#8e9c8c</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>复制后置换掉原来 /src/css/custom.css 档案内容即可</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="修改-i18n-预设语系为中文">修改 i18n 预设语系为中文<a href="https://tech.havocfuture.tw/zh-hans/blog/docusaurus-common-setting#%E4%BF%AE%E6%94%B9-i18n-%E9%A2%84%E8%AE%BE%E8%AF%AD%E7%B3%BB%E4%B8%BA%E4%B8%AD%E6%96%87" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>预设的语系是英文，docusaurus.config.js 的设定是</p>
<div class="language-javascript codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-javascript codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token literal-property property" style="color:#36acaa">i18n</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">defaultLocale</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'en'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">locales</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'en'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><br></div></code></pre></div></div>
<p>如果没有网站没有多国语系的话，其实可以不用修改，但缺点是很多讯息就会是英文，</p>
<p>如果希望讯息也是中文的话，先执行</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">npm run write-translations -- --locale zh-hans</span><br></div></code></pre></div></div>
<p>执行后会出现 /i18n/zh-hans 的目录，再来修改设定成中文就可以</p>
<div class="language-javascript codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-javascript codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token literal-property property" style="color:#36acaa">i18n</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">defaultLocale</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'zh-hans'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">locales</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'zh-hans'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="移除网址最后的斜线">移除网址最后的斜线<a href="https://tech.havocfuture.tw/zh-hans/blog/docusaurus-common-setting#%E7%A7%BB%E9%99%A4%E7%BD%91%E5%9D%80%E6%9C%80%E5%90%8E%E7%9A%84%E6%96%9C%E7%BA%BF" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>预设的 sitemap 产生出来的网址预设会有个斜线，个人习惯会在 docusaurus.config.js</p>
<p>增加一行</p>
<div class="language-javascript codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-javascript codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token literal-property property" style="color:#36acaa">trailingSlash</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><br></div></code></pre></div></div>
<p>可参考文件 <a href="https://docusaurus.io/zh-CN/docs/api/docusaurus-config#trailingSlash" target="_blank" rel="noopener noreferrer" class="">trailingSlash</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="部落格侧边栏显示数目">部落格侧边栏显示数目<a href="https://tech.havocfuture.tw/zh-hans/blog/docusaurus-common-setting#%E9%83%A8%E8%90%BD%E6%A0%BC%E4%BE%A7%E8%BE%B9%E6%A0%8F%E6%98%BE%E7%A4%BA%E6%95%B0%E7%9B%AE" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>预设只有 5 笔，个人觉得有点少，习惯改成 10 笔，在 docusaurus.config.js 增加 blogSidebarCount 属性</p>
<div class="language-javascript codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-javascript codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">presets</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'@docusaurus/preset-classic'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">blog</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">blogSidebarCount</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>可参考文件 <a href="https://docusaurus.io/zh-CN/docs/blog#blog-sidebar" target="_blank" rel="noopener noreferrer" class="">Blog sidebar</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="数学公式">数学公式<a href="https://tech.havocfuture.tw/zh-hans/blog/docusaurus-common-setting#%E6%95%B0%E5%AD%A6%E5%85%AC%E5%BC%8F" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>docusaurus 支援 <a href="https://katex.org/" target="_blank" rel="noopener noreferrer" class="">KaTeX</a>，如果希望在页面上呈现像以下的效果</p>
<p>CAGR
<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>=</mo><mstyle mathsize="1.2em"><msup><mrow><mo fence="true">(</mo><mfrac><mrow><mi>F</mi><mi>V</mi></mrow><mrow><mi>P</mi><mi>V</mi></mrow></mfrac><mo fence="true">)</mo></mrow><mfrac><mn>1</mn><mi>n</mi></mfrac></msup><mstyle mathsize="1em"><mo>−</mo><mn>1</mn></mstyle></mstyle></mrow><annotation encoding="application/x-tex">= \large\left(\frac{FV}{PV}\right)^{\frac{1}{n}} \normalsize- 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:2.2115em;vertical-align:-0.59em"></span><span class="minner sizing reset-size6 size7"><span class="minner"><span class="mopen sizing reset-size7 size6 delimcenter" style="top:-0.05em"><span class="delimsizing size2">(</span></span><span class="mord"><span class="mopen nulldelimiter sizing reset-size7 size6"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8496em"><span style="top:-2.655em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size7 size4 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.1389em">P</span><span class="mord mathnormal mtight" style="margin-right:0.2222em">V</span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.394em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size7 size4 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.1389em">F</span><span class="mord mathnormal mtight" style="margin-right:0.2222em">V</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em"><span></span></span></span></span></span><span class="mclose nulldelimiter sizing reset-size7 size6"></span></span><span class="mclose sizing reset-size7 size6 delimcenter" style="top:-0.05em"><span class="delimsizing size2">)</span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.3512em"><span style="top:-3.773em;margin-right:0.0417em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size7 size4 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mopen nulldelimiter sizing reset-size4 size6"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8673em"><span style="top:-2.656em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size4 size2 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span style="top:-3.2255em"><span class="pstrut" style="height:3em"></span><span class="frac-line mtight" style="border-bottom-width:0.049em"></span></span><span style="top:-3.384em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size4 size2 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.344em"><span></span></span></span></span></span><span class="mclose nulldelimiter sizing reset-size4 size6"></span></span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin sizing reset-size6 size6">−</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:0.6444em"></span><span class="mord sizing reset-size6 size6">1</span></span></span></span></p>
<p>就会需要先安装 remark-math、remark-math，注意一下版本，</p>
<p>docusaurus 3 安装</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">npm install --save remark-math@6 rehype-katex@7</span><br></div></code></pre></div></div>
<p>在 docusaurus.config.js 增加以下设定，这个范例是在 /docs 下可以使用 KaTex，如果在 /blog 或 /pages 要使用也要有同样的设定</p>
<div class="language-javascript codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-javascript codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">remarkMath</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'remark-math'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports">rehypeKatex</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'rehype-katex'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">presets</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'@docusaurus/preset-classic'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">docs</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">remarkPlugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">remarkMath</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">rehypePlugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">rehypeKatex</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>然后还要增加一段 CSS</p>
<div class="language-css codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-css codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token selector" style="color:#00009f">stylesheets: [</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">href</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'https://cdn.jsdelivr.net/npm/katex@0.13.24/dist/katex.min.css'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'text/css'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">integrity</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'sha384-odtC+0UGzzFL/6PNoE8rX/SPcQDXBJ+uRepguP4QkPCm2LBxH3FA3y+fKSiJ+AmM'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">crossorigin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'anonymous'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">]</span><span class="token punctuation" style="color:#393A34">,</span><br></div></code></pre></div></div>
<p>可参考文件 <a href="https://docusaurus.io/zh-CN/docs/markdown-features/math-equations" target="_blank" rel="noopener noreferrer" class="">数学公式</a></p>
<p>docusaurus 2 则要安装旧版</p>
<div class="language-bash codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-bash codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">npm install --save remark-math@3 rehype-katex@5</span><br></div></code></pre></div></div>
<p>印象中 docusaurus.config.js 设定语法和新版有点不一样，还在使用 docusaurus 2 就麻烦自己找一下</p>
<p>大概就这样吧，有想到再补充</p>
<!-- -->
<div><iframe src="https://button.like.co/in/embed/havocfuture/button?referrer=https://tech.havocfuture.tw/zh-hans/blog/docusaurus-common-setting"></iframe><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>版权声明</h5></div><div class="admonition-content"><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh_CN" target="_blank" rel="noopener noreferrer" title="CC BY-NC-SA 4.0"><img src="data:image/png;base64,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"></a>，转载请注明出处<br>本文键接: <a href="https://tech.havocfuture.tw/zh-hans/blog/docusaurus-common-setting" target="_blank" rel="noopener noreferrer">https://tech.havocfuture.tw/zh-hans/blog/docusaurus-common-setting</a></p></div></div><br><div class="row"><div class="col col--12"><div class="banner_m8Vh"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="9057051535" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div><br><div id="cusdis_thread" data-host="https://cusdis.com" data-app-id="60a126c4-a58f-4510-a5f4-c3d3d182b735" data-page-id="docusaurus-common-setting" data-page-url="https://tech.havocfuture.tw/blog/docusaurus-common-setting" data-page-title="Docusaurus 常用设定笔记"></div><div class="row"><div class="col col--2"><div class="leftAd_demG"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="4460531054" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div></div>]]></content>
        <author>
            <name>Eric Cheng</name>
        </author>
        <category label="Website" term="Website"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[网站刚上线该做的事 - 申请 GA、GSC 流程笔记]]></title>
        <id>https://tech.havocfuture.tw/zh-hans/blog/ga-gsc-setting</id>
        <link href="https://tech.havocfuture.tw/zh-hans/blog/ga-gsc-setting"/>
        <updated>2023-12-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[一个网站上线其实有不少的事该做，像是怎么知道有多少人来你的网站？怎么让 google 搜寻引擎找到你的网站 … etc，这篇文章简单的整理了一下一个网站上线有哪些事要做]]></summary>
        <content type="html"><![CDATA[<p>一个网站上线其实有不少的事该做，像是怎么知道有多少人来你的网站？怎么让 google 搜寻引擎找到你的网站 … etc，这篇文章简单的整理了一下一个网站上线有哪些事要做</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="google-analysis-简写-ga">Google Analysis (简写 GA)<a href="https://tech.havocfuture.tw/zh-hans/blog/ga-gsc-setting#google-analysis-%E7%AE%80%E5%86%99-ga" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="什么是-ga">什么是 GA<a href="https://tech.havocfuture.tw/zh-hans/blog/ga-gsc-setting#%E4%BB%80%E4%B9%88%E6%98%AF-ga" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>简单的说就是google 提供的网站数据分析工具，网站安装GA 后可以知道有多少人来过你的网站，从什么管道找到你的网站…etc，比较需要注意的有新旧版之分，新版GA叫GA4，请记得使用新版，GA4 使用「<strong>评估ID</strong>」，格式像G-XXXXXXXXXX</p>
<p>使用 GA 需要在网站放一小段 javascript，有一些平台会简化这个流程，直接在设定填入 评估ID 即可</p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="如何申请-ga">如何申请 GA<a href="https://tech.havocfuture.tw/zh-hans/blog/ga-gsc-setting#%E5%A6%82%E4%BD%95%E7%94%B3%E8%AF%B7-ga" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>网址：<a href="https://analytics.google.com/" target="_blank" rel="noopener noreferrer" class="">https://analytics.google.com/</a></p>
<p>建立「<strong>帐户</strong>」(已有帐户可使用旧帐户) 和「<strong>资源</strong>」</p>
<p>请先评估要使用旧有帐户或新建帐户，原则上同一群管理者管理的资源可用同一帐户，管理者可能不同，就用不同帐户，一个资源对应到一个网站</p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="建立帐户和资源">建立「帐户」和「资源」<a href="https://tech.havocfuture.tw/zh-hans/blog/ga-gsc-setting#%E5%BB%BA%E7%AB%8B%E5%B8%90%E6%88%B7%E5%92%8C%E8%B5%84%E6%BA%90" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="ga-1.png" src="https://tech.havocfuture.tw/zh-hans/assets/images/ga-1-6127b4a178fc6dc2ca8e0e148024548c.png" width="1486" height="609" class="img_blrk"></p>
<p><img decoding="async" loading="lazy" alt="ga-2.png" src="https://tech.havocfuture.tw/zh-hans/assets/images/ga-2-3aa9d7df365c4b6a50eaadab68789044.png" width="1478" height="739" class="img_blrk"></p>
<p>基本上就是填写基本资料，然后一直按下一步就可以，建立完成后会看到刚才建立的帐户和资源</p>
<p><img decoding="async" loading="lazy" alt="ga-3.png" src="data:image/png;base64,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" width="1035" height="300" class="img_blrk"></p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="建立资料串流">建立「资料串流」<a href="https://tech.havocfuture.tw/zh-hans/blog/ga-gsc-setting#%E5%BB%BA%E7%AB%8B%E8%B5%84%E6%96%99%E4%B8%B2%E6%B5%81" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>在刚才建立的资源选 「资料串流」-&gt; 「网站」 (这里的范例是网站，当然有手机的需求就是选 Android 或 iOS)</p>
<p><img decoding="async" loading="lazy" alt="ga-4.png" src="https://tech.havocfuture.tw/zh-hans/assets/images/ga-4-0ea346407c3467f9df89e2843e173519.png" width="1840" height="733" class="img_blrk"></p>
<p>填写「网站网址」和「串流名称」</p>
<p><img decoding="async" loading="lazy" alt="ga-5.png" src="https://tech.havocfuture.tw/zh-hans/assets/images/ga-5-587e488d38b9e1bf12c1886ae3a0c8bd.png" width="1490" height="655" class="img_blrk"></p>
<p>这时就可以取得 <strong>评估ID</strong>，基本上只要在网站设定好这个 评估ID，就可以在网站搜寻资讯了</p>
<p><img decoding="async" loading="lazy" alt="ga-6.png" src="https://tech.havocfuture.tw/zh-hans/assets/images/ga-6-0e1f007bb179021a121ae8506dceb849.png" width="1454" height="400" class="img_blrk"></p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="如何在网站埋-ga-code">如何在网站埋 GA code<a href="https://tech.havocfuture.tw/zh-hans/blog/ga-gsc-setting#%E5%A6%82%E4%BD%95%E5%9C%A8%E7%BD%91%E7%AB%99%E5%9F%8B-ga-code" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>可以直接看 GA 网站上的「<strong>查看代码操作说明</strong>」教学</p>
<p>分为「手动安装」或「透过网站制作工具或 CMS 置入」，手动就是直接在网站写 javascript，但一般常见的平台通常都会提供简单置入 GA code 的方法，也可以见各平台的教学</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="google-tag-manager-简写-gtm">Google Tag Manager (简写 GTM)<a href="https://tech.havocfuture.tw/zh-hans/blog/ga-gsc-setting#google-tag-manager-%E7%AE%80%E5%86%99-gtm" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="什么是-gtm">什么是 GTM<a href="https://tech.havocfuture.tw/zh-hans/blog/ga-gsc-setting#%E4%BB%80%E4%B9%88%E6%98%AF-gtm" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>很多新手搞不懂什么是GTM 和GA 的差别，简单说GTM 是google 的代码管理工具，可以管理多个追踪码，像是GA 、FB pixel … etc，有了GTM 后，只需要在网站埋GTM code，之后其他的代码就可以直接在GTM 设定，不再需要动到网站程式了</p>
<p>网址：<a href="https://tagmanager.google.com/" target="_blank" rel="noopener noreferrer" class="">https://tagmanager.google.com/</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="到底需不需要-gtm">到底需不需要 GTM<a href="https://tech.havocfuture.tw/zh-hans/blog/ga-gsc-setting#%E5%88%B0%E5%BA%95%E9%9C%80%E4%B8%8D%E9%9C%80%E8%A6%81-gtm" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>同样是很多新手的疑惑，简单说，如果你的网站很单纯只有GA，其实是不需要安装GTM 的，但如果你的网站有其他行销的需求，或者想保留扩充的弹性，就还是会建议要安装GTM</p>
<p>这篇文章算新手入门篇，就不介绍如何安装 GTM 了…</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="google-search-console-简称-gsc">Google Search Console (简称 GSC)<a href="https://tech.havocfuture.tw/zh-hans/blog/ga-gsc-setting#google-search-console-%E7%AE%80%E7%A7%B0-gsc" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="什么是-gsc">什么是 GSC<a href="https://tech.havocfuture.tw/zh-hans/blog/ga-gsc-setting#%E4%BB%80%E4%B9%88%E6%98%AF-gsc" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>简单说 GSC 可以查看「<strong>google 搜寻</strong>」使用者造访网站的数据，同时藉由申请 GSC，google 搜寻引擎可以知道这边有个新网站上线，让搜寻引擎更快的建立网站索引</p>
<p>GSC 不需要在网站埋程式码，但必须对网站 domain 有所有权才可以设定，会在 DNS 要求认证</p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="如何申请-gsc">如何申请 GSC<a href="https://tech.havocfuture.tw/zh-hans/blog/ga-gsc-setting#%E5%A6%82%E4%BD%95%E7%94%B3%E8%AF%B7-gsc" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>网址：<a href="https://search.google.com/search-console/" target="_blank" rel="noopener noreferrer" class="">https://search.google.com/search-console/</a></p>
<p>点选「新增资源」</p>
<p>依需求选择「网域」或「网址前置字元」，以全新网站的话，选择「网域」就可以了</p>
<p><img decoding="async" loading="lazy" alt="gsc-1.png" src="https://tech.havocfuture.tw/zh-hans/assets/images/gsc-1-a89e364ec21270b6b56b745aabb11abe.png" width="965" height="787" class="img_blrk"></p>
<p>新网域使用 DNS 验证，在 DNS 托管的地方加入一笔 TXT 记录，等 DNS 生效，点选验证即可</p>
<p><img decoding="async" loading="lazy" alt="gsc-2.png" src="https://tech.havocfuture.tw/zh-hans/assets/images/gsc-2-214d9f010ed491e2a77abc53a404a456.png" width="809" height="792" class="img_blrk"></p>
<p>成功后大概要等个一、两天才会看到 GSC 的数据出现</p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="提交-sitemap">提交 sitemap<a href="https://tech.havocfuture.tw/zh-hans/blog/ga-gsc-setting#%E6%8F%90%E4%BA%A4-sitemap" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>非必要，但一个新上线的网站建议提交一下 sitemap，可以加速网站被 google 搜寻引擎找到的时间</p>
<p><img decoding="async" loading="lazy" alt="gsc-3.png" src="https://tech.havocfuture.tw/zh-hans/assets/images/gsc-3-82e5f4ab9ab8142394e6366dd9175b95.png" width="1588" height="541" class="img_blrk"></p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="如何知道自己的网站被-google-收录了">如何知道自己的网站被 google 收录了<a href="https://tech.havocfuture.tw/zh-hans/blog/ga-gsc-setting#%E5%A6%82%E4%BD%95%E7%9F%A5%E9%81%93%E8%87%AA%E5%B7%B1%E7%9A%84%E7%BD%91%E7%AB%99%E8%A2%AB-google-%E6%94%B6%E5%BD%95%E4%BA%86" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>除了看 GSC 的数据外，还有个比较简单的方法，举例要看这个网站有多少页面被 google 收录，直接在浏览器网址打</p>
<p>site<!-- -->:tech<!-- -->.havocfuture.tw * (请自行替换自己的网域)</p>
<p>就可以看到有多少页面被收录和搜寻结果了</p>
<p><img decoding="async" loading="lazy" alt="google-1.png" src="https://tech.havocfuture.tw/zh-hans/assets/images/google-1-65cf28c25bc60ade63ae47dc602aa050.png" width="1068" height="712" class="img_blrk"></p>
<!-- -->
<div><iframe src="https://button.like.co/in/embed/havocfuture/button?referrer=https://tech.havocfuture.tw/zh-hans/blog/ga-gsc-setting"></iframe><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>版权声明</h5></div><div class="admonition-content"><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh_CN" target="_blank" rel="noopener noreferrer" title="CC BY-NC-SA 4.0"><img src="data:image/png;base64,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"></a>，转载请注明出处<br>本文键接: <a href="https://tech.havocfuture.tw/zh-hans/blog/ga-gsc-setting" target="_blank" rel="noopener noreferrer">https://tech.havocfuture.tw/zh-hans/blog/ga-gsc-setting</a></p></div></div><br><div class="row"><div class="col col--12"><div class="banner_m8Vh"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="9057051535" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div><br><div id="cusdis_thread" data-host="https://cusdis.com" data-app-id="60a126c4-a58f-4510-a5f4-c3d3d182b735" data-page-id="ga-gsc-setting" data-page-url="https://tech.havocfuture.tw/blog/ga-gsc-setting" data-page-title="网站刚上线该做的事 - 申请 GA、GSC 流程笔记"></div><div class="row"><div class="col col--2"><div class="leftAd_demG"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="4460531054" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div></div>]]></content>
        <author>
            <name>Eric Cheng</name>
        </author>
        <category label="Website" term="Website"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[该让3%还是6%？用白话文解释统计的误差范围]]></title>
        <id>https://tech.havocfuture.tw/zh-hans/blog/statistics-margin-of-error</id>
        <link href="https://tech.havocfuture.tw/zh-hans/blog/statistics-margin-of-error"/>
        <updated>2023-11-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[最近最热门的话大概就是蓝白合到底该让3%还是6%，统计就是统计，明明就该是要有标准答案，为什么会让两边的「统计专家」吵不出结论？因为我是统计系毕业的，坦白说快被朋友问的烦死了，决定直接写一篇文章来说明，我会尽量的减少数学公式，用白话文来说明谁对谁错]]></summary>
        <content type="html"><![CDATA[<p>最近最热门的话大概就是蓝白合到底该让3%还是6%，统计就是统计，明明就该是要有标准答案，为什么会让两边的「统计专家」吵不出结论？</p>
<p>因为我是统计系毕业的，坦白说快被朋友问的烦死了，每一个人问就要解释一遍，加上又不好解释，决定直接写一篇文章来说明。我会尽量的减少数学公式，用白话文来说明谁对谁错</p>
<p>先打个预防针，虽然我是统计系毕业的，但毕业没碰统计十几年了，可能有些专用名词会用词不太精准，如果有错误也麻烦留言反应给我知道</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="误差范围就是-3-吗">误差范围就是 ±3% 吗？<a href="https://tech.havocfuture.tw/zh-hans/blog/statistics-margin-of-error#%E8%AF%AF%E5%B7%AE%E8%8C%83%E5%9B%B4%E5%B0%B1%E6%98%AF-3-%E5%90%97" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>这个问题比较单纯：<code>不是</code>，误差范围会随着样本大小改变</p>
<p>对民调有点概念的都听过 1068 份样本，误差范围 ±3% 这个数字，我们先来看这个数字怎么来的</p>
<p>公式：在 95% 的信心水准下</p>
<p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mi>o</mi><mi>e</mi><mo>=</mo><mn>1.96</mn><mo>∗</mo><msqrt><mrow><mi>p</mi><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>p</mi><mo stretchy="false">)</mo><mi mathvariant="normal">/</mi><mi>n</mi></mrow></msqrt></mrow><annotation encoding="application/x-tex">moe = 1.96 * \sqrt{p(1-p)/n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em"></span><span class="mord mathnormal">m</span><span class="mord mathnormal">oe</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.6444em"></span><span class="mord">1.96</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:1.24em;vertical-align:-0.305em"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.935em"><span class="svg-align" style="top:-3.2em"><span class="pstrut" style="height:3.2em"></span><span class="mord" style="padding-left:1em"><span class="mord mathnormal">p</span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mord mathnormal">p</span><span class="mclose">)</span><span class="mord">/</span><span class="mord mathnormal">n</span></span></span><span style="top:-2.895em"><span class="pstrut" style="height:3.2em"></span><span class="hide-tail" style="min-width:1.02em;height:1.28em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.28em" viewBox="0 0 400000 1296" preserveAspectRatio="xMinYMin slice"><path d="M263,681c0.7,0,18,39.7,52,119
c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120
c340,-704.7,510.7,-1060.3,512,-1067
l0 -0
c4.7,-7.3,11,-11,19,-11
H40000v40H1012.3
s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232
c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1
s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26
c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z
M1001 80h400000v40h-400000z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.305em"><span></span></span></span></span></span></span></span></span></p>
<p>在一般情况下，p 会简化为 0.5，当 n = 1068 时，误差为 ±3%，而当 n = 3000 时，误差会降低为 ±1.79%</p>
<p>所以<code>当 n (样本数) 愈大，moe (误差范围) 就会愈小</code></p>
<p>这里有一个重点叫 <code>在 95% 的信心水准下</code>，这关系到公式中的 1.96，不想复杂化，直接列表</p>
<table><thead><tr><th>信心水准</th><th>　</th></tr></thead><tbody><tr><td>90%</td><td>1.645</td></tr><tr><td>95%</td><td>1.96</td></tr><tr><td>99%</td><td>2.575</td></tr></tbody></table>
<p>一般统计会用就是 90%，95%，99% 三种信心水准，信心水准愈高，误差范围愈大</p>
<p>这次的蓝白合的<code>第一个问题就是没有提到信心水准</code>，不过以他们的数字很明显信心水准指的是 95%</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="误差范围-3-指的是真实值和估计值的误差">误差范围 ±3% 指的是真实值和估计值的误差<a href="https://tech.havocfuture.tw/zh-hans/blog/statistics-margin-of-error#%E8%AF%AF%E5%B7%AE%E8%8C%83%E5%9B%B4-3-%E6%8C%87%E7%9A%84%E6%98%AF%E7%9C%9F%E5%AE%9E%E5%80%BC%E5%92%8C%E4%BC%B0%E8%AE%A1%E5%80%BC%E7%9A%84%E8%AF%AF%E5%B7%AE" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>同样以民调为例，有一个真实的得票率(现在不知道，要等明年的1月13日才知道)，所以我们透过抽样预估出一个估计值，比较这个真实值和估计值用的就是这个±3% 误差范围</p>
<p>什么叫<code>在95% 的信心水准下，误差范围为±3%</code>，可以不精准的解释为假设估计值为40%，则真实值有95% 的机率会落在37% ~ 43% 之间(37% ~ 43% 称为信赖区间)，至于5% 会小于37% 或大于43% 则被我们容许，因为抽样本来就不会完全正确</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="为什么国民党的算法一定是错的">为什么国民党的算法一定是错的？<a href="https://tech.havocfuture.tw/zh-hans/blog/statistics-margin-of-error#%E4%B8%BA%E4%BB%80%E4%B9%88%E5%9B%BD%E6%B0%91%E5%85%9A%E7%9A%84%E7%AE%97%E6%B3%95%E4%B8%80%E5%AE%9A%E6%98%AF%E9%94%99%E7%9A%84" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>国民党的说法是假设A 是40%，B 是34%，则A 的信赖区间是37% ~ 43%， B 的信赖区间是31% ~ 37%，因为37% 同时存在两个信赖区间，所以在误差范围内</p>
<p>其实错误很明显</p>
<ol>
<li class="">这两个都是估计值，没有真实值</li>
<li class="">如果要满足A - B &gt; 6% 的话，<code>机率远低于5%</code>，假设为常态分布的话，A &lt; 37% 为2.5%，B &gt; 37% 为2.5%，同时满足还要相乘，已经不符合一开始的<code>95% 的信心水准下</code>的前提了</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="所以到底该怎么算">所以到底该怎么算？<a href="https://tech.havocfuture.tw/zh-hans/blog/statistics-margin-of-error#%E6%89%80%E4%BB%A5%E5%88%B0%E5%BA%95%E8%AF%A5%E6%80%8E%E4%B9%88%E7%AE%97" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>其实这次的争执国民党和民众党算法不一样，国民党比较的是「侯柯」和「柯侯」的支持度，民众党比较的是「侯柯和赖萧」和「柯侯和赖萧」的差距，但不管是哪一种，比的都是<code>两个估计值之间的差距</code></p>
<p>先声明以下的计算都是<code>国民党版本「侯柯」和「柯侯」的支持度</code>，因为民众党的算法会更复杂，饶了我这个十几年没碰统计的人吧.. Orz</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="侯柯-vs-柯侯-和-侯-vs-柯-误差范围不同">「侯柯 vs 柯侯」 和 「侯 vs 柯」 误差范围不同<a href="https://tech.havocfuture.tw/zh-hans/blog/statistics-margin-of-error#%E4%BE%AF%E6%9F%AF-vs-%E6%9F%AF%E4%BE%AF-%E5%92%8C-%E4%BE%AF-vs-%E6%9F%AF-%E8%AF%AF%E5%B7%AE%E8%8C%83%E5%9B%B4%E4%B8%8D%E5%90%8C" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>在开始计算之前先请大家想一下「侯柯 vs 柯侯」 和 「侯 vs 柯」，先不考虑谁比较高，大家认为哪一个差距会比较大？</p>
<p>这个应该很直觉「侯vs 柯」差距会比较大，其实统计已经把这个考虑进去了，「侯vs 柯」和「侯柯vs 柯侯」误差范围是不一样的，「侯vs 柯」会较大，为什么？</p>
<p>正确的算法应该是计算两个估计值之间的差距是否显著，我们来计算一下差距的变异数和标准差</p>
<p>公式：</p>
<div class="language-text codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-text codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">Var(X-Y)=Var(X)+Var(Y)-2rho_{X,Y}*(Var(X)Var(Y))^0.5</span><br></div></code></pre></div></div>
<p>其中 rho_{X,Y} 是 X,Y 的相关系数</p>
<p>好啦，我知道大家不想看数学公式，所以我直接把结果计算出来了，为了方便理解起见，我仍然用的是原来 1068 份样本的版本</p>
<table><thead><tr><th>相关系数</th><th>误差范围　</th></tr></thead><tbody><tr><td>-1</td><td>2 * 3% = 6%</td></tr><tr><td>0</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msqrt><mn>2</mn></msqrt></mrow><annotation encoding="application/x-tex"> \sqrt{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.04em;vertical-align:-0.1328em"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9072em"><span class="svg-align" style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord" style="padding-left:0.833em"><span class="mord">2</span></span></span><span style="top:-2.8672em"><span class="pstrut" style="height:3em"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702
c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14
c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54
c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10
s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429
c69,-144,104.5,-217.7,106.5,-221
l0 -0
c5.3,-9.3,12,-14,20,-14
H400000v40H845.2724
s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7
c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z
M834 80h400000v40h-400000z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1328em"><span></span></span></span></span></span></span></span></span> * 3% = 4.24%</td></tr><tr><td>0.5</td><td>1 * 3% = 3%</td></tr><tr><td>1</td><td>0%</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="误差范围会介于-06重点在相关系数">误差范围会介于 0%~6%，重点在相关系数<a href="https://tech.havocfuture.tw/zh-hans/blog/statistics-margin-of-error#%E8%AF%AF%E5%B7%AE%E8%8C%83%E5%9B%B4%E4%BC%9A%E4%BB%8B%E4%BA%8E-06%E9%87%8D%E7%82%B9%E5%9C%A8%E7%9B%B8%E5%85%B3%E7%B3%BB%E6%95%B0" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="什么是相关系数">什么是相关系数？<a href="https://tech.havocfuture.tw/zh-hans/blog/statistics-margin-of-error#%E4%BB%80%E4%B9%88%E6%98%AF%E7%9B%B8%E5%85%B3%E7%B3%BB%E6%95%B0" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>简单来说就是两者之间相关的程度，这个值介于-1 到1 之间，只要有raw data 的数据，是可以算的出来的，不过这次并没有公布，我们先来看几个极端值和特殊值</p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="完全负相关相关系数--1">完全负相关，相关系数 -1<a href="https://tech.havocfuture.tw/zh-hans/blog/statistics-margin-of-error#%E5%AE%8C%E5%85%A8%E8%B4%9F%E7%9B%B8%E5%85%B3%E7%9B%B8%E5%85%B3%E7%B3%BB%E6%95%B0--1" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>什么叫完全负相关，简单说就是非A即B，非黑即白，如果把「侯柯vs 柯侯」印在同一张选票上，然后<code>只能选一个，而且一定要选一个</code>，相关系数就会是-1，做出来的结果就会是80% : 20%、55% : 45% 这样的数据</p>
<p>在这个前提下，误差范围就是 6%，假设柯侯大于 53%，这时侯柯一定小于 47%，我们就可以认定两者有显著差异，<code>国民党的说法仅适用这种情况</code></p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="完全正相关相关系数-1">完全正相关，相关系数 1<a href="https://tech.havocfuture.tw/zh-hans/blog/statistics-margin-of-error#%E5%AE%8C%E5%85%A8%E6%AD%A3%E7%9B%B8%E5%85%B3%E7%9B%B8%E5%85%B3%E7%B3%BB%E6%95%B0-1" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>什么叫完全正相关，简单说A就是B，如果把「侯柯、柯侯」印在同一张选票上，两者为复选题，投侯柯的选民都会投柯侯，投柯侯的选民也都会投侯柯，
这时侯柯和柯侯的支持度相等，误差范围为 0%</p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="独立事件相关系数为-0">独立事件，相关系数为 0<a href="https://tech.havocfuture.tw/zh-hans/blog/statistics-margin-of-error#%E7%8B%AC%E7%AB%8B%E4%BA%8B%E4%BB%B6%E7%9B%B8%E5%85%B3%E7%B3%BB%E6%95%B0%E4%B8%BA-0" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>简单说就是投侯柯和投柯侯是独立事件，彼此完全不相关，这时的误差范围为 4.24%</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="所以到底是-51-还是-33">所以到底是 5:1 还是 3:3<a href="https://tech.havocfuture.tw/zh-hans/blog/statistics-margin-of-error#%E6%89%80%E4%BB%A5%E5%88%B0%E5%BA%95%E6%98%AF-51-%E8%BF%98%E6%98%AF-33" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>其实把 raw data 公布出来，直接计算就知道了，我一直不懂为什么不做这个动作</p>
<p>不过以经验法则「侯柯、柯侯」在蓝白选民还没吵翻之前一定是高度正相关，也就是支持侯柯的人大部份都支持柯侯，同时支持柯侯的人也大部份支持侯柯 (吵翻后就不一定了)，合理估计在0.6~0.8 之间，很难低于0.5，这样的话误差范围不仅不会是6%，还会小于3%，<code>结果就会是3:3</code></p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="结论">结论<a href="https://tech.havocfuture.tw/zh-hans/blog/statistics-margin-of-error#%E7%BB%93%E8%AE%BA" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<ul>
<li class="">以上的计算为国民党版本「侯柯 vs 柯侯」的计算，不考虑赖萧的对比</li>
<li class="">这题有标准答案，但真正的结果需要 raw data 的相关系数资料</li>
<li class=""><code>在假设相关系数大于0.5的前提下，结果为 3:3</code></li>
</ul>
<p>再打一支预防针，我只是统计系毕业，但是十几年没碰统计的人，不是什么统计专家，如果有算错的话，批小一点，麻烦留言给我知道</p>
<p>然后我不相信连我都会的东西，两个政党的统计专家会不懂？请让政治归政治，不要让正在学统计和教统计的人无所适从</p>
<!-- -->
<div><iframe src="https://button.like.co/in/embed/havocfuture/button?referrer=https://tech.havocfuture.tw/zh-hans/blog/statistics-margin-of-error"></iframe><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>版权声明</h5></div><div class="admonition-content"><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh_CN" target="_blank" rel="noopener noreferrer" title="CC BY-NC-SA 4.0"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFgAAAAfCAMAAABUFvrSAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAEZ0FNQQAAsY58+1GTAAAAAXNSR0IB2cksfwAAAf5QTFRF////////////////8fHx7+/v6Ofn4+Pj4N/g39/f1tXV09bS0tXS0tXR0dTR0dTQ0NTQ0NPPz9PPztLOztHNzdHNzdHMz8/PzdDMzNDMzNDLzM/Ly8/Ly8/Ky87Kys3Jyc3Jyc3Iy8rLyMzIyMzHx8vHxsrGycjIxsrFxcnFyMfHxcnExMnExMjDw8jDxMfDw8fCwsfCwcXAwMXAwMW/wMS/v8S+v8O+vsO+vsK9vcK9vcK8v7+/vMG8vMG7vMC8u8C7u8C6ur+6ur+5ub65ub64uL23t7y2urm5tru1tbq0tLqztLmzs7iysrixtbW1srexsbewsLavsLWvr7Wur7SusLOvrrStrrOtr7KvrbOsrLKrr6+vq7GqrKurpqqmo6ijoqaho6Ghn6OenqCdn5+fnp2dn5aampiZlpmWlZmUmJaXk5iTkZSRkZORkY+Pj4+PiYyJjIqLjoeLh4aHhIaEhIWEgoWChIGCf4F+gICAfX98fH98fnt8en15eXx5eHV2dnN0dXJzcHJvcHBwbmxsaGVmY19hYGBgXV5dWldYUFFQUFBQQ0RDQEBAPj8+Pzs8Pzc5NTY1MjMxMjExMDAwMS0uLS0tKioqKSopKSkpKCkoKCgoKicnKCUmJCQkIx8gICAgHxscGxsbGRkZEBAQDg4ODQ4NDQwNAAAA4LK4NQAAAAN0Uk5TAAoO5yEBUwAAA+1JREFUeNq1lot3GkUUxlcviEDS7bYbKxC2oaWKSUmRpkkrSBvzIMGkJjGamoSobROtNqRVWyOppli0NBBSHxst+JiYUvr9l57dheVx8ESpncOeOfvbnW92vjv3DtyzeCqN44BIeCh02t/tcXdIDpvN4Tzs9nj9faHBcGR88u2Z2dm56H9vAIdIeCBwyudxOUWBb7FaW/YJYrvL4+sJDCjK0zOzc00pcwgPBE56j0kif3OzqCyiuHmDP+h0H/e/NhCOnJ+avjA7t55THuTWK+P2JOAwFDjpdduF2G7FoN1lwebq8gcGw2MTUzOf5IFsMpkF8le1UVf3JuAQOuV12/g0gEIqHgzGUwUA6RMvuI73hIZGxyc/fISMmYjInMEjddSlf0HA4bTvmF3RLcSNpLXFApA/YXP7+vqHIxM5pIgIUB4grwzKq2Rlo46YOjtNOgEHv0cS0oBsJr0ZZSAtOD3+wNDoGjKWsjBlsB6NruPnj4lWHj5OmHSSsdBFxhgbKRFFuPuoGANkI1Gt8vJBl7e3P/wAVTOakYtGc/iD3f8e8S+woBMzdbIf7iYYW9GIIuxx8rsoHKKaZixgl2/3+F8fQla5T0FdPmURjSL77W3GWMJkqRAyfMQ+J1pi2xpRhN1tN4E41bVF4Ibo9p0ZQJJUJzQvkopMkqgzASBhqRDDn+w3IhNjz6lEEe44sImCkSiYyWbjWneNiArYFA57e/sbCxOZEtuMbYzo5K1fgqrw87qwxBeVZQbVHZydV7uUsvjiPmdXz7lGVhCRYYksSrTul8nIxZeJFhirWOFoBa4RydgxB3cWZcjm+Z1F1YsWh8cf+lULnvbBeqhog21vI7Hw9V9lssTY6urv7NNK8OxWIKiMjGsCJbuDgNX2kj/0FTJUv90yRKbVh49XDNVkVVnAd4bKdttDePhBJUGS1Qny2UYdObKwYNFJjRXGQztxGbLSVawYfr/ZlC4FrxQ1PXhJFHmpq+fc8Jsf5AA5lZQrJedSfk+ibrc0CqRvt/ms2tEONoUOb+8b4bHJd75pqmy622KqF40S5NUzg6PjUzNNHCLg8Iqa0uZ/SunI+WaFu4+KlxsVoZjo6u7rD49NTF+Ya0oYtyThHiBXlSGzWjalL5/omAZwx7G/utAb4wXgR95+C08qjDXb/nt1RxP/4hX9HS0/oF0a0S4i1L1EtcJYcwiXqw/TmGC/UjWm9KMqldJ9zVQ1QBPGHUnkY+Xjf5kXpWofymWzeiqqmag8F1G9MH56z9l2gG+1Wlt5QWx/d6tmTJ0RZRuohtUtgdP51vWzksNud0hnr2/VxqHRF9d7XI5DA+H/+1/hM09J92+7pmyRGJsTpgAAAABJRU5ErkJggg=="></a>，转载请注明出处<br>本文键接: <a href="https://tech.havocfuture.tw/zh-hans/blog/statistics-margin-of-error" target="_blank" rel="noopener noreferrer">https://tech.havocfuture.tw/zh-hans/blog/statistics-margin-of-error</a></p></div></div><br><div class="row"><div class="col col--12"><div class="banner_m8Vh"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="9057051535" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div><br><div id="cusdis_thread" data-host="https://cusdis.com" data-app-id="60a126c4-a58f-4510-a5f4-c3d3d182b735" data-page-id="statistics-margin-of-error" data-page-url="https://tech.havocfuture.tw/blog/statistics-margin-of-error" data-page-title="该让3%还是6%？用白话文解释统计的误差范围"></div><div class="row"><div class="col col--2"><div class="leftAd_demG"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="4460531054" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div></div>]]></content>
        <author>
            <name>Eric Cheng</name>
        </author>
        <category label="Statistics" term="Statistics"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[如何使用 Gmail 收发个人网域的电子邮件]]></title>
        <id>https://tech.havocfuture.tw/zh-hans/blog/send-mail-from-gmail-custom-domain</id>
        <link href="https://tech.havocfuture.tw/zh-hans/blog/send-mail-from-gmail-custom-domain"/>
        <updated>2023-11-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[网站的连络方式，放上一个有个网域的Email 是个很普遍的需求，原本我购买网域的Gandi 有送两个免费的Email 服务，然后最近收到了一个讯息，简单说免费信箱没了，之后一个信箱每个月要126 台币]]></summary>
        <content type="html"><![CDATA[<p>网站的连络方式，放上一个有个网域的 Email 是个很普遍的需求，以这个网站来看，连络方式放 <a href="mailto:service@havocfuture.tw" target="_blank" rel="noopener noreferrer" class="">service@havocfuture.tw</a> 感觉就是比 <a href="mailto:havocfuture@gmail.com" target="_blank" rel="noopener noreferrer" class="">havocfuture@gmail.com</a> 专业一点，
原本我购买网域的 Gandi 有送两个免费的 Email 服务，然后最近收到了一个讯息</p>
<!-- -->
<p><img decoding="async" loading="lazy" alt="Gandi 免费信箱没了" src="https://tech.havocfuture.tw/zh-hans/assets/images/2023-11-03_151437-7c634790d81ce2b8f033b5f2afacefd9.png" width="986" height="263" class="img_blrk"></p>
<p>简单说免费信箱没了，之后一个信箱每个月要 126 台币，虽然说不算贵，但能省则省，测试成功使用 Gmail 收发个人网域的电子邮件的方法，简单做了笔记</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="step-1-转址信件到-gmail">Step 1 转址信件到 Gmail<a href="https://tech.havocfuture.tw/zh-hans/blog/send-mail-from-gmail-custom-domain#step-1-%E8%BD%AC%E5%9D%80%E4%BF%A1%E4%BB%B6%E5%88%B0-gmail" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>以下截图是 Gandi 的服务，如果网域托管在其他地方，就麻烦自行找一下</p>
<p><img decoding="async" loading="lazy" alt="转址信件到 Gmail" src="https://tech.havocfuture.tw/zh-hans/assets/images/2023-11-03_152646-4e03524713065a71acad3e397ce6fe73.png" width="1350" height="289" class="img_blrk"></p>
<p>设定成功后，以后寄到 <a href="mailto:service@havocfuture.tw" target="_blank" rel="noopener noreferrer" class="">service@havocfuture.tw</a> 的信就会被转到 <a href="mailto:havocfuture@gmail.com" target="_blank" rel="noopener noreferrer" class="">havocfuture@gmail.com</a>，但这样问题只有解决一半，信件只能收，不能寄</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="step-2-dns-设定-txt-record">Step 2 DNS 设定 TXT record<a href="https://tech.havocfuture.tw/zh-hans/blog/send-mail-from-gmail-custom-domain#step-2-dns-%E8%AE%BE%E5%AE%9A-txt-record" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>到网域托管 DNS 记录增加一笔 TXT record</p>
<div class="language-text codeBlockContainer_LW_r theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_Yo7j"><pre tabindex="0" class="prism-code language-text codeBlock_hY9W thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_zk3A"><div class="token-line" style="color:#393A34"><span class="token plain">v=spf1 include:_spf.google.com ~all</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="step-3-google-帐户取得应用程式密码">Step 3 Google 帐户取得应用程式密码<a href="https://tech.havocfuture.tw/zh-hans/blog/send-mail-from-gmail-custom-domain#step-3-google-%E5%B8%90%E6%88%B7%E5%8F%96%E5%BE%97%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BC%8F%E5%AF%86%E7%A0%81" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>申请应用程式密码：【<a href="https://myaccount.google.com/apppasswords" target="_blank" rel="noopener noreferrer" class="">连结</a>】，完成后可以拿到一个密码</p>
<p>这个服务需要启用两阶段验证，如果你看的是「您的帐户无法使用这项设定」，代表你未启用或已停用，请先启用并完成两阶段验证</p>
<p><img decoding="async" loading="lazy" alt="两阶段验证" src="https://tech.havocfuture.tw/zh-hans/assets/images/2023-11-03_153917-9cf0f3b8f348de5971afa35f33f670f8.png" width="1458" height="214" class="img_blrk"></p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="step-4-gmail-设定-选择寄件地址">Step 4 Gmail 设定 选择寄件地址<a href="https://tech.havocfuture.tw/zh-hans/blog/send-mail-from-gmail-custom-domain#step-4-gmail-%E8%AE%BE%E5%AE%9A-%E9%80%89%E6%8B%A9%E5%AF%84%E4%BB%B6%E5%9C%B0%E5%9D%80" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>到 Gmail 的设定，「帐户和汇入」=&gt;「选择寄件地址」=&gt;「新增另一个电子邮件地址」</p>
<p><img decoding="async" loading="lazy" alt="选择寄件地址" src="https://tech.havocfuture.tw/zh-hans/assets/images/2023-11-03_154459-3f21286e0bf8de37253a66fa2b34cd0c.png" width="1267" height="497" class="img_blrk"></p>
<ul>
<li class="">电子邮件：个人网域的 Email</li>
<li class="">SMTP 伺服器：smtp.gmail.com</li>
<li class="">通讯埠：587</li>
<li class="">使用者名称：Gmail</li>
<li class="">密码：刚才拿到的应用程式密码</li>
</ul>
<p>选择「采用 TLS 加密连线」后按下「新增帐户」送出，这时会收到一封验证信，点信中验证连结就完成了</p>
<p>之后在 Gmail 寄信，寄件者旁会有下接式选单，就可以选择用哪个信箱寄信了</p>
<!-- -->
<div><iframe src="https://button.like.co/in/embed/havocfuture/button?referrer=https://tech.havocfuture.tw/zh-hans/blog/send-mail-from-gmail-custom-domain"></iframe><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>版权声明</h5></div><div class="admonition-content"><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh_CN" target="_blank" rel="noopener noreferrer" title="CC BY-NC-SA 4.0"><img src="data:image/png;base64,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"></a>，转载请注明出处<br>本文键接: <a href="https://tech.havocfuture.tw/zh-hans/blog/send-mail-from-gmail-custom-domain" target="_blank" rel="noopener noreferrer">https://tech.havocfuture.tw/zh-hans/blog/send-mail-from-gmail-custom-domain</a></p></div></div><br><div class="row"><div class="col col--12"><div class="banner_m8Vh"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="9057051535" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div><br><div id="cusdis_thread" data-host="https://cusdis.com" data-app-id="60a126c4-a58f-4510-a5f4-c3d3d182b735" data-page-id="send-mail-from-gmail-custom-domain" data-page-url="https://tech.havocfuture.tw/blog/send-mail-from-gmail-custom-domain" data-page-title="如何使用 Gmail 收发个人网域的电子邮件"></div><div class="row"><div class="col col--2"><div class="leftAd_demG"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="4460531054" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div></div>]]></content>
        <author>
            <name>Eric Cheng</name>
        </author>
        <category label="Website" term="Website"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[实测网站搬家，更换网域对 SEO 的影响 - 完整 GA、GSC 报表]]></title>
        <id>https://tech.havocfuture.tw/zh-hans/blog/seo-change-domain</id>
        <link href="https://tech.havocfuture.tw/zh-hans/blog/seo-change-domain"/>
        <updated>2023-09-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[先聊聊为什么要搬网站，原本我只是havocfuture.tw 这个网域，第一个网站【老哈の量化投资笔记】，理所当然就是用主网域，之后把网站拆成两个，就诞生了你们现在看的这个网站，详情见【为什么要设立分站】，后来发现写blog 太累了，写小工具比较简单而且有流量，CP 值高多了，就写了一个小工具网站，因为只有一个网域，就继续用子网域]]></summary>
        <content type="html"><![CDATA[<p>先聊聊为什么要搬网站，原本我只是 havocfuture.tw 这个网域，第一个网站<a href="https://havocfuture.tw/" target="_blank" rel="noopener noreferrer" class="">【老哈の量化投资笔记】</a>，理所当然就是用主网域，
之后把网站拆成两个，就诞生了你们现在看的这个网站，详情见<a class="" href="https://tech.havocfuture.tw/zh-hans/blog/website-launched">【为什么要设立分站】</a>，
后来发现写blog 太累了，写小工具比较简单而且有流量，CP 值比较高，就写了一个小工具网站，因为只有买一个网域，就继续用子网域，叫tools.havocfuture.tw ，</p>
<!-- -->
<p>然后为了要测试多国语系，又买了另一个网域<a href="https://toolser.net/" target="_blank" rel="noopener noreferrer" class="">【Toolser Net】</a>，这时已经有点奇怪， toolser.net 和tools.havocfuture.tw 这两个网站内容其实是重复的，主要差在语系，但分别在不同网域。
更重要的原因是多国语系的SEO 一直没有玩不起来，tools.havocfuture.tw 的流量有起来，但toolser.net 一直没有起色，就兴起把tools.havocfuture.tw 移回toolser.net 网域的念头，
看看能不能将 toolser.net 这个网域权重提高一点，达到帮助提升原 Toolser Net 的 SEO 搜寻排名的目的</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="实测网站搬家更换网域">实测网站搬家，更换网域<a href="https://tech.havocfuture.tw/zh-hans/blog/seo-change-domain#%E5%AE%9E%E6%B5%8B%E7%BD%91%E7%AB%99%E6%90%AC%E5%AE%B6%E6%9B%B4%E6%8D%A2%E7%BD%91%E5%9F%9F" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>这次测试的是将 tools.havocfuture.tw 更换网域为 tw.toolser.net，网站内容完全不动，开始搬家时间为 2023/08/19</p>
<p>进行工作如下：</p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="设定-301-转址">设定 301 转址<a href="https://tech.havocfuture.tw/zh-hans/blog/seo-change-domain#%E8%AE%BE%E5%AE%9A-301-%E8%BD%AC%E5%9D%80" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>我的网域是在 gandi 买的，gandi 的 DNS 管理介面就提供 301 转址的功能，到红框的地方，设定「永久」转址就可以</p>
<p><img decoding="async" loading="lazy" alt="Gandi 设定 301 转址" src="https://tech.havocfuture.tw/zh-hans/assets/images/2023-09-30_173036-b8c0fb535804b9ac7b75665debac9f51.png" width="1590" height="460" class="img_blrk"></p>
<p>其他 DNS 管理服务应该都有类似的功能，ex: Cloudflare 的介面</p>
<p><img decoding="async" loading="lazy" alt="Cloudflare 设定 301 转址" src="https://tech.havocfuture.tw/zh-hans/assets/images/2023-10-07_174955-7a5875ef17a34bde95c7f446ec9743b4.png" width="1807" height="812" class="img_blrk"></p>
<p>可以从「规则」-&gt;「网页规则」，然后就可以设定 301 转址</p>
<p>如果不是用这两个介面的话，就麻烦自己找看看了...</p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="设定-google-search-console-变更网址">设定 Google Search Console 变更网址<a href="https://tech.havocfuture.tw/zh-hans/blog/seo-change-domain#%E8%AE%BE%E5%AE%9A-google-search-console-%E5%8F%98%E6%9B%B4%E7%BD%91%E5%9D%80" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>Google Search Console 的设定中有一个「变更网址」的选项，直接去设定完成后会出现如下「这个网站目前正在迁移至 xxx」，截图如下</p>
<p><img decoding="async" loading="lazy" alt="设定 Google Search Console 变更网址" src="https://tech.havocfuture.tw/zh-hans/assets/images/2023-09-30_173938-3c2202130c982a0c628435dc9fdd6a70.png" width="1722" height="567" class="img_blrk"></p>
<p>至于 Google Analytics 则什么事都不用做，因为 GA 看的是程式中的 GA code，不看网域，搬家前后的资料会在同样的报表中</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="google-analytics-数据">Google Analytics 数据<a href="https://tech.havocfuture.tw/zh-hans/blog/seo-change-domain#google-analytics-%E6%95%B0%E6%8D%AE" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>报表时间：07/23(日) ~ 09/16(六)，就是从 08/19(六) 往前和往后各加四个礼拜</p>
<p><img decoding="async" loading="lazy" alt="变更网址 GA 报表1" src="https://tech.havocfuture.tw/zh-hans/assets/images/2023-09-30_202415-09ff89bbd74d221ea8ea478e5ac90db4.png" width="745" height="410" class="img_blrk"></p>
<p><img decoding="async" loading="lazy" alt="变更网址 GA 报表2" src="https://tech.havocfuture.tw/zh-hans/assets/images/2023-09-30_203101-54f55a139bf74bf9c8cd442f126ee2b2.png" width="814" height="383" class="img_blrk"></p>
<p>这个网站之前主要的流量来源就是自然搜寻(Organic Search)，在转换前，一天约 400~500 人左右，转换后几天因为旧网站还搜寻的到，流量并没有下降，
大概在一个礼拜左右后，旧网站的搜寻结果消失，但是新的网站并没有马上接上来，所以有明显的断层，
两个礼拜后排名慢慢有回来，但并没有回到转换之前的水准，一天约 300~400 人</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="google-search-console-数据">Google Search Console 数据<a href="https://tech.havocfuture.tw/zh-hans/blog/seo-change-domain#google-search-console-%E6%95%B0%E6%8D%AE" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>报表时间：07/23(日) ~ 09/16(六)，就是从 08/19(六) 往前和往后各加四个礼拜，和上面一样</p>
<p>tools.havocfuture.tw (旧)
<img decoding="async" loading="lazy" alt="变更网址 GSC 报表1" src="https://tech.havocfuture.tw/zh-hans/assets/images/2023-09-30_204703-f18c11d4f37070a74237327c99d392c8.png" width="1457" height="531" class="img_blrk"></p>
<p>tw.toolser.net (新)
<img decoding="async" loading="lazy" alt="变更网址 GSC 报表2" src="https://tech.havocfuture.tw/zh-hans/assets/images/2023-09-30_204739-1ced9ab9313cc9c7e69c704f177e3942.png" width="1455" height="529" class="img_blrk"></p>
<p>和GA 看到的数据大致是相同的，旧网站大致在8/25 (约一个礼拜后) 开始搜寻不到，新网站约在9/1 (约两个礼拜后) 开始拿回原来的自然搜寻排名</p>
<h3 class="anchor anchorTargetStickyNavbar_Ab5Z" id="搜寻排名对照">搜寻排名对照<a href="https://tech.havocfuture.tw/zh-hans/blog/seo-change-domain#%E6%90%9C%E5%AF%BB%E6%8E%92%E5%90%8D%E5%AF%B9%E7%85%A7" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h3>
<p>捉几个比较主要的关键字，比较一下新旧网站的排名，报表时间取两个礼拜</p>
<p>旧：08/06(日) ~ 08/19(六)<br>
<!-- -->新：09/03(日) ~ 09/16(六)</p>
<table><thead><tr><th>关键字</th><th>搜寻量(旧)</th><th>排名(旧)</th><th>搜寻量(新)</th><th>排名(新)</th></tr></thead><tbody><tr><td>中原标准时间</td><td>1030</td><td>3</td><td>1050</td><td>3.3</td></tr><tr><td>bmi计算</td><td>872</td><td>4</td><td>73</td><td>8</td></tr><tr><td>坪数换算器</td><td>817</td><td>2.5</td><td>258</td><td>3</td></tr><tr><td>标准时间</td><td>332</td><td>4.1</td><td>104</td><td>5.4</td></tr><tr><td>儿童bmi</td><td>66</td><td>5.3</td><td>11</td><td>7.8</td></tr><tr><td>uuid</td><td>47</td><td>4.4</td><td>26</td><td>5.1</td></tr><tr><td>平方公尺换算为坪</td><td>41</td><td>7</td><td>9</td><td>9.8</td></tr><tr><td>二进位转十进位</td><td>40</td><td>4</td><td>98</td><td>4.8</td></tr></tbody></table>
<p>排名其实算都回来了，只是都有不同幅度的下跌</p>
<h2 class="anchor anchorTargetStickyNavbar_Ab5Z" id="结论">结论<a href="https://tech.havocfuture.tw/zh-hans/blog/seo-change-domain#%E7%BB%93%E8%AE%BA" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接" translate="no">​</a></h2>
<p>老实说比我预期的好多了，原本估计会有一到三个月的阵痛期，结果两个礼拜就结束了，
排名下降其实也可以理解，毕竟两个主网域权重有不小的落差( havocfuture.tw 好歹也是个有稳定 5~7 万月流量的网站 )，
成功分家后，就是要努力经营两个网域了...</p>
<p>所以请大家继续支持搬家后的<a href="https://tw.toolser.net/" target="_blank" rel="noopener noreferrer" class="">【Toolser Net 工具网】</a> ... XD</p>
<!-- -->
<div><iframe src="https://button.like.co/in/embed/havocfuture/button?referrer=https://tech.havocfuture.tw/zh-hans/blog/seo-change-domain"></iframe><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>版权声明</h5></div><div class="admonition-content"><p><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh_CN" target="_blank" rel="noopener noreferrer" title="CC BY-NC-SA 4.0"><img src="data:image/png;base64,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"></a>，转载请注明出处<br>本文键接: <a href="https://tech.havocfuture.tw/zh-hans/blog/seo-change-domain" target="_blank" rel="noopener noreferrer">https://tech.havocfuture.tw/zh-hans/blog/seo-change-domain</a></p></div></div><br><div class="row"><div class="col col--12"><div class="banner_m8Vh"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="9057051535" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div><br><div id="cusdis_thread" data-host="https://cusdis.com" data-app-id="60a126c4-a58f-4510-a5f4-c3d3d182b735" data-page-id="seo-change-domain" data-page-url="https://tech.havocfuture.tw/blog/seo-change-domain" data-page-title="实测网站搬家，更换网域对 SEO 的影响 - 完整 GA、GSC 报表"></div><div class="row"><div class="col col--2"><div class="leftAd_demG"><span>這是 google 廣告</span><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1798054428298183" data-ad-slot="4460531054" data-ad-format="auto" data-full-width-responsive="true"></ins></div></div></div></div>]]></content>
        <author>
            <name>Eric Cheng</name>
        </author>
        <category label="Website" term="Website"/>
    </entry>
</feed>