在 Cloudflare Workers 中实现修改阿里云策略的功能是可行的。Cloudflare Workers 是一个无服务器平台,支持使用 JavaScript 编写代码并运行在 Cloudflare 的边缘节点上。可以通过 Workers 调用阿里云的 API 来实现策略修改。
以下是实现步骤和示例代码:
实现步骤
获取阿里云 API 的 AccessKey:
登录阿里云控制台,创建 AccessKey(AccessKey ID 和 AccessKey Secret)。
确保 AccessKey 有权限执行相关操作(如修改安全组规则)。
编写 Cloudflare Worker 代码:
使用 JavaScript 编写 Worker 代码,调用阿里云 API。
使用
fetch
或axios
发送 HTTP 请求。部署 Worker:
将代码部署到 Cloudflare Workers。并在workers中配置变量。
accessKeyId = '你的AccessKey ID';accessKeySecret = '你的AccessKey Secret';regionId = 'cn-hangzhou'; // 区域 IDsecurityGroupId = 'sg-xxxxxx'; // 安全组 ID测试 Worker:
通过 HTTP 请求触发 Worker,验证功能是否正常。
1.直接访问,返回访问ip
2.新增了一个接口ctt,可以显示区域:

// Cloudflare Worker 入口addEventListener('fetch', (event) => {event.respondWith(handleRequest(event.request));});async function handleRequest(request) {try {解析请求参数const url = new URL(request.url);const { pathname } = new URL(request.url);const country = request.headers.get("cf-ipcountry");const city = request.headers.get("cf-ipcity");const asn = request.headers.get("x-asn");const action = url.searchParams.get('action'); // 操作类型(如 authorize/revoke)var ip = url.searchParams.get('ip'); // 允许的 IP 地址const userip = request.headers.get('CF-Connecting-IP'); // 客户访问ipconst port = url.searchParams.get('port'); // 端口号var desc = url.searchParams.get('desc'); // 注释// 如果未传递ip,则使用useripif (!ip) {ip = userip;}// 如未传递desc,则赋值一个文本if (!desc) {desc = `Cloudflare Allow IP:${ip}`;}if (pathname === "/ctt") {return new Response(`${desc}:${pathname}:${country}:${city}:${asn}`, { status: 500 });}if (!action || !port) {return new Response(`${ip}`, { status: 500 });}// 调用阿里云 APIif (pathname === "/api") {const result = await callAliyunAPI(action, ip, port, desc);// 返回结果return new Response(JSON.stringify(result), {headers: { 'Content-Type': 'application/json' },});}} catch (error) {return new Response(`Error: ${error.message}`, { status: 500 });}}// 调用阿里云 API 的函数async function callAliyunAPI(action, ip, port, desc) {//修改为在workers中添加变量//const accessKeyId = //'你的AccessKey ID';//const accessKeySecret = '你的AccessKey Secret';//const regionId = 'cn-hangzhou'; // 区域 ID//const securityGroupId = 'sg-xxxxxx'; // 安全组 ID// 阿里云 API 的公共参数const commonParams = {Format: 'JSON',Version: '2014-05-26', // API 版本AccessKeyId: accessKeyId,SignatureMethod: 'HMAC-SHA1',Timestamp: new Date().toISOString().replace(/\.\d+Z$/, 'Z'),SignatureVersion: '1.0',SignatureNonce: Math.random().toString(36).substring(7),RegionId: regionId,SecurityGroupId: securityGroupId,IpProtocol: 'tcp',PortRange: `${port}/${port}`,SourceCidrIp: ip,Policy: 'accept',Priority: 1,NicType: 'internet',Description: desc,};// 根据操作类型设置 API 名称const apiName = action === 'authorize' ? 'AuthorizeSecurityGroup' : 'RevokeSecurityGroup';commonParams.Action = apiName;// 生成签名const signature = await generateSignature(commonParams, accessKeySecret);commonParams.Signature = signature;// 发送请求const apiUrl = 'https://ecs.aliyuncs.com/';const response = await fetch(apiUrl, {method: 'POST',headers: { 'Content-Type': 'application/x-www-form-urlencoded' },body: new URLSearchParams(commonParams),});return response.json();}// 使用 Web Crypto API 生成签名的函数async function generateSignature(params, accessKeySecret) {// 将参数排序并编码const sortedParams = Object.keys(params).sort().map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`).join('&');// 构造待签名的字符串const stringToSign = `POST&%2F&${encodeURIComponent(sortedParams)}`;// 使用 Web Crypto API 生成 HMAC-SHA1 签名const encoder = new TextEncoder();const key = await crypto.subtle.importKey('raw',encoder.encode(accessKeySecret + '&'),{ name: 'HMAC', hash: 'SHA-1' },false,['sign']);const signatureArray = await crypto.subtle.sign('HMAC', key, encoder.encode(stringToSign));// 将签名转换为 Base64const signatureBase64 = btoa(String.fromCharCode(...new Uint8Array(signatureArray)));return signatureBase64;}
文章转载自老柴杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




