├── LICENSE ├── README.md └── deno_index.ts /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Good li 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # astrbot2github 2 | 3 | [![Visitors](https://visitor-badge.laobi.icu/badge?page_id=lxfight.astrbot2github)](https://visitor-badge.laobi.icu) 4 | 5 | 为 [AstrBot](https://github.com/AstrBotDevs/AstrBot) 用户打造的 GitHub 加速代理服务,基于免费且强大的 [Deno Deploy](https://deno.com/deploy) 平台。 6 | 7 | ## 你是否遇到过这种情况? 8 | 9 | > * 在服务器上部署了心爱的 AstrBot 10 | > * 兴冲冲地打开插件市场,准备扩展功能 11 | > * 精心挑选了几个看起来很棒的插件 12 | > * 点击“安装”... 却无情地看到... 13 | > * **安装失败!** 😭 14 | 15 | 更令人沮丧的是,即使尝试了 AstrBot 设置中提供的官方 GitHub 代理地址,问题依旧无法解决?这通常是因为网络环境复杂,导致你的服务器无法稳定连接到 GitHub 或其资源。 16 | 17 | ## 解决方案:astrbot2github ✨ 18 | 19 | 本项目 `astrbot2github` 提供了一个简单、免费且有效的解决方案: 20 | 21 | 利用 Deno Deploy 的全球边缘网络为你创建一个专属的 GitHub 资源代理。只需简单几步部署,即可显著提高 AstrBot 插件的下载和安装成功率。 22 | 23 | ## 主要特性 24 | 25 | * 🚀 **加速访问**: 通过 Deno Deploy 全球节点代理 GitHub 请求,有效解决网络问题。 26 | * 🆓 **免费部署**: 利用 Deno Deploy 的慷慨免费套餐,零成本搭建和运行。 27 | * 🔧 **一键部署**: 提供 Deno Deploy 按钮,简化部署流程。 28 | * 🎯 **精准适配**: 专门针对 AstrBot 获取插件列表 (`market.json`) 和下载插件 `.zip` 包的模式进行了优化。 29 | * 🔒 **专属服务**: 你将拥有一个自己控制的、独立的代理服务地址。 30 | 31 | ## 部署与使用教程 32 | 33 | 按照以下步骤,轻松部署你自己的 AstrBot GitHub 加速服务: 34 | 35 | 1. **(可选但推荐)** 给本项目点个 [**Star ⭐**](https://github.com/lxfight/astrbot2github),你的支持是作者更新和维护的动力! 36 | 2. **Fork 本项目**: 点击页面右上角的 [**Fork**](https://github.com/lxfight/astrbot2github/fork) 按钮,将此项目复刻到你自己的 GitHub 账号下。 37 | 3. **登录 Deno Deploy**: 访问 [Deno Deploy](https://dash.deno.com/) 并使用你的 GitHub 账号登录(如果尚未注册,会自动引导注册)。 38 | 4. **创建新项目**: 39 | * 点击 **New Project** (或 **新建项目**)。 40 | * 选择 **Deploy from GitHub repository** (带有 GitHub 图标的那个选项)。 41 | * 授权 Deno Deploy 访问你的 GitHub 仓库。 42 | 5. **选择仓库**: 在仓库列表中,找到并选择你刚刚 Fork 的 `astrbot2github` 项目。 43 | 6. **配置部署**: 44 | * **Production Branch**: 保持默认 (`main`) 即可。 45 | * **Entrypoint**: **这是关键步骤!** 点击下拉框,找到并选择 `deno_index.ts` 文件作为入口点。 46 | * **Project Name**: Deno 会自动生成一个项目名称,这将是你的服务地址的一部分。你可以保留自动生成的名称 (例如 `fluffy-donkey-12`),也可以自定义一个**全局唯一**的名称 (例如 `my-astrbot-proxy`)。 记下这个名称,你的服务最终地址将是 `https://<你的项目名>.deno.dev`。 47 | 7. **开始部署**: 确认设置无误后,点击 **Link** 或 **Deploy** 按钮。Deno 将自动拉取代码、构建并部署你的服务。稍等片刻即可完成。 48 | 8. **获取服务地址**: 部署成功后,页面会显示你的服务地址,格式为 `https://<第6步设置的项目名>.deno.dev`。复制这个地址。 49 | 9. **配置 AstrBot**: 50 | * 回到你的 AstrBot WebUI。 51 | * 进入 **设置 (Settings)** 页面。 52 | * 找到 **GitHub 加速地址 (GitHub Proxy)** 53 | * 将**第 8 步**复制的 Deno 服务地址完整粘贴进去。 54 | 55 | 🎉 **完成!** 现在 AstrBot 在访问插件市场和下载插件时,将会通过你刚刚部署的 Deno 服务进行代理。 56 | 57 | ## 验证部署 58 | 59 | 部署完成后,你可以通过直接在浏览器中访问你的 Deno 服务地址来验证是否成功: 60 | 61 | `https://<你的项目名>.deno.dev` 62 | 63 | 如果页面显示 `此地址只用于为astrbot提供更快速的github访问服务` 的信息,则表示你的代理服务已成功部署并正在运行。 64 | 65 | ## 注意事项 66 | 67 | * **专为 AstrBot 设计**: 本项目主要解决了 AstrBot 在下载插件 `.zip` 包 (`/raw/` 或 `/archive/`) 时可能遇到的网络问题。它针对 AstrBot 的特定请求路径进行了优化,并非一个通用的 GitHub 网站或 API 代理。 68 | * **Deno Deploy 免费额度**: Deno Deploy 提供非常慷慨的免费套餐(包括每月大量的请求数和数据传输量),对于 AstrBot 的使用场景通常绰绰有余。但仍需注意,超出免费额度可能会产生费用或服务受限,请自行查阅 [Deno Deploy Pricing](https://deno.com/deploy/pricing)。 69 | * **更新**: 如果本项目有重要更新,你可能需要同步你 Fork 的仓库,Deno Deploy 通常会自动重新部署更新后的代码。 70 | 71 | --- 72 | 73 | 希望这个 `astrbot2github` 项目能帮助你顺畅地使用 AstrBot 插件市场!如果遇到问题,欢迎提出 Issue。 74 | -------------------------------------------------------------------------------- /deno_index.ts: -------------------------------------------------------------------------------- 1 | import { serve } from "https://deno.land/std@0.155.0/http/server.ts"; // 或更新到最新稳定版,如 @0.224.0 2 | 3 | async function handler(req: Request): Promise { 4 | const incomingUrl = new URL(req.url); 5 | if (incomingUrl.pathname === "/") { 6 | return new Response( 7 | "此地址只用于为astrbot提供更快速的github访问服务", 8 | { 9 | status: 200, // OK 10 | headers: { "Content-Type": "text/plain; charset=utf-8" }, 11 | } 12 | ); 13 | } 14 | // 1. 从请求路径中提取目标 URL 15 | // - incomingUrl.pathname 会是像 "/https://github.com/..." 这样的形式 16 | // - slice(1) 去掉开头的 "/" 17 | // - decodeURIComponent 处理路径中可能存在的 URL 编码 (例如 %2F) 18 | const targetUrlString = decodeURIComponent(incomingUrl.pathname.slice(1)); 19 | 20 | // 2. 验证提取出的字符串是否看起来像一个有效的 URL 21 | if (!targetUrlString || (!targetUrlString.startsWith("http://") && !targetUrlString.startsWith("https://"))) { 22 | // 如果路径为空或者不是以 http/https 开头,则返回错误 23 | return new Response("Invalid or missing target URL in path. Usage: /", { 24 | status: 400, // Bad Request 25 | headers: { "Content-Type": "text/plain; charset=utf-8" }, 26 | }); 27 | } 28 | 29 | console.log(`Proxying request to: ${targetUrlString}`); // 打印日志,方便调试 30 | 31 | try { 32 | // 3. 使用提取出的目标 URL 发起 fetch 请求 33 | // 并将原始请求的方法、头信息、请求体都转发过去 34 | const response = await fetch(targetUrlString, { 35 | headers: req.headers, // 转发原始请求头 36 | method: req.method, // 转发原始请求方法 37 | body: req.body, // 转发原始请求体 (支持流式传输) 38 | redirect: 'manual', // 重要:不自动处理重定向,将 3xx 响应返回给客户端处理 39 | // 或者设为 'follow' 让代理服务器处理重定向 40 | }); 41 | 42 | // 4. 返回从目标服务器获取的响应 43 | // 为了允许跨域请求 (例如浏览器 JS 调用此代理),添加 CORS 头 44 | const responseHeaders = new Headers(response.headers); // 复制响应头以便修改 45 | responseHeaders.set("Access-Control-Allow-Origin", "*"); // 允许任何来源访问 46 | responseHeaders.set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); // 允许的方法 47 | responseHeaders.set("Access-Control-Allow-Headers", "Content-Type, Authorization, *"); // 允许的请求头 48 | // 可以根据需要更精细地控制 CORS 头 49 | 50 | // 处理浏览器的 OPTIONS 预检请求 51 | if (req.method === "OPTIONS") { 52 | return new Response(null, { 53 | status: 204, // No Content 54 | headers: responseHeaders 55 | }); 56 | } 57 | 58 | // 直接返回目标服务器的响应体、状态码和处理过的头信息 59 | return new Response(response.body, { 60 | status: response.status, 61 | statusText: response.statusText, 62 | headers: responseHeaders, 63 | }); 64 | 65 | } catch (error) { 66 | // 5. 处理 fetch 过程中可能发生的错误 (例如网络问题、目标服务器无法访问) 67 | console.error(`Error fetching ${targetUrlString}:`, error); 68 | return new Response(`Failed to proxy request to ${targetUrlString}: ${error.message}`, { 69 | status: 502, // Bad Gateway 70 | headers: { "Content-Type": "text/plain; charset=utf-8" }, 71 | }); 72 | } 73 | } 74 | 75 | console.log("此地址只用于帮助astrbot更快的连接github"); // Deno Deploy 会自动使用 $PORT 76 | // 监听端口 8000 (本地) 或 Deno Deploy 指定的端口 77 | serve(handler); 78 | --------------------------------------------------------------------------------