介绍 on Save Any Bothttps://sabot.unv.app/Recent content in 介绍 on Save Any BotHugozh静默模式https://sabot.unv.app/usage/silent/Mon, 01 Jan 0001 00:00:00 +0000https://sabot.unv.app/usage/silent/<h1 id="静默模式-silent"> 静默模式 (silent) <a class="anchor" href="#%e9%9d%99%e9%bb%98%e6%a8%a1%e5%bc%8f-silent">#</a> </h1> <p>使用 <code>/silent</code> 命令可以开关静默模式.</p> <p>默认情况下不开启静默模式, Bot 会询问你每个文件的保存位置.</p> <p>开启静默模式后, Bot 会直接保存文件到默认位置, 无需确认.</p> <p>在开启静默模式之前, 需要使用 <code>/storage</code> 命令设置默认保存位置.</p>存储规则https://sabot.unv.app/usage/rules/Mon, 01 Jan 0001 00:00:00 +0000https://sabot.unv.app/usage/rules/<h1 id="存储规则"> 存储规则 <a class="anchor" href="#%e5%ad%98%e5%82%a8%e8%a7%84%e5%88%99">#</a> </h1> <p>允许你为 Bot 在上传文件到存储时设置一些重定向规则, 用于自动整理所保存的文件.</p> <p>见: <a href="https://github.com/krau/SaveAny-Bot/issues/28" target="_blank">#28</a></p> <p>目前支持的规则类型:</p> <ol> <li>FILENAME-REGEX</li> <li>MESSAGE-REGEX</li> <li>IS-ALBUM</li> </ol> <p>添加规则的基本语法:</p> <p>&ldquo;规则类型 规则内容 存储名 路径&rdquo;</p> <p>注意空格的使用, 语法正确 bot 才能解析, 以下是一条合法的添加规则命令:</p> <pre tabindex="0"><code>/rule add FILENAME-REGEX (?i)\.(mp4|mkv|ts|avi|flv)$ MyAlist /视频 </code></pre><p>此外, 规则中的存储名若使用 &ldquo;CHOSEN&rdquo; , 则表示存储到点击按钮选择的存储端的路径下</p> <p>你也可以使用 <code>/rule switch</code> 来开关规则模式. 关闭规则模式时, 所有文件都将保存到默认存储.</p> <h2 id="预设规则"> 预设规则 <a class="anchor" href="#%e9%a2%84%e8%ae%be%e8%a7%84%e5%88%99">#</a> </h2> <p>为常见文件类型手动编写正则规则比较繁琐, 因此 Bot 内置了一组预设分类 (视频、图片、音频、文档、压缩包), 可以通过一条命令批量导入:</p> <pre tabindex="0"><code>/rule preset &lt;存储名&gt; [基础路径] </code></pre><p>参数:</p> <ul> <li><code>存储名</code>: 目标存储名 (必须存在且你有权访问)</li> <li><code>基础路径</code>: 可选. 各预设分类的子目录会创建在此路径下; 若不填则直接使用默认分类目录名</li> </ul> <p>示例:</p> <pre tabindex="0"><code># 导入预设规则到 &#34;MyAlist&#34;, 使用默认目录布局 /rule preset MyAlist # 在自定义基础路径 &#34;downloads/sorted&#34; 下导入预设规则 /rule preset MyAlist downloads/sorted </code></pre><p>此命令会为每个分类创建 <code>FILENAME-REGEX</code> 规则, 将匹配的文件路由到 <code>基础路径</code> 下对应的子目录:</p>监听聊天https://sabot.unv.app/usage/watch/Mon, 01 Jan 0001 00:00:00 +0000https://sabot.unv.app/usage/watch/<h1 id="监听聊天"> 监听聊天 <a class="anchor" href="#%e7%9b%91%e5%90%ac%e8%81%8a%e5%a4%a9">#</a> </h1> <blockquote class="book-hint warning"> 该功能需开启 UserBot 集成. </blockquote> <p>监听指定聊天的消息, 并自动保存到默认存储中, 遵从存储规则, 并且可以设置过滤器来只保存匹配的消息.</p> <p>监听聊天:</p> <pre tabindex="0"><code>/watch &lt;chat_id/username&gt; [filter] </code></pre><p>取消监听:</p> <pre tabindex="0"><code>/unwatch &lt;chat_id/username&gt; </code></pre><p>过滤器类型:</p> <h2 id="msgre"> msgre <a class="anchor" href="#msgre">#</a> </h2> <p>正则匹配消息文本, 例如:</p> <pre tabindex="0"><code>/watch 12345678 msgre:.*hello.* </code></pre><p>这将会监听 ID 为 12345678 的聊天, 并且只保存消息文本中包含 &ldquo;hello&rdquo; 的消息.</p>直接下载链接https://sabot.unv.app/usage/directlinks/Mon, 01 Jan 0001 00:00:00 +0000https://sabot.unv.app/usage/directlinks/<h1 id="直接下载链接"> 直接下载链接 <a class="anchor" href="#%e7%9b%b4%e6%8e%a5%e4%b8%8b%e8%bd%bd%e9%93%be%e6%8e%a5">#</a> </h1> <p>使用 <code>/dl</code> 命令可以直接下载一个或多个 HTTP/HTTPS 链接的文件到存储中.</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>/dl &lt;url1&gt; <span style="color:#f92672">[</span>url2<span style="color:#f92672">]</span> <span style="color:#f92672">[</span>url3<span style="color:#f92672">]</span> ... </span></span></code></pre></div><p>示例:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>/dl https://example.com/file.zip </span></span><span style="display:flex;"><span>/dl https://example.com/file1.zip https://example.com/file2.zip </span></span></code></pre></div><p>Bot 会验证链接格式, 然后让你选择目标存储位置.</p>Aria2 下载https://sabot.unv.app/usage/aria2/Mon, 01 Jan 0001 00:00:00 +0000https://sabot.unv.app/usage/aria2/<h1 id="aria2-下载"> Aria2 下载 <a class="anchor" href="#aria2-%e4%b8%8b%e8%bd%bd">#</a> </h1> <blockquote class="book-hint warning"> 该功能需要在配置文件中启用 Aria2 并配置 RPC 连接. </blockquote> <p>使用 <code>/aria2dl</code> 命令可以通过 Aria2 下载管理器下载文件, 支持 HTTP/HTTPS、FTP、BitTorrent 等多种协议.</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>/aria2dl &lt;uri1&gt; <span style="color:#f92672">[</span>uri2<span style="color:#f92672">]</span> <span style="color:#f92672">[</span>uri3<span style="color:#f92672">]</span> ... </span></span></code></pre></div><p>示例:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># 下载 HTTP 链接</span> </span></span><span style="display:flex;"><span>/aria2dl https://example.com/file.zip </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># 下载磁力链接</span> </span></span><span style="display:flex;"><span>/aria2dl magnet:?xt<span style="color:#f92672">=</span>urn:btih:... </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># 下载种子文件 (需要先上传 .torrent 文件)</span> </span></span><span style="display:flex;"><span>/aria2dl https://example.com/file.torrent </span></span></code></pre></div><p>配置 Aria2:</p> <p>在 <code>config.toml</code> 中添加:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#a6e22e">aria2</span>] </span></span><span style="display:flex;"><span><span style="color:#a6e22e">enable</span> = <span style="color:#66d9ef">true</span> </span></span><span style="display:flex;"><span><span style="color:#a6e22e">url</span> = <span style="color:#e6db74">&#34;http://localhost:6800/jsonrpc&#34;</span> </span></span><span style="display:flex;"><span><span style="color:#a6e22e">secret</span> = <span style="color:#e6db74">&#34;your-rpc-secret&#34;</span> <span style="color:#75715e"># 如果配置了 rpc-secret</span> </span></span><span style="display:flex;"><span><span style="color:#a6e22e">remove_after_transfer</span> = <span style="color:#66d9ef">true</span> <span style="color:#75715e"># 转存完成后删除本地文件</span> </span></span></code></pre></div>yt-dlp 视频下载https://sabot.unv.app/usage/ytdlp/Mon, 01 Jan 0001 00:00:00 +0000https://sabot.unv.app/usage/ytdlp/<h1 id="yt-dlp-视频下载"> yt-dlp 视频下载 <a class="anchor" href="#yt-dlp-%e8%a7%86%e9%a2%91%e4%b8%8b%e8%bd%bd">#</a> </h1> <blockquote class="book-hint warning"> 该功能需要在系统中安装 yt-dlp 命令行工具. </blockquote> <p>使用 <code>/ytdlp</code> 命令可以下载支持的视频网站的视频和音频, 支持 YouTube、Bilibili、Twitter 等 1000+ 个网站.</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>/ytdlp &lt;url1&gt; <span style="color:#f92672">[</span>url2<span style="color:#f92672">]</span> <span style="color:#f92672">[</span>flags...<span style="color:#f92672">]</span> </span></span></code></pre></div><p>示例:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># 基本下载</span> </span></span><span style="display:flex;"><span>/ytdlp https://www.youtube.com/watch?v<span style="color:#f92672">=</span>dQw4w9WgXcQ </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># 下载多个视频</span> </span></span><span style="display:flex;"><span>/ytdlp https://www.youtube.com/watch?v<span style="color:#f92672">=</span>video1 https://www.youtube.com/watch?v<span style="color:#f92672">=</span>video2 </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># 使用自定义参数</span> </span></span><span style="display:flex;"><span>/ytdlp https://www.youtube.com/watch?v<span style="color:#f92672">=</span>dQw4w9WgXcQ -f best </span></span><span style="display:flex;"><span>/ytdlp https://www.youtube.com/watch?v<span style="color:#f92672">=</span>dQw4w9WgXcQ --extract-audio --audio-format mp3 </span></span></code></pre></div><p>常用参数:</p> <ul> <li><code>-f &lt;format&gt;</code>: 指定下载格式 (如 <code>best</code>, <code>worst</code>, <code>bestvideo+bestaudio</code>)</li> <li><code>--extract-audio</code>: 提取音频</li> <li><code>--audio-format &lt;format&gt;</code>: 音频格式 (如 <code>mp3</code>, <code>m4a</code>, <code>wav</code>)</li> <li><code>--write-sub</code>: 下载字幕</li> <li><code>--write-thumbnail</code>: 下载缩略图</li> </ul> <p>更多参数请参考 <a href="https://github.com/yt-dlp/yt-dlp#usage-and-options">yt-dlp 文档</a>.</p>存储间传输https://sabot.unv.app/usage/transfer/Mon, 01 Jan 0001 00:00:00 +0000https://sabot.unv.app/usage/transfer/<h1 id="存储间传输"> 存储间传输 <a class="anchor" href="#%e5%ad%98%e5%82%a8%e9%97%b4%e4%bc%a0%e8%be%93">#</a> </h1> <p>使用 <code>/transfer</code> 命令可以在不同存储之间直接传输文件, 无需经过 Telegram.</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>/transfer &lt;source_storage&gt;:/&lt;source_path&gt; <span style="color:#f92672">[</span>filter<span style="color:#f92672">]</span> </span></span></code></pre></div><p>参数说明:</p> <ul> <li><code>source_storage</code>: 源存储名称</li> <li><code>source_path</code>: 源路径</li> <li><code>filter</code>: 可选的正则表达式过滤器, 只传输匹配的文件</li> </ul> <p>示例:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># 传输整个目录</span> </span></span><span style="display:flex;"><span>/transfer local1:/downloads </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># 传输指定路径的文件</span> </span></span><span style="display:flex;"><span>/transfer alist1:/media/photos </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># 只传输 mp4 文件</span> </span></span><span style="display:flex;"><span>/transfer webdav1:/videos <span style="color:#e6db74">&#34;.*\.mp4</span>$<span style="color:#e6db74">&#34;</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># 传输图片文件</span> </span></span><span style="display:flex;"><span>/transfer local1:/pictures <span style="color:#e6db74">&#34;(?i)\.(jpg|png|gif)</span>$<span style="color:#e6db74">&#34;</span> </span></span></code></pre></div><p>Bot 会:</p> <ol> <li>列出源路径下的所有文件</li> <li>应用过滤器 (如果提供)</li> <li>显示文件数量和总大小</li> <li>让你选择目标存储</li> <li>让你选择目标目录 (如果该存储配置了目录)</li> <li>开始传输任务</li> </ol> <p>注意:</p> <ul> <li>源存储必须支持列举和读取功能</li> <li>目标存储必须支持写入功能</li> <li>传输过程显示实时进度</li> <li>支持取消正在进行的传输任务</li> </ul>转存 Telegram 之外的文件https://sabot.unv.app/usage/parsers/Mon, 01 Jan 0001 00:00:00 +0000https://sabot.unv.app/usage/parsers/<h1 id="转存-telegram-之外的文件"> 转存 Telegram 之外的文件 <a class="anchor" href="#%e8%bd%ac%e5%ad%98-telegram-%e4%b9%8b%e5%a4%96%e7%9a%84%e6%96%87%e4%bb%b6">#</a> </h1> <p>除了 Telegram 上的文件, Bot 还可通过 JavaScript 插件或内置解析器来支持转存其他网站的文件.</p> <blockquote> <p>查看<a href="../contribute">贡献解析器</a>文档了解详情</p></blockquote> <p>只需向 Bot 发送符合解析器要求的链接即可使用, 当前内置的解析器:</p> <ul> <li>Twitter</li> <li>Kemono</li> </ul>文件命名与重名策略https://sabot.unv.app/usage/config/Mon, 01 Jan 0001 00:00:00 +0000https://sabot.unv.app/usage/config/<h1 id="文件命名与重名策略"> 文件命名与重名策略 <a class="anchor" href="#%e6%96%87%e4%bb%b6%e5%91%bd%e5%90%8d%e4%b8%8e%e9%87%8d%e5%90%8d%e7%ad%96%e7%95%a5">#</a> </h1> <p>SaveAny-Bot 支持在 Telegram 中通过 <code>/config</code> 和 <code>/fnametmpl</code> 命令自定义保存文件的命名方式, 以及处理与已存在文件重名时的冲突策略.</p> <h2 id="config--用户配置"> <code>/config</code> — 用户配置 <a class="anchor" href="#config--%e7%94%a8%e6%88%b7%e9%85%8d%e7%bd%ae">#</a> </h2> <p><code>/config</code> 命令会弹出一个内联菜单, 你可以在其中修改以下两项用户级设置:</p> <ul> <li><strong>文件名策略</strong> — 保存文件的命名方式</li> <li><strong>重名文件保存策略</strong> — 目标存储中已存在同名文件时的处理方式</li> </ul> <p>设置按用户分别保存, 对该用户后续所有的保存/转存任务生效.</p> <h3 id="文件名策略"> 文件名策略 <a class="anchor" href="#%e6%96%87%e4%bb%b6%e5%90%8d%e7%ad%96%e7%95%a5">#</a> </h3> <table> <thead> <tr> <th>选项</th> <th>行为</th> </tr> </thead> <tbody> <tr> <td><code>默认</code></td> <td>使用媒体原始文件名, 没有原始文件名时使用生成名</td> </tr> <tr> <td><code>优先从消息生成</code></td> <td>优先根据消息内容 (如 caption、文本) 生成文件名, 而非原始文件名</td> </tr> <tr> <td><code>自定义模板</code></td> <td>使用 <code>/fnametmpl</code> 设置的自定义模板渲染文件名</td> </tr> </tbody> </table> <h3 id="重名文件保存策略"> 重名文件保存策略 <a class="anchor" href="#%e9%87%8d%e5%90%8d%e6%96%87%e4%bb%b6%e4%bf%9d%e5%ad%98%e7%ad%96%e7%95%a5">#</a> </h3> <table> <thead> <tr> <th>选项</th> <th>行为</th> </tr> </thead> <tbody> <tr> <td><code>始终重命名</code> (默认)</td> <td>保留已有文件, 将新文件以另一个名字保存</td> </tr> <tr> <td><code>每次询问</code></td> <td>每次遇到重名时通过内联按钮提示你选择</td> </tr> <tr> <td><code>始终覆盖</code></td> <td>用新文件替换已有文件</td> </tr> <tr> <td><code>始终跳过</code></td> <td>对重名文件不做处理</td> </tr> </tbody> </table> <blockquote class="book-hint info"> 重名策略仅在能够检测文件是否已存在的存储后端生效. 不支持检测文件是否存在的存储后端会退化为覆盖行为. </blockquote> <h2 id="fnametmpl--自定义文件名模板"> <code>/fnametmpl</code> — 自定义文件名模板 <a class="anchor" href="#fnametmpl--%e8%87%aa%e5%ae%9a%e4%b9%89%e6%96%87%e4%bb%b6%e5%90%8d%e6%a8%a1%e6%9d%bf">#</a> </h2> <p>当文件名策略设置为 <code>自定义模板</code> 时, SaveAny-Bot 会用 <code>/fnametmpl</code> 配置的模板来渲染所保存文件的文件名.</p>HTTP APIhttps://sabot.unv.app/usage/api/Mon, 01 Jan 0001 00:00:00 +0000https://sabot.unv.app/usage/api/<h1 id="http-api"> HTTP API <a class="anchor" href="#http-api">#</a> </h1> <p>SaveAny-Bot 提供了一套 HTTP API,允许你通过程序化方式创建下载/转存任务、查询任务状态、取消任务等,无需通过 Telegram 操作。</p> <h2 id="启用-api"> 启用 API <a class="anchor" href="#%e5%90%af%e7%94%a8-api">#</a> </h2> <p>在 <code>config.toml</code> 中添加或修改以下配置:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#a6e22e">api</span>] </span></span><span style="display:flex;"><span><span style="color:#a6e22e">enable</span> = <span style="color:#66d9ef">true</span> </span></span><span style="display:flex;"><span><span style="color:#a6e22e">host</span> = <span style="color:#e6db74">&#34;0.0.0.0&#34;</span> <span style="color:#75715e"># 监听地址,默认 0.0.0.0</span> </span></span><span style="display:flex;"><span><span style="color:#a6e22e">port</span> = <span style="color:#ae81ff">8080</span> <span style="color:#75715e"># 监听端口,默认 8080</span> </span></span><span style="display:flex;"><span><span style="color:#a6e22e">token</span> = <span style="color:#e6db74">&#34;your-token&#34;</span> <span style="color:#75715e"># 鉴权 Token,强烈建议设置</span> </span></span></code></pre></div><p>也可通过环境变量覆盖(前缀 <code>SAVEANY_</code>):</p> <table> <thead> <tr> <th>环境变量</th> <th>对应配置项</th> </tr> </thead> <tbody> <tr> <td><code>SAVEANY_API_ENABLE</code></td> <td><code>api.enable</code></td> </tr> <tr> <td><code>SAVEANY_API_HOST</code></td> <td><code>api.host</code></td> </tr> <tr> <td><code>SAVEANY_API_PORT</code></td> <td><code>api.port</code></td> </tr> <tr> <td><code>SAVEANY_API_TOKEN</code></td> <td><code>api.token</code></td> </tr> </tbody> </table> <blockquote class="book-hint warning"> 若 `token` 为空,API 服务将**不进行任何鉴权**即可访问,存在安全风险。 </blockquote> <h2 id="鉴权"> 鉴权 <a class="anchor" href="#%e9%89%b4%e6%9d%83">#</a> </h2> <p>当配置了 <code>token</code> 时,所有 API 请求均需在 HTTP 请求头中携带 Bearer Token:</p> <pre tabindex="0"><code>Authorization: Bearer &lt;your-token&gt; </code></pre><p>鉴权失败时返回 <code>401</code>:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ <span style="color:#f92672">&#34;error&#34;</span>: <span style="color:#e6db74">&#34;unauthorized&#34;</span>, <span style="color:#f92672">&#34;message&#34;</span>: <span style="color:#e6db74">&#34;invalid token&#34;</span> } </span></span></code></pre></div><h2 id="错误响应格式"> 错误响应格式 <a class="anchor" href="#%e9%94%99%e8%af%af%e5%93%8d%e5%ba%94%e6%a0%bc%e5%bc%8f">#</a> </h2> <p>所有错误均使用统一的 JSON 格式:</p>命令行子命令https://sabot.unv.app/usage/cli/Mon, 01 Jan 0001 00:00:00 +0000https://sabot.unv.app/usage/cli/<h1 id="命令行子命令"> 命令行子命令 <a class="anchor" href="#%e5%91%bd%e4%bb%a4%e8%a1%8c%e5%ad%90%e5%91%bd%e4%bb%a4">#</a> </h1> <p>除了直接运行 <code>./saveany-bot</code> (不带子命令) 启动 Telegram Bot 外, 这个二进制文件还提供两个把本地文件上传到存储后端的辅助子命令: <code>upload</code> (一次性) 和 <code>watch</code> (持续监听).</p> <p>这些子命令会读取与 Bot 相同的 <code>config.toml</code>, 初始化数据库和缓存, 然后执行任务. 它们<strong>不会</strong>启动 Telegram Bot 本身, 但 <code>telegram</code> 类型的存储会在需要上传时临时启动 Bot 客户端来执行上传.</p> <h2 id="upload--上传单个文件"> <code>upload</code> — 上传单个文件 <a class="anchor" href="#upload--%e4%b8%8a%e4%bc%a0%e5%8d%95%e4%b8%aa%e6%96%87%e4%bb%b6">#</a> </h2> <pre tabindex="0"><code>saveany-bot upload -f &lt;文件&gt; -s &lt;存储名&gt; [-d &lt;目录&gt;] [--no-progress] </code></pre><p>参数:</p> <table> <thead> <tr> <th>参数</th> <th>必填</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td><code>-f, --file</code></td> <td>是</td> <td>待上传的本地文件路径</td> </tr> <tr> <td><code>-s, --storage</code></td> <td>是</td> <td>目标存储名 (必须存在于 <code>config.toml</code>)</td> </tr> <tr> <td><code>-d, --dir</code></td> <td>否</td> <td>存储中的目标目录, 默认使用存储的 <code>base_path</code></td> </tr> <tr> <td><code>--no-progress</code></td> <td>否</td> <td>关闭终端进度条</td> </tr> </tbody> </table> <p>示例:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># 上传文件到 &#34;MyAlist&#34; 的默认目录</span> </span></span><span style="display:flex;"><span>./saveany-bot upload -f ./movie.mp4 -s MyAlist </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># 上传到指定子目录</span> </span></span><span style="display:flex;"><span>./saveany-bot upload -f ./movie.mp4 -s MyAlist -d movies/2026 </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># 通过 Telegram 存储上传并关闭进度条</span> </span></span><span style="display:flex;"><span>./saveany-bot upload -f ./photo.jpg -s MyChannel --no-progress </span></span></code></pre></div><h2 id="watch--监听目录并自动上传"> <code>watch</code> — 监听目录并自动上传 <a class="anchor" href="#watch--%e7%9b%91%e5%90%ac%e7%9b%ae%e5%bd%95%e5%b9%b6%e8%87%aa%e5%8a%a8%e4%b8%8a%e4%bc%a0">#</a> </h2> <p><code>watch</code> 子命令持续监听一个本地目录, 将新建或修改的文件上传到存储后端, 并保留相对监听根目录的子目录结构.</p>安装与更新https://sabot.unv.app/deployment/installation/Mon, 01 Jan 0001 00:00:00 +0000https://sabot.unv.app/deployment/installation/<h1 id="安装与更新"> 安装与更新 <a class="anchor" href="#%e5%ae%89%e8%a3%85%e4%b8%8e%e6%9b%b4%e6%96%b0">#</a> </h1> <h2 id="从预编译文件部署推荐"> 从预编译文件部署(推荐) <a class="anchor" href="#%e4%bb%8e%e9%a2%84%e7%bc%96%e8%af%91%e6%96%87%e4%bb%b6%e9%83%a8%e7%bd%b2%e6%8e%a8%e8%8d%90">#</a> </h2> <p>在 <a href="https://github.com/krau/SaveAny-Bot/releases">Release</a> 页面下载对应平台的二进制文件.</p> <p>在解压后目录新建 <code>config.toml</code> 文件, 参考 <a href="../configuration">配置说明</a> 编辑配置文件</p> <p>运行:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>chmod +x saveany-bot </span></span><span style="display:flex;"><span>./saveany-bot </span></span></code></pre></div><h3 id="进程守护"> 进程守护 <a class="anchor" href="#%e8%bf%9b%e7%a8%8b%e5%ae%88%e6%8a%a4">#</a> </h3> <div class="book-tabs"> <input type="radio" class="toggle" name="tabs-daemon" id="tabs-daemon-0" checked="checked" /> <label for="tabs-daemon-0">systemd (常规 Linux)</label> <div class="book-tabs-content markdown-inner"> 创建文件 <code>/etc/systemd/system/saveany-bot.service</code> 并写入以下内容: <pre><code class="language-text">[Unit] Description=SaveAnyBot After=systemd-user-sessions.service [Service] Type=simple WorkingDirectory=/yourpath/ ExecStart=/yourpath/saveany-bot Restart=always [Install] WantedBy=multi-user.target</code></pre> 设为开机启动并启动服务: <pre><code class="language-text">systemctl enable --now saveany-bot</code></pre> </div> <input type="radio" class="toggle" name="tabs-daemon" id="tabs-daemon-1" /> <label for="tabs-daemon-1">procd (OpenWrt)</label> <div class="book-tabs-content markdown-inner"> <h4>添加开机自启动服务</h4> 创建文件 <code>/etc/init.d/saveanybot</code> ,参考 <a href="https://github.com/krau/SaveAny-Bot/blob/main/docs/confs/wrt_init" target="_blank">wrt_init</a> 并自行修改: <pre><code class="language-text">#!/bin/sh /etc/rc.common #This is the OpenWRT init.d script for SaveAnyBot START=99 STOP=10 description=&amp;#34;SaveAnyBot&amp;#34; WORKING_DIR=&amp;#34;/mnt/mmc1-1/SaveAnyBot&amp;#34; EXEC_PATH=&amp;#34;$WORKING_DIR/saveany-bot&amp;#34; start() { echo &amp;#34;Starting SaveAnyBot...&amp;#34; cd $WORKING_DIR $EXEC_PATH &amp;amp; } stop() { echo &amp;#34;Stopping SaveAnyBot...&amp;#34; killall saveany-bot } reload() { stop start }</code></pre> 赋予权限: <pre><code class="language-text">chmod &#43;x /etc/init.d/saveanybot</code></pre> 然后将文件复制到 <code>/etc/rc.d</code> 并重命名为 <code>S99saveanybot</code>, 同样赋予权限: <pre><code class="language-text">chmod &#43;x /etc/rc.d/S99saveanybot</code></pre> <h4>添加快捷指令</h4> 创建文件 <code>/usr/bin/sabot</code> ,参考 <a href="https://github.com/krau/SaveAny-Bot/blob/main/docs/confs/wrt_bin" target="_blank">wrt_bin</a> 并自行修改,注意此处文件编码仅支持 ANSI 936 . 随后赋予权限: <pre><code class="language-text">chmod &#43;x /usr/bin/sabot</code></pre> 使用: <code>sudo sabot start|stop|restart|status|enable|disable</code> </div> </div> <h2 id="使用-docker-部署"> 使用 Docker 部署 <a class="anchor" href="#%e4%bd%bf%e7%94%a8-docker-%e9%83%a8%e7%bd%b2">#</a> </h2> <h3 id="docker-compose"> Docker Compose <a class="anchor" href="#docker-compose">#</a> </h3> <p>下载 <a href="https://github.com/krau/SaveAny-Bot/blob/main/docker-compose.yml">docker-compose.yml</a> 文件, 在同目录下新建 <code>config.toml</code> 文件, 参考 <a href="https://github.com/krau/SaveAny-Bot/blob/main/config.example.toml">config.example.toml</a> 编辑配置文件.</p>存储端配置https://sabot.unv.app/deployment/configuration/storages/Mon, 01 Jan 0001 00:00:00 +0000https://sabot.unv.app/deployment/configuration/storages/<h1 id="存储端配置"> 存储端配置 <a class="anchor" href="#%e5%ad%98%e5%82%a8%e7%ab%af%e9%85%8d%e7%bd%ae">#</a> </h1> <p>请先阅读 <a href="../">配置说明</a> 了解配置文件的基本格式.</p> <h2 id="alist"> Alist <a class="anchor" href="#alist">#</a> </h2> <p><code>type=alist</code></p> <p>不支持 Stream 模式.</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span><span style="color:#a6e22e">url</span> = <span style="color:#e6db74">&#34;https://alist.example.com&#34;</span> <span style="color:#75715e"># Alist 的 URL</span> </span></span><span style="display:flex;"><span><span style="color:#a6e22e">username</span> = <span style="color:#e6db74">&#34;your_username&#34;</span> <span style="color:#75715e"># Alist 的用户名</span> </span></span><span style="display:flex;"><span><span style="color:#a6e22e">password</span> = <span style="color:#e6db74">&#34;your_password&#34;</span> <span style="color:#75715e"># Alist 的密码</span> </span></span><span style="display:flex;"><span><span style="color:#a6e22e">base_path</span> = <span style="color:#e6db74">&#34;/path/saveanybot&#34;</span> <span style="color:#75715e"># Alist 中的基础路径, 所有文件将存储在此路径下</span> </span></span><span style="display:flex;"><span><span style="color:#a6e22e">token_exp</span> = <span style="color:#ae81ff">3600</span> <span style="color:#75715e"># Alist 访问令牌的自动刷新时间, 单位秒</span> </span></span><span style="display:flex;"><span><span style="color:#a6e22e">token</span> = <span style="color:#e6db74">&#34;your_token&#34;</span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># Alist 的访问令牌, 可选, 如果不设置则使用用户名和密码进行身份验证. </span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># 使用 token 验证时无法自动刷新 token</span> </span></span></code></pre></div><h2 id="本地磁盘"> 本地磁盘 <a class="anchor" href="#%e6%9c%ac%e5%9c%b0%e7%a3%81%e7%9b%98">#</a> </h2> <p><code>type=local</code></p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span><span style="color:#a6e22e">base_path</span> = <span style="color:#e6db74">&#34;./downloads&#34;</span> <span style="color:#75715e"># 本地存储的基础路径, 所有文件将存储在此路径下</span> </span></span></code></pre></div><h2 id="webdav"> WebDAV <a class="anchor" href="#webdav">#</a> </h2> <p><code>type=webdav</code></p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span><span style="color:#a6e22e">url</span> = <span style="color:#e6db74">&#34;https://webdav.example.com&#34;</span> <span style="color:#75715e"># WebDAV 的 URL</span> </span></span><span style="display:flex;"><span><span style="color:#a6e22e">username</span> = <span style="color:#e6db74">&#34;your_username&#34;</span> <span style="color:#75715e"># WebDAV</span> </span></span><span style="display:flex;"><span><span style="color:#a6e22e">password</span> = <span style="color:#e6db74">&#34;your_password&#34;</span> <span style="color:#75715e"># WebDAV 的密码</span> </span></span><span style="display:flex;"><span><span style="color:#a6e22e">base_path</span> = <span style="color:#e6db74">&#34;/path/to/webdav&#34;</span> <span style="color:#75715e"># WebDAV 中的基础路径, 所有文件将存储在此路径下</span> </span></span></code></pre></div><h2 id="s3"> S3 <a class="anchor" href="#s3">#</a> </h2> <p><code>type=s3</code></p>