<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
            <title type="text">奈奈子</title>
    <updated>2025-08-08T17:13:32+08:00</updated>
        <id>https://blog.nanako.vip</id>
        <link rel="alternate" type="text/html" href="https://blog.nanako.vip" />
        <link rel="self" type="application/atom+xml" href="https://blog.nanako.vip/atom.xml" />
    <rights>Copyright © 2026, 奈奈子</rights>
    <generator uri="https://halo.run/" version="1.5.3">Halo</generator>
            <entry>
                <title><![CDATA[NotifyHub——这可能是你用过最好的通知聚合工具]]></title>
                <link rel="alternate" type="text/html" href="https://blog.nanako.vip/?p=258" />
                <id>tag:https://blog.nanako.vip,2025-08-08:notifyhub这可能是你用过最好的通知聚合工具</id>
                <published>2025-08-08T17:10:10+08:00</published>
                <updated>2025-08-08T17:13:32+08:00</updated>
                <author>
                    <name>黑田奈奈子</name>
                    <uri>https://blog.nanako.vip</uri>
                </author>
                <content type="html">
                        <![CDATA[<blockquote><p>声明：本篇教程为原创，未经允许禁止转载，搬运请注明原作者。</p></blockquote><p>老规矩，先贴地址 -&gt; <a href="https://github.com/htnanako/NotifyHub" target="_blank">NotifyHub</a></p><h3 id="%E9%A1%B9%E7%9B%AE%E8%83%8C%E6%99%AF" tabindex="-1">项目背景</h3><p>NotifyHub 项目的诞生源于我在 MovieBot 插件中开发的 <code>通知调度中心</code> 功能。为了让这个功能更加开放和灵活，我决定将其独立出来，以支持更多渠道和第三方接口的接入。</p><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D258/1.png" alt="1.png" /></p><h3 id="%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1" tabindex="-1">架构设计</h3><p>经过深思熟虑，我最终确定了以 <code>通道</code> 作为接口层，<code>渠道（企微、Bark、TG等）</code> 作为应用层的架构逻辑。同时，系统支持 <code>模板</code> 功能，为用户提供高度的自由度，实现更便捷的第三方接口接入方案。</p><h3 id="%E6%8A%80%E6%9C%AF%E6%A0%88" tabindex="-1">技术栈</h3><ul><li><strong>前端</strong>：React + Vite + Shadcn</li><li><strong>后端</strong>：Python + FastAPI</li><li><strong>数据库</strong>：SQLite</li></ul><h3 id="%E7%95%8C%E9%9D%A2%E9%A2%84%E8%A7%88" tabindex="-1">界面预览</h3><h4 id="%E9%A6%96%E9%A1%B5%E4%BB%AA%E8%A1%A8%E6%9D%BF" tabindex="-1">首页仪表板</h4><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D258/2.png" alt="2.png" /></p><h4 id="%E9%80%9A%E7%9F%A5%E9%80%9A%E9%81%93" tabindex="-1">通知通道</h4><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D258/3.png" alt="3.png" /></p><h4 id="%E9%80%9A%E7%9F%A5%E6%B8%A0%E9%81%93" tabindex="-1">通知渠道</h4><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D258/4.png" alt="4.png" /></p><h4 id="%E9%80%9A%E7%9F%A5%E6%A8%A1%E6%9D%BF" tabindex="-1">通知模板</h4><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D258/5.png" alt="5.png" /></p><h4 id="%E6%8F%92%E4%BB%B6%E7%AE%A1%E7%90%86" tabindex="-1">插件管理</h4><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D258/6.png" alt="6.png" /></p><h4 id="%E7%B3%BB%E7%BB%9F%E6%97%A5%E5%BF%97" tabindex="-1">系统日志</h4><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D258/7.png" alt="7.png" /></p><h4 id="%E7%B3%BB%E7%BB%9F%E8%AE%BE%E7%BD%AE" tabindex="-1">系统设置</h4><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D258/8.png" alt="8.png" /></p><h4 id="%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97" tabindex="-1">更新日志</h4><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D258/9.png" alt="9.png" /></p><h3 id="%E8%AF%A6%E7%BB%86%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E" tabindex="-1">详细配置说明</h3><blockquote><p><strong>注意</strong>：以下所有说明中的 <code>route_id</code> 参数均以 <code>route_abcd</code> 为例，实际使用时请根据程序生成的实际情况进行修改。</p></blockquote><h4 id="1.-%E9%80%9A%E7%9F%A5%E6%B8%A0%E9%81%93" tabindex="-1">1. 通知渠道</h4><p>目前系统已支持以下通知渠道：</p><ul><li>Bark</li><li>Telegram</li><li>企业微信</li><li>Pushdeer</li><li>钉钉</li><li>Discord</li><li>飞书</li><li>Server酱3</li></ul><p>根据需求配置相应的通知渠道，并为每个渠道设置名称和描述以便识别。<strong>重要提醒</strong>：渠道名称设置后不可修改，如需修改请删除后重新添加。配置完成后，建议进行测试以确保渠道正常工作。</p><p><strong>特别说明</strong>：钉钉、Discord、飞书三个渠道的配置相对复杂，如果不是这些渠道的重度用户，建议优先考虑其他渠道。</p><h4 id="2.-%E9%80%9A%E7%9F%A5%E9%80%9A%E9%81%93" tabindex="-1">2. 通知通道</h4><p>配置完所需的通知渠道后，可以创建通知通道来绑定相应的通知渠道，设置默认推送图片，并为通道命名以便识别。</p><h5 id="%E9%80%9A%E9%81%93%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95" tabindex="-1">通道使用方法</h5><p>通道展示页面提供了详细的使用说明。其工作原理是开放了一个 HTTP 接口，外部程序通过调用这个接口并传递需要推送的内容，即可向该通道绑定的渠道发送指定内容。</p><h6 id="json-%E9%85%8D%E7%BD%AE%E6%96%B9%E5%BC%8F" tabindex="-1">JSON 配置方式</h6><p><strong>推送 URL</strong>：<code>http://你的域名或IP:端口/api/service/notify</code></p><pre><code class="language-json">{  &quot;route_id&quot;: &quot;route_abcd&quot;,  &quot;title&quot;: &quot;测试标题&quot;,  &quot;content&quot;: &quot;这是一条测试内容&quot;,  &quot;push_img_url&quot;: &quot;https://example.com/test.jpg&quot;,  &quot;push_link_url&quot;: &quot;https://example.com&quot;}</code></pre><p><strong>参数说明</strong>：</p><ul><li><code>route_id</code>：通道的唯一标识</li><li><code>title</code>：推送的标题</li><li><code>content</code>：推送的内容</li></ul><p>如果外部软件支持自定义内容占位符，可将 <code>title</code> 与 <code>content</code> 的值替换为占位符，实现自定义内容推送。</p><p><strong>可选参数</strong>：</p><ul><li><code>push_img_url</code>：推送图片的 URL（如需推送指定图片）</li><li><code>push_link_url</code>：点击跳转的 URL（如需实现推送点击跳转）</li></ul><h6 id="curl-%E6%96%B9%E5%BC%8F" tabindex="-1">cURL 方式</h6><pre><code class="language-bash">curl -X POST &#39;http://你的域名或IP:端口/api/service/notify&#39; \  -H &#39;Content-Type: application/json&#39; \  -d &#39;{    &quot;route_id&quot;: &quot;route_abcd&quot;,    &quot;title&quot;: &quot;测试标题&quot;,    &quot;content&quot;: &quot;这是一条测试内容&quot;,    &quot;push_img_url&quot;: &quot;https://example.com/test.jpg&quot;,    &quot;push_link_url&quot;: &quot;https://example.com&quot;  }&#39;</code></pre><p>cURL 方式适用于自定义的 shell 脚本，同样可以将对应的参数值进行替换来发送消息到通道接口实现推送。</p><h6 id="%E5%85%BC%E5%AE%B9-bark-%E6%A0%BC%E5%BC%8F" tabindex="-1">兼容 Bark 格式</h6><p>当第三方应用仅支持 Bark 推送且不支持自定义 webhook 时，可使用此方式进行配置：</p><p><strong>推送 URL</strong>：<code>http://你的域名或IP:端口/api/service/notify/route_abcd</code></p><p>将此 URL 作为 Bark 的推送地址+推送密钥，即可实现 Bark 方式的接入推送。<strong>重要说明</strong>：此方式下，推送不仅限于 Bark 渠道，其他已绑定的渠道均可正常推送。</p><h4 id="3.-%E9%80%9A%E7%9F%A5%E6%A8%A1%E6%9D%BF" tabindex="-1">3. 通知模板</h4><p>通知模板功能允许用户自定义推送内容格式，使用 <a href="https://docs.jinkan.org/docs/jinja2/" target="_blank"><code>Jinja2</code></a> 模板语法，快速构建动态的指定内容进行推送。</p><p>当前程序内置了 <code>Emby Webhook</code>、<code>Pve</code>、<code>Watchtower</code> 三个软件的推送消息自动化处理，并提供可使用的模板变量，可直接使用。示例模板内容可在 Github 页面中查看，可根据需要进行修改。</p><p><strong>配置流程</strong>：</p><ol><li>配置模板后，需要在通知通道中将某一通道绑定同一类型的模板</li><li>程序会自动识别该通道接收到的消息，并使用对应的模板进行推送</li><li>使用相关格式模板时，需要根据模板类型在第三方软件中配置对应的接口地址</li></ol><p><strong>具体配置示例</strong>：</p><ul><li><p><strong>Emby Webhook</strong>：</p><ul><li>接口地址：<code>http://你的域名或IP:端口/api/service/emby/notify/route_abcd?emby_url=&lt;Emby服务器地址&gt;</code></li><li>说明：将 <code>&lt;Emby服务器地址&gt;</code> 替换为实际的 NotifyHub 可访问到的 Emby 服务器域名地址，程序将获取对应的影视图片作为推送封面图</li></ul></li><li><p><strong>Pve</strong>：</p><ul><li>接口地址：<code>http://你的域名或IP:端口/api/service/pve/notify/route_abcd</code></li><li>配置位置：PVE 的通知设置中</li><li>目标选择：<code>Gotify</code></li><li>API 令牌：任意填写，不影响推送</li></ul></li><li><p><strong>Watchtower</strong>：</p><ul><li>接口地址：<code>generic://你的域名或IP:端口/api/service/watchtower/notify/route_abcd?template=json&amp;%24server_name=&lt;服务器名称&gt;&amp;%24push_link_url=&lt;跳转链接&gt;</code></li><li>配置位置：Watchtower 容器环境变量 <code>WATCHTOWER_NOTIFICATION_URL</code></li><li>额外设置：<code>WATCHTOWER_NOTIFICATIONS</code> 变量设置为 <code>shoutrrr</code></li><li>参数说明：<ul><li><code>&lt;服务器名称&gt;</code>：设置自己能识别的名称，供模板变量使用</li><li><code>&lt;跳转链接&gt;</code>：设置点击推送跳转的地址，如不需要可删除此参数（从对应参数的 <code>&amp;%24</code> 部分开始删除）</li></ul></li></ul></li></ul><p><strong>默认模板功能</strong>：</p><p>除了指定第三方 API 的模板功能外，程序还提供了默认模板功能。其原理是将通道接收到的所有参数均作为 Jinja2 模板变量，组合成配置的模板内容进行推送。</p><p><strong>示例</strong>：</p><p>请求 JSON 参数：</p><pre><code class="language-json">{    &quot;username&quot;: &quot;htnanako&quot;,    &quot;date&quot;: &quot;2025年8月8日&quot;,    &quot;location&quot;: &quot;广东&quot;}</code></pre><p>模板内容：</p><pre><code class="language-">{{ username }} 发送了新通知</code></pre><pre><code class="language-">今天是 {{ date }}，{{ username }} 在 {{ location }} 发了一条通知</code></pre><p>最终推送内容：</p><pre><code class="language-">htnanako 发送了新通知今天是 2025年8月8日，htnanako 在 广东 发了一条通知</code></pre><h4 id="4.-%E6%8F%92%E4%BB%B6%E7%AE%A1%E7%90%86" tabindex="-1">4. 插件管理</h4><p>当前将与程序主逻辑无强关联的功能独立为插件功能，可按需配置及使用。目前暂未开放自开发插件能力。</p><p><strong>已内置插件</strong>：</p><ol><li><p><strong>企业微信回调工具</strong></p><ul><li>用途：企业微信新建应用后，配置可信 IP 需要前置完成 <code>接收消息服务器URL</code> 的配置</li><li>功能：在用户无相关功能工具时，可临时使用此插件进行一次性配置后，即可添加可信 IP</li></ul></li><li><p><strong>企业微信智能聊天机器人</strong></p><ul><li>来源：迁移我开发的 MovieBot 插件 <code>企业微信Chatbot</code> 功能</li><li>适配：NotifyHub 的插件架构</li></ul></li></ol><h3 id="%E6%80%BB%E7%BB%93" tabindex="-1">总结</h3><p>NotifyHub 是一款支持多种主流推送渠道的智能通知调度平台，适用于个人和团队的消息统一分发、自动化推送、渠道管理等场景。支持通过 Web 界面灵活配置“通知渠道”（如 Telegram、Bark、企业微信等）和“通知通道”（消息路由），实现一条消息多平台同步推送，为用户提供便捷、灵活的消息推送解决方案。</p><h4 id="%E6%A0%B8%E5%BF%83%E5%8A%9F%E8%83%BD%E7%89%B9%E7%82%B9%EF%BC%9A" tabindex="-1">核心功能特点：</h4><ul><li><strong>多渠道支持</strong>：集成 Bark、Telegram、企业微信、Pushdeer、钉钉、Discord、飞书、Server酱3 等多种主流通知渠道</li><li><strong>灵活配置</strong>：支持自定义通知通道、模板，满足不同场景的需求</li><li><strong>模板系统</strong>：基于 Jinja2 的模板引擎，支持动态内容生成和第三方软件集成</li><li><strong>简单易用</strong>：提供直观的 Web 界面，配置简单，使用便捷</li><li><strong>高兼容性</strong>：支持多种调用方式，包括 JSON API、cURL 和 Bark 兼容格式等，可快速在第三方软件中进行接入</li></ul><h4 id="%E9%80%82%E7%94%A8%E5%9C%BA%E6%99%AF%EF%BC%9A" tabindex="-1">适用场景：</h4><ul><li>服务器监控告警</li><li>自动化脚本通知</li><li>应用状态监控</li><li>个人消息推送</li><li>团队协作通知</li></ul><h3 id="%E4%BB%98%E8%B4%B9%E8%AF%B4%E6%98%8E" tabindex="-1">付费说明</h3><p>NotifyHub 是一款付费软件，采用授权制使用模式。</p><h4 id="%E8%AF%95%E7%94%A8%E7%94%B3%E8%AF%B7%EF%BC%9A" tabindex="-1">试用申请：</h4><ul><li>加入 <a href="https://t.me/notifyhub_chat" target="_blank">Telegram 群组</a>申请试用码</li><li>试用期间仅限单通知渠道及单通知通道</li><li>试用期结束后需要购买授权继续使用</li></ul><h4 id="%E8%B4%AD%E4%B9%B0%E6%96%B9%E5%BC%8F%EF%BC%9A" tabindex="-1">购买方式：</h4><ul><li>软件内直接购买永久授权</li><li>一次购买，永久使用</li></ul><h4 id="%E6%8E%88%E6%9D%83%E6%9D%83%E7%9B%8A%EF%BC%9A" tabindex="-1">授权权益：</h4><ul><li>无限制使用所有功能</li><li>支持无限量通知渠道和通道</li><li>享受后续功能更新</li><li>获得技术支持服务</li></ul>]]>
                </content>
            </entry>
            <entry>
                <title><![CDATA[xStrm不完全教程]]></title>
                <link rel="alternate" type="text/html" href="https://blog.nanako.vip/?p=226" />
                <id>tag:https://blog.nanako.vip,2025-01-14:xstrm不完全教程</id>
                <published>2025-01-14T18:37:06+08:00</published>
                <updated>2025-03-15T23:21:47+08:00</updated>
                <author>
                    <name>黑田奈奈子</name>
                    <uri>https://blog.nanako.vip</uri>
                </author>
                <content type="html">
                        <![CDATA[<blockquote><p>声明：本篇教程为原创，未经允许禁止转载，搬运请注明原作者。</p></blockquote><p>看本教程之前，先查看<a href="https://blog.nanako.vip/?p=194" target="_blank">上一篇教程</a>，对某5网盘资源转302直链有一定的了解。有看不懂的名词，善用<a href="https://google.com/" target="_blank">Google</a>及<a href="https://chat.openai.com" target="_blank">ChatGPT</a>。本教程不会对完整建立媒体库流程再进行详解。</p><p>由于目前可用工具，要么不够好用，要么高昂付费，加上某5网盘的收紧风控策略，依赖于CloudDrive2的遍历网盘容易触发429，索性自己写了个工具<a href="https://github.com/htnanako/xstrm" target="_blank">xStrm</a>，用于替换掉原方案中的AutoSymlink，快速完成strm文件生成与元数据下载，构建Emby媒体库。</p><p>本项目Telegram官方群组<a href="https://t.me/xstrm_chat" target="_blank">https://t.me/xstrm_chat</a></p><h3 id="%E5%8E%9F%E7%90%86" tabindex="-1">原理</h3><p>利用某库(消音)提供的某5网盘接口，实现快速遍历网盘文件，根据用户配置的同步任务，对比本地已有的strm文件与元数据，创建strm文件与下载元数据，供Emby进行读取。并支持接收CloudDrive2提供的webhook功能，实现网盘变动更新strm的实时监控。</p><h3 id="%E9%83%A8%E7%BD%B2" tabindex="-1">部署</h3><h4 id="docker%E9%83%A8%E7%BD%B2" tabindex="-1">Docker部署</h4><pre><code class="language-yaml">services:  xstrm:    image: htnanako/xstrm:latest    container_name: xstrm    ports:      - &quot;5300:5300&quot;    volumes:      - /path/to/data:/data  # 配置文件目录      - /path/to/strm:/strm    # 本地strm文件目录    environment:      - LICENSE_KEY=your_license_key  # 授权密钥    restart: unless-stopped</code></pre><h3 id="%E9%85%8D%E7%BD%AE%E7%9B%B8%E5%85%B3" tabindex="-1">配置相关</h3><h4 id="%E5%AE%B9%E5%99%A8%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E" tabindex="-1">容器配置说明</h4><p>1、环境变量</p><ul><li>LICENSE_KEY: 授权码(必需)。本项目非免费开源项目，需要申请授权码才可使用，提供7天免费试用期，具体可查看<a href="https://github.com/htnanako/xstrm" target="_blank">Github</a>页面。</li></ul><p>2、目录说明</p><ul><li><p>/data: 软件配置文件目录</p><ul><li>/data/conf: 软件配置信息，web中配置的信息都保存在这里</li><li>/data/logs: 软件日志，软件运行过程中生成的日志保存在这里，按日期分割</li></ul></li><li><p>/strm: 生成本地的strm文件保存的目录，可自定义为其他名称，可映射多个本地strm路径</p></li></ul><p>3、实时监控</p><ul><li>需要开启CloudDrive2的webhook功能，下载项目仓库的<a href="https://github.com/htnanako/xStrm/blob/main/webhook.toml" target="_blank">webhook.toml</a>文件，并配置其中的base_url地址为本程序地址，如http://your-ip:5300<br /><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D226/1.png" alt="1.png" /></li><li>保存到cd2配置中的config路径下，重启cd2容器即可</li></ul><h4 id="web%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E" tabindex="-1">Web配置说明</h4><p>1、任务配置<br /><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D226/2.png" alt="2" /><br />任务配置页，展示当前已配置的任务信息，可在此页面快速开关某个任务、开关pickcode参数、元数据下载开关、实时监控开关，未来可能会增加更多配置项。以及手动执行任务、编辑任务信息、删除任务配置。</p><p>2、添加任务<br /><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D226/3.png" alt="3" /></p><ul><li>任务名称: 起一个不重复且自己能识别任务信息的名称。</li><li>源路径: 需要同步的媒体文件在网盘中的路径(注意：非CloudDrive2中的路径！非CloudDrive2中的路径！非CloudDrive2中的路径！)。</li><li>目标路径: 生成strm及下载元数据文件到本地的路径，该路径应在容器的目录映射中配置好。</li><li>strm前缀: strm文件内容默认为文件在网盘中的绝对路径，根据302工具需要，添加http前缀或路径前缀。</li><li>Cron表达式: 定时任务的五位cron表达式，不懂得如何编写的请自行Google。</li><li>使用Pickcode: pickcode用于唯一定位网盘中的某一文件，即使后续网盘文件被移动了位置也能定位到，开启后生成的strm内容会添加 <code>?pickcode=xxxx</code> 参数。</li><li>启用任务: 这个不需要赘述了吧。</li><li>实时监控: 该网盘目录是否纳入实时监控范围。</li><li>视频文件后缀: 指定文件后缀用于生成strm文件，特殊需求可自行添加，按照示例中给定的格式。</li><li>元数据文件后缀: 指定文件后缀识别为元数据，开启元数据下载开关后会下载到本地，特殊需求可自行添加。</li><li>元数据下载: 是否下载元数据到本地</li></ul><p>最终生成的文件名及目录，根据网盘源中的目录树和文件名。文件内容为 <code>strm前缀+网盘中文件绝对路径</code> ，开启pickcode开关后为 <code>strm前缀+网盘中文件绝对路径?pickcode=xxx</code> 。</p><p>3、查看日志<br /><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D226/4.png" alt="4" /><br />查看日志页面，该页面每3s请求一次系统日志展示，请勿长时间开启该页面，会使浏览器大量占用内存。</p><p>4、系统配置<br /><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D226/5.png" alt="5" /><br />系统配置页面，用于配置一些全局设置。</p><ul><li><p>授权信息: 可查看当前授权的信息，如邮箱等。如为试用用户，会显示到期时间。信息缓存一小时，重启会立刻更新。</p></li><li><p>全局配置<br /><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D226/6.png" alt="6" /></p><ul><li>全局strm前缀: 可提前在此配置strm前缀，添加新任务时会默认填充，最终生成文件以任务配置为准。</li><li>视频文件后缀: 作用同上，最终生成文件以任务配置为准。</li><li>元数据文件后缀: 作用同上，最终生成文件以任务配置为准。</li><li>定时任务开关: 全局的定时任务开关，此处关闭则关闭所有定时任务。</li><li>实时监控开关: 全局的实时监控开关，此处关闭则关闭所有实时监控任务。</li><li>视频大小限制: 限制生成strm的视频文件大小，单位为MB，设置为0则不限制，该配置全局生效。<br />修改配置之后务必点击保存，否则不生效。</li></ul></li><li><p>网盘配置<br /><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D226/7.png" alt="7" /><br />配置网盘Cookie，请按照说明获取填写并保存，此Cookie在失效时会自动更新，请勿用在其他工具中。</p></li><li><p>通知配置</p><ul><li>企业微信配置<br /><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D226/8.png" alt="8" /><br />配置企业微信推送消息，支持自定义推送地址，自定义推送图片，支持随机图接口。不懂得如何配置请自行找教程。</li><li>Telegram配置<br /><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D226/9.png" alt="9" /><br />配置Telegram推送消息，支持自定义推送地址，自定义推送图片，支持随机图接口。支持配置代理，请务必保证软件可访问Telegram。不懂得如何配置请自行找教程。</li></ul><p>配置通知信息后建议重启，保证配置生效。</p></li></ul><p>xStrm目前上线前期，可先在<a href="https://t.me/xstrm_chat" target="_blank">Telegram官方群组</a>中使用机器人自助申请试用授权码。</p><p>截止本文发布时，购买永久授权价格为¥30，如需购买，可在Github页面扫码购买并备注邮箱，一般当天内处理完毕，随后可在设置页面的授权信息查看到授权情况。</p><h3 id="%E6%9B%B4%E6%96%B0%E4%BA%8E1.26(%E5%BD%93%E5%89%8D%E7%89%88%E6%9C%ACv0.4.2)" tabindex="-1">更新于1.26(当前版本v0.4.2)</h3><p>软件发布有两个多星期了，迭代也有二十来个版本了，收到了不少的反馈，也在不断地完善软件功能与稳定性。</p><p>在最近的更新中，任务配置添加了一个 <code>所属网盘</code> 的功能，有人发现了该功能会给strm文件添加一个 <code>?d=115</code> 的参数。用于标识该文件所属的网盘，但出现了一些问题，如果使用local模式的strm，依赖于CloudDrive2进行中转播放的话会播放不了。解释一下添加该参数的原因。</p><p>在v0.4.0版本中，集成了redir服务，用于将strm文件标识的文件路径地址，转换为网盘直链实现302跳转播放。并且在redir服务中，也对d参数进行了判断。</p><p>在redir服务的前置，还需要配置一个Ngnix服务，用于代理emby的请求转发给redir服务。具体可查看上一篇教程。那么，该方案的最佳实践，是配置strm前缀为本工具反代地址+<code>/redir</code>，生成cloud模式的strm，也就是strm文件内容，为一个http链接地址，而不是本地文件路径，形如 <code>https://redir.your-domain/redir/path/to/file</code>，这样可以让Nginx，以及Emby的神医插件，直接访问redir服务。</p><p>鉴于 <code>strm前缀</code> 参数为开放式配置，内置了一个判断，如果strm填写非http路径，则不添加d参数，避免使用CloudDrive2中转播放的用户无法正常播放。但同样的，此非最佳实践，后续若更新相关增值功能，则无法体验到。</p>]]>
                </content>
            </entry>
            <entry>
                <title><![CDATA[strm媒体库使用redir115的进阶302方案]]></title>
                <link rel="alternate" type="text/html" href="https://blog.nanako.vip/?p=194" />
                <id>tag:https://blog.nanako.vip,2024-09-20:strm媒体库使用redir115的进阶302方案</id>
                <published>2024-09-20T23:48:17+08:00</published>
                <updated>2024-09-23T19:55:16+08:00</updated>
                <author>
                    <name>黑田奈奈子</name>
                    <uri>https://blog.nanako.vip</uri>
                </author>
                <content type="html">
                        <![CDATA[<blockquote><p>声明：除引用的Github项目文件外，其他内容编写为原创。搬运请注明原作者。</p></blockquote><p>看本教程之前，先查看<a href="https://blog.nanako.vip/?p=162" target="_blank">上一篇教程</a>，对115资源转302直链有一定的了解。有看不懂的名词，善用<a href="https://google.com" target="_blank">Google</a>及<a href="https://chat.openai.com" target="_blank">ChatGPT</a>。</p><h3 id="%E5%87%86%E5%A4%87%E6%9D%A1%E4%BB%B6" tabindex="-1">准备条件</h3><ul><li>有空间及会员的115账号</li><li>CD2(<a href="https://www.clouddrive2.com" target="_blank">CloudDriver2</a>)，可以不需要会员。</li><li>Emby，可以选择自己喜欢的镜像版本，如<a href="https://hub.docker.com/r/emby/embyserver" target="_blank">emby/embyserver</a>、<a href="https://hub.docker.com/r/linuxserver/emby" target="_blank">linuxserver/emby</a>、<a href="https://hub.docker.com/r/amilys/embyserver" target="_blank">amilys/emby</a></li><li><a href="https://github.com/shenxianmq/auto_symlink" target="_blank">Auto_Symlink</a></li><li><a href="https://hub.docker.com/r/htnanako/redir115" target="_blank">Redir115</a></li></ul><p>阅读此篇教程，默认你已经</p><ul><li>已阅读<a href="https://blog.nanako.vip/?p=162" target="_blank">上一篇教程</a></li><li>Docker/Docker-Compose的相关配置使用</li><li>理解什么叫strm</li></ul><h3 id="%E5%8E%9F%E7%90%86" tabindex="-1">原理</h3><p>本教程不再使用网盘的源文件，而是使用Auto_Symlink生成的local类型的strm文件加入媒体库，并利用nginx提供的转发到redir115服务，访问115网盘获取对应直链进行302跳转给客户端，并且可以实现emby的web播放302地址。</p><h3 id="%E5%AE%B9%E5%99%A8%E9%85%8D%E7%BD%AE" tabindex="-1">容器配置</h3><pre><code class="language-yaml">services:  cloudnas:    image: cloudnas/clouddrive2-unstable    container_name: clouddrive2    environment:       - TZ=Asia/Shanghai       - CLOUDDRIVE_HOME=/Config    volumes:      - ./cd2:/Config      - /CloudNAS:/CloudNAS:shared      - /Movies:/Movies    devices:      - /dev/fuse:/dev/fuse    restart: unless-stopped    pid: &quot;host&quot;    privileged: true    network_mode: bridge    ports:      - 19798:19798  auto_symlink:    image: shenxianmq/auto_symlink:latest    container_name: auto_symlink    restart: unless-stopped    user: 0:0    network_mode: bridge    ports:      - &quot;8095:8095&quot;    environment:      - TZ=Asia/Shanghai    volumes:      - ./auto_symlink:/app/config      - /CloudNAS:/CloudNAS:rslave      - /Movies:/Movies    depends_on:      - cloudnas  emby:    image: amilys/embyserver    container_name: emby    volumes:      - ./emby:/config      - /CloudNAS:/CloudNAS:rslave      - /Movies:/Movies    privileged: true    network_mode: bridge    ports:      - 8096:8096    restart: unless-stopped        redir115:    image: htnanako/redir115:nginx    container_name: redir115    restart: unless-stopped    network_mode: host    volumes:      - ./redir115:/data      - ./cache:/var/cache/nginx/emby      - ./logs:/var/log/nginx    environment:      NGINX_PORT: 8092      EMBY_HOST: http://emby.lan:8096      EMBY_API_KEY: abcdefghijklmnopqrstuv0123456789      ORIGINAL_PATH: /CloudNAS/115      REDIR_PATH: /Movies      REDIR_HOST: https://redir.abc.xyz      REDIR_MODE: strm_local      COOKIE: UID=;CID=;SEID=;</code></pre><h3 id="%E5%85%B7%E4%BD%93%E6%AD%A5%E9%AA%A4" tabindex="-1">具体步骤</h3><h4 id="clouddriver2" tabindex="-1">CloudDriver2</h4><p>CloudDriver2(下称CD2)的配置与上一篇教程一致，安装后添加115网盘，并将115根目录挂载到容器的 <code>/CloudNAS</code> 目录，即宿主机的 <code>/CloudNAS</code> 目录，并注意添加 <code>:shared</code> 权限实现读写共享。</p><h4 id="auto_symlink" tabindex="-1">Auto_Symlink</h4><p>Auto_Symlink(下称AS)作用是读取CD2挂载的115网盘文件，生成local类型的strm文件，并同步元数据(如有)到本地，加快扫库读取速度，减少访问网盘的次数。</p><h5 id="%E8%B7%AF%E5%BE%84%E8%AF%B4%E6%98%8E" tabindex="-1">路径说明</h5><ul><li><p>/CloudNAS:/CloudNAS:rslave</p><p>用于挂载CD2挂载到本地的115网盘到容器内，并添加 <code>:rslave</code> 权限实现读写从属。</p></li><li><p>/Movies:/Movies</p><p>用于生成strm文件以及同步元数据到宿主机的 <code>/Movies</code> 目录下，供emby扫库读取。</p></li></ul><h5 id="%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E" tabindex="-1">配置说明</h5><p>点击 <code>添加同步</code> 按钮<br /><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D194/1.png" alt="1" /><br />媒体目录填写 <code>/CloudNAS</code> 目录下需要同步的子目录，如整个 <code>影视</code> 目录，也可将每个类型的影视目录独立一个任务。<br />本地目录填写 <code>/Movies</code> 目录下想要同步到的目标目录，该目录需先手动创建。</p><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D194/2.png" alt="2" /><br /><code>同步状态</code> 按钮打开。<br /><code>元数据模式</code> 选择本地模式<br /><code>清除功能</code> 务必全部关闭</p><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D194/3.png" alt="3" /></p><p><code>实时监控</code> 按需打开，删除功能务必关闭</p><p><code>软链接模式</code> 选择 <code>strm</code></p><p><code>strm模式</code> 选择 <code>local</code></p><p><code>挂载类型</code> 选择 <code>cd2</code></p><p><code>云端地址</code> 填写 <code>CD2的内网地址及端口</code></p><p><code>cd2根目录</code> 填写 <code>115目录的上一级目录，如/ClouNAS</code></p><p>将所有需要的同步目录配置完保存后，重启一下AS。然后在 <code>常用工具</code> -&gt; <code>手动同步</code> 中启动任务等待strm文件生成及元数据同步完成。</p><h4 id="emby" tabindex="-1">Emby</h4><p>Emby的配置，将宿主机的 <code>/CloudNAS</code> 与 <code>/Movies</code> 目录均原样映射入容器后，需要使用 <code>/Movies</code> 目录作为媒体库目录，即 <code>strm</code> 文件所在目录，添加媒体库配置。</p><p>此时，在Emby扫完某一个库之后，可以打开任意一部电影或者剧集，查看对应的文件目录信息，如 <code>/CloudNAS/影视/动漫/动画电影/铃芽之旅 (2022)/铃芽之旅 (2022) - 1080p H.264.mkv</code> 此路径记录一下，等会要用。<br />你问我媒体库用的是 <code>/Movies</code> ，为什么显示的是 <code>/CloudNAS</code>？这就是 <code>strm</code> 文件的特性，Emby会直接显示 <code>strm</code> 文件内容的路径信息。</p><p>接下来看一下该文件在115网盘内的路径，应该是 <code>/影视/动漫/动画电影/铃芽之旅 (2022)/铃芽之旅 (2022) - 1080p H.264.mkv</code> ，记录一下，一会也要用。</p><h4 id="redir115" tabindex="-1">Redir115</h4><p>镜像地址 <a href="https://hub.docker.com/r/htnanako/redir115" target="_blank">htnanako/redir115</a>，该项目使用了<a href="https://github.com/bpking1/embyExternalUrl" target="_blank">bpking1/embyExternalUrl</a>以及<a href="https://hub.docker.com/r/sjtuross/redir115" target="_blank">sjtuross/redir115</a>提供的代码进行整合，同时提供redir115及nginx代理服务在同一个容器内。感谢原项目开发大佬的付出。</p><p>使用<a href="https://hub.docker.com/r/htnanako/redir115" target="_blank">redir115</a>的nginx标签镜像，此镜像同时用于代理Emby请求以及请求115直链。</p><h5 id="%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E9%85%8D%E7%BD%AE" tabindex="-1">环境变量配置</h5><ul><li><p>NGINX_PORT</p><p>指定nginx监听端口，后续访问Emby服务均使用此端口，才可以实现直链播放，默认8092端口。</p></li><li><p>EMBY_HOST</p><p>Emby服务器的地址，内网地址端口即可</p></li><li><p>EMBY_API_KEY</p><p>Emby的ApiKey，从Emby的web中获取</p></li><li><p>ORIGINAL_PATH</p><p>Emby中显示的媒体路径中，不属于115网盘内路径的部分。</p><p>如上述例子的 <code>/CloudNAS/影视/动漫/动画电影/铃芽之旅 (2022)/铃芽之旅 (2022) - 1080p H.264.mkv</code> 中， <code>/CloudNAS</code> 即不属于115网盘内路径。</p></li><li><p>REDIR_PATH</p><p>在Emby中的媒体路径中，去掉ORIGINNAL_PATH部分之后，如果并不是115网盘内实际的完整路径，需要添加的前缀部分。<br />在上述例子中的 <code>/影视/动漫/动画电影/铃芽之旅 (2022)/铃芽之旅 (2022) - 1080p H.264.mkv</code> ，已经是115网盘内的完整路径了，那么此环境变量可不填写任何内容，或者删除此环境变量。</p></li><li><p>REDIR_HOST</p><p>Redir115容器中的redir115服务，使用5302端口，使用你本地的反代服务器将其反代出去，并添加上ssl证书，填写反代后的https地址端口，如 <code>https://redir.abc.xyz:5302</code> 。</p></li><li><p>REDIR_MODE</p><p>此参数支持 <code>strm_local</code>, <code>strm_cloud</code>, <code>symlink</code>，依照AS容器的配置进行填写。本教程使用的是 <code>strm_local</code> 。</p></li><li><p>COOKIE</p><p>填写一个不会在其他地方使用的115网盘的Cookie，建议使用alist官方文档中、提供的扫码服务获取TV端的Cookie，格式应如 <code>: UID=;CID=;SEID=;</code> 。</p></li></ul><h3 id="%E4%BD%BF%E7%94%A8" tabindex="-1">使用</h3><p>所有配置完成并启动容器后，访问Redir115容器中配置的Nginx端口，默认 <code>8092</code> ，即可访问到Emby服务。可支持第三方客户端、Emby Web播放302直链地址。</p><h3 id="%E7%95%AA%E5%A4%96" tabindex="-1">番外</h3><h4 id="emby-strm-assistant-%E6%8F%92%E4%BB%B6" tabindex="-1">Emby Strm Assistant 插件</h4><p><a href="https://github.com/sjtuross/StrmAssistant" target="_blank">Strm Assistant</a> 是一个Emby插件，放置到Emby配置目录下的 <code>/config/plugins/</code>，重启Emby即可在插件页看到。<br /><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D194/4.png" alt="4" /><br />其主要功能为提取媒体信息，即媒体的视频信息及音频信息等，并更新对应的nfo文件。如果你使用的的是<a href="https://hub.docker.com/r/amilys/embyserver" target="_blank">amilys/emby</a>并开启了第三方播放器按钮功能，在该插件跑完任务后才可以看到显示第三方播放器按钮。</p><h4 id="%E5%A4%9Aemby%E9%85%8D%E7%BD%AE" tabindex="-1">多Emby配置</h4><p>如果你不止一个Emby服务端需要进行获取直链播放，在安装完上述容器后，每新增一个Emby容器，需添加一个Nginx容器，用于Emby的一对一服务。</p><h5 id="nginx%E5%AE%B9%E5%99%A8%E9%85%8D%E7%BD%AE" tabindex="-1">Nginx容器配置</h5><pre><code class="language-yaml">services:  nginx:    image: nginx:latest    container_name: nginx    network_mode: host    volumes:      - ./nginx/conf.d:/etc/nginx/conf.d      - ./nginx/nginx.conf:/etc/nginx/nginx.conf      - ./nginx/embyCache:/var/cache/nginx/emby      - ./nginx/logs:/var/log/nginx    restart: unless-stopped</code></pre><p>配置文件仓库<a href="https://github.com/bpking1/embyExternalUrl" target="_blank">bpking1/embyExternalUrl</a></p><p>下载完该仓库的文件，使用其中的 <code>emby2Alist/nginx</code> 文件夹内的配置文件。</p><p>需要进行修改的文件：</p><ul><li><p>conf.d/constant.js<br /><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D194/5.png" alt="5" /></p><ul><li>embyHost参数修改为新增的Emby地址</li><li>embyApiKey参数修改为新增的Emby的ApiKey</li><li>mediaMountPath参数去掉默认的 <code>/mnt</code> 仅保留 <code>[&quot;&quot;]</code> 部分</li></ul></li><li><p>conf.d/config/constant-pro.js<br /><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D194/6.png" alt="6" /></p><ul><li>mediaPathMapping为一个列表，其中的参数均为列表，仿照其中第一条参数进行填写。<ul><li>第一个参数为0</li><li>如果你的文件是symlink类型，则第二个参数为0，如果文件为strm_local类型，则第二个参数为1，如果文件为strm_cloud类型，则第二个参数为2</li><li>第三个参数填写上述redir115服务中的 <code>ORIGINAL_PATH</code> 同含义的路径</li><li>第四个参数填写上述redir115服务的5302端口反代的https地址端口，如 <code>https://redir.abc.xyz:5302</code> 。但当 <code>REDIR_PATH</code> 有任何内容时，需要填写在该地址后的路径部分，如 <code>https://redir.abc.xyz:5302/media</code> 之类</li><li>总的来说，填写格式为 <code>[0, 1, &quot;/CloudNAS/115&quot;, &quot;https://redir.abc.xyz:5302&quot;]</code> 。</li></ul></li></ul></li><li><p>conf.d/includes/http.conf<br /><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D194/7.png" alt="7" /></p><ul><li>修改两个listen后的端口号，为该nginx监听的端口，作用同redir115的NGINX_PORT</li></ul></li></ul><p>此nginx容器仅用于对应的Emby服务的代理访问。获取115直链的服务，可复用redir115容器的5302端口提供的服务即可。</p>]]>
                </content>
            </entry>
            <entry>
                <title><![CDATA[Emby+115的网盘直链方案，外网看片不再受限上传带宽]]></title>
                <link rel="alternate" type="text/html" href="https://blog.nanako.vip/?p=162" />
                <id>tag:https://blog.nanako.vip,2024-04-15:emby115的网盘直链方案外网看片不再受限上传带宽</id>
                <published>2024-04-15T14:08:31+08:00</published>
                <updated>2024-05-05T00:01:48+08:00</updated>
                <author>
                    <name>黑田奈奈子</name>
                    <uri>https://blog.nanako.vip</uri>
                </author>
                <content type="html">
                        <![CDATA[<blockquote><p>声明：除引用的Github项目文件外，其他内容编写为原创。搬运请注明原作者。</p></blockquote><h3 id="302%E6%98%AF%E4%BB%80%E4%B9%88" tabindex="-1">302是什么</h3><p>GPT如是说</p><blockquote><p>HTTP 302是HTTP协议中的一种状态码（Status Code），全称是HTTP 302 Found，表示请求的资源临时移动到了一个新的URL，即临时重定向。</p><p>当浏览器或其他客户端向服务器发送请求时，如果服务器返回一个302状态码，它会同时在响应头中提供一个Location字段，告知客户端资源现在可以在新的URL找到。客户端随后应该使用这个新的URL来重新发起请求。</p><p>这种重定向通常是临时的，意味着资源只是暂时可以在新的地址找到，未来还可能会返回到原来的地址。</p></blockquote><p>在此教程中，利用Alist的获取115网盘直链的功能，也就是302跳转直链，来实现Emby播放时直连网盘地址，不走Emby所在网络上下行，减少了一次中转，达到外网高带宽看片的需求。</p><p>目前已测试以下客户端播放可以实现302跳转</p><ul><li>Emby客户端</li><li>Infuse</li><li>Fileball</li><li>Vidhub</li><li>Yamby</li></ul><p>欢迎补充…</p><h3 id="%E5%87%86%E5%A4%87%E6%9D%A1%E4%BB%B6%EF%BC%9A" tabindex="-1">准备条件：</h3><ul><li>有空间及会员的115账号</li><li>CD2(<a href="https://www.clouddrive2.com" target="_blank">CloudDriver2</a>)，可以不需要会员。</li><li><a href="https://alist.nn.ci/zh/" target="_blank">Alist</a></li><li>Emby，可以选择自己喜欢的镜像版本，如<a href="https://hub.docker.com/r/emby/embyserver" target="_blank">emby/embyserver</a>、<a href="https://hub.docker.com/r/linuxserver/emby" target="_blank">linuxserver/emby</a>、<a href="https://hub.docker.com/r/amilys/embyserver" target="_blank">amilys/emby</a></li></ul><p>阅读此篇教程，默认你已经学会</p><ul><li>Docker/Docker-Compose的相关配置使用</li><li>上述相关软件的基础配置使用</li></ul><h3 id="%E5%8E%9F%E7%90%86%E5%8F%8A%E4%BD%BF%E7%94%A8%E5%AE%B9%E5%99%A8%E4%BB%8B%E7%BB%8D" tabindex="-1">原理及使用容器介绍</h3><p>此方案需使用到四个容器，Emby、CloudDriver2、Alist、Nginx。</p><ul><li><p>Emby不必多说</p></li><li><p>CloudDriver2用于挂载115网盘到本地，使用起来比alist的webdav+rclone挂载方便。</p></li><li><p>Alist用于获取视频文件的115直链</p></li><li><p>Nginx用于劫持Emby的请求地址并从Alist获取115直链转发给客户端</p></li></ul><p>相关容器的配置与日常使用无甚区别，只需要对相关路径的转换理解即可。</p><h3 id="%E5%AE%B9%E5%99%A8%E9%85%8D%E7%BD%AE" tabindex="-1">容器配置</h3><h4 id="emby" tabindex="-1">Emby</h4><pre><code class="language-yaml">version: &#39;2.3&#39;services:  embyserver:    image: amilys/embyserver    container_name: emby    volumes:      - ./emby:/config      - /Movies:/movies:rslave    privileged: true    network_mode: bridge    ports:      - 8096:8096    restart: unless-stopped</code></pre><p>据群友实测，Emby需要4.8及以上版本，低于4.8版本有可能不成功。</p><p>emby配置两个路径，一个是<code>/config</code>，映射到你喜欢的路径即可。一个是<code>/movies</code>，映射到宿主机的<code>/Movies</code>，这个路径可以自己自定义，所有的影视文件都会在此路径内，没有什么特殊的，记住这个<code>/movies</code>，一会要考。</p><h4 id="cd2" tabindex="-1">CD2</h4><pre><code class="language-yaml">version: &#39;2.3&#39;cloudnas:    image: cloudnas/clouddrive2-unstable    container_name: clouddrive2    environment:       - TZ=Asia/Shanghai       - CLOUDDRIVE_HOME=/Config    volumes:      - /Movies:/CloudNAS:shared      - ./cd2:/Config      # - &lt;other local shared path&gt;:/media:shared    devices:      - /dev/fuse:/dev/fuse    restart: unless-stopped    pid: &quot;host&quot;    privileged: true    network_mode: bridge    ports:      - 19798:19798</code></pre><p>cd2映射两个路径，<code>/CloudNAS</code>为挂载路径，用于将云盘文件挂载到本地，同样映射到宿主机的<code>/Movies</code>路径下，这个宿主机路径与Emby的必须一致，自行决定。</p><h4 id="alist" tabindex="-1">Alist</h4><pre><code class="language-yaml">version: &#39;2.3&#39;alist:    image: xhofe/alist:latest    container_name: alist    volumes:        - ./alist:/opt/alist/data    network_mode: bridge    ports:        - 5244:5244    environment:        - PUID=0        - PGID=0        - UMASK=022    restart: unless-stopped</code></pre><p>Alist只需要映射配置文件的路径即可。</p><h4 id="nginx" tabindex="-1">Nginx</h4><pre><code class="language-yaml">version: &#39;2.3&#39;nginx:    image: nginx:latest    container_name: nginx    network_mode: host    volumes:      - ./nginx/conf.d:/etc/nginx/conf.d      - ./nginx/nginx.conf:/etc/nginx/nginx.conf      - ./nginx/embyCache:/var/cache/nginx/emby      - ./nginx/logs:/var/log/nginx    restart: unless-stopped</code></pre><p>nginx配置需要完全自定义，使用官方镜像即可，需要注意的是，容器的网络模式必须使用host。相关配置文件后文提供，<code>nginx容器先不启动</code>。</p><h3 id="%E8%AF%A6%E7%BB%86%E9%85%8D%E7%BD%AE" tabindex="-1">详细配置</h3><h4 id="cd2-1" tabindex="-1">CD2</h4><p>启动CD2容器后，添加自己的115账号。使用CD2的本地挂载功能，选择<code>115根目录</code>，点击<code>挂载到本地</code>，<code>名称</code>填写<code>115</code>，挂载点选择<code>/CloudNAS</code>，保存即可挂载到<code>/CloudNAS</code>路径下，也就是宿主机的<code>/Movies</code>路径。如果你不知道怎么操作，自行查看CD2官方文档，学会了再来。</p><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D162/1.png" alt="1.png" /><br /><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D162/2.png" alt="2.png" /></p><p>此时，在宿主机查看<code>/Movies</code>目录，就可以查看到115上的文件了。</p><h4 id="alist-1" tabindex="-1">Alist</h4><p>启动Alist容器，在添加存储里添加115网盘。挂载路径填写<code>/115</code>，<code>WEBDAV策略</code>选择302。从<a href="https://alist.nn.ci/zh/guide/drivers/115.html#qrcode-%E6%89%AB%E7%A0%81%E6%96%B9%E5%BC%8F%E7%99%BB%E5%BD%95" target="_blank">Alist文档</a>中通过手机客户端扫码获取115token，填写到配置中的二维码令牌，下方的<code>Qrcode源</code>选择一个自己不需要用到的源，如TV端，防止顶号失效。如果你的CD2是挂载的根目录的话，最下方的 <code>根文件夹ID</code> 为0不要修改，反之请自行修改，务必保持一致。</p><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D162//3.png" alt="3.png" /></p><h4 id="emby-1" tabindex="-1">emby</h4><p>配置完以上挂载之后，需要重启一次Emby容器，如果你的Emby已经提前启动了的话。</p><p>重启完成之后，在Emby中添加你的媒体库，此时可以看到，Emby的 <code>/movies</code> 目录下有你的115的影视文件了。如果你的文件不包含nfo文件的话，建议不要开启⬇️⬇️⬇️此开关，防止小文件上传过多被风控。以及关闭 <code>将媒体图像保存到媒体文件夹中</code> 开关。</p><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D162//4.png" alt="4.png" /></p><h4 id="nginx-1" tabindex="-1">Nginx</h4><p>操作到这里，你需要自己明确一下Emby和Alist的对应文件路径。</p><p>两边对比一下同一个视频文件，可以看到，Emby中的路径应为<code>/movies/115/影视/动漫/动画电影/铃芽之旅 (2022)/铃芽之旅 (2022) - 1080p H.264.mkv</code>，Alist中的同一个文件路径为<code>/115/影视/动漫/动画电影/铃芽之旅 (2022)/铃芽之旅 (2022) - 1080p H.264.mkv</code></p><blockquote><p>具体的网盘内路径以自己为准，但如果完全照抄以上配置的话，路径的开头<code>/movies/115</code> 及 <code>/115</code> 肯定是和我一致的。</p></blockquote><p>此时Alist内的路径为Emby的路径的子集，即多出一个 <code>/movies</code> 开头。</p><p>接下来下载<a href="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D162/nginx.zip" target="_blank">此压缩包</a>，解压后得到一个nginx文件夹，其中有conf.d文件夹及nginx.conf文件，此为nginx相关配置文件。在此感谢<a href="https://github.com/bpking1/embyExternalUrl" target="_blank">bpking1/embyExternalUrl</a>作者大大提供的配置及脚本。</p><p>需要自定义配置的有两个文件。</p><ul><li><p>conf.d/constant.js<br /><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D162//5.png" alt="5.png" /></p><ul><li>embyHost: Emby的内网地址及端口</li><li>embyMountPath: 填写上述的 <code>/movies</code> ，即Alist路径为Emby的子集剩余的部分。注意填写到此列表变量的元素中，即 <code>[&quot;/movies&quot;]</code>。如果你的Emby文件路径与Alist完全一致，即剩余部分为空，那么此处填写 <code>[]</code>。</li><li>embyApiKey: Emby的ApiKey，从Emby的web中获取。</li><li>alistAddr: Alist的地址及端口。这里我使用的是Alist的外网地址，内网地址是否可用可自行探索。</li><li>alistToken: Alist的Token令牌，在 <code>Alist -&gt; 管理 -&gt; 设置 -&gt; 其他 -&gt; 令牌</code> 获取，格式为 <code>alist-</code> 开头</li></ul></li><li><p>conf.d/emby.conf<br /><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D162//6.png" alt="6.png" /><br />第26行: <code>listen 8091;</code><br />此为nginx监听的端口，修改为你想要的端口即可，用于替代原Emby的8096端口访问。访问此端口才能实现302转发。</p></li></ul><p>修改完配置之后，将<code>conf.d</code> 及 <code>nginx.conf</code> 映射到nginx容器，在上述的nginx的docker-compose配置中已添加，注意存放的宿主机路径。启动nginx容器。</p><h3 id="%E6%B5%8B%E8%AF%95" tabindex="-1">测试</h3><p>此时启动Nginx容器后，访问 <code>8091</code> 端口，或是你在 <code>emby.conf</code> 文件中修改的端口，可以访问到Emby Web。即完成了第一步，nginx代理Emby Web成功。</p><p>使用各类客户端，如Emby官方客户端、Infuse、Fileball、Vidhub等登录8091端口，找一个刮削好的片子播放，或者web跳转第三方播放器potplayer、iina等，查看CD2的下载任务。如果没有大流量的对应文件下载，进程为 <code>/system/EmbyServer</code> ，即302转发成功。</p><p>目前Emby Web直接播放还无法实现302转发，也或许是我姿势不对。如果有成功使用Emby Web播放302直链的欢迎分享成果。</p><h3 id="%E5%90%88%E5%B9%B6%E5%AE%B9%E5%99%A8%E9%85%8D%E7%BD%AE" tabindex="-1">合并容器配置</h3><p>使用Docker Compose可以方便地把多个有关联的容器进行合并配置，并且可以设置依赖的启动顺序，一键拉起所有容器。</p><pre><code class="language-yaml">version: &#39;2.3&#39;services:  embyserver:    image: amilys/embyserver_arm64v8    container_name: emby    volumes:      - ./emby:/config      - /Movies:/movies:rslave    privileged: true    network_mode: bridge    ports:      - 8096:8096    restart: unless-stopped    depends_on:      - cloudnas      - alist      - nginx  cloudnas:    image: cloudnas/clouddrive2-unstable    container_name: clouddrive2    environment:       - TZ=Asia/Shanghai       - CLOUDDRIVE_HOME=/Config    volumes:      - /Movies:/CloudNAS:shared      - ./cd2:/Config      # - &lt;other local shared path&gt;:/media:shared    devices:      - /dev/fuse:/dev/fuse    restart: unless-stopped    pid: &quot;host&quot;    privileged: true    network_mode: bridge    ports:      - 19798:19798  alist:    image: xhofe/alist:latest    container_name: alist    volumes:        - ./alist:/opt/alist/data    network_mode: bridge    ports:        - 5244:5244    environment:        - PUID=0        - PGID=0        - UMASK=022    restart: unless-stopped      nginx:    image: nginx:latest    container_name: nginx    network_mode: host    volumes:      - ./nginx/conf.d:/etc/nginx/conf.d      - ./nginx/nginx.conf:/etc/nginx/nginx.conf      - ./nginx/embyCache:/var/cache/nginx/emby      - ./nginx/logs:/var/log/nginx    restart: unless-stopped</code></pre>]]>
                </content>
            </entry>
            <entry>
                <title><![CDATA[ChatGPT无障碍访问：搭建自己的专属Chat]]></title>
                <link rel="alternate" type="text/html" href="https://blog.nanako.vip/?p=130" />
                <id>tag:https://blog.nanako.vip,2023-07-22:搭建自己的专属chat</id>
                <published>2023-07-22T19:05:32+08:00</published>
                <updated>2023-07-22T19:11:58+08:00</updated>
                <author>
                    <name>黑田奈奈子</name>
                    <uri>https://blog.nanako.vip</uri>
                </author>
                <content type="html">
                        <![CDATA[<h2 id="%E5%89%8D%E8%A8%80" tabindex="-1">前言</h2><p>由于某些众所周知的原因，国内访问ChatGPT官网存在一些门槛，对普通用户来说并不方便。但如果您能克服这些门槛，那就恭喜您了！</p><p>关于如何注册ChatGPT官方账号，网上已经有很多教程，包含本地IP、谷歌邮箱、接码等步骤。如果您有兴趣，可以自行搜索相关内容。</p><h2 id="%E5%B9%B3%E5%8F%B0%E4%BB%8B%E7%BB%8D" tabindex="-1">平台介绍</h2><p>那么对于普通用户来说，有哪些途径可以使用ChatGPT呢？</p><p>实际上，已经存在许多类似的平台，但它们在速度、质量和安全性方面存在良莠不齐的问题，对于一般用户来说很难进行判断。接下来，我将介绍一个平台，这也是我个人长期使用的选择：AiProxy。它价格亲民，速度快且安全可靠。</p><blockquote><p><a href="https://aiproxy.io/?i=nanako" target="_blank">AiProxy</a></p></blockquote><h3 id="%E6%B3%A8%E5%86%8C" tabindex="-1">注册</h3><p>该平台接入了Authing，支持通过Google账号或Github账号一键登录，同时也可以使用邮箱或手机号接收验证码进行登录。</p><h3 id="%E5%85%85%E5%80%BC%E7%A7%AF%E5%88%86%E5%8F%8A%E4%BC%9A%E5%91%98%E8%AE%A2%E9%98%85" tabindex="-1">充值积分及会员订阅</h3><p>注册账号后，您会看到积分充值和会员订阅选项。积分充值提供多种档次选择，从5元2000积分的体验版到2000元2000000积分的全额版，您可以根据需求自由选择。除了5元的体验档外，其他档次的充值比例为1元1000积分。如果使用我的邀请码<a href="https://aiproxy.io/?i=nanako" target="_blank">nanako</a>进行首次充值，还可额外获得3%的积分赠送。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16851028336704.jpg" alt="积分充值" /></p><p>向下滚动页面，您会看到三种会员套餐，分别是高级会员、专业会员和企业会员。价格分别为9.9元/月、29.9元/月和299元/月。不同套餐之间的区别在于积分折扣、赠送积分数量以及子账号数量。具体请参考下图：</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16851028094498.jpg" alt="会员订阅价格" /></p><p>费率最低可以达到12%，相对于OpenAI官方价格来说，仅为1.12倍费用。相比起其他平台动辄50%以上手续费，可以说相当划算。价格受汇率影响，可能会有轻微波动。</p><h3 id="%E7%94%9F%E6%88%90apikey" tabindex="-1">生成ApiKey</h3><p>注册账号并充值积分后，我们进入控制台。点击左侧的ApiKeys选项，然后点击右上角的新建Apikey按钮。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16851031642576.jpg" alt="新建ApiKey" /></p><p>在弹出的窗口中，您可以设置该Apikey的名称、可用模型、是否为子账户以及子账户限额等信息。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16851032121585.jpg" alt="ApiKey配置" /></p><p>平台支持的模型非常丰富，基本可以满足一般用户和开发者的所有需求。需要注意的是，目前无法使用<code>gpt-4-32k</code>和<code>gpt-4-32k-0314</code>这两个模型，只有少数特定企业才有使用权限，平台运营者无法提供相关权限。</p><p>保存配置后，您会在页面底部看到一条新的Apikey，其中部分字符被隐藏，默认以<code>ap-</code>开头。点击右侧的复制按钮即可将其复制到剪贴板。如果您使用的是子账户，右侧的子账户列中将显示该Key的可用额度。</p><blockquote><p>6.2更新，平台为了兼容一些强制检测ApiKey格式的项目，已将默认生成的key调整为和官方一样的<code>sk-</code>开头，但这不是官方key，不是官方key，不是官方key，不可以直接用官方的api地址。</p></blockquote><h2 id="%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8" tabindex="-1">如何使用</h2><p>那么，现在让我们来解答用户最关心的问题：我已经获得了Apikey，接下来该怎么使用呢？</p><p>我推荐您使用GitHub上的一个项目，<code>ChatGPT-Next-Web</code>。如果您有docker环境，无论是家中的NAS还是自己的VPS，部署都非常方便。您也可以选择部署到Vercel上。</p><h3 id="%E5%90%AF%E5%8A%A8%E5%AE%B9%E5%99%A8" tabindex="-1">启动容器</h3><p>以下是我个人使用的docker-compose示例：</p><pre><code class="language-yaml">version: &#39;3&#39;services:  chatgpt-next-web:    container_name: chatgpt-next-web    image: yidadaa/chatgpt-next-web    network_mode: &quot;host&quot; # 使用host网络模式    environment:      OPENAI_API_KEY:  # 填入平台获取的apikey，ap-开头的      CODE:  # 管理密码，防止他人直接使用你的账号      BASE_URL: https://api.aiproxy.io # 重要！必须填入AiProxy平台提供的api接口地址，不填或者填写官方地址都不可以。</code></pre><p>或者您也可以使用docker cli命令：</p><pre><code class="language-bash">docker run -itd -p 3000:3000 \   -e OPENAI_API_KEY=&quot;ap-xxxx&quot; \   -e BASE_URL=&quot;https://api.aiproxy.io&quot; \   -e CODE=&quot;页面访问密码&quot; \   yidadaa/chatgpt-next-web</code></pre><p>启动容器后，访问http://您的IP:3000即可开始使用。</p><p>如果没有自己的NAS或者VPS，也可以使用Vercel进行免费的搭建。</p><p>使用Vercel，你需要有一个Github账号，具体如何注册请自行Google。<br />之后打开该项目地址<a href="https://github.com/Yidadaa/ChatGPT-Next-Web" target="_blank">ChatGPT-Next-Web</a>，点击下方的Deploy按钮，跳转Vercel。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16856946073883.jpg" alt="" /></p><p>跳转之后未登录账号的会提示登录，使用你的Github账号登录之后来到这个界面。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16856946678258.jpg" alt="" /></p><p>点击右下方的Create，Vercel会给你的Github新增一个私人仓库，将项目代码完整拷贝过来。<br />Create完成之后，向下滚动页面，可以看到<code>Configure Project</code>（配置项目）项，下方提示了项目必填的两个环境变量，<code>OPENAI_API_KEY</code>和<code>CODE</code>。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16856947556411.jpg" alt="" /></p><p>将从AiProxy获取的<code>ApiKey</code>填入<code>OPENAI_API_KEY</code>右边对应的框内，CODE为你自己设置的页面密码，防止被他人滥用。Vercel对于非必填的环境变量，需要先进行一次部署，之后才可新增，所以我们现在将两个环境变量填写之后，点击Deploy按钮，等待部署完成。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16856950250747.jpg" alt="" /></p><p>部署完成之后会提示<code>Congratulations</code>,我们点击右边的C<code>ontinue to Dashboard</code>按钮。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16856951486804.jpg" alt="" /></p><p>在跳转的面板页面，点击<code>Setting</code>。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16856952487401.jpg" alt="" /></p><p>在Setting页面中，左侧找到并点击<code>Environmeent Variables</code>选项。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16856952760539.jpg" alt="" /></p><p>在打开的<code>环境变量(Environment Variables)</code>页面中，可以看到有<code>Key</code>和<code>Value</code>供填写。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16856953422699.jpg" alt="" /></p><p>我们在Key项中填写<code>BASE_URL</code>，Value项中填写<code>https://api.aiproxy.io</code>，如下图：</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16856954620927.jpg" alt="" /></p><p>填写完成之后点击Save。<br />保存完成之后，我们可以在下方看到一共设置了三个环境变量，分别是<code>BASE_URL</code>，<code>OPENAI_API_KEY</code>，<code>CODE</code>。三个环境变量缺一不可，如果有哪个没有配置，请重新回到前面教程查看是否漏了什么没有配置。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16856955275183.jpg" alt="" /></p><p>确认三个环境变量都配置了之后，点击左上角的<code>Deployments</code>按钮。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16856959049547.jpg" alt="" /></p><p>在跳转的页面下方，我们点击右边的三个小点，在弹出的选项中选择<code>Redeploy</code>。更新了项目配置之后，需要点击一次重新部署才能生效。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16856959842016.jpg" alt="" /></p><p>在弹出的页面点击<code>Redeploy</code>。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16856960359950.jpg" alt="" /></p><p>等待完成。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16856961144279.jpg" alt="" /></p><p>完成之后，点击右方的<code>Visit</code>按钮，或者下方的DOMAINS下第一行，即可跳转项目的地址访问。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16856962751934.jpg" alt="" /></p><p>如果看到如下界面，那么部署就算完成了。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16856957708536.jpg" alt="" /></p><h3 id="%E8%AE%BE%E7%BD%AE%E8%BD%AF%E4%BB%B6" tabindex="-1">设置软件</h3><p>在打开的页面中，默认显示为英文界面。此时，点击左下角的设置按钮，进入软件的设置界面。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16851039641415.jpg" alt="" /></p><p>在设置界面中，将语言修改为中文。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16851040000161.jpg" alt="" /></p><p>修改完成后，继续向下滚动页面，您会看到访问密码和ApiKey两个选项。</p><p><img src="v16851040219541.jpg" alt="" /></p><p>根据刚才启动docker时的配置，您已经设置了访问密码，请将其输入后，即可直接使用AiProxy提供的ApiKey进行对话了。</p><p>如果要与朋友共享使用AiProxy提供的ApiKey，只需对方输入自己的ApiKey即可，无需填写访问密码。</p><p>填写完成后，点击右上角的关闭按钮，即可看到默认的提示语“有什么可以帮您的吗？”现在您可以开始与GPT对话了。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16851042267329.jpg" alt="" /></p><p>在输入框的上方，有几个小图标。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16851042882113.jpg" alt="" /></p><h3 id="%E6%A8%A1%E5%9E%8B%E4%BF%AE%E6%94%B9" tabindex="-1">模型修改</h3><p>如果您想切换模型（默认使用<code>gpt-3.5-turbo</code>），点击第一个齿轮图标，即可查看模型相关的设置。</p><p><img src="https://docs.nnk.im/img/ChatGPT%E6%97%A0%E9%9A%9C%E7%A2%8D%E8%AE%BF%E9%97%AE%EF%BC%9A%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E4%B8%93%E5%B1%9EChat/16851043673810.jpg" alt="" /></p><p>软件已经支持许多模型，如前文所述，<code>gpt-4-32k</code>和<code>gpt-4-32k-0314</code>这两个模型目前无法使用。如果要使用GPT-4模型，请选择<code>gpt-4</code>或<code>gpt-4-0314</code>。此设置仅在当前对话中有效。在新建对话时，将再次使用软件的默认模型<code>gpt-3.5-turbo</code>。</p><p>如果您想修改全局的模型设置，请点击左下角的设置按钮，然后向下滚动页面，即可找到相关选项。</p><h3 id="%E5%85%B6%E4%BB%96%E5%8A%9F%E8%83%BD" tabindex="-1">其他功能</h3><p>软件还提供了一些其他功能，您可以自行探索。本文已经介绍了主要的使用方法。</p><h2 id="%E6%84%89%E5%BF%AB%E5%9C%B0%E4%BD%BF%E7%94%A8%E5%90%A7" tabindex="-1">愉快地使用吧</h2><p>现在，在国内的网络环境下，您已经可以直接使用OpenAI提供的ChatGPT API服务了。</p>]]>
                </content>
            </entry>
            <entry>
                <title><![CDATA[Unraid上搭建Cloudflare Tunnels]]></title>
                <link rel="alternate" type="text/html" href="https://blog.nanako.vip/?p=98" />
                <id>tag:https://blog.nanako.vip,2022-09-28:unraid上搭建cloudflaretunnels</id>
                <published>2022-09-28T00:21:38+08:00</published>
                <updated>2022-09-28T00:37:08+08:00</updated>
                <author>
                    <name>黑田奈奈子</name>
                    <uri>https://blog.nanako.vip</uri>
                </author>
                <content type="html">
                        <![CDATA[<p>Cloudflare Tunnels(Argo Tunnel) 通过在你的环境中部署轻量级连接器，在你的服务和 Cloudflare 之间创建一个安全的、仅限出站的连接。</p><h2 id="%E5%85%88%E5%86%B3%E6%9D%A1%E4%BB%B6" tabindex="-1"><strong><strong>先决条件</strong></strong></h2><p>对于此设置，你需要有一个由 <code>CloudFlare</code> 管理的域，并且可以在免费计划中完成。</p><h2 id="%E8%AE%BE%E7%BD%AE%E6%AD%A5%E9%AA%A4" tabindex="-1"><strong><strong>设置步骤</strong></strong></h2><ol><li>在 Unraid 终端中，运行以下命令以使用要设置隧道的 <code>Cloudflare</code> 站点授权 <code>Cloudflared</code>。</li></ol><pre><code class="language-">docker run -it --rm -v /mnt/user/appdata/cloudflared:/home/nonroot/.cloudflared/ cloudflare/cloudflared:2021.8.2 tunnel login</code></pre><p>它将打印出 <code>Cloudflare</code> 的链接。将此链接复制到浏览器中打开，登录Cloudflare，然后选择您要使用的域。然后，守护进程会自动拉取证书。</p><ol start="2"><li>现在我们需要创建一个隧道。在Unraid终端运行以下命令。</li></ol><pre><code class="language-">docker run -it --rm -v /mnt/user/appdata/cloudflared:/home/nonroot/.cloudflared/ cloudflare/cloudflared:2021.8.2 tunnel create TUNNELNAME</code></pre><p>这将创建隧道的 <code>UUID.json</code> 文件，其中包含用于验证你与 cloudflare 的隧道连接的秘钥。JSON 文件仅用于运行隧道，但任何隧道修改都需要 <code>cert.pem</code>。</p><p>复制屏幕上显示 <code>UUID</code>保存好，后面的步骤中会使用到。也可以通过 JSON 文件的名称找到它。</p><ol start="3"><li>现在我们需要创建一个 <code>config.yaml</code> 来配置隧道</li></ol><pre><code class="language-">vi /mnt/user/appdata/cloudflared/config.yaml</code></pre><ol start="4"><li>现在粘贴以下内容并修改你的<code>反向代理 IP:PORT</code>、<code>隧道 UUID</code> 和<code>域名</code>（如果需要）</li></ol><ul><li>如果你的反向代理上有 SSL证书，则需要传入 SSL 证书所在的域名</li><li>如果要禁用 ssl 验证，请在 <code>originRequest</code> 下添加 <code>noTLSVerify</code></li></ul><pre><code class="language-yaml">tunnel: UUIDcredentials-file: /home/nonroot/.cloudflared/UUID.json# NOTE: You should only have one ingress tag, so if you uncomment one block comment the others# forward all traffic to Reverse Proxy w/ SSLingress:  - service: https://REVERSEPROXYIP:PORT    originRequest:      originServerName: yourdomain.com      #forward all traffic to Reverse Proxy w/ SSL and no TLS Verify#ingress:#  - service: https://REVERSEPROXYIP:PORT#    originRequest:#      noTLSVerify: true# forward all traffic to reverse proxy over http#ingress:#  - service: http://REVERSEPROXYIP:PORT</code></pre><p>有关入口规则以及如何配置它们的更多信息，请参见<a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/configuration/ingress" target="_blank">此处</a>。</p><ol start="5"><li>现在可以在<code>Unraid</code>中安装程序了。</li></ol><ul><li>转到 <code>应用</code> 选项卡</li><li>搜索 <code>cloudflared</code></li><li>找到<code>cloudflare/cloudflared</code>。Unraid默认模板为<code>cloudflare/cloudflared:2021.6.0</code>，需要自行修改下版本号为<code>2021.8.2</code>。</li><li>先别点击应用，需要进行以下更改：</li></ul><ol start="6"><li>点击启用右上角的“高级视图”。<br />在发布参数中你应该会看到如下命令。将 UUID 替换为在步骤 2 中生成的隧道的 UUID。</li></ol><pre><code class="language-">发布参数：tunnel run UUID</code></pre><ol start="7"><li>修改完成之后点击应用启动容器。如果一切都正确无误，你应该有一个正在运行的隧道！</li></ol><p><img src="https://ghproxy.com/https://raw.githubusercontent.com/htnanako/nanako-blog/main/article/p%3D98/1.png" alt="1" /></p><ol start="8"><li>下一步将是编辑你的域 DNS 记录。</li></ol><ul><li>如果已经有 A 记录，可以删除它，因为现在不需要它。</li><li>添加指向域根 (@) 的 CNAME 记录，在内容选项框内添加 <code>UUID.cfargotunnel.com</code>（<code>UUID</code>替换为步骤2中保存的值）。</li><li>其他子域的添加方法如下例子，也可添加泛域名解析。</li></ul><h3 id="%E4%BE%8B%E5%AD%90" tabindex="-1"><strong><strong>例子</strong></strong></h3><table><thead><tr><th>Type</th><th>NAME</th><th>Value</th><th>TTL</th><th>Status</th></tr></thead><tbody><tr><td>CNAME</td><td>@</td><td><a href="http://UUID.cfargotunnel.com" target="_blank">UUID.cfargotunnel.com</a></td><td>Automatic</td><td>Orange ☁️</td></tr><tr><td>CNAME</td><td>plex</td><td>@</td><td>Automatic</td><td>Orange ☁️</td></tr><tr><td>CNAME</td><td>emby</td><td>@</td><td>Automatic</td><td>Orange ☁️</td></tr><tr><td>CNAME</td><td>qb</td><td>@</td><td>Automatic</td><td>Orange ☁️</td></tr></tbody></table><h2 id="%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4" tabindex="-1"><strong><strong>故障排除</strong></strong></h2><h3 id="%E8%AF%81%E4%B9%A6%E5%AF%B9%E4%BB%BB%E4%BD%95%E5%90%8D%E7%A7%B0%E5%9D%87%E6%97%A0%E6%95%88" tabindex="-1"><strong><strong>证书对任何名称均无效</strong></strong></h3><p>如果看到类似的错误</p><pre><code class="language-">in the logs of cloudflared i have this error &quot;ERR  error=&quot;Unable to reach the origin service. The service may be down or it may not be responding to traffic from cloudflared: x509: certificate is not valid for any names, but wanted to match youdomain.com</code></pre><p>尝试将 <a href="http://yourdomain.com" target="_blank">yourdomain.com</a> 更改为 <a href="http://host.yourdomain.com" target="_blank">host.yourdomain.com</a>，其中 host 是拥有 DNS 记录的有效子域。尽管这是一个特定的主机名，Cloudflared 应该能够在您的其他子域通过隧道时验证该名称的证书。</p><h3 id="%E9%9A%A7%E9%81%93%E5%88%9B%E5%BB%BA%E4%B8%8D%E8%BF%94%E5%9B%9E-id" tabindex="-1"><strong><strong>隧道创建不返回 ID</strong></strong></h3><p>如果在终端中运行命令时，没有返回 ID，请尝试使用指定的容器版本运行命令，如下所示</p><pre><code class="language-">docker run -it --rm -v /mnt/user/appdata/cloudflared:/home/nonroot/.cloudflared/ cloudflare/cloudflared:2021.8.2 tunnel</code></pre><h2 id="%E9%80%9A%E8%BF%87-web-%E6%B8%B2%E6%9F%93%E7%BB%88%E7%AB%AF%E5%90%AF%E7%94%A8-ssh-%E8%AE%BF%E9%97%AE" tabindex="-1"><strong><strong>通过 Web 渲染终端启用 SSH 访问</strong></strong></h2><ol><li>为要进行 SSH 访问的子域创建 DNS 记录。</li></ol><table><thead><tr><th>Type</th><th>NAME</th><th>Value</th><th>TTL</th><th>Status</th></tr></thead><tbody><tr><td>CNAME</td><td>ssh</td><td>@</td><td>Automatic</td><td>Orange ☁️</td></tr></tbody></table><ol start="2"><li>添加入口规则</li></ol><p>入口规则自上而下解析，因此此规则应高于 - 服务：<code>https://REVERSEPROXYIP:PORT/</code>规则。</p><pre><code class="language-">- hostname: ssh.domain.com    service: ssh://SSHIP:PORT</code></pre><ol start="3"><li>注册 Cloudflare 团队</li></ol><p>• 点击<a href="https://www.cloudflare.com/teams-pricing/" target="_blank">这里</a>注册，免费计划最多可容纳 50 个用户，但需要计费详细信息，可以在没有计划的情况下使用它。</p><ol start="4"><li>为您的 SSH 服务添加 Teams 应用程序并启用基于浏览器的渲染</li></ol><p>• cloudflare 的指南可以在<a href="https://developers.cloudflare.com/cloudflare-one/tutorials/ssh" target="_blank">这里找到</a></p><h2 id="%E5%88%97%E5%87%BA%E5%92%8C%E5%88%A0%E9%99%A4%E9%9A%A7%E9%81%93" tabindex="-1"><strong><strong>列出和删除隧道</strong></strong></h2><p>要列出所有已配置的隧道并查看活动连接：</p><pre><code class="language-">docker run -it --rm -v /mnt/user/appdata/cloudflared:/home/nonroot/.cloudflared/ cloudflare/cloudflared tunnel list</code></pre><table><thead><tr><th>ID</th><th>NAME</th><th>CREATED</th><th>CONNECTIONS</th></tr></thead><tbody><tr><td>十六进制的NAMEID</td><td>隧道名称</td><td>创建日期和时间</td><td>NUMBERxCFPOINT</td></tr></tbody></table><p>撤销和删除隧道：</p><pre><code class="language-">docker run -it --rm -v /mnt/user/appdata/cloudflared:/home/nonroot/.cloudflared/ cloudflare/cloudflared tunnel delete TUNNELID</code></pre><p>如果隧道上仍有活动连接，则需要强制删除。连接将被丢弃：</p><pre><code class="language-">docker run -it --rm -v /mnt/user/appdata/cloudflared:/home/nonroot/.cloudflared/ cloudflare/cloudflared tunnel delete -f TUNNELID</code></pre><p><strong>删除隧道还会使与该隧道关联的凭据文件无效，这意味着无法重新建立这些连接。</strong></p>]]>
                </content>
            </entry>
            <entry>
                <title><![CDATA[提问的智慧]]></title>
                <link rel="alternate" type="text/html" href="https://blog.nanako.vip/?p=65" />
                <id>tag:https://blog.nanako.vip,2022-06-21:提问的智慧</id>
                <published>2022-06-21T13:38:51+08:00</published>
                <updated>2022-06-21T13:53:29+08:00</updated>
                <author>
                    <name>黑田奈奈子</name>
                    <uri>https://blog.nanako.vip</uri>
                </author>
                <content type="html">
                        <![CDATA[<p>本文引用自<a href="https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md" target="_blank">https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md</a>。</p><p>How To Ask Questions The Smart Way</p><p>Copyright © 2001,2006,2014 Eric S. Raymond, Rick Moen</p><p>本指南英文版版权为 Eric S. Raymond, Rick Moen 所有。</p><p>原文网址：<a href="http://www.catb.org/~esr/faqs/smart-questions.html" target="_blank">http://www.catb.org/~esr/faqs/smart-questions.html</a></p><p>Copyleft 2001 by D.H.Grand(nOBODY/Ginux), 2010 by Gasolin, 2015 by Ryan Wu</p><p>本中文指南是基于原文 3.10 版以及 2010 年由 <a href="https://github.com/gasolin" target="_blank">Gasolin</a> 所翻译版本的最新翻译；</p><p>协助指出翻译问题，请发 <a href="https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/issues/new" target="_blank">issue</a>，或直接发 <a href="https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/compare" target="_blank">pull request</a> 给我。</p><p>本文另有<a href="https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README.md" target="_blank">繁體中文版</a>。</p><h3 id="%E5%8E%9F%E6%96%87%E7%89%88%E6%9C%AC%E5%8E%86%E5%8F%B2" tabindex="-1"><a href="https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/history.md" target="_blank">原文版本历史</a></h3><h3 id="%E7%9B%AE%E5%BD%95" tabindex="-1">目录</h3><ul><li><a href="#1">声明</a></li><li><a href="#2">简介</a></li><li><a href="#3">在提问之前</a></li><li><a href="#4">当你提问时</a><ul><li><a href="#4.1">慎选提问的论坛</a></li><li><a href="#4.2">Stack Overflow</a></li><li><a href="#4.3">网站和 IRC 论坛</a></li><li><a href="#4.4">第二步，使用项目邮件列表</a></li><li><a href="#4.5">使用有意义且描述明确的标题</a></li><li><a href="#4.6">使问题容易回复</a></li><li><a href="#4.7">使用清晰、正确、精准且合乎语法的语句</a></li><li><a href="#4.8">使用易于读取且标准的文件格式发送问题</a></li><li><a href="#4.9">精确地描述问题并言之有物</a></li><li><a href="#4.10">话不在多而在精</a></li><li><a href="#4.11">别动辄声称找到 Bug</a></li><li><a href="#4.12">低声下气不能代替你的功课</a></li><li><a href="#4.13">描述问题症状而非你的猜测</a></li><li><a href="#4.14">按发生时间先后列出问题症状</a></li><li><a href="#4.15">描述目标而不是过程</a></li><li><a href="#4.16">别要求使用私人电邮回复</a></li><li><a href="#4.17">清楚明确的表达你的问题以及需求</a></li><li><a href="#4.18">询问有关代码的问题时</a></li><li><a href="#4.19">别把自己家庭作业的问题贴上来</a></li><li><a href="#4.20">去掉无意义的提问句</a></li><li><a href="#4.21">即使你很急也不要在标题写紧急</a></li><li><a href="#4.22">礼多人不怪，而且有时还很有帮助</a></li><li><a href="#4.23">问题解决后，加个简短的补充说明</a></li></ul></li><li><a href="#5">如何解读答案</a><ul><li><a href="#5.1">RTFM 和 STFW：如何知道你已完全搞砸了</a></li><li><a href="#5.2">如果还是搞不懂</a></li><li><a href="#5.3">处理无礼的回应</a></li></ul></li><li><a href="#6">如何避免扮演失败者</a></li><li><a href="#7">不该问的问题</a></li><li><a href="#8">好问题与蠢问题</a></li><li><a href="#9">如果得不到回答</a></li><li><a href="#10">如何更好地回答问题</a></li><li><a href="#11">相关资源</a></li><li><a href="#12">鸣谢</a></li></ul><h3 id="%E5%A3%B0%E6%98%8E" tabindex="-1"><a id="1"></a>声明</h3><p>许多项目在他们的使用协助/说明网页中链接了本指南，这么做很好，我们也鼓励大家都这么做。但如果你是负责管理这个项目网页的人，请在超链接附近的显著位置上注明：</p><p>本指南不提供此项目的实际支持服务！</p><p>我们已经深刻领教到少了上述声明所带来的痛苦。因为少了这点声明，我们不停地被一些白痴纠缠。这些白痴认为既然我们发布了这本指南，那么我们就有责任解决世上所有的技术问题。</p><p>如果你因寻求某些帮助而阅读本指南，并在离开时还觉得可以从本文作者这里得到直接帮助，那你就是我们之前说的那些白痴之一。别问我们问题，我们只会忽略你。我们在这本指南中想教你如何从那些真正懂得你所遇到的软件或硬件问题的人处取得协助，而 99% 的情况下那不会是我们。除非你确定本指南的作者之一刚好是你所遇到的问题领域的专家，否则请不要打扰我们，这样大家都会开心一点。</p><h3 id="%E7%AE%80%E4%BB%8B" tabindex="-1"><a id="2"></a>简介</h3><p>在<a href="http://www.catb.org/~esr/faqs/hacker-howto.html" target="_blank">黑客</a>的世界里，当你拋出一个技术问题时，最终是否能得到有用的回答，往往取决于你所提问和追问的方式。本指南将教你如何正确的提问以获得你满意的答案。</p><p>现在开源（Open Source）软件已经相当盛行，您通常可以从其他更有经验的用户那里获得与黑客一样好的答案，这是件好事；和黑客相比，用户们往往对那些新手常遇到的问题更宽容一些。尽管如此，以我们在此推荐的方式对待这些有经验的用户通常也是从他们那里获得有用答案的最有效方式。</p><p>首先你应该明白，黑客们喜爱有挑战性的问题，或者能激发他们思维的好问题。如果我们并非如此，那我们也不会成为你想询问的对象。如果你给了我们一个值得反复咀嚼玩味的好问题，我们自会对你感激不尽。好问题是激励，是厚礼。好问题可以提高我们的理解力，而且通常会暴露我们以前从没意识到或者思考过的问题。对黑客而言，“好问题！”是诚挚的大力称赞。</p><p>尽管如此，黑客们有着蔑视或傲慢面对简单问题的坏名声，这有时让我们看起来对新手、无知者似乎较有敌意，但其实不是那样的。</p><p>我们不讳言我们对那些不愿思考、或者在发问前不做他们该做的事的人的蔑视。那些人是时间杀手 —— 他们只想索取，从不付出，消耗我们可用在更有趣的问题或更值得回答的人身上的时间。我们称这样的人为<code>失败者（撸瑟）</code>（由于历史原因，我们有时把它拼作<code>lusers</code>）。</p><p>我们意识到许多人只是想使用我们写的软件，他们对学习技术细节没有兴趣。对大多数人而言，电脑只是种工具，是种达到目的的手段而已。他们有自己的生活并且有更要紧的事要做。我们了解这点，也从不指望每个人都对这些让我们着迷的技术问题感兴趣。尽管如此，我们回答问题的风格是指向那些真正对此有兴趣并愿意主动参与解决问题的人，这一点不会变，也不该变。如果连这都变了，我们就是在降低做自己最擅长的事情上的效率。</p><p>我们（在很大程度上）是自愿的，从繁忙的生活中抽出时间来解答疑惑，而且时常被提问淹没。所以我们无情地滤掉一些话题，特别是拋弃那些看起来像失败者的家伙，以便更高效地利用时间来回答<code>赢家（winner）</code>的问题。</p><p>如果你厌恶我们的态度，高高在上，或过于傲慢，不妨也设身处地想想。我们并没有要求你向我们屈服 —— 事实上，我们大多数人非常乐意与你平等地交流，只要你付出小小努力来满足基本要求，我们就会欢迎你加入我们的文化。但让我们帮助那些不愿意帮助自己的人是没有效率的。无知没有关系，但装白痴就是不行。</p><p>所以，你不必在技术上很在行才能吸引我们的注意，但你必须表现出能引导你变得在行的特质 —— 机敏、有想法、善于观察、乐于主动参与解决问题。如果你做不到这些使你与众不同的事情，我们建议你花点钱找家商业公司签个技术支持服务合同，而不是要求黑客个人无偿地帮助你。</p><p>如果你决定向我们求助，当然你也不希望被视为失败者，更不愿成为失败者中的一员。能立刻得到快速并有效答案的最好方法，就是像赢家那样提问 —— 聪明、自信、有解决问题的思路，只是偶尔在特定的问题上需要获得一点帮助。</p><p>（欢迎对本指南提出改进意见。你可以把你的建议发送至<a href="https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/esr@thyrsus.com" target="_blank">esr@thyrsus.com</a> 或<a href="https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/respond-auto@linuxmafia.com" target="_blank">respond-auto@linuxmafia.com</a>。然而请注意，本文并非<a href="http://www.ietf.org/rfc/rfc1855.txt" target="_blank">网络礼节</a>的通用指南，而我们通常会拒绝无助于在技术论坛得到有用答案的建议）。</p><h3 id="%E5%9C%A8%E6%8F%90%E9%97%AE%E4%B9%8B%E5%89%8D" tabindex="-1"><a id="3"></a>在提问之前</h3><p>在你准备要通过电子邮件、新闻群组或者聊天室提出技术问题前，请先做到以下事情：</p><ol><li>尝试在你准备提问的论坛的旧文章中搜索答案。</li><li>尝试上网搜索以找到答案。</li><li>尝试阅读手册以找到答案。</li><li>尝试阅读常见问题文件（FAQ）以找到答案。</li><li>尝试自己检查或试验以找到答案。</li><li>向你身边的强者朋友打听以找到答案。</li><li>如果你是程序开发者，请尝试阅读源代码以找到答案。</li></ol><p>当你提出问题的时候，请先表明你已经做了上述的努力；这将有助于树立你并不是一个不劳而获且浪费别人的时间的提问者。如果你能一并表达在做了上述努力的过程中所学到的东西会更好，因为我们更乐于回答那些表现出能从答案中学习的人的问题。</p><p>运用某些策略，比如先用 Google 搜索你所遇到的各种错误信息（搜索<a href="http://groups.google.com/" target="_blank">Google 论坛</a>和网页），这样很可能直接就找到了能解决问题的文件或邮件列表线索。即使没有结果，在邮件列表或新闻组寻求帮助时加上一句<code>我在 Google 中搜过下列句子但没有找到什么有用的东西</code>也是件好事，即使它只是表明了搜索引擎不能提供哪些帮助。这么做（加上搜索过的字串）也让遇到相似问题的其他人能被搜索引擎引导到你的提问来。</p><p>别着急，不要指望几秒钟的 Google 搜索就能解决一个复杂的问题。在向专家求助之前，再阅读一下常见问题文件（FAQ）、放轻松、坐得舒服一些，再花点时间思考一下这个问题。相信我们，他们能从你的提问看出你做了多少阅读与思考，如果你是有备而来，将更有可能得到解答。不要将所有问题一股脑拋出，只因你的第一次搜索没有找到答案（或者找到太多答案）。</p><p>准备好你的问题，再将问题仔细的思考过一遍，因为草率的发问只能得到草率的回答，或者根本得不到任何答案。越是能表现出在寻求帮助前你为解决问题所付出的努力，你越有可能得到实质性的帮助。</p><p>小心别问错了问题。如果你的问题基于错误的假设，某个普通黑客（J. Random Hacker）多半会一边在心里想着<code>蠢问题…</code>，一边用无意义的字面解释来答复你，希望着你会从问题的回答（而非你想得到的答案）中汲取教训。</p><p>绝不要自以为够格得到答案，你没有；你并没有。毕竟你没有为这种服务支付任何报酬。你将会是自己去挣到一个答案，靠提出有内涵的、有趣的、有思维激励作用的问题 —— 一个有潜力能贡献社区经验的问题，而不仅仅是被动的从他人处索取知识。</p><p>另一方面，表明你愿意在找答案的过程中做点什么是一个非常好的开端。<code>谁能给点提示？</code>、<code>我的这个例子里缺了什么？</code>以及<code>我应该检查什么地方</code>比<code>请把我需要的确切的过程贴出来</code>更容易得到答复。因为你表现出只要有人能指个正确方向，你就有完成它的能力和决心。</p><h3 id="%E5%BD%93%E4%BD%A0%E6%8F%90%E9%97%AE%E6%97%B6" tabindex="-1"><a id="4"></a>当你提问时</h3><h4 id="%E6%85%8E%E9%80%89%E6%8F%90%E9%97%AE%E7%9A%84%E8%AE%BA%E5%9D%9B" tabindex="-1"><a id="4.1"></a>慎选提问的论坛</h4><p>小心选择你要提问的场合。如果你做了下述的事情，你很可能被忽略掉或者被看作失败者：</p><ul><li>在与主题不合的论坛上贴出你的问题。</li><li>在探讨进阶技术问题的论坛张贴非常初级的问题；反之亦然。</li><li>在太多的不同新闻群组上重复转贴同样的问题（cross-post）。</li><li>向既非熟人也没有义务解决你问题的人发送私人电邮。</li></ul><p>黑客会剔除掉那些搞错场合的问题，以保护他们沟通的渠道不被无关的东西淹没。你不会想让这种事发生在自己身上的。</p><p>因此，第一步是找到对的论坛。再说一次，Google 和其它搜索引擎还是你的朋友，用它们来找到与你遭遇到困难的软硬件问题最相关的网站。通常那儿都有常见问题（FAQ）、邮件列表及相关说明文件的链接。如果你的努力（包括阅读 FAQ）都没有结果，网站上也许还有报告 Bug（Bug-reporting）的流程或链接，如果是这样，链过去看看。</p><p>向陌生的人或论坛发送邮件最可能是风险最大的事情。举例来说，别假设一个提供丰富内容的网页的作者会想充当你的免费顾问。不要对你的问题是否会受到欢迎做太乐观的估计 —— 如果你不确定，那就向别处发送，或者压根别发。</p><p>在选择论坛、新闻群组或邮件列表时，别太相信它的名字，先看看 FAQ 或者许可书以弄清楚你的问题是否切题。发文前先翻翻已有的话题，这样可以让你感受一下那里的文化。事实上，事先在新闻组或邮件列表的历史记录中搜索与你问题相关的关键词是个极好的主意，也许这样就找到答案了。即使没有，也能帮助你归纳出更好的问题。</p><p>别像机关枪似的一次“扫射”所有的帮助渠道，这就像大喊大叫一样会使人不快。要一个一个地来。</p><p>搞清楚你的主题！最典型的错误之一是在某种致力于跨平台可移植的语言、套件或工具的论坛中提关于 Unix 或 Windows 操作系统程序界面的问题。如果你不明白为什么这是大错，最好在搞清楚这之间差异之前什么也别问。</p><p>一般来说，在仔细挑选的公共论坛中提问，会比在私有论坛中提同样的问题更容易得到有用的回答。有几个理由可以支持这点，一是看潜在的回复者有多少，二是看观众有多少。黑客较愿意回答那些能帮助到许多人的问题。</p><p>可以理解的是，老练的黑客和一些热门软件的作者正在接受过多的错发信息。就像那根最后压垮骆驼背的稻草一样，你的加入也有可能使情况走向极端 —— 已经好几次了，一些热门软件的作者由于涌入其私人邮箱的大量不堪忍受的无用邮件而不再提供支持。</p><h4 id="stack-overflow" tabindex="-1"><a id="4.2"></a>Stack Overflow</h4><p>搜索，然后在 Stack Exchange 问。</p><p>近年来，Stack Exchange 社区已经成为回答技术及其他问题的主要渠道，尤其是那些开放源码的项目。</p><p>因为 Google 索引是即时的，在看 Stack Exchange 之前先在 Google 搜索。有很高的几率某人已经问了一个类似的问题，而且 Stack Exchange 网站们往往会是搜索结果中最前面几个。如果你在 Google 上没有找到任何答案，你再到特定相关主题的网站去找。用标签（Tag）搜索能让你更缩小你的搜索结果。</p><p>如果你还是找不到任何对你的问题有用的内容，请把你的问题发在与它最相关的网站上。提问的时候请善用善用格式化工具，尤其注意为代码添加格式，并且添加相关的标签（特别是编程语言、操作系统或库/包的名称）。当有人要求你提供更多相关信息时，请编辑你的贴子来补充它们[译注：而不是发一个回帖或回答！]。如果你觉得一个答案对你有帮助，点击向上的箭头来为它投票；如果一个答案提供了问题的正确解决方案，点击投票按钮下方的对勾来将它标记为正解。</p><p>Stack Exchange 已经成长到<a href="https://stackexchange.com/sites" target="_blank">超过一百个网站</a>，以下是最常用的几个站：</p><ul><li>Super User 是问一些通用的电脑问题，如果你的问题跟代码或是写程序无关，只是一些网络连线之类的，请到这里。</li><li>Stack Overflow 是问写程序有关的问题。</li><li>Server Fault 是问服务器和网管相关的问题。</li></ul><h4 id="%E7%BD%91%E7%AB%99%E5%92%8C-irc-%E8%AE%BA%E5%9D%9B" tabindex="-1"><a id="4.3"></a>网站和 IRC 论坛</h4><p>本地的用户群组（user group），或者你所用的 Linux 发行版本也许正在宣传他们的网页论坛或 IRC 频道，并提供新手帮助（在一些非英语国家，新手论坛很可能还是邮件列表），这些都是开始提问的好地方，特别是当你觉得遇到的也许只是相对简单或者很普通的问题时。有广告赞助的 IRC 频道是公开欢迎提问的地方，通常可以即时得到回应。</p><p>事实上，如果程序出的问题只发生在特定 Linux 发行版提供的版本（这很常见），最好先去该发行版的论坛或邮件列表中提问，再到程序本身的论坛或邮件列表提问。（否则）该项目的黑客可能仅仅回复“使用我们的版本”。</p><p>在任何论坛发文以前，先确认一下有没有搜索功能。如果有，就试着搜索一下问题的几个关键词，也许这会有帮助。如果在此之前你已做过通用的网页搜索（你也该这样做），还是再搜索一下论坛，搜索引擎有可能没来得及索引此论坛的全部内容。</p><p>通过论坛或 IRC 频道来提供用户支持服务有增长的趋势，电子邮件则大多为项目开发者间的交流而保留。所以最好先在论坛或 IRC 中寻求与该项目相关的协助。</p><p>在使用 IRC 的时候，首先最好不要发布很长的问题描述，有些人称之为频道洪水。最好通过一句话的问题描述来开始聊天。</p><h4 id="%E7%AC%AC%E4%BA%8C%E6%AD%A5%EF%BC%8C%E4%BD%BF%E7%94%A8%E9%A1%B9%E7%9B%AE%E9%82%AE%E4%BB%B6%E5%88%97%E8%A1%A8" tabindex="-1"><a id="4.4"></a>第二步，使用项目邮件列表</h4><p>当某个项目提供开发者邮件列表时，要向列表而不是其中的个别成员提问，即使你确信他能最好地回答你的问题。查一查项目的文件和首页，找到项目的邮件列表并使用它。有几个很好的理由支持我们采用这种办法：</p><ul><li>任何好到需要向个别开发者提出的问题，也将对整个项目群组有益。反之，如果你认为自己的问题对整个项目群组来说太愚蠢，那这也不能成为骚扰个别开发者的理由。</li><li>向列表提问可以分散开发者的负担，个别开发者（尤其是项目领导人）也许太忙以至于没法回答你的问题。</li><li>大多数邮件列表都会被存档，那些被存档的内容将被搜索引擎索引。如果你向列表提问并得到解答，将来其他人可以通过网页搜索找到你的问题和答案，也就不用再次发问了。</li><li>如果某些问题经常被问到，开发者可以利用此信息来改进说明文件或软件本身，以使其更清楚。如果只是私下提问，就没有人能看到最常见问题的完整场景。</li></ul><p>如果一个项目既有“用户”也有“开发者”（或“黑客”）邮件列表或论坛，而你又不会动到那些源代码，那么就向“用户”列表或论坛提问。不要假设自己会在开发者列表中受到欢迎，那些人多半会将你的提问视为干扰他们开发的噪音。</p><p>然而，如果你确信你的问题很特别，而且在“用户”列表或论坛中几天都没有回复，可以试试前往“开发者”列表或论坛发问。建议你在张贴前最好先暗地里观察几天以了解那里的行事方式（事实上这是参与任何私有或半私有列表的好主意）</p><p>如果你找不到一个项目的邮件列表，而只能查到项目维护者的电子邮件地址，尽管向他发信。即使是在这种情况下，也别假设（项目）邮件列表不存在。在你的电子邮件中，请陈述你已经试过但没有找到合适的邮件列表，也提及你不反对将自己的邮件转发给他人（许多人认为，即使没什么秘密，私人电子邮件也不应该被公开。通过允许将你的电子邮件转发他人，你给了相应人员处置你邮件的选择）。</p><h4 id="%E4%BD%BF%E7%94%A8%E6%9C%89%E6%84%8F%E4%B9%89%E4%B8%94%E6%8F%8F%E8%BF%B0%E6%98%8E%E7%A1%AE%E7%9A%84%E6%A0%87%E9%A2%98" tabindex="-1"><a id="4.5"></a>使用有意义且描述明确的标题</h4><p>在邮件列表、新闻群组或论坛中，大约 50 字以内的标题是抓住资深专家注意力的好机会。别用喋喋不休的<code>帮帮忙</code>、<code>跪求</code>、<code>急</code>（更别说<code>救命啊！！！！</code>这样让人反感的话，用这种标题会被条件反射式地忽略）来浪费这个机会。不要妄想用你的痛苦程度来打动我们，而应该是在这点空间中使用极简单扼要的描述方式来提出问题。</p><p>一个好标题范例是<code>目标 —— 差异</code>式的描述，许多技术支持组织就是这样做的。在<code>目标</code>部分指出是哪一个或哪一组东西有问题，在<code>差异</code>部分则描述与期望的行为不一致的地方。</p><blockquote><p>蠢问题：救命啊！我的笔记本电脑不能正常显示了！</p></blockquote><blockquote><p>聪明问题：<a href="http://X.org" target="_blank">X.org</a> 6.8.1 的鼠标指针会变形，某牌显卡 MV1005 芯片组。</p></blockquote><blockquote><p>更聪明问题：<a href="http://X.org" target="_blank">X.org</a> 6.8.1 的鼠标指针，在某牌显卡 MV1005 芯片组环境下 - 会变形。</p></blockquote><p>编写<code>目标 —— 差异</code>式描述的过程有助于你组织对问题的细致思考。是什么被影响了？ 仅仅是鼠标指针或者还有其它图形？只在 <a href="http://X.org" target="_blank">X.org</a> 的 X 版中出现？或只是出现在 6.8.1 版中？ 是针对某牌显卡芯片组？或者只是其中的 MV1005 型号？ 一个黑客只需瞄一眼就能够立即明白你的环境和你遇到的问题。</p><p>总而言之，请想像一下你正在一个只显示标题的存档讨论串（Thread）索引中查寻。让你的标题更好地反映问题，可使下一个搜索类似问题的人能够关注这个讨论串，而不用再次提问相同的问题。</p><p>如果你想在回复中提出问题，记得要修改内容标题，以表明你是在问一个问题， 一个看起来像<code>Re: 测试</code>或者<code>Re: 新 bug</code>的标题很难引起足够重视。另外，在不影响连贯性之下，适当引用并删减前文的内容，能给新来的读者留下线索。</p><p>对于讨论串，不要直接点击回复来开始一个全新的讨论串，这将限制你的观众。因为有些邮件阅读程序，比如 mutt ，允许用户按讨论串排序并通过折叠讨论串来隐藏消息，这样做的人永远看不到你发的消息。</p><p>仅仅改变标题还不够。mutt 和其它一些邮件阅读程序还会检查邮件标题以外的其它信息，以便为其指定讨论串。所以宁可发一个全新的邮件。</p><p>在网页论坛上，好的提问方式稍有不同，因为讨论串与特定的信息紧密结合，并且通常在讨论串外就看不到里面的内容，故通过回复提问，而非改变标题是可接受的。不是所有论坛都允许在回复中出现分离的标题，而且这样做了基本上没有人会去看。不过，通过回复提问，这本身就是暧昧的做法，因为它们只会被正在查看该标题的人读到。所以，除非你只想在该讨论串当前活跃的人群中提问，不然还是另起炉灶比较好。</p><h4 id="%E4%BD%BF%E9%97%AE%E9%A2%98%E5%AE%B9%E6%98%93%E5%9B%9E%E5%A4%8D" tabindex="-1"><a id="4.6"></a>使问题容易回复</h4><p>以<code>请将你的回复发送到……</code>来结束你的问题多半会使你得不到回答。如果你觉得花几秒钟在邮件客户端设置一下回复地址都麻烦，我们也觉得花几秒钟思考你的问题更麻烦。如果你的邮件程序不支持这样做，<a href="http://linuxmafia.com/faq/Mail/muas.html" target="_blank">换个好点的</a>；如果是操作系统不支持这种邮件程序，也换个好点的。</p><p>在论坛，要求通过电子邮件回复是非常无礼的，除非你认为回复的信息可能比较敏感（有人会为了某些未知的原因，只让你而不是整个论坛知道答案）。如果你只是想在有人回复讨论串时得到电子邮件提醒，可以要求网页论坛发送给你。几乎所有论坛都支持诸如<code>追踪此讨论串</code>、<code>有回复时发送邮件提醒</code>等功能。</p><h4 id="%E4%BD%BF%E7%94%A8%E6%B8%85%E6%99%B0%E3%80%81%E6%AD%A3%E7%A1%AE%E3%80%81%E7%B2%BE%E5%87%86%E4%B8%94%E5%90%88%E4%B9%8E%E8%AF%AD%E6%B3%95%E7%9A%84%E8%AF%AD%E5%8F%A5" tabindex="-1"><a id="4.7"></a>使用清晰、正确、精准且合乎语法的语句</h4><p>我们从经验中发现，粗心的提问者通常也会粗心地写程序与思考（我敢打包票）。回答粗心大意者的问题很不值得，我们宁愿把时间耗在别处。</p><p>正确的拼写、标点符号和大小写是很重要的。一般来说，如果你觉得这样做很麻烦，不想在乎这些，那我们也觉得麻烦，不想在乎你的提问。花点额外的精力斟酌一下字句，用不着太僵硬与正式 —— 事实上，黑客文化很看重能准确地使用非正式、俚语和幽默的语句。但它必须很准确，而且有迹象表明你是在思考和关注问题。</p><p>正确地拼写、使用标点和大小写，不要将<code>its</code>混淆为<code>it's</code>，<code>loose</code>搞成<code>lose</code>或者将<code>discrete</code>弄成<code>discreet</code>。不要全部用大写，这会被视为无礼的大声嚷嚷（全部小写也好不到哪去，因为不易阅读。<a href="http://en.wikipedia.org/wiki/Alan_Cox" target="_blank">Alan Cox</a>也许可以这样做，但你不行）。</p><p>更白话的说，如果你写得像是个半文盲[译注：<a href="http://zh.wikipedia.org/wiki/%E5%B0%8F%E7%99%BD" target="_blank">小白</a>]，那多半得不到理睬。也不要使用即时通信中的简写或<a href="http://zh.wikipedia.org/wiki/%E7%81%AB%E6%98%9F%E6%96%87" target="_blank">火星文</a>，如将<code>的</code>简化为<code>d</code>会使你看起来像一个为了少打几个键而省字的小白。更糟的是，如果像个小孩似地鬼画符那绝对是在找死，可以肯定没人会理你（或者最多是给你一大堆指责与挖苦）。</p><p>如果在使用非母语的论坛提问，你可以犯点拼写和语法上的小错，但决不能在思考上马虎（没错，我们通常能弄清两者的分别）。同时，除非你知道回复者使用的语言，否则请使用英语书写。繁忙的黑客一般会直接删除用他们看不懂的语言写的消息。在网络上英语是通用语言，用英语书写可以将你的问题在尚未被阅读就被直接删除的可能性降到最低。</p><p>如果英文是你的外语（Second language），提示潜在回复者你有潜在的语言困难是很好的： [译注：以下附上原文以供使用]</p><blockquote><p>English is not my native language; please excuse typing errors.</p></blockquote><ul><li>英文不是我的母语，请原谅我的错字或语法。</li></ul><blockquote><p>If you speak $LANGUAGE, please email/PM me; I may need assistance translating my question.</p></blockquote><ul><li>如果你说某语言，请向我发电邮/私信；</li><li>我需要有人协助我翻译我的问题。</li></ul><blockquote><p>I am familiar with the technical terms, but some slang expressions and idioms are difficult for me.</p></blockquote><ul><li>我对技术名词很熟悉，但对于俗语或是特别用法不甚了解。</li></ul><blockquote><p>I’ve posted my question in $LANGUAGE and English. I’ll be glad to translate responses, if you only use one or the other.</p></blockquote><ul><li>我把我的问题用某语言和英文写出来。</li><li>如果你只用其中的一种语言回答，我会乐意将回复翻译成为你使用的语言。</li></ul><h4 id="%E4%BD%BF%E7%94%A8%E6%98%93%E4%BA%8E%E8%AF%BB%E5%8F%96%E4%B8%94%E6%A0%87%E5%87%86%E7%9A%84%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E5%8F%91%E9%80%81%E9%97%AE%E9%A2%98" tabindex="-1"><a id="4.8"></a>使用易于读取且标准的文件格式发送问题</h4><p>如果你人为地将问题搞得难以阅读，它多半会被忽略，人们更愿读易懂的问题，所以：</p><ul><li>使用纯文字而不是 HTML (关闭<a href="http://archive.birdhouse.org/etc/evilmail.html" target="_blank">HTML</a>并不难）。</li><li>使用 MIME 附件通常是可以的，前提是真正有内容（譬如附带的源代码或 patch），而不仅仅是邮件程序生成的模板（譬如只是信件内容的拷贝）。</li><li>不要发送一段文字只是一行句子但自动换行后会变成多行的邮件（这使得回复部分内容非常困难）。设想你的读者是在 80 个字符宽的终端机上阅读邮件，最好设置你的换行分割点小于 80 字。</li><li>但是，对一些特殊的文件不要设置固定宽度（譬如日志文件拷贝或会话记录）。数据应该原样包含，让回复者有信心他们看到的是和你看到的一样的东西。</li><li>在英语论坛中，不要使用<code>Quoted-Printable</code> MIME 编码发送消息。这种编码对于张贴非 ASCII 语言可能是必须的，但很多邮件程序并不支持这种编码。当它们处理换行时，那些文本中四处散布的<code>=20</code>符号既难看也分散注意力，甚至有可能破坏内容的语意。</li><li>绝对，永远不要指望黑客们阅读使用封闭格式编写的文档，像微软公司的 Word 或 Excel 文件等。大多数黑客对此的反应就像有人将还在冒热气的猪粪倒在你家门口时你的反应一样。即便他们能够处理，他们也很厌恶这么做。</li><li>如果你从使用 Windows 的电脑发送电子邮件，关闭微软愚蠢的<code>智能引号</code>功能 （从[选项] &gt; [校订] &gt; [自动校正选项]，勾选掉智能引号单选框），以免在你的邮件中到处散布垃圾字符。</li><li>在论坛，勿滥用<code>表情符号</code>和<code>HTML</code>功能（当它们提供时）。一两个表情符号通常没有问题，但花哨的彩色文本倾向于使人认为你是个无能之辈。过滥地使用表情符号、色彩和字体会使你看来像个傻笑的小姑娘。这通常不是个好主意，除非你只是对性而不是对答案感兴趣。</li></ul><p>如果你使用图形用户界面的邮件程序（如微软公司的 Outlook 或者其它类似的），注意它们的默认设置不一定满足这些要求。大多数这类程序有基于选单的<code>查看源代码</code>命令，用它来检查发送文件夹中的邮件，以确保发送的是纯文本文件同时没有一些奇怪的字符。</p><h3 id="%E7%B2%BE%E7%A1%AE%E5%9C%B0%E6%8F%8F%E8%BF%B0%E9%97%AE%E9%A2%98%E5%B9%B6%E8%A8%80%E4%B9%8B%E6%9C%89%E7%89%A9" tabindex="-1"><a id="4.9"></a>精确地描述问题并言之有物</h3><ul><li>仔细、清楚地描述你的问题或 Bug 的症状。</li><li>描述问题发生的环境（机器配置、操作系统、应用程序、以及相关的信息），提供经销商的发行版和版本号（如：<code>Fedora Core 4</code>、<code>Slackware 9.1</code>等）。</li><li>描述在提问前你是怎样去研究和理解这个问题的。</li><li>描述在提问前为确定问题而采取的诊断步骤。</li><li>描述最近做过什么可能相关的硬件或软件变更。</li><li>尽可能地提供一个可以<code>重现这个问题的可控环境</code>的方法。</li><li>尽量去揣测一个黑客会怎样反问你，在你提问之前预先将黑客们可能提出的问题回答一遍。</li></ul><p>以上几点中，当你报告的是你认为可能在代码中的问题时，给黑客一个可以重现你的问题的环境尤其重要。当你这么做时，你得到有效的回答的机会和速度都会大大的提升。</p><p><a href="http://www.chiark.greenend.org.uk/~sgtatham/" target="_blank">Simon Tatham</a> 写过一篇名为《<a href="http://www.chiark.greenend.org.uk/~sgtatham/bugs-cn.html" target="_blank">如何有效的报告 Bug</a>》的出色文章。强力推荐你也读一读。</p><h3 id="%E8%AF%9D%E4%B8%8D%E5%9C%A8%E5%A4%9A%E8%80%8C%E5%9C%A8%E7%B2%BE" tabindex="-1"><a id="4.10"></a>话不在多而在精</h3><p>你需要提供精确有内容的信息。这并不是要求你简单的把成堆的出错代码或者资料完全转录到你的提问中。如果你有庞大而复杂的测试样例能重现程序挂掉的情境，尽量将它剪裁得越小越好。</p><p>这样做的用处至少有三点。 第一，表现出你为简化问题付出了努力，这可以使你得到回答的机会增加； 第二，简化问题使你更有可能得到有用的答案； 第三，在精炼你的 bug 报告的过程中，你很可能就自己找到了解决方法或权宜之计。</p><h4 id="%E5%88%AB%E5%8A%A8%E8%BE%84%E5%A3%B0%E7%A7%B0%E6%89%BE%E5%88%B0-bug" tabindex="-1"><a id="4.11"></a>别动辄声称找到 Bug</h4><p>当你在使用软件中遇到问题，除非你非常、非常的有根据，不要动辄声称找到了 Bug。提示：除非你能提供解决问题的源代码补丁，或者提供回归测试来表明前一版本中行为不正确，否则你都多半不够完全确信。这同样适用在网页和文件，如果你（声称）发现了文件的<code>Bug</code>，你应该能提供相应位置的修正或替代文件。</p><p>请记得，还有其他许多用户没遇到你发现的问题，否则你在阅读文件或搜索网页时就应该发现了（你在抱怨前<a href="https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md#%E5%9C%A8%E6%8F%90%E9%97%AE%E4%B9%8B%E5%89%8D" target="_blank">已经做了这些，是吧？</a>）。这也意味着很有可能是你弄错了而不是软件本身有问题。</p><p>编写软件的人总是非常辛苦地使它尽可能完美。如果你声称找到了 Bug，也就是在质疑他们的能力，即使你是对的，也有可能会冒犯到其中某部分人。当你在标题中嚷嚷着有<code>Bug</code>时，这尤其严重。</p><p>提问时，即使你私下非常确信已经发现一个真正的 Bug，最好写得像是你做错了什么。如果真的有 Bug，你会在回复中看到这点。这样做的话，如果真有 Bug，维护者就会向你道歉，这总比你惹恼别人然后欠别人一个道歉要好一点。</p><h4 id="%E4%BD%8E%E5%A3%B0%E4%B8%8B%E6%B0%94%E4%B8%8D%E8%83%BD%E4%BB%A3%E6%9B%BF%E4%BD%A0%E7%9A%84%E5%8A%9F%E8%AF%BE" tabindex="-1"><a id="4.12"></a>低声下气不能代替你的功课</h4><p>有些人明白他们不该粗鲁或傲慢的提问并要求得到答复，但他们选择另一个极端 —— 低声下气：<code>我知道我只是个可悲的新手，一个撸瑟，但...</code>。这既使人困扰，也没有用，尤其是伴随着与实际问题含糊不清的描述时更令人反感。</p><p>别用原始灵长类动物的把戏来浪费你我的时间。取而代之的是，尽可能清楚地描述背景条件和你的问题情况。这比低声下气更好地定位了你的位置。</p><p>有时网页论坛会设有专为新手提问的版面，如果你真的认为遇到了初学者的问题，到那去就是了，但一样别那么低声下气。</p><h4 id="%E6%8F%8F%E8%BF%B0%E9%97%AE%E9%A2%98%E7%97%87%E7%8A%B6%E8%80%8C%E9%9D%9E%E4%BD%A0%E7%9A%84%E7%8C%9C%E6%B5%8B" tabindex="-1"><a id="4.13"></a>描述问题症状而非你的猜测</h4><p>告诉黑客们你认为问题是怎样造成的并没什么帮助。（如果你的推断如此有效，还用向别人求助吗？），因此要确信你原原本本告诉了他们问题的症状，而不是你的解释和理论；让黑客们来推测和诊断。如果你认为陈述自己的猜测很重要，清楚地说明这只是你的猜测，并描述为什么它们不起作用。</p><p>蠢问题</p><blockquote><p>我在编译内核时接连遇到 SIG11 错误， 我怀疑某条飞线搭在主板的走线上了，这种情况应该怎样检查最好？</p></blockquote><p>聪明问题</p><blockquote><p>我的组装电脑是 FIC-PA2007 主机板搭载 AMD K6/233 CPU（威盛 Apollo VP2 芯片组）， 256MB Corsair PC133 SDRAM 内存，在编译内核时，从开机 20 分钟以后就频频产生 SIG11 错误， 但是在头 20 分钟内从没发生过相同的问题。重新启动也没有用，但是关机一晚上就又能工作 20 分钟。 所有内存都换过了，没有效果。相关部分的标准编译记录如下…</p></blockquote><p>由于以上这点似乎让许多人觉得难以配合，这里有句话可以提醒你：<code>所有的诊断专家都来自密苏里州</code>。 美国国务院的官方座右铭则是：<code>让我看看</code>（出自国会议员 Willard D. Vandiver 在 1899 年时的讲话：<code>我来自一个出产玉米，棉花，牛蒡和民主党人的国家，滔滔雄辩既不能说服我，也不会让我满意。我来自密苏里州，你必须让我看看。</code>） 针对诊断者而言，这并不是一种怀疑，而只是一种真实而有用的需求，以便让他们看到的是与你看到的原始证据尽可能一致的东西，而不是你的猜测与归纳的结论。所以，大方的展示给我们看吧！</p><h4 id="%E6%8C%89%E5%8F%91%E7%94%9F%E6%97%B6%E9%97%B4%E5%85%88%E5%90%8E%E5%88%97%E5%87%BA%E9%97%AE%E9%A2%98%E7%97%87%E7%8A%B6" tabindex="-1"><a id="4.14"></a>按发生时间先后列出问题症状</h4><p>问题发生前的一系列操作，往往就是对找出问题最有帮助的线索。因此，你的说明里应该包含你的操作步骤，以及机器和软件的反应，直到问题发生。在命令行处理的情况下，提供一段操作记录（例如运行脚本工具所生成的），并引用相关的若干行（如 20 行）记录会非常有帮助。</p><p>如果挂掉的程序有诊断选项（如 -v 的详述开关），试着选择这些能在记录中增加调试信息的选项。记住，<code>多</code>不等于<code>好</code>。试着选取适当的调试级别以便提供有用的信息而不是让读者淹没在垃圾中。</p><p>如果你的说明很长（如超过四个段落），在开头简述问题，接下来再按时间顺序详述会有所帮助。这样黑客们在读你的记录时就知道该注意哪些内容了。</p><h4 id="%E6%8F%8F%E8%BF%B0%E7%9B%AE%E6%A0%87%E8%80%8C%E4%B8%8D%E6%98%AF%E8%BF%87%E7%A8%8B" tabindex="-1"><a id="4.15"></a>描述目标而不是过程</h4><p>如果你想弄清楚如何做某事（而不是报告一个 Bug），在开头就描述你的目标，然后才陈述重现你所卡住的特定步骤。</p><p>经常寻求技术帮助的人在心中有个更高层次的目标，而他们在自以为能达到目标的特定道路上被卡住了，然后跑来问该怎么走，但没有意识到这条路本身就有问题。结果要费很大的劲才能搞定。</p><p>蠢问题</p><blockquote><p>我怎样才能从某绘图程序的颜色选择器中取得十六进制的 RGB 值？</p></blockquote><p>聪明问题</p><blockquote><p>我正试着用替换一幅图片的色码（color table）成自己选定的色码，我现在知道的唯一方法是编辑每个色码区块（table slot）， 但却无法从某绘图程序的颜色选择器取得十六进制的 RGB 值。</p></blockquote><p>第二种提问法比较聪明，你可能得到像是<code>建议采用另一个更合适的工具</code>的回复。</p><h4 id="%E5%88%AB%E8%A6%81%E6%B1%82%E4%BD%BF%E7%94%A8%E7%A7%81%E4%BA%BA%E7%94%B5%E9%82%AE%E5%9B%9E%E5%A4%8D" tabindex="-1"><a id="4.16"></a>别要求使用私人电邮回复</h4><p>黑客们认为问题的解决过程应该公开、透明，此过程中如果更有经验的人注意到不完整或者不当之处，最初的回复才能够、也应该被纠正。同时，作为提供帮助者可以得到一些奖励，奖励就是他的能力和学识被其他同行看到。</p><p>当你要求私下回复时，这个过程和奖励都被中止。别这样做，让回复者来决定是否私下回答 —— 如果他真这么做了，通常是因为他认为问题编写太差或者太肤浅，以至于不可能使其他人产生兴趣。</p><p>这条规则存在一条有限的例外，如果你确信提问可能会引来大量雷同的回复时，那么这个神奇的提问句会是<code>向我发电邮，我将为论坛归纳这些回复</code>。试着将邮件列表或新闻群组从洪水般的雷同回复中解救出来是非常有礼貌的 —— 但你必须信守诺言。</p><p>清楚明确的表达你的问题以及需求<br />漫无边际的提问是近乎无休无止的时间黑洞。最有可能给你有用答案的人通常也正是最忙的人（他们忙是因为要亲自完成大部分工作）。这样的人对无节制的时间黑洞相当厌恶，所以他们也倾向于厌恶那些漫无边际的提问。</p><p>如果你明确表述需要回答者做什么（如提供指点、发送一段代码、检查你的补丁、或是其他等等），就最有可能得到有用的答案。因为这会定出一个时间和精力的上限，便于回答者能集中精力来帮你。这么做很棒。</p><p>要理解专家们所处的世界，请把专业技能想像为充裕的资源，而回复的时间则是稀缺的资源。你要求他们奉献的时间越少，你越有可能从真正专业而且很忙的专家那里得到解答。</p><p>所以，界定一下你的问题，使专家花在辨识你的问题和回答所需要付出的时间减到最少，这技巧对你有用答案相当有帮助 —— 但这技巧通常和简化问题有所区别。因此，问<code>我想更好地理解 X，可否指点一下哪有好一点说明？</code>通常比问<code>你能解释一下 X 吗？</code>更好。如果你的代码不能运作，通常请别人看看哪里有问题，比要求别人替你改正要明智得多。</p><h4 id="%E8%AF%A2%E9%97%AE%E6%9C%89%E5%85%B3%E4%BB%A3%E7%A0%81%E7%9A%84%E9%97%AE%E9%A2%98%E6%97%B6" tabindex="-1"><a id="4.17"></a>询问有关代码的问题时</h4><p>别要求他人帮你调试有问题的代码，不提示一下应该从何入手。张贴几百行的代码，然后说一声：它不能工作会让你完全被忽略。只贴几十行代码，然后说一句：<code>在第七行以后，我期待它显示 &lt;x&gt;，但实际出现的是 &lt;y&gt;</code>比较有可能让你得到回应。</p><p>最有效描述程序问题的方法是提供最精简的 Bug 展示测试用例（bug-demonstrating test case）。什么是最精简的测试用例？那是问题的缩影；一小个程序片段能刚好展示出程序的异常行为，而不包含其他令人分散注意力的内容。怎么制作最精简的测试用例？如果你知道哪一行或哪一段代码会造成异常的行为，复制下来并加入足够重现这个状况的代码（例如，足以让这段代码能被编译/直译/被应用程序处理）。如果你无法将问题缩减到一个特定区块，就复制一份代码并移除不影响产生问题行为的部分。总之，测试用例越小越好（查看话不在多而在精一节）。</p><p>一般而言，要得到一段相当精简的测试用例并不太容易，但永远先尝试这样做的是种好习惯。这种方式可以帮助你了解如何自行解决这个问题 —— 而且即使你的尝试不成功，黑客们也会看到你在尝试取得答案的过程中付出了努力，这可以让他们更愿意与你合作。</p><p>如果你只是想让别人帮忙审查（Review）一下代码，在信的开头就要说出来，并且一定要提到你认为哪一部分特别需要关注以及为什么。</p><h4 id="%E5%88%AB%E6%8A%8A%E8%87%AA%E5%B7%B1%E5%AE%B6%E5%BA%AD%E4%BD%9C%E4%B8%9A%E7%9A%84%E9%97%AE%E9%A2%98%E8%B4%B4%E4%B8%8A%E6%9D%A5" tabindex="-1"><a id="4.18"></a>别把自己家庭作业的问题贴上来</h4><p>黑客们很擅长分辨哪些问题是家庭作业式的问题；因为我们中的大多数都曾自己解决这类问题。同样，这些问题得由你来搞定，你会从中学到东西。你可以要求给点提示，但别要求得到完整的解决方案。</p><p>如果你怀疑自己碰到了一个家庭作业式的问题，但仍然无法解决，试试在用户群组，论坛或（最后一招）在项目的用户邮件列表或论坛中提问。尽管黑客们会看出来，但一些有经验的用户也许仍会给你一些提示。</p><h4 id="%E5%8E%BB%E6%8E%89%E6%97%A0%E6%84%8F%E4%B9%89%E7%9A%84%E6%8F%90%E9%97%AE%E5%8F%A5" tabindex="-1"><a id="4.19"></a>去掉无意义的提问句</h4><p>避免用无意义的话结束提问，例如<code>有人能帮我吗？</code>或者<code>这有答案吗？</code>。</p><p>首先：如果你对问题的描述不是很好，这样问更是画蛇添足。</p><p>其次：由于这样问是画蛇添足，黑客们会很厌烦你 —— 而且通常会用逻辑上正确，但毫无意义的回答来表示他们的蔑视， 例如：<code>没错，有人能帮你</code>或者<code>不，没答案</code>。</p><p>一般来说，避免用<code>是或否</code>、<code>对或错</code>、<code>有或没有</code>类型的问句，除非你想得到<a href="https://strcat.de/questions-with-yes-or-no-answers.html" target="_blank">是或否类型的回答</a>。</p><h4 id="%E5%8D%B3%E4%BD%BF%E4%BD%A0%E5%BE%88%E6%80%A5%E4%B9%9F%E4%B8%8D%E8%A6%81%E5%9C%A8%E6%A0%87%E9%A2%98%E5%86%99%E7%B4%A7%E6%80%A5" tabindex="-1"><a id="4.20"></a>即使你很急也不要在标题写<code>紧急</code></h4><p>这是你的问题，不是我们的。宣称<code>紧急</code>极有可能事与愿违：大多数黑客会直接删除无礼和自私地企图即时引起关注的问题。更严重的是，<code>紧急</code>这个字（或是其他企图引起关注的标题）通常会被垃圾信过滤器过滤掉 —— 你希望能看到你问题的人可能永远也看不到。</p><p>有半个例外的情况是，如果你是在一些很高调，会使黑客们兴奋的地方，也许值得这样去做。在这种情况下，如果你有时间压力，也很有礼貌地提到这点，人们也许会有兴趣回答快一点。</p><p>当然，这风险很大，因为黑客们兴奋的点多半与你的不同。譬如从 NASA 国际空间站（International Space Station）发这样的标题没有问题，但用自我感觉良好的慈善行为或政治原因发肯定不行。事实上，张贴诸如<code>紧急：帮我救救这个毛茸茸的小海豹！</code>肯定让你被黑客忽略或惹恼他们，即使他们认为毛茸茸的小海豹很重要。</p><p>如果你觉得这点很不可思议，最好再把这份指南剩下的内容多读几遍，直到你弄懂了再发文。</p><h4 id="%E7%A4%BC%E5%A4%9A%E4%BA%BA%E4%B8%8D%E6%80%AA%EF%BC%8C%E8%80%8C%E4%B8%94%E6%9C%89%E6%97%B6%E8%BF%98%E5%BE%88%E6%9C%89%E5%B8%AE%E5%8A%A9" tabindex="-1"><a id="4.21"></a>礼多人不怪，而且有时还很有帮助</h4><p>彬彬有礼，多用<code>请</code>和<code>谢谢您的关注</code>，或<code>谢谢你的关照</code>。让大家都知道你对他们花时间免费提供帮助心存感激。</p><p>坦白说，这一点并没有比使用清晰、正确、精准且合乎语法和避免使用专用格式重要（也不能取而代之）。黑客们一般宁可读有点唐突但技术上鲜明的 Bug 报告，而不是那种有礼但含糊的报告。（如果这点让你不解，记住我们是按问题能教给我们什么来评价问题的价值的）</p><p>然而，如果你有一串的问题待解决，客气一点肯定会增加你得到有用回应的机会。</p><p>（我们注意到，自从本指南发布后，从资深黑客那里得到的唯一严重缺陷反馈，就是对预先道谢这一条。一些黑客觉得<code>先谢了</code>意味着事后就不用再感谢任何人的暗示。我们的建议是要么先说<code>先谢了</code>，然后事后再对回复者表示感谢，或者换种方式表达感激，譬如用<code>谢谢你的关注</code>或<code>谢谢你的关照</code>。）</p><h4 id="%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E5%90%8E%EF%BC%8C%E5%8A%A0%E4%B8%AA%E7%AE%80%E7%9F%AD%E7%9A%84%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E" tabindex="-1"><a id="4.22"></a>问题解决后，加个简短的补充说明</h4><p>问题解决后，向所有帮助过你的人发个说明，让他们知道问题是怎样解决的，并再一次向他们表示感谢。如果问题在新闻组或者邮件列表中引起了广泛关注，应该在那里贴一个说明比较恰当。</p><p>最理想的方式是向最初提问的话题回复此消息，并在标题中包含<code>已修正</code>，<code>已解决</code>或其它同等含义的明显标记。在人来人往的邮件列表里，一个看见讨论串<code>问题 X</code>和<code>问题 X - 已解决</code>的潜在回复者就明白不用再浪费时间了（除非他个人觉得<code>问题 X</code>的有趣），因此可以利用此时间去解决其它问题。</p><p>补充说明不必很长或是很深入；简单的一句<code>你好，原来是网线出了问题！谢谢大家 – Bill</code>比什么也不说要来的好。事实上，除非结论真的很有技术含量，否则简短可爱的小结比长篇大论更好。说明问题是怎样解决的，但大可不必将解决问题的过程复述一遍。</p><p>对于有深度的问题，张贴调试记录的摘要是有帮助的。描述问题的最终状态，说明是什么解决了问题，在此之后才指明可以避免的盲点。避免盲点的部分应放在正确的解决方案和其它总结材料之后，而不要将此信息搞成侦探推理小说。列出那些帮助过你的名字，会让你交到更多朋友。</p><p>除了有礼貌和有内涵以外，这种类型的补充也有助于他人在邮件列表/新闻群组/论坛中搜索到真正解决你问题的方案，让他们也从中受益。</p><p>至少，这种补充有助于让每位参与协助的人因问题的解决而从中得到满足感。如果你自己不是技术专家或者黑客，那就相信我们，这种感觉对于那些你向他们求助的大师或者专家而言，是非常重要的。问题悬而未决会让人灰心；黑客们渴望看到问题被解决。好人有好报，满足他们的渴望，你会在下次提问时尝到甜头。</p><p>思考一下怎样才能避免他人将来也遇到类似的问题，自问写一份文件或加个常见问题（FAQ）会不会有帮助。如果是的话就将它们发给维护者。</p><p>在黑客中，这种良好的后继行动实际上比传统的礼节更为重要，也是你如何透过善待他人而赢得声誉的方式，这是非常有价值的资产。</p><h3 id="%E5%A6%82%E4%BD%95%E8%A7%A3%E8%AF%BB%E7%AD%94%E6%A1%88" tabindex="-1"><a id="5"></a>如何解读答案</h3><h4 id="rtfm-%E5%92%8C-stfw%EF%BC%9A%E5%A6%82%E4%BD%95%E7%9F%A5%E9%81%93%E4%BD%A0%E5%B7%B2%E5%AE%8C%E5%85%A8%E6%90%9E%E7%A0%B8%E4%BA%86" tabindex="-1"><a id="5.1"></a>RTFM 和 STFW：如何知道你已完全搞砸了</h4><p>有一个古老而神圣的传统：如果你收到<code>RTFM（Read The Fucking Manual）</code>的回应，回答者认为你应该去读他妈的手册。当然，基本上他是对的，你应该去读一读。</p><p>RTFM 有一个年轻的亲戚。如果你收到<code>STFW（Search The Fucking Web）</code>的回应，回答者认为你应该到他妈的网上搜索。那人多半也是对的，去搜索一下吧。（更温和一点的说法是 <a href="http://lmgtfy.com/" target="_blank">Google 是你的朋友！</a>）</p><p>在论坛，你也可能被要求去爬爬论坛的旧文。事实上，有人甚至可能热心地为你提供以前解决此问题的讨论串。但不要依赖这种关照，提问前应该先搜索一下旧文。</p><p>通常，用这两句之一回答你的人会给你一份包含你需要内容的手册或者一个网址，而且他们打这些字的时候也正在读着。这些答复意味着回答者认为</p><ul><li>你需要的信息非常容易获得；</li><li>你自己去搜索这些信息比灌给你，能让你学到更多。</li></ul><p>你不应该因此不爽；依照黑客的标准，他已经表示了对你一定程度的关注，而没有对你的要求视而不见。你应该对他祖母般的慈祥表示感谢。</p><h4 id="%E5%A6%82%E6%9E%9C%E8%BF%98%E6%98%AF%E6%90%9E%E4%B8%8D%E6%87%82" tabindex="-1"><a id="5.2"></a>如果还是搞不懂</h4><p>如果你看不懂回应，别立刻要求对方解释。像你以前试着自己解决问题时那样（利用手册，FAQ，网络，身边的高手），先试着去搞懂他的回应。如果你真的需要对方解释，记得表现出你已经从中学到了点什么。</p><p>比方说，如果我回答你：<code>看来似乎是 zentry 卡住了；你应该先清除它。</code>，然后，这是一个很糟的后续问题回应：<code>zentry 是什么？</code> 好的问法应该是这样：<code>哦~~~我看过说明了但是只有 -z 和 -p 两个参数中提到了 zentries，而且还都没有清楚的解释如何清除它。你是指这两个中的哪一个吗？还是我看漏了什么？</code></p><h4 id="%E5%A4%84%E7%90%86%E6%97%A0%E7%A4%BC%E7%9A%84%E5%9B%9E%E5%BA%94" tabindex="-1"><a id="5.3"></a>处理无礼的回应</h4><p>很多黑客圈子中看似无礼的行为并不是存心冒犯。相反，它是直截了当，一针见血式的交流风格，这种风格更注重解决问题，而不是使人感觉舒服而却模模糊糊。</p><p>如果你觉得被冒犯了，试着平静地反应。如果有人真的做了出格的事，邮件列表、新闻群组或论坛中的前辈多半会招呼他。如果这没有发生而你却发火了，那么你发火对象的言语可能在黑客社区中看起来是正常的，而你将被视为有错的一方，这将伤害到你获取信息或帮助的机会。</p><p>另一方面，你偶尔真的会碰到无礼和无聊的言行。与上述相反，对真正的冒犯者狠狠地打击，用犀利的语言将其驳得体无完肤都是可以接受的。然而，在行事之前一定要非常非常的有根据。纠正无礼的言论与开始一场毫无意义的口水战仅一线之隔，黑客们自己莽撞地越线的情况并不鲜见。如果你是新手或外人，避开这种莽撞的机会并不高。如果你想得到的是信息而不是消磨时光，这时最好不要把手放在键盘上以免冒险。</p><p>（有些人断言很多黑客都有轻度的自闭症或亚斯伯格综合症，缺少用于润滑人类社会正常交往所需的神经。这既可能是真也可能是假的。如果你自己不是黑客，兴许你认为我们脑袋有问题还能帮助你应付我们的古怪行为。只管这么干好了，我们不在乎。我们喜欢我们现在这个样子，并且通常对病患标记都有站得住脚的怀疑。）</p><p>Jeff Bigler 的观察总结和这个相关也值得一读 (<a href="http://www.mit.edu/~jcb/tact.html" target="_blank">tact filters</a>)。</p><p>在下一节，我们会谈到另一个问题，当你行为不当时所会受到的<code>冒犯</code>。</p><h3 id="%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%E6%89%AE%E6%BC%94%E5%A4%B1%E8%B4%A5%E8%80%85" tabindex="-1"><a id="6"></a>如何避免扮演失败者</h3><p>在黑客社区的论坛中，你以本指南所描述的或类似的方式，可能会有那么几次搞砸了。而你会在公开场合中被告知你是如何搞砸的，也许攻击的言语中还会带点夹七夹八的颜色。</p><p>这种事发生以后，你能做的最糟糕的事莫过于哀嚎你的遭遇、宣称被言语攻击、要求道歉、高声尖叫、憋闷气、威胁诉诸法律、向其雇主报怨、不去关马桶盖等等。相反地，你该这么做：</p><p>熬过去，这很正常。事实上，它是有益健康且合理的。</p><p>社区的标准不会自行维持，它们是通过参与者积极而公开地执行来维持的。不要哭嚎所有的批评都应该通过私下的邮件传送，它不是这样运作的。当有人评论你的一个说法有误或者提出不同看法时，坚持声称受到个人攻击也毫无益处，这些都是失败者的态度。</p><p>也有其它的黑客论坛，受过高礼节要求的误导，禁止参与者张贴任何对别人帖子挑毛病的消息，并声称<code>如果你不想帮助用户就闭嘴</code>。 结果造成有想法的参与者纷纷离开，这么做只会使它们沦为毫无意义的唠叨与无用的技术论坛。</p><p>夸张的讲法是：你要的是“友善”（以上述方式）还是有用？两个里面挑一个。</p><p>记着：当黑客说你搞砸了，并且（无论多么刺耳）告诉你别再这样做时，他正在为关心你和他的社区而行动。对他而言，不理你并将你从他的生活中滤掉更简单。如果你无法做到感谢，至少要表现得有点尊严，别大声哀嚎，也别因为自己是个有戏剧性超级敏感的灵魂和自以为有资格的新来者，就指望别人像对待脆弱的洋娃娃那样对你。</p><p>有时候，即使你没有搞砸（或者只是在他的想像中你搞砸了），有些人也会无缘无故地攻击你本人。在这种情况下，抱怨倒是真的会把问题搞砸。</p><p>这些来找麻烦的人要么是毫无办法但自以为是专家的不中用家伙，要么就是测试你是否真会搞砸的心理专家。其它读者要么不理睬，要么用自己的方式对付他们。这些来找麻烦的人在给他们自己找麻烦，这点你不用操心。</p><p>也别让自己卷入口水战，最好不要理睬大多数的口水战 —— 当然，这是在你检验它们只是口水战，并且未指出你有搞砸的地方，同时也没有巧妙地将问题真正的答案藏于其后（这也是有可能的）。</p><h4 id="%E4%B8%8D%E8%AF%A5%E9%97%AE%E7%9A%84%E9%97%AE%E9%A2%98" tabindex="-1"><a id="7"></a>不该问的问题</h4><p>以下是几个经典蠢问题，以及黑客没回答时心中所想的：</p><p>问题：<a href="#7.1">我能在哪找到 X 程序或 X 资源？</a></p><p>问题：<a href="#7.2">我怎样用 X 做 Y？</a></p><p>问题：<a href="#7.3">如何设定我的 shell 提示？</a></p><p>问题：<a href="#7.4">我可以用 Bass-o-matic 文件转换工具将 AcmeCorp 文件转换为 TeX 格式吗？</a></p><p>问题：<a href="#7.5">我的程序/设定/SQL 语句没有用</a></p><p>问题：<a href="#7.6">我的 Windows 电脑有问题，你能帮我吗？</a></p><p>问题：<a href="#7.7">我的程序不会动了，我认为系统工具 X 有问题</a></p><p>问题：<a href="#7.8">我在安装 Linux（或者 X ）时有问题，你能帮我吗？</a></p><p>问题：<a href="#7.9">我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢？</a></p><hr /><blockquote><p><a id="7.1"></a>问题：我能在哪找到 X 程序或 X 资源？</p></blockquote><p>回答：就在我找到它的地方啊，白痴 —— 搜索引擎的那一头。天哪！难道还有人不会用 <a href="https://www.google.com/" target="_blank">Google</a> 吗？</p><blockquote><p><a id="7.2"></a>问题：我怎样用 X 做 Y？</p></blockquote><p>回答：如果你想解决的是 Y ，提问时别给出可能并不恰当的方法。这种问题说明提问者不但对 X 完全无知，也对 Y 要解决的问题糊涂，还被特定形势禁锢了思维。最好忽略这种人，等他们把问题搞清楚了再说。</p><blockquote><p><a id="7.3"></a>问题：如何设定我的 shell 提示？？</p></blockquote><p>回答：如果你有足够的智慧提这个问题，你也该有足够的智慧去<a href="#5.1">RTFM</a>，然后自己去找出来。</p><blockquote><p><a id="7.4"></a>问题：我可以用 Bass-o-matic 文件转换工具将 AcmeCorp 文件转换为 TeX 格式吗？</p></blockquote><p>回答：试试看就知道了。如果你试过，你就知道了答案，就不用浪费我的时间了。</p><blockquote><p><a id="7.5"></a>问题：我的{程序/设定/SQL 语句}没有用</p></blockquote><p>回答：这不算是问题吧，我对要我问你二十个问题才找得出你真正问题的问题没兴趣 —— 我有更有意思的事要做呢。在看到这类问题的时候，我的反应通常不外如下三种</p><ul><li>你还有什么要补充的吗？</li><li>真糟糕，希望你能搞定。</li><li>这关我屁事？</li></ul><blockquote><p><a id="7.6"></a>问题：我的 Windows 电脑有问题，你能帮我吗？</p></blockquote><p>回答：能啊，扔掉微软的垃圾，换个像 Linux 或 BSD 的开源操作系统吧。</p><p>注意：如果程序有官方版 Windows 或者与 Windows 有互动（如 Samba），你可以问与 Windows 相关的问题，只是别对问题是由 Windows 操作系统而不是程序本身造成的回复感到惊讶， 因为 Windows 一般来说实在太烂，这种说法通常都是对的。</p><blockquote><p><a id="7.7"></a>问题：我的程序不会动了，我认为系统工具 X 有问题</p></blockquote><p>回答：你完全有可能是第一个注意到被成千上万用户反复使用的系统调用与函数库文件有明显缺陷的人，更有可能的是你完全没有根据。不同凡响的说法需要不同凡响的证据，当你这样声称时，你必须有清楚而详尽的缺陷说明文件作后盾。</p><blockquote><p><a id="7.8"></a>问题：我在安装 Linux（或者 X ）时有问题，你能帮我吗？</p></blockquote><p>回答：不能，我只有亲自在你的电脑上动手才能找到毛病。还是去找你当地的 Linux 使用群组者寻求实际的指导吧（你能在<a href="http://www.linux.org/groups/index.html" target="_blank">这儿</a>找到用户群组的清单）。</p><p>注意：如果安装问题与某 Linux 的发行版有关，在它的邮件列表、论坛或本地用户群组中提问也许是恰当的。此时，应描述问题的准确细节。在此之前，先用<code>Linux</code>和所有被怀疑的硬件作关键词仔细搜索。</p><blockquote><p><a id="7.9"></a>问题：我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢？</p></blockquote><p>回答：想要这样做，说明了你是个卑鄙小人；想找个黑客帮你，说明你是个白痴！</p><h3 id="%E5%A5%BD%E9%97%AE%E9%A2%98%E4%B8%8E%E8%A0%A2%E9%97%AE%E9%A2%98" tabindex="-1"><a id="8"></a>好问题与蠢问题</h3><p>最后，我将透过举一些例子，来说明怎样聪明的提问；同一个问题的两种问法被放在一起，一种是愚蠢的，另一种才是明智的。</p><p>蠢问题：</p><blockquote><p>我可以在哪儿找到关于 Foonly Flurbamatic 的资料？</p></blockquote><p>这种问法无非想得到<a href="#5.1">STFW</a>这样的回答。</p><p>聪明问题：</p><blockquote><p>我用 Google 搜索过 “Foonly Flurbamatic 2600”，但是没找到有用的结果。谁知道上哪儿去找对这种设备编程的资料？</p></blockquote><p>这个问题已经 STFW 过了，看起来他真的遇到了麻烦。</p><p>蠢问题：</p><blockquote><p>我从 foo 项目找来的源码没法编译。它怎么这么烂？</p></blockquote><p>他觉得都是别人的错，这个傲慢自大的提问者。</p><p>聪明问题：</p><blockquote><p>foo 项目代码在 Nulix 6.2 版下无法编译通过。我读过了 FAQ，但里面没有提到跟 Nulix 有关的问题。这是我编译过程的记录，我有什么做的不对的地方吗？</p></blockquote><p>提问者已经指明了环境，也读过了 FAQ，还列出了错误，并且他没有把问题的责任推到别人头上，他的问题值得被关注。</p><p>蠢问题：</p><blockquote><p>我的主机板有问题了，谁来帮我？</p></blockquote><p>某黑客对这类问题的回答通常是：<code>好的，还要帮你拍拍背和换尿布吗？</code>，然后按下删除键。</p><p>聪明问题：</p><blockquote><p>我在 S2464 主机板上试过了 X 、 Y 和 Z ，但没什么作用，我又试了 A 、 B 和 C 。请注意当我尝试 C 时的奇怪现象。显然 florbish 正在 grommicking，但结果出人意料。通常在 Athlon MP 主机板上引起 grommicking 的原因是什么？有谁知道接下来我该做些什么测试才能找出问题？</p></blockquote><p>这个家伙，从另一个角度来看，值得去回答他。他表现出了解决问题的能力，而不是坐等天上掉答案。</p><p>在最后一个问题中，注意<code>告诉我答案</code>和<code>给我启示，指出我还应该做什么诊断工作</code>之间微妙而又重要的区别。</p><p>事实上，后一个问题源自于 2001 年 8 月在 Linux 内核邮件列表（lkml）上的一个真实的提问。我（Eric）就是那个提出问题的人。我在 Tyan S2464 主板上观察到了这种无法解释的锁定现象，列表成员们提供了解决这一问题的重要信息。</p><p>通过我的提问方法，我给了别人可以咀嚼玩味的东西；我设法让人们很容易参与并且被吸引进来。我显示了自己具备和他们同等的能力，并邀请他们与我共同探讨。通过告诉他们我所走过的弯路，以避免他们再浪费时间，我也表明了对他们宝贵时间的尊重。</p><p>事后，当我向每个人表示感谢，并且赞赏这次良好的讨论经历的时候，一个 Linux 内核邮件列表的成员表示，他觉得我的问题得到解决并非由于我是这个列表中的名人，而是因为我用了正确的方式来提问。</p><p>黑客从某种角度来说是拥有丰富知识但缺乏人情味的家伙；我相信他是对的，如果我像个乞讨者那样提问，不论我是谁，一定会惹恼某些人或者被他们忽视。他建议我记下这件事，这直接导致了本指南的出现。</p><h3 id="%E5%A6%82%E6%9E%9C%E5%BE%97%E4%B8%8D%E5%88%B0%E5%9B%9E%E7%AD%94" tabindex="-1"><a id="9"></a>如果得不到回答</h3><p>如果仍得不到回答，请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。没有回应不代表你被忽视，虽然不可否认这种差别很难区分。</p><p>总的来说，简单的重复张贴问题是个很糟的点子。这将被视为无意义的喧闹。有点耐心，知道你问题答案的人可能生活在不同的时区，可能正在睡觉，也有可能你的问题一开始就没有组织好。</p><p>你可以通过其他渠道获得帮助，这些渠道通常更适合初学者的需要。</p><p>有许多网上的以及本地的用户群组，由热情的软件爱好者（即使他们可能从没亲自写过任何软件）组成。通常人们组建这样的团体来互相帮助并帮助新手。</p><p>另外，你可以向很多商业公司寻求帮助，不论公司大还是小。别为要付费才能获得帮助而感到沮丧！毕竟，假使你的汽车发动机汽缸密封圈爆掉了 —— 完全可能如此 —— 你还得把它送到修车铺，并且为维修付费。就算软件没花费你一分钱，你也不能强求技术支持总是免费的。</p><p>对像是 Linux 这种大众化的软件，每个开发者至少会对应到上万名用户。根本不可能由一个人来处理来自上万名用户的求助电话。要知道，即使你要为这些协助付费，和你所购买的同类软件相比，你所付出的也是微不足道的（通常封闭源代码软件的技术支持费用比开源软件的要高得多，且内容也没那么丰富）。</p><h3 id="%E5%A6%82%E4%BD%95%E6%9B%B4%E5%A5%BD%E5%9C%B0%E5%9B%9E%E7%AD%94%E9%97%AE%E9%A2%98" tabindex="-1"><a id="10"></a>如何更好地回答问题</h3><p>态度和善一点。 问题带来的压力常使人显得无礼或愚蠢，其实并不是这样。</p><p>对初犯者私下回复。 对那些坦诚犯错之人没有必要当众羞辱，一个真正的新手也许连怎么搜索或在哪找常见问题都不知道。</p><p>如果你不确定，一定要说出来！ 一个听起来权威的错误回复比没有还要糟，别因为听起来像个专家很好玩，就给别人乱指路。要谦虚和诚实，给提问者与同行都树个好榜样。</p><p>如果帮不了忙，也别妨碍他。 不要在实际步骤上开玩笑，那样也许会毁了提问者的设置 —— 有些可怜的呆瓜会把它当成真的指令。</p><p>试探性的反问以引出更多的细节。 如果你做得好，提问者可以学到点东西 —— 你也可以。试试将蠢问题转变成好问题，别忘了我们都曾是新手。</p><p>尽管对那些懒虫抱怨一声 RTFM 是正当的，但能给出文档的链接（即使只是建议个 Google 搜索关键词）会更好。</p><p>如果你决定回答，就请给出好的答案。 当别人正在用错误的工具或方法时别建议笨拙的权宜之计（workaround），应推荐更好的工具，重新界定问题。</p><p>正面地回答问题！ 如果这个提问者已经很深入的研究而且也表明已经试过 X 、 Y 、 Z 、 A 、 B 、 C 但没得到结果，回答<code>试试看 A 或是 B</code>或者<code>试试 X 、 Y 、 Z 、 A 、 B 、 C</code>并附上一个链接一点用都没有。</p><p>帮助你的社区从问题中学习。 当回复一个好问题时，问问自己<code>如何修改相关文件或常见问题文件以免再次解答同样的问题？</code>，接着再向文件维护者发一份补丁。</p><p>如果你在研究一番后才作出了回答，展现你的技巧而不是直接端出结果。毕竟<code>授人以鱼不如授人以渔</code>。</p><h3 id="%E7%9B%B8%E5%85%B3%E8%B5%84%E6%BA%90" tabindex="-1"><a id="11"></a>相关资源</h3><p>如果你需要个人电脑、Unix 系统和网络如何运作的基础知识，参阅<a href="http://en.tldp.org/HOWTO/Unix-and-Internet-Fundamentals-HOWTO/" target="_blank">Unix 系统和网络基本原理</a>。</p><p>当你发布软件或补丁时，试着按<a href="http://en.tldp.org/HOWTO/Software-Release-Practice-HOWTO/index.html" target="_blank">软件发布实践</a>操作。</p><h3 id="%E9%B8%A3%E8%B0%A2" tabindex="-1"><a id="12"></a>鸣谢</h3><p>Evelyn Mitchel 贡献了一些愚蠢问题例子并启发了编写<code>如何更好地回答问题</code>这一节， Mikhail Ramendik 贡献了一些特别有价值的建议和改进。</p>]]>
                </content>
            </entry>
            <entry>
                <title><![CDATA[Centos下防火墙firewall配置]]></title>
                <link rel="alternate" type="text/html" href="https://blog.nanako.vip/?p=34" />
                <id>tag:https://blog.nanako.vip,2022-06-19:centos下防火墙firewall配置</id>
                <published>2022-06-19T16:33:14+08:00</published>
                <updated>2022-06-19T16:41:39+08:00</updated>
                <author>
                    <name>黑田奈奈子</name>
                    <uri>https://blog.nanako.vip</uri>
                </author>
                <content type="html">
                        <![CDATA[<h2 id="centos%E9%98%B2%E7%81%AB%E5%A2%99firewall%E8%AE%BE%E7%BD%AE" tabindex="-1">Centos防火墙firewall设置</h2><h3 id="%E4%B8%80%E3%80%81%E6%9D%A1%E4%BB%B6%E9%98%B2%E7%81%AB%E5%A2%99%E6%98%AF%E5%BC%80%E5%90%AF%E7%9A%84" tabindex="-1">一、条件防火墙是开启的</h3><pre><code class="language-">systemctl start firewalld</code></pre><h4 id="1%E3%80%81%E6%9F%A5%E7%9C%8B%E9%98%B2%E7%81%AB%E5%A2%99%E7%9A%84%E9%85%8D%E7%BD%AE" tabindex="-1">1、查看防火墙的配置</h4><pre><code class="language-">firewall-cmd --statefirewall-cmd --list-all</code></pre><h4 id="2%E3%80%81%E5%BC%80%E6%94%BE80%E7%AB%AF%E5%8F%A3" tabindex="-1">2、开放80端口</h4><pre><code class="language-">firewall-cmd --permanent --add-port=80/tcpfirewall-cmd --reload    #重新加载防火墙配置才会起作用</code></pre><h4 id="3%E3%80%81%E7%A7%BB%E9%99%A4%E4%BB%A5%E4%B8%8A%E8%A7%84%E5%88%99" tabindex="-1">3、移除以上规则</h4><pre><code class="language-">firewall-cmd --permanent --remove-port=80/tcpfirewall-cmd --reload</code></pre><h4 id="4%E3%80%81%E6%94%BE%E9%80%9A%E6%9F%90%E4%B8%AA%E7%AB%AF%E5%8F%A3%E6%AE%B5" tabindex="-1">4、放通某个端口段</h4><pre><code class="language-">firewall-cmd --permanent --zone=public --add-port=1000-2000/tcpfirewall-cmd --reload</code></pre><h4 id="5%E3%80%81%E6%94%BE%E9%80%9A%E6%9F%90%E4%B8%AAip%E8%AE%BF%E9%97%AE%EF%BC%8C%E9%BB%98%E8%AE%A4%E5%85%81%E8%AE%B8" tabindex="-1">5、放通某个IP访问，默认允许</h4><pre><code class="language-">firewall-cmd --permanent --add-rich-rule=&#39;rule family=ipv4 source address=192.168.1.169 accept&#39;firewall-cmd --reload</code></pre><h4 id="6%E3%80%81%E7%A6%81%E6%AD%A2%E6%9F%90%E4%B8%AAip%E8%AE%BF%E9%97%AE" tabindex="-1">6、禁止某个IP访问</h4><pre><code class="language-">firewall-cmd --permanent --add-rich-rule=&#39;rule family=ipv4 source address=10.0.0.42 drop&#39;firewall-cmd --reload</code></pre><h4 id="7%E3%80%81%E6%94%BE%E9%80%9A%E6%9F%90%E4%B8%AAip%E8%AE%BF%E9%97%AE%E6%9F%90%E4%B8%AA%E7%AB%AF%E5%8F%A3" tabindex="-1">7、放通某个IP访问某个端口</h4><pre><code class="language-">firewall-cmd --permanent --add-rich-rule=&#39;rule family=ipv4 source address=192.168.1.169 port protocol=tcp port=6379 accept&#39;firewall-cmd --reload</code></pre><h4 id="8%E3%80%81%E7%A7%BB%E9%99%A4%E4%BB%A5%E4%B8%8A%E8%A7%84%E5%88%99" tabindex="-1">8、移除以上规则</h4><pre><code class="language-">firewall-cmd --permanent --remove-rich-rule=&#39;rule family=&quot;ipv4&quot; source address=&quot;192.168.1.169&quot; port port=&quot;6379&quot; protocol=&quot;tcp&quot; accept&#39;firewall-cmd --reload</code></pre><h4 id="9%E3%80%81%E6%94%BE%E9%80%9A%E6%9F%90%E4%B8%AAip%E6%AE%B5%E8%AE%BF%E9%97%AE" tabindex="-1">9、放通某个IP段访问</h4><pre><code class="language-">firewall-cmd --permanent --add-rich-rule=&#39;rule family=ipv4 source address=10.0.0.0/24 accept&#39;</code></pre>]]>
                </content>
            </entry>
            <entry>
                <title><![CDATA[我的影视追剧方案]]></title>
                <link rel="alternate" type="text/html" href="https://blog.nanako.vip/?p=3" />
                <id>tag:https://blog.nanako.vip,2022-06-06:mr</id>
                <published>2022-06-06T01:16:09+08:00</published>
                <updated>2023-11-30T20:32:09+08:00</updated>
                <author>
                    <name>黑田奈奈子</name>
                    <uri>https://blog.nanako.vip</uri>
                </author>
                <content type="html">
                        <![CDATA[<p>前几个月无意中在张大妈上看到一个影视追剧方案，软件名为movie-robot，抱着好奇心提交邮箱试用了一下，果断入了门槛（软件可试用，永久使用需赞助）。</p><blockquote><p>本文不涉及搭建，仅介绍及截图展示。</p></blockquote><blockquote><p>更新于2023年11月30日</p></blockquote><p>(文末附软件官网及软件wiki)</p><h3 id="%E5%8F%91%E7%8E%B0%E5%A5%91%E6%9C%BA" tabindex="-1">发现契机</h3><p>本来平常也会看看感兴趣的电影电视剧，遇上大片上映也会跑去电影院赶个早班车，手头也有多个国内视频网站的v。但国内视频网站多年发展下来风气已然不一般，体验感总感觉差了那么些什么。家里恰好有台旧电脑，装了个unraid加三盘4T当起了nas存储，但是下片的体验总是太过繁琐。</p><p>时间差不多是过年那会，无聊在张大妈上面随便逛逛，就看到作者发的文章，勾起了我的好奇心。果断发了申请拿到了试用码，从那会的纯配置文件版本，一直发展到现在优雅的webui，一路跟着作者更新过来，并且也提交支持了一些站点的适配工作，算是跟着产品一路走来了。大概在去年(2012年)11月推出了插件市场功能，也借此契机学习了Python，写了几个功能扩展的插件。</p><h3 id="%E5%8A%9F%E8%83%BD%E7%AE%80%E4%BB%8B" tabindex="-1">功能简介</h3><ul><li><p>多种渠道支持多用户搜索订阅</p><ul><li>豆瓣APP、豆瓣小程序点击想看</li><li>通过微信搜索订阅</li><li>通过软件web端直接搜索订阅</li></ul></li><li><p>多站点支持</p><ul><li>基本涵盖了国内大部分pt站点、和两个外站，以及一个国外bt站点，具体支持可查阅<a href="https://github.com/pofey/movie_robot/tree/main/app/sites" target="_blank">github</a>链接</li></ul></li><li><p>在配置好的站点中，定时或者实时，准确获取订阅中的影视，并且通过设定好的排序规则及过滤器，找到符合你需求的片源</p></li><li><p>新片发布后，通常会有更好品质值得收藏的资源会后续再发布，机器人会自动完成下载及替换（删除原有）。</p></li><li><p>基于pt站点命名混乱问题，机器人通过一系列算法准确识别出影视文件信息，并按一定的格式进行硬链接重命名整理到指定目录。</p></li><li><p>国外新片通常会没有中文字幕，在影片自动下载完成后，机器人会启动中文字幕搜索任务，从字幕网站查找品质优秀的中文字幕，下载好存储在媒体库所在路径。</p></li><li><p>完全私有化产品，不共享任何内容和数据，全部媒体元数据，和媒体资源，均来自第三方网站。</p></li><li><p>Python sdk插件支持。利用作者封装的Python sdk，可以很方便快速地使用内置接口编写插件，快速扩展软件功能。</p></li></ul><h3 id="%E7%95%8C%E9%9D%A2%E6%88%AA%E5%9B%BE" tabindex="-1">界面截图</h3><p>图片为本人实际截图。</p><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D3/20231130/1.jpg" alt="web首页" /></p><blockquote><p>web打开首页，头图为豆瓣日推，下方是用户豆瓣的推荐影片，并附带豆瓣推荐理由。</p></blockquote><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D3/20231130/2.jpg" alt="剧集搜索" /><br /><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D3/20231130/3.jpg" alt="电影搜索" /></p><blockquote><p>搜索页可同时查看本地已有资源、豆瓣相关信息、站点资源信息。本地已有资源可查看分辨率、编码、音轨、字幕等信息，甚至可手动执行字幕下载任务。搜索剧集可查看分集信息，下一集开播时间等。</p></blockquote><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D3/20231130/4.jpg" alt="下载资源" /></p><blockquote><p>手动点击资源下载，手选设定好的下载路径，机器人会自动识别信息并在下载记录中呈现。</p></blockquote><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D3/20231130/5.jpg" alt="下载记录" /></p><blockquote><p>下载记录，记录提交到下载器的任务并自动识别影视信息。</p></blockquote><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D3/20231130/6.jpg" alt="豆瓣榜单" /></p><blockquote><p>四个豆瓣榜单，查看当前实时热门电影及剧集</p></blockquote><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D3/20231130/7.jpg" alt="订阅记录" /></p><blockquote><p>订阅记录，分类查看订阅中、洗版中、已完成的订阅信息</p></blockquote><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D3/20231130/8.jpg" alt="站点数据" /></p><blockquote><p>站点数据。饼状图及条形图直观查看分站点的上传下载数据</p></blockquote><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D3/20231130/9.jpg" alt="过滤器" /></p><blockquote><p>通过过滤器设置条件，保证下载的资源是自己想要的。</p></blockquote><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D3/20231130/10.jpg" alt="设置项1" /><br /><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D3/20231130/10.5.jpg" alt="设置项2" /></p><blockquote><p>所有设置项</p></blockquote><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D3/20231130/11.png" alt="下载完成通知" /></p><blockquote><p>下载完成通知</p></blockquote><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D3/20231130/12.png" alt="入库通知" /></p><blockquote><p>plex入库通知</p></blockquote><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D3/20231130/13.jpg" alt="plex库" /></p><blockquote><p>plex库</p></blockquote><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D3/20231130/14.jpg" alt="插件市场" /></p><blockquote><p>插件市场</p></blockquote><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D3/20231130/15.jpg" alt="插件功能按钮" /></p><blockquote><p>插件功能按钮</p></blockquote><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D3/20231130/16.jpg" alt="追剧日历" /></p><blockquote><p>插件-追剧日历</p></blockquote><p><img src="https://nanako-1253183981.cos.ap-guangzhou.myqcloud.com/article/p%3D3/20231130/17.jpg" alt="有声书工具箱" /></p><blockquote><p>插件-有声书工具箱</p></blockquote><p>自从装了movie-robot，看的剧和电影也多了起来。现在看到哪个想看的片，打开页面/企微搜索/捷径提交订阅，过一会打开plex就能看了，这体验真的太舒服了。</p><hr /><p>项目官网：<a href="https://moviebot.fun" target="_blank">homepage:movie-robot</a><br />wiki链接：<a href="https://yee329.notion.site/yee329/Movie-Robot-Wiki-9abef8c648c840fca47a0bf308957f85" target="_blank">wiki:movie-robot</a></p>]]>
                </content>
            </entry>
</feed>
