CF创建workers,黏贴代码
// 部署完成后在网址后面加上这个,获取订阅器默认节点,/auto
let mytoken= 'auto';//快速订阅访问入口, 留空则不启动快速订阅
// 设置优选地址,不带端口号默认443,不支持非TLS订阅生成
let addresses = [
'icook.tw:2053#优选域名',
'cloudflare.cfgo.cc#优选官方线路',
'icook.hk:8443#香港',
'cfip.xxxxxxxx.tk#官方优选-otc提供',
'hk.100366.xyz#香港',
];
// 设置优选地址api接口
let addressesapi = [
'https://raw.githubusercontent.com/dockkkk/CF-WORKERS/main/ip.txt' //可参考内容格式 自行搭建。
];
let DLS = 4;//速度下限
let addressescsv = [
//'https://raw.githubusercontent.com/dockkkk/CF-WORKERS/main/result.csv' //iptest测速结果文件。
];
let subconverter = "api.v1.mk"; //在线订阅转换后端,目前使用肥羊的订阅转换功能。支持自建psub 可自行搭建https://github.com/bulianglin/psub
let subconfig = "https://github.com/ACL4SSR/ACL4SSR/blob/master/Clash/config/ACL4SSR.ini"; //订阅配置文件
let link = '';
let edgetunnel = 'ed';
let RproxyIP = 'false';
let proxyIPs = [
'proxyip.aliyun.fxxk.dedyn.io',
'proxyip.multacom.fxxk.dedyn.io',
'proxyip.vultr.fxxk.dedyn.io',
];
let CMproxyIPs = [
{ proxyIP: "proxyip.fxxk.dedyn.io", type: "HK" },
];
let BotToken ='';
let ChatID ='';
let proxyhosts = [//本地代理域名池
//'ppfv2tl9veojd-maillazy.pages.dev',
];
let proxyhostsURL = 'https://raw.githubusercontent.com/cmliu/CFcdnVmess2sub/main/proxyhosts';//在线代理域名池URL
let EndPS = '';//节点名备注内容
async function sendMessage(type, ip, add_data = "") {
if ( BotToken !== '' && ChatID !== ''){
let msg = "";
const response = await fetch(`http://ip-api.com/json/${ip}?lang=zh-CN`);
if (response.status == 200) {
const ipInfo = await response.json();
msg = `${type}\nIP: ${ip}\n国家: ${ipInfo.country}\n<tg-spoiler>城市: ${ipInfo.city}\n组织: ${ipInfo.org}\nASN: ${ipInfo.as}\n${add_data}`;
} else {
msg = `${type}\nIP: ${ip}\n<tg-spoiler>${add_data}`;
}
let url = "https://api.telegram.org/bot"+ BotToken +"/sendMessage?chat_id=" + ChatID + "&parse_mode=HTML&text=" + encodeURIComponent(msg);
return fetch(url, {
method: 'get',
headers: {
'Accept': 'text/html,application/xhtml+xml,application/xml;',
'Accept-Encoding': 'gzip, deflate, br',
'User-Agent': 'Mozilla/5.0 Chrome/90.0.4430.72'
}
});
}
}
async function getAddressesapi() {
if (!addressesapi || addressesapi.length === 0) {
return [];
}
let newAddressesapi = [];
for (const apiUrl of addressesapi) {
try {
const response = await fetch(apiUrl);
if (!response.ok) {
console.error('获取地址时出错:', response.status, response.statusText);
continue;
}
const text = await response.text();
const lines = text.split('\n');
const regex = /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(:\d+)?(#.*)?$/;
const apiAddresses = lines.map(line => {
const match = line.match(regex);
return match ? match[0] : null;
}).filter(Boolean);
newAddressesapi = newAddressesapi.concat(apiAddresses);
} catch (error) {
console.error('获取地址时出错:', error);
continue;
}
}
return newAddressesapi;
}
async function getAddressescsv() {
if (!addressescsv || addressescsv.length === 0) {
return [];
}
let newAddressescsv = [];
for (const csvUrl of addressescsv) {
try {
const response = await fetch(csvUrl);
if (!response.ok) {
console.error('获取CSV地址时出错:', response.status, response.statusText);
continue;
}
const text = await response.text();// 使用正确的字符编码解析文本内容
const lines = text.split('\n');
// 检查CSV头部是否包含必需字段
const header = lines[0].split(',');
const tlsIndex = header.indexOf('TLS');
const speedIndex = header.length - 1; // 最后一个字段
const ipAddressIndex = 0;// IP地址在 CSV 头部的位置
const portIndex = 1;// 端口在 CSV 头部的位置
const dataCenterIndex = tlsIndex + 1; // 数据中心是 TLS 的后一个字段
if (tlsIndex === -1) {
console.error('CSV文件缺少必需的字段');
continue;
}
// 从第二行开始遍历CSV行
for (let i = 1; i < lines.length; i++) {
const columns = lines[i].split(',');
// 检查TLS是否为"TRUE"且速度大于DLS
if (columns[tlsIndex].toUpperCase() === 'TRUE' && parseFloat(columns[speedIndex]) > DLS) {
const ipAddress = columns[ipAddressIndex];
const port = columns[portIndex];
const dataCenter = columns[dataCenterIndex];
const formattedAddress = `${ipAddress}:${port}#${dataCenter}`;
newAddressescsv.push(formattedAddress);
}
}
} catch (error) {
console.error('获取CSV地址时出错:', error);
continue;
}
}
return newAddressescsv;
}
let protocol;
export default {
async fetch (request, env) {
mytoken = env.TOKEN || mytoken;
BotToken = env.TGTOKEN || BotToken;
ChatID = env.TGID || ChatID;
subconverter = env.SUBAPI || subconverter;
subconfig = env.SUBCONFIG || subconfig;
const userAgentHeader = request.headers.get('User-Agent');
const userAgent = userAgentHeader ? userAgentHeader.toLowerCase() : "null";
const url = new URL(request.url);
const format = url.searchParams.get('format') ? url.searchParams.get('format').toLowerCase() : "null";
let host = "";
let uuid = "";
let path = "";
if (mytoken !== '' && url.pathname.includes(mytoken)) {
host = env.HOST || "edgetunnel-2z2.pages.dev";
uuid = env.UUID || "30e9c5c8-ed28-4cd9-b008-dc67277f8b02";
path = env.PATH || "/?ed=2048";
edgetunnel = env.ED || edgetunnel;
RproxyIP = env.RPROXYIP || RproxyIP;
const hasSos = url.searchParams.has('sos');
if (hasSos) {
const hy2Url = "https://hy2sub.pages.dev";
try {
const subconverterResponse = await fetch(hy2Url);
if (!subconverterResponse.ok) {
throw new Error(`Error fetching lzUrl: ${subconverterResponse.status} ${subconverterResponse.statusText}`);
}
const base64Text = await subconverterResponse.text();
link = atob(base64Text); // 进行 Base64 解码
} catch (error) {
// 错误处理
}
}
await sendMessage("#获取订阅", request.headers.get('CF-Connecting-IP'), `UA: ${userAgent}</tg-spoiler>\n域名: ${url.hostname}\n<tg-spoiler>入口: ${url.pathname + url.search}</tg-spoiler>`);
} else {
host = url.searchParams.get('host');
uuid = url.searchParams.get('uuid');
path = url.searchParams.get('path');
if (!url.pathname.includes("/sub")) {
const responseText = `
路径必须包含 "/sub"
The path must contain "/sub"
مسیر باید شامل "/sub" باشد
${url.origin}/sub?host=[your host]&uuid=[your uuid]&path=[your path]
https://github.com/dockkkk/CF-WORKERS
`;
return new Response(responseText, {
status: 400,
headers: { 'content-type': 'text/plain; charset=utf-8' },
});
}
if (!host || !uuid) {
const responseText = `
缺少必填参数:host 和 uuid
Missing required parameters: host and uuid
پارامترهای ضروری وارد نشده: هاست و یوآیدی
${url.origin}/sub?host=[your host]&uuid=[your uuid]&path=[your path]
https://t.me/tweekpiao
`;
return new Response(responseText, {
status: 400,
headers: { 'content-type': 'text/plain; charset=utf-8' },
});
}
if (!path || path.trim() === '') {
path = '/?ed=2048';
} else {
// 如果第一个字符不是斜杠,则在前面添加一个斜杠
path = (path[0] === '/') ? path : '/' + path;
}
}
if (userAgent.includes('telegram') || userAgent.includes('twitter') || userAgent.includes('miaoko')) {
return new Response('Hello World!');
} else if (userAgent.includes('clash') || (format === 'clash' && !userAgent.includes('subconverter'))) {
const subconverterUrl = `https://${subconverter}/sub?target=clash&url=${encodeURIComponent(request.url)}&insert=false&config=${encodeURIComponent(subconfig)}&emoji=true&list=false&tfo=false&scv=false&fdn=false&sort=false&new_name=true`;
try {
const subconverterResponse = await fetch(subconverterUrl);
if (!subconverterResponse.ok) {
throw new Error(`Error fetching subconverterUrl: ${subconverterResponse.status} ${subconverterResponse.statusText}`);
}
const subconverterContent = await subconverterResponse.text();
return new Response(subconverterContent, {
headers: { 'content-type': 'text/plain; charset=utf-8' },
});
} catch (error) {
return new Response(`Error: ${error.message}`, {
status: 500,
headers: { 'content-type': 'text/plain; charset=utf-8' },
});
}
} else if (userAgent.includes('sing-box') || userAgent.includes('singbox') || (format === 'singbox' && !userAgent.includes('subconverter'))){
const subconverterUrl = `https://${subconverter}/sub?target=singbox&url=${encodeURIComponent(request.url)}&insert=false&config=${encodeURIComponent(subconfig)}&emoji=true&list=false&tfo=false&scv=false&fdn=false&sort=false&new_name=true`;
try {
const subconverterResponse = await fetch(subconverterUrl);
if (!subconverterResponse.ok) {
throw new Error(`Error fetching subconverterUrl: ${subconverterResponse.status} ${subconverterResponse.statusText}`);
}
const subconverterContent = await subconverterResponse.text();
return new Response(subconverterContent, {
headers: { 'content-type': 'text/plain; charset=utf-8' },
});
} catch (error) {
return new Response(`Error: ${error.message}`, {
status: 500,
headers: { 'content-type': 'text/plain; charset=utf-8' },
});
}
} else {
if(host.includes('workers.dev') || host.includes('pages.dev')) {
if (proxyhostsURL) {
try {
const response = await fetch(proxyhostsURL);
if (!response.ok) {
console.error('获取地址时出错:', response.status, response.statusText);
return; // 如果有错误,直接返回
}
const text = await response.text();
const lines = text.split('\n');
// 过滤掉空行或只包含空白字符的行
const nonEmptyLines = lines.filter(line => line.trim() !== '');
proxyhosts = proxyhosts.concat(nonEmptyLines);
} catch (error) {
console.error('获取地址时出错:', error);
}
}
// 使用Set对象去重
proxyhosts = [...new Set(proxyhosts)];
}
const newAddressesapi = await getAddressesapi();
const newAddressescsv = await getAddressescsv();
addresses = addresses.concat(newAddressesapi);
addresses = addresses.concat(newAddressescsv);
// 使用Set对象去重
const uniqueAddresses = [...new Set(addresses)];
const responseBody = uniqueAddresses.map(address => {
let port = "443";
let addressid = address;
if (address.includes(':') && address.includes('#')) {
const parts = address.split(':');
address = parts[0];
const subParts = parts[1].split('#');
port = subParts[0];
addressid = subParts[1];
} else if (address.includes(':')) {
const parts = address.split(':');
address = parts[0];
port = parts[1];
} else if (address.includes('#')) {
const parts = address.split('#');
address = parts[0];
addressid = parts[1];
}
if (addressid.includes(':')) {
addressid = addressid.split(':')[0];
}
edgetunnel = url.searchParams.get('edgetunnel') || edgetunnel;
RproxyIP = url.searchParams.get('proxyip') || RproxyIP;
if (edgetunnel.trim() === 'cmliu' && RproxyIP.trim() === 'true') {
// 将addressid转换为小写
let lowerAddressid = addressid.toLowerCase();
// 初始化找到的proxyIP为null
let foundProxyIP = null;
// 遍历CMproxyIPs数组查找匹配项
for (let item of CMproxyIPs) {
if (lowerAddressid.includes(item.type.toLowerCase())) {
foundProxyIP = item.proxyIP;
break; // 找到匹配项,跳出循环
}
}
if (foundProxyIP) {
// 如果找到匹配的proxyIP,赋值给path
path = `/proxyIP=${foundProxyIP}`;
} else {
// 如果没有找到匹配项,随机选择一个proxyIP
const randomProxyIP = proxyIPs[Math.floor(Math.random() * proxyIPs.length)];
path = `/proxyIP=${randomProxyIP}`;
}
}
let 伪装域名 = host ;
let 最终路径 = path ;
let 节点备注 = EndPS ;
if(proxyhosts && (host.includes('workers.dev') || host.includes('pages.dev'))) {
最终路径 = `/${host}${path}`;
伪装域名 = proxyhosts[Math.floor(Math.random() * proxyhosts.length)];
节点备注 = `${EndPS} 临时域名中转!`;
}
const vlessLink = `vless://${uuid}@${address}:${port}?encryption=none&security=tls&sni=${伪装域名}&fp=random&type=ws&host=${伪装域名}&path=${encodeURIComponent(最终路径)}#${encodeURIComponent(addressid + 节点备注)}`;
return vlessLink;
}).join('\n');
const combinedContent = responseBody + '\n' + link; // 合并内容
const base64Response = btoa(combinedContent); // 重新进行 Base64 编码
const response = new Response(base64Response, {
headers: { 'content-type': 'text/plain' },
});
return response;
}
}
};
代码地址:https://raw.githubusercontent.com/dockkkk/CF-WORKERS/main/dingyue.js
优选域名推荐
推荐api地址
变量自动:
UUID=UUID
HOST=伪装域名
PATH=路径
TOKEN=订阅入口
手动填写:https://生成器地址/sub?host=伪装域名&uuid=你的UUID&path=路径
本博客内已发表cname优选域名教程,但是考虑到大家没有优选域名,专门更新一期优选域名
注:2024/10/23 已更新优选域名
优选域名列表:
秋名山自建CF优选域名
cf.877774.xyz
博主推荐:
visa.cn | visa中国官网
cf.090227.xyz | CM大佬维护的优选
api-ipv4.ip.sb | IP查询器
fbi.gov | 美国FBI
其他优选:
shopify.com
time.is
icook.hk
icook.tw
ip.sb
japan.com
malaysia.com
russia.com
singapore.com
skk.moe
www.visa.com
www.visa.com.sg
www.visa.com.hk
www.visa.com.tw
www.visa.co.jp
www.visakorea.com
www.gco.gov.qa
www.gov.se
www.gov.ua
www.digitalocean.com
www.csgo.com
www.shopify.com
www.whoer.net
www.whatismyip.com
www.ipget.net
www.hugedomains.com
www.udacity.com
www.4chan.org
www.okcupid.com
www.glassdoor.com
www.udemy.com
www.baipiao.eu.org
alejandracaiccedo.com
log.bpminecraft.com
www.boba88slot.com
gur.gov.ua
www.zsu.gov.ua
www.iakeys.com
edtunnel-dgp.pages.dev
www.d-555.com
fbi.gov
www.sean-now.com
download.yunzhongzhuan.com
whatismyipaddress.com
www.ipaddress.my
www.pcmag.com
www.ipchicken.com
www.iplocation.net
iplocation.io
www.who.int
www.wto.org
第三方维护的优选官方域名(未备注出处的为未知)
cfip.xxxxxxxx.tk#OTC提供维护官方优选
bestcf.onecf.eu.org#Mingyu提供维护官方优选
cf.zhetengsha.eu.org#小一提供维护官方优选
acjp2.cloudflarest.link#KJKKK维护官方优选
achk.cloudflarest.link#KJKKK维护官方优选
xn--b6gac.eu.org
yx.887141.xyz
8.889288.xyz
cfip.1323123.xyz
cf.515188.xyz
cf-st.annoy.eu.org
cf.0sm.com
cf.877771.xyz
cf.345673.xyz
第三方维护的优选官方IP的API
https://ipdb.api.030101.xyz/?type=bestcf&country=true
https://addressesapi.090227.xyz/CloudFlareYes
https://addressesapi.090227.xyz/ip.164746.xyz
官方 IP 优选:
jp.byun.eu.org
un.goasa.top
emby2.misakaf.org
IPv6不死IP(需要有IPv6环境)
2606:4700::
其他在线优选网站:(浏览器访问)
三网优选IP:点击前往
CM优选IP:点击前往
https://monitor.gacjie.cn/page/cloudflare/ipv4.html
https://vps789.com/public/sum/cfIpTop20