来!让我们用Vercel来分享你的OneDrive!

正式开始 你可以根据前文免费拿E3,得到至高免费5T的OneDrive存储空间,也可以用你个人永久免费的5G空间,都可以! 前往 高级 - OneDrive Vercel Index 拿到 clientid 和 secret 前往该页面,点击快速部署 onedrive-index/README.zh-CN.md at main · iRedScarf/onedrive-index 填写必须的5个环境变量 其中,USER_PRINCIPAL_NAME为类似 huding@Smartree233.onmicrosoft.com 的电子邮箱,也就是你登陆OneDrive的用户名 Vercel部署完毕后,会报错连不上Redis,因为我们还没创建和绑定,现在我们开始做 前往 https://vercel.com/integrations/upstash 点击 Install 选择你要绑定的Vercel项目,并且设置Redis实例名称 来到Vercel的环境变量页面,这就是绑定成功了 随便打开一个部署,点击 Redeploy 重新部署,就能成功连接数据库了 接下来访问你的项目域名,进入OneDrive-Index的引导,需要打开微软的一个链接授权 授权后会重定向到一个localhost的域名,复制该URI,粘贴回OneDrive-Index即可(仅需一次) 成功部署! 同项目更改OneDrive账号 首先在Vercel上更改这三个环境变量 然后打开 Upstash 找到对应的Redis,删除里面存储的所有Token

November 14, 2025 · 1 min · 40 words

配置 Vercel.json 以支持服务器级别的重定向

正式开始 官方文档: Redirects 在你的仓库根目录创建 vercel.json 写入重定向规则 source 为要重定向的路径,destination 为重定向到的路径/URL,permanent 为一个可选的布尔值,用于在永久重定向和临时重定向之间切换(默认为 true)。当 true 时,状态代码为 308。当 false 时,状态代码为 307。 { "redirects": [ { "source": "/ak", "destination": "https://akile.io/register?aff_code=503fe5ea-e7c5-4d68-ae05-6de99513680e", "permanent": false }, { "source": "/kook", "destination": "https://kook.vip/K29zpT", "permanent": false }, { "source": "/long", "destination": "https://iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii.iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii.in/", "permanent": false }, { "source": "/mly", "destination": "https://muleyun.com/aff/GOTRJLPN", "permanent": false }, { "source": "/tg", "destination": "https://t.me/+_07DERp7k1ljYTc1", "permanent": false }, { "source": "/tit", "destination": "/posts/pin/", "permanent": false }, { "source": "/tly", "destination": "https://tianlicloud.cn/aff/HNNCFKGP", "permanent": false }, { "source": "/wly", "destination": "https://wl.awcmam.com/#/register?code=FNQwOQBM", "permanent": false }, { "source": "/yyb", "destination": "https://www.rainyun.com/acofork_?s=bilibili", "permanent": false } ] }

September 1, 2025 · 1 min · 94 words

N款CDN/静态托管服务商的优缺点比较

Netlify 注册门槛高,需要使用谷歌邮箱注册。支持IPv6回源。用量限制较宽松,仅有带宽和构建时间限制。 我认为是免费计划里最快的CDN!并且限制很少! 需要注意,构建时间是每月限制。但是流量限制较为宽松 因为节点禁Ping,所以这里用Tcping结果展示 推荐CNAME: apex-loadbalancer.netlify.com Vercel 零成本用上。注册无门槛,延迟良好。用量限制较严格。仅支持IPv4回源。默认的 *.vercel.app 在国内会被SNI阻断,需要绑定自己的域名 Vercel每天可以构建100次,每次构建时间不得超过45分钟 推荐IP: 76.76.21.21 EdgeOne CDN 目前处于内测,需要兑换码。获取方式前往 腾讯云EdgeOne免费计划兑换码 - 立即体验 。无流量和请求数限制。 支持高级回源设置 全球可用区(不含中国大陆) 本人博客目前使用的CDN 默认提供的CNAME延迟一般。下图是使用了本人的HK优选: eo.072103.xyz(注: EdgeOne Page不可用) EdgeOne CDN 中国大陆可用区 需要实名认证,需要域名备案 默认CNAME可用 Cloudflare 无流量和请求数限制。无法被打死 戳我查看优选域名 下图使用本人的分流优选: fenliu.072103.xyz Render 注册简单,具有严格的用量限制 Github Page 需要使用Github Action发布。中国大陆大部分地区会间歇性阻断,不推荐使用

July 13, 2025 · 1 min · 44 words

配置Vercel让ITDog测试全部403!

配套视频 https://www.bilibili.com/video/BV1w7GTzMEy7 获取ITDog等拨测服务的IP 因为Vercel不支持IPv6,所以我们只需要获取v4IP 如果你有VPS,直接写一个Py脚本创建一个HTTP服务器记录IP去重即可 如果你只有家里云,可以使用Cloudflare Tunnel,然后获取 CF-Connecting-IP 来曲线救国 结论,你已经获得了你要屏蔽的拨测网站的IP 创建Vercel API Token 前往 https://vercel.com/account/settings/tokens 创建一个Token 抓取防火墙创建/更新接口 前往 https://vercel.com/your-projects/fuwari/firewall 新增规则 随便写点东西然后抓包 PATCH https://vercel.com/api/v1/security/firewall/config/draft?projectId=prj_UfvbpIvawjL2eAETAiZT7hPLR8W2&teamId=team_lemndzHQNJAcTipIF6elB5Md 将主机名 vercel.com 改为 api.vercel.com 。并携带请求头 Authorization ,值为刚才获取的Token 复制刚才的响应并且稍作修改进行测试,看是否能更新成功 可以看到已经200 OK 使用Python脚本创建大批量IP拒绝规则 根据本人测试,Vercel虽然在创建规则的时候有一个 is any of 支持填入多个IP,但是单规则最多只能填写75个,所以我们需要一个Python脚本批量帮我们规划。脚本已经写好 使用: python app.py ip.txt 作用:自动获取指定TXT中的内容并将其中的所有IP添加到拒绝规则 #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Vercel防火墙规则更新脚本 用法: python vercelnoitdog.py xxx.txt """ import sys import json import requests import ipaddress from typing import List, Dict, Any # Vercel API配置 API_BASE_URL = "https://api.vercel.com/v1/security/firewall/config/draft" PROJECT_ID = "prj_UfvbpIvawjL2eAETAiZT7hPLR8W2" TEAM_ID = "team_lemndzHQNJAcTipIF6elB5Md" AUTH_TOKEN = "你的Token" RULE_ID = "rule_noitdog_eGxdcK" # 每组最大IP数量 MAX_IPS_PER_GROUP = 75 def validate_ip_or_cidr(ip_str: str) -> bool: """ 验证IP地址或CIDR格式是否有效 """ try: # 尝试解析为IP地址或网络 ipaddress.ip_address(ip_str) return True except ValueError: try: # 尝试解析为CIDR网络 ipaddress.ip_network(ip_str, strict=False) return True except ValueError: return False def read_ips_from_file(file_path: str) -> List[str]: """ 从文件中读取IP地址和CIDR网段 """ ips = [] invalid_entries = [] try: with open(file_path, 'r', encoding='utf-8') as f: for line_num, line in enumerate(f, 1): ip = line.strip() if ip and not ip.startswith('#'): # 忽略空行和注释 if validate_ip_or_cidr(ip): ips.append(ip) else: invalid_entries.append(f"第{line_num}行: {ip}") print(f"从文件 {file_path} 读取到 {len(ips)} 个有效的IP地址/CIDR网段") if invalid_entries: print(f"⚠️ 发现 {len(invalid_entries)} 个无效条目:") for entry in invalid_entries[:5]: # 只显示前5个 print(f" {entry}") if len(invalid_entries) > 5: print(f" ... 还有 {len(invalid_entries) - 5} 个无效条目") return ips except FileNotFoundError: print(f"错误: 文件 {file_path} 不存在") sys.exit(1) except Exception as e: print(f"读取文件时出错: {e}") sys.exit(1) def chunk_ips(ips: List[str], chunk_size: int = MAX_IPS_PER_GROUP) -> List[List[str]]: """ 将IP列表分组,每组最多包含指定数量的IP """ chunks = [] for i in range(0, len(ips), chunk_size): chunks.append(ips[i:i + chunk_size]) return chunks def create_condition_groups(ip_chunks: List[List[str]]) -> List[Dict[str, Any]]: """ 创建条件组,每个组包含一个IP列表 """ condition_groups = [] for ip_chunk in ip_chunks: condition_group = { "conditions": [ { "op": "inc", "type": "ip_address", "value": ip_chunk } ] } condition_groups.append(condition_group) return condition_groups def create_request_payload(condition_groups: List[Dict[str, Any]]) -> Dict[str, Any]: """ 创建请求负载 """ payload = { "action": "rules.update", "id": RULE_ID, "value": { "name": "noitdog", "active": True, "description": "", "conditionGroup": condition_groups, "action": { "mitigate": { "action": "deny", } } } } return payload def send_request(payload: Dict[str, Any]) -> bool: """ 发送PATCH请求到Vercel API """ url = f"{API_BASE_URL}?projectId={PROJECT_ID}&teamId={TEAM_ID}" headers = { "Authorization": f"Bearer {AUTH_TOKEN}", "Content-Type": "application/json" } try: print(f"发送请求到: {url}") print(f"请求数据: {json.dumps(payload, indent=2, ensure_ascii=False)}") response = requests.patch(url, headers=headers, json=payload) print(f"响应状态码: {response.status_code}") print(f"响应内容: {response.text}") if response.status_code == 200: print("✅ 请求成功") return True else: print(f"❌ 请求失败: {response.status_code} - {response.text}") return False except requests.exceptions.RequestException as e: print(f"❌ 网络请求错误: {e}") return False except Exception as e: print(f"❌ 发送请求时出错: {e}") return False def main(): """ 主函数 """ if len(sys.argv) != 2: print("用法: python vercelnoitdog.py <ip_file.txt>") print("示例: python vercelnoitdog.py ips.txt") sys.exit(1) ip_file = sys.argv[1] # 读取IP地址 ips = read_ips_from_file(ip_file) if not ips: print("❌ 没有找到有效的IP地址或CIDR网段") sys.exit(1) # 去重 unique_ips = list(set(ips)) print(f"去重后共有 {len(unique_ips)} 个唯一IP地址/CIDR网段") # 分组 ip_chunks = chunk_ips(unique_ips) print(f"IP地址被分为 {len(ip_chunks)} 组") for i, chunk in enumerate(ip_chunks, 1): print(f"第 {i} 组: {len(chunk)} 个IP/CIDR") # 创建条件组 condition_groups = create_condition_groups(ip_chunks) # 创建请求负载 payload = create_request_payload(condition_groups) # 发送请求 success = send_request(payload) if success: print("\n🎉 防火墙规则更新成功!") else: print("\n💥 防火墙规则更新失败!") sys.exit(1) if __name__ == "__main__": main() 示例ip.txt ...

July 9, 2025 · 8 min · 1659 words

让Vercel对接你的S3对象存储(仅下载)

视频教程(推荐): https://www.bilibili.com/video/BV17b5gz5Ea4 正式开始 使用方法非常简单,进入GitHub仓库:GitHub - afoim/S3cloudrive-index: S3cloudrive public directory listing. Powered by Next.js. 按照README部署即可 原理 采用Vercel Function登录S3,获取文件列表传递给前端拼接URL显示,原项目是对接的OneDrive:iRedScarf/onedrive-index: OneDrive public directory listing, and One-Click Deploy to Vercel. Powered by Vercel and Next.js.。本项目仅更改了后端对接的存储类型,理论上你可以三改后对接任意存储… 本人想对接天翼云盘PC的驱动,但是登录鉴权一直不会做,有没有人来帮帮我()

May 4, 2025 · 1 min · 32 words

Github全站反向代理搭建指南

引言 由于网络原因,国内访问Github经常遇到各种问题。本文将带你从原理到实践,搭建一个属于自己的Github全站反向代理。 为什么不能只用透明代理? 针对Github这样的网站,我们无法仅使用一个简单的透明反向代理指向 github.com 来解决,原因有两点: 1. 外域依赖问题 Github官网有许多外域依赖,比如 raw.githubusercontent.com、avatars.githubusercontent.com 等。如果只代理主域名,这些资源请求会直接访问原站,导致加载失败。 2. 钓鱼风险 注意!直接反代主流网站后,不久你的网站就会被Cloudflare标记为钓鱼站点,因为你原封不动的克隆了人家站点并且 没有显式屏蔽登录页面。 解决方案:透明代理 + HTML覆写 核心思路 我们需要实现两个关键功能: 透明代理:将请求转发到Github服务器 HTML覆写:重写Github返回的HTML,将其中的外域改为我们自己的域 请求流程对比 原始流程: 用户 -> github.com -> raw.githubusercontent.com(被github.com请求) 代理流程: 用户 -> gh.072103.xyz -> raw-githubusercontent-com.072103.xyz(被gh.072103.xyz请求) 对于 gh.072103.xyz 的请求由代理服务转发到 github.com,而针对于 raw-githubusercontent-com.072103.xyz 的请求则转发到 raw.githubusercontent.com。 域名映射配置 你需要配置类似这样的域名映射: const domain_mappings = { 'github.com': 'gh.', 'avatars.githubusercontent.com': 'avatars-githubusercontent-com.', 'github.githubassets.com': 'github-githubassets-com.', 'collector.github.com': 'collector-github-com.', 'api.github.com': 'api-github-com.', 'raw.githubusercontent.com': 'raw-githubusercontent-com.', 'gist.githubusercontent.com': 'gist-githubusercontent-com.', 'github.io': 'github-io.', 'assets-cdn.github.com': 'assets-cdn-github-com.', 'cdn.jsdelivr.net': 'cdn.jsdelivr-net.', 'securitylab.github.com': 'securitylab-github-com.', 'www.githubstatus.com': 'www-githubstatus-com.', 'npmjs.com': 'npmjs-com.', 'git-lfs.github.com': 'git-lfs-github-com.', 'githubusercontent.com': 'githubusercontent-com.', 'github.global.ssl.fastly.net': 'github-global-ssl-fastly-net.', 'api.npms.io': 'api-npms-io.', 'github.community': 'github-community.' }; 假如你的域名为 abc.com,你需要将以下子域名绑定到你的代理服务: gh.abc.com avatars-githubusercontent-com.abc.com raw-githubusercontent-com.abc.com …等等 防钓鱼措施 我们需要找到原站点的所有登录页逐一屏蔽,对于Github.com,我们需要屏蔽: ...

April 14, 2025 · 4 min · 764 words

Netlify、Vercel反代网站

原理思路 现阶段大部分家宽拿不到公网IPv4,但是可以拿到公网IPv6,借助Netlify做一个v6 -> v4的回源就可以让所有人都访问到你的站点了。同时这也是一个Netlify的通用反代教程。本文还教了Vercel的通用反代教程,不过这玩意在2025年仍然不支持IPv6,只能拿来反代小黄站了ToT 正式开始 Netlify篇 首先前往 https://app.netlify.com/ 注册账号。(注意!最好使用谷歌邮箱去注册,其他方式注册可能会出现什么你的账号需要验证/激活,然后巴拉巴拉很麻烦) 接下来去Github开一个新仓库,根目录创建一个 netlify.toml。在其中写入 [[redirects]] from = "/*" to = "http://反代域名:反代端口/:splat" status = 200 force = true 注意,端口后面的斜杠一定不要丢! 家宽v6网站建议搭配DDNS食用 接下来回到 https://app.netlify.com/ 创建一个新项目,导入你刚创建的Github项目,部署即可 最后绑定一下你的域名,完成! Vercel篇 首先前往 https://vercel.com/ 注册并登录你的账号 电脑安装Nodejs,我们需要用到npm 安装Vercel CLI npm i -g vercel 登录Vercel CLI vercel login 找个地方(比如桌面)创建一个你随意命名的文件夹,然后在其中创建一个你随意命名的.json文件,其中写入。注意,目前Vercel不支持反代IPv6!!! { "version": 2, "routes": [ {"src": "/(.*)","dest": "https://反代域名:端口"} ] } 然后部署 verceL -A 你随意命名的.json --prod 最后绑定一下你的域名,完成!

April 3, 2025 · 1 min · 62 words