# images 本仓库用于存放图片,作为 [图床](https://images.poneding.com) 使用。 ## 加速代理 本仓库中的图片可以通过 [`raw.githubusercontent.com`](https://raw.githubusercontent.com/poneding/images/master/README.md) 访问,但是国内的访问速度不理想,我们可以使用 Cloudflare Workers 代理 GitHub 用户仓库中的图片,实现图片加速。 创建 CloudFlare Worker,js 代码如下: ```javascript // Website you intended to retrieve for users. const upstream = "raw.githubusercontent.com"; // Custom pathname for the upstream website. // (1) 填写代理的路径,格式为 /<用户>/<仓库名>/<分支> const upstream_path = "/poneding/images/master"; // github personal access token. // (2) 填写github令牌 const github_token = "[GITHUB_TOKEN]]"; // Website you intended to retrieve for users using mobile devices. const upstream_mobile = upstream; // Countries and regions where you wish to suspend your service. const blocked_region = []; // IP addresses which you wish to block from using your service. const blocked_ip_address = ["0.0.0.0", "127.0.0.1"]; // Whether to use HTTPS protocol for upstream address. const https = true; // Whether to disable cache. const disable_cache = false; // Replace texts. const replace_dict = { $upstream: "$custom_domain", }; addEventListener("fetch", (event) => { event.respondWith(fetchAndApply(event.request)); }); async function fetchAndApply(request) { const region = request.headers.get("cf-ipcountry")?.toUpperCase(); const ip_address = request.headers.get("cf-connecting-ip"); const user_agent = request.headers.get("user-agent"); let response = null; let url = new URL(request.url); let url_hostname = url.hostname; if (https == true) { url.protocol = "https:"; } else { url.protocol = "http:"; } if (await device_status(user_agent)) { var upstream_domain = upstream; } else { var upstream_domain = upstream_mobile; } url.host = upstream_domain; if (url.pathname == "/") { url.pathname = upstream_path; } else { url.pathname = upstream_path + url.pathname; } if (blocked_region.includes(region)) { response = new Response( "Access denied: WorkersProxy is not available in your region yet.", { status: 403, } ); } else if (blocked_ip_address.includes(ip_address)) { response = new Response( "Access denied: Your IP address is blocked by WorkersProxy.", { status: 403, } ); } else { let method = request.method; let request_headers = request.headers; let new_request_headers = new Headers(request_headers); new_request_headers.set("Host", upstream_domain); new_request_headers.set("Referer", url.protocol + "//" + url_hostname); new_request_headers.set("Authorization", "token " + github_token); let original_response = await fetch(url.href, { method: method, headers: new_request_headers, body: request.body, }); connection_upgrade = new_request_headers.get("Upgrade"); if (connection_upgrade && connection_upgrade.toLowerCase() == "websocket") { return original_response; } let original_response_clone = original_response.clone(); let original_text = null; let response_headers = original_response.headers; let new_response_headers = new Headers(response_headers); let status = original_response.status; if (disable_cache) { new_response_headers.set("Cache-Control", "no-store"); } else { new_response_headers.set("Cache-Control", "max-age=43200000"); } new_response_headers.set("access-control-allow-origin", "*"); new_response_headers.set("access-control-allow-credentials", true); new_response_headers.delete("content-security-policy"); new_response_headers.delete("content-security-policy-report-only"); new_response_headers.delete("clear-site-data"); if (new_response_headers.get("x-pjax-url")) { new_response_headers.set( "x-pjax-url", response_headers .get("x-pjax-url") .replace("//" + upstream_domain, "//" + url_hostname) ); } const content_type = new_response_headers.get("content-type"); if ( content_type != null && content_type.includes("text/html") && content_type.includes("UTF-8") ) { original_text = await replace_response_text( original_response_clone, upstream_domain, url_hostname ); } else { original_text = original_response_clone.body; } response = new Response(original_text, { status, headers: new_response_headers, }); } return response; } async function replace_response_text(response, upstream_domain, host_name) { let text = await response.text(); var i, j; for (i in replace_dict) { j = replace_dict[i]; if (i == "$upstream") { i = upstream_domain; } else if (i == "$custom_domain") { i = host_name; } if (j == "$upstream") { j = upstream_domain; } else if (j == "$custom_domain") { j = host_name; } let re = new RegExp(i, "g"); text = text.replace(re, j); } return text; } async function device_status(user_agent_info) { var agents = [ "Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod", ]; var flag = true; for (var v = 0; v < agents.length; v++) { if (user_agent_info.indexOf(agents[v]) > 0) { flag = false; break; } } return flag; } ``` > 注意:`upstream_path` 需要填写代理的路径,格式为 `/<用户>/<仓库名>/<分支>`,`github_token` 需要填写 GitHub 个人访问令牌,需要勾选 `repo` 权限。 为 CloudFlare Worker 添加自定义域 `images.poneding.com`(域名需要托管在 CloudFlare 上,这一步完成之后,CloudFlare 会自动为域名添加 DNS 解析记录)。 ## PicGo 配置 建议使用 PicGo 上传图片,PicGo 支持使用 GitHub 图床上传图片,配置参考如下: ```yaml { "picBed": { "current": "github", "uploader": "github", "github": { "repo": "poneding/images", "branch": "master", "token": "[GITHUB_TOKEN]", "path": "2023/11/", "customUrl": "https://images.poneding.com" } }, } ``` > 注意:`token` 需要使用 GitHub 个人访问令牌,需要勾选 `repo` 权限。