首页
文章导航
导航
壁纸
留言板
更多
直播
友链
统计
关于
Search
1
【白嫖攻略】在cloudflare搭建域名邮箱并转发
6 阅读
2
cloudflare上免费部署随机地址生成器
6 阅读
3
Claw Cloud 免费容器平台部署哪吒面板教程
5 阅读
4
bpb面板搭建
5 阅读
5
Sub-Hub 基于 Cloudflare Worker+D1数据库的简洁订阅管理器,摒弃第三方订阅转换!
5 阅读
默认
日常
学习
技术
登录
Search
标签搜索
cloudflare
白嫖
docker
脚本
安装
CF
壁纸
图片
Linux
Caddy
节点
代码
哪吒
域名
NAT
HTML
github
LXC
手机壁纸
网页
ws01
累计撰写
121
篇文章
累计收到
45
条评论
首页
栏目
默认
日常
学习
技术
页面
文章导航
导航
壁纸
留言板
直播
友链
统计
关于
搜索到
95
篇与
的结果
2024-08-27
套cf后 站点WAF防火墙规则设定 这2+1就够了 全能防御恶意流量攻击!
套cf后 站点WAF防火墙规则设定 这2+1就够了 全能防御恶意流量攻击!转自 科技L 自己网站受攻击是正常的,下面说说怎么在cf防范打开cf网站受攻击的域名,安全性---WAF---自定义规则,一般可免费创建五个规则,下面是网友建好的,当然规则是死的,人是活的,许多地方可以举一反三,灵活修改【遇到强烈攻击时,宁可错杀一千不放过一个ip的原则选择交互式质询或阻止,规则先后秩序一般是 先放行后阻止 】1、放行跳过机器人扫描规则-KJL(cf.client.bot) or (http.user_agent contains "duckduckgo") or (http.user_agent contains "facebookexternalhit") or (http.user_agent contains "Feedfetcher-Google") or (http.user_agent contains "LinkedInBot") or (http.user_agent contains "Mediapartners-Google") or (http.user_agent contains "msnbot") or (http.user_agent contains "Slackbot") or (http.user_agent contains "TwitterBot") or (http.user_agent contains "ia_archive") or (http.user_agent contains "yahoo")2、全球用户js质询访问记录全球所有的用户访问都会有ip记录,方便你追踪,通过5s盾保护安全(ip.geoip.continent eq "AF") or (ip.geoip.continent eq "AN") or (ip.geoip.continent eq "AS") or (ip.geoip.continent eq "EU") or (ip.geoip.continent eq "NA") or (ip.geoip.continent eq "OC") or (ip.geoip.continent eq "SA") or (ip.geoip.continent eq "T1")3、恶意流量托管质询规则-KJL【可修改威胁分数值,值越大越严格,当然也可以把托管质询修改为更严格的 交互式质询或阻止 】2025年8月8日修改(cf.threat_score ge 15 and not cf.client.bot) or (not http.request.version in {"HTTP/1.1" "HTTP/2" "HTTP/3"}) or (not http.user_agent contains "Mozilla/")原来规则(cf.threat_score ge 5 and not cf.client.bot) or (not http.request.version in {"HTTP/1.2" "HTTP/2" "HTTP/3" "SPDY/3.1"}) or (not http.user_agent contains "Mozilla/")4、可适当添加速率限制规则限制时间窗口(比如 10 秒)限制请求数(比如 10 次)【可修改为20次、30次等】超过就 阻止/质询(block/challenge)//login/api/三个网站页面(http.request.uri.path eq "/") or (http.request.uri.path eq "/login") or (http.request.uri.path eq "/api/")其它规则 阻止:( /* --- 固定 IP 黑名单 --- */ ip.src in { 136.243.216.232 43.134.171.180 54.175.182.99 3.85.24.248 179.43.191.18 92.204.239.20 } /* --- User-Agent 黑名单:扫描工具 / 爬虫。常见的扫描器、爬虫、自动化工具(Censys、Expanse、HeadlessChrome、python-requests 等) --- */ or http.user_agent contains "InternetMeasurement" or http.user_agent contains "Censys" or http.user_agent contains "HeadlessChrome" or http.user_agent contains "Expanse" or http.user_agent contains "OPD" or http.user_agent contains "fasthttp" or http.user_agent contains "ALittle Client" or http.user_agent contains "ct-git-scanner" or http.user_agent contains "python-requests" /* --- ASN 黑名单:ASN 多是云厂商、IDC、代理/VPN 节点(比如 AWS:16509、DigitalOcean、Hetzner、OVH、M247、Leaseweb 等),常见攻击来源。 --- */ or ip.geoip.asnum in { 14168 16509 211298 45102 63023 200593 399486 7713 135377 14061 209854 401120 206092 36903 48693 8758 216167 14987 208161 204428 8560 31898 137409 48090 16276 210558 198953 212238 51167 202425 58224 60068 9009 401116 174 28573 52053 206216 396356 62240 43641 8075 22295 62610 25369 19871 211590 197540 198605 49870 } /* --- 国家黑名单:来源国家是 塞舌尔 (SC) 或 爱尔兰 (IE),直接拦截。 --- */ or ip.src.country in {"SC" "IE"} /* --- 敏感目录扫描:如果请求的 URL 路径包含 /.git 或 /.env,直接拦截。 --- */ or http.request.uri.path contains "/.git" or http.request.uri.path contains "/.env" ) 这条规则的作用就是:拦截已知的恶意 IP拦截常见扫描工具 / 爬虫拦截高风险 ASN(IDC/云厂商)拦截指定国家来源的流量拦截探测敏感文件路径的扫描请求等于是 一条“黑名单大合集规则”,只要命中任意条件,就会被挡住。拦截:针对监控/探测类爬虫( http.user_agent contains "UptimeRobot" or http.user_agent contains "SemrushBot" or http.user_agent contains "AhrefsBot" or http.user_agent contains "MJ12bot" or http.user_agent contains "DotBot" or http.user_agent contains "ZoominfoBot" or http.user_agent contains "Python-urllib" or http.user_agent contains "python-requests" or http.user_agent contains "Go-http-client" or http.user_agent contains "curl" ) 解释UptimeRobot → 网站监控工具SemrushBot / AhrefsBot / MJ12bot / DotBot / ZoominfoBot → 常见 SEO 爬虫,通常会大量抓取页面(可能影响性能,不一定有益处)Python-urllib / python-requests / Go-http-client / curl → 常见脚本/扫描器的 User-Agent允许(cf.client.bot) or (http.user_agent contains "UptimeRobot")跳过组件勾选:所有其余自定义规则,用户代理封禁,浏览器完整性验证
2024年08月27日
3 阅读
0 评论
0 点赞
2024-08-27
哪吒探针如何进行数据迁移、备份恢复?
哪吒探针如何进行数据迁移、备份恢复?1、先运行旧服务器上的哪吒一键脚本curl -L https://raw.githubusercontent.com/naiba/nezha/master/script/install.sh -o nezha.sh && chmod +x nezha.sh && ./nezha.sh选择 停止面板 2、在旧服务器中打包 /opt/nezha 哪吒文件夹,复制到新服务器相同位置解压【或直接下载整个文件夹,后面直接上传也行】{dotted startColor="#ff6c6c" endColor="#1989fa"/}3、在 新服务器中运行一键脚本 ,正常安装好面板后同样停止面板,删除新服务器上的 /opt/nezha 哪吒文件夹中的内容,把旧服务器下载下来的文件夹上传上去4、在 新服务器中运行一键脚本 ,选择 启动面板 ,完成。5、如何关闭nezha自带ssha.被控端A. opt/nezha/agent/config.yamlb.第四行 disable_command_execute:trueB. 自制一键命令(或者在SHH下用此命令)sed -i 's/disable_command_execute: false/disable_command_execute: true/' /opt/nezha/agent/config.ymlc.运行之后要重启agentsystemctl restart nezha-agent.service && systemctl status nezha-agent.service
2024年08月27日
3 阅读
0 评论
0 点赞
2024-08-27
Cloudflare五秒盾、JS质询、托管质询以及交互式质询的区别
Cloudflare五秒盾、JS质询、托管质询、交互式质询以及阻止的区别本文转自: 多记 - LOT.PM 一、JS质询(五秒盾)开启后,访客浏览器需要完成JS验证才能访问网站。其特点是用户无需点击,整个验证过程是自动的。二、托管质询托管质询(Managed Challenge)也就是俗称的五秒盾,托管质询是JS质询和交互式质询的结合版。实际上如果网络连接通畅,JS质询的完成时间其实是在1秒以内的,而之所以叫五秒盾其实是因为在中国大陆访问Cloudflare的连接性不佳,从而导致验证速度较慢,完成验证所需时间大概为5秒。Cloudflare会根据访客的环境、IP等参数进行评分,风险较低的用户会启用JS验证,而较高风险的用户会被要求完成交互式质询(需要完成鼠标点击的操作)。三、交互式质询交互式质询(Interactive Challenge)在某种意义上是验证码质询,也就是需要用户完成鼠标点击交互才能完成验证,这种验证比较影响用户体验,但安全性较JS质询而言更高。四、阻止没话说了,阻止,进不来了,别想访问五、总结阻止,交互式质询安全性高,但用户体验较差。JS质询用户体验较好,但安全性不如交互式质询。
2024年08月27日
3 阅读
0 评论
0 点赞
2024-08-20
Nginx安装与使用
Nginx安装与使用一、安装 Docker 和 Docker-Compose 一键命令curl -fsSL https://get.docker.com | sh && ln -s /usr/libexec/docker/cli-plugins/docker-compose /usr/local/bin二、进入home文件夹并在home文件夹下创建安装文件夹nginx,进入nginx文件夹并创建docker-compose.yml文件:cd /home/ && mkdir nginx && cd nginx && touch /home/nginx/docker-compose.yml三、进入/home/nginx ,打开docker-compose.yml文件,输入以下内容并保荐退出【如果是NAT小鸡,因端口没有全开,相应修改为可用的3个端口,例如:24888为一个可用端口,修改为24888:80,以此类推】:version: '3.8' services: app: image: 'jc21/nginx-proxy-manager:latest' restart: unless-stopped ports: - '80:80' - '81:81' - '443:443' volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt四、在文件夹下启动 Nginxdocker-compose up -d # If using docker-compose-plugin docker compose up -d五、登录管理界面当您的 docker 容器运行时,通过管理界面的端口 81 连接到它。有时,由于密钥的原因,这可能需要一点时间,最好重启机器。reboot默认登录地址:http://ip:81默认管理员用户和密码:Email:admin@example.com Password:changeme使用此默认用户登录后,系统会立即要求您修改您的详细信息并更改您的密码。{dotted startColor="#ff6c6c" endColor="#1989fa"/}六、 在cf上设置和在 Nginx界面设置
2024年08月20日
3 阅读
1 评论
0 点赞
2024-08-15
一键编辑删除cloudflare的DNS解析记录
一键编辑删除cloudflare的DNS解析记录由于 Cloudflare 的控制台没有批量删除解析的功能,一条一条删很麻烦。不过我们可以通过 Cloudflare 的 API 功能来实现批量删除解析,准确地讲是全部删除,目前还不能实现删除指定的解析。打开 用户 API 令牌 页面,点击 创建令牌 。然后点击 编辑区域 DNS 后的 使用模板 按钮。接着在 特定区域 右侧的下拉列表列表中选择你需要批量删除解析的域名。翻到网页底部,点击 继续以显示摘要。接着点击 创建令牌。复制虚线框内的令牌,保存备用。打开域名的概述页,下拉网页,在右下角找到 区域 ID。一、下面介绍第一种网页在线工具解决(不推荐,一页删除50条);在 梦牛网络注册并登录 二、下面介绍第二种脚本方法解决 (推荐) ;注意:脚本会删除指定域名的所有解析!请将以下的 替换为你之前创建的 API 令牌,将 替换为域名的区域 ID。如果你使用 Windows 系统,请使用以下 PowerShell 脚本。使用方法一:Windows 系统;$API_TOKEN = "你的 API 令牌" $ZONE_ID = "域名的区域 ID" $baseUrl = "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records" $headers = @{ 'Authorization' = "Bearer $API_TOKEN" 'Content-Type' = "application/json" } $listUrl = $baseUrl + '?per_page=500' Write-Host $listUrl $records = Invoke-RestMethod -Uri $listUrl -Method 'GET' -Headers $headers $records = $records | Select-Object -ExpandProperty result foreach ($record in $records) { Write-Host "Deleting $($record.name) that points to $($record.content)" $deleteUrl = $baseUrl + '/' + $record.id Invoke-RestMethod -Uri $deleteUrl -Method 'DELETE' -Headers $headers Write-Host $deleteUrl }首先将脚本中的 替换为你之前创建的 API 令牌,将 替换为域名的区域 ID。然后右键脚本,点击 使用 PowerShell 运行,等待执行完成即可。
2024年08月15日
3 阅读
1 评论
0 点赞
2024-08-13
windows设置开机默认开启数字小键盘
windows设置开机默认开启数字小键盘1、win+R打开运行,输入regedit打开注册表。2、找到目录HKEY_USERS.Default\Control Panel\Keyboard将InitialKeyboardIndicators项目的数据2147483648,修改为“80000002”,然后单击“确定”按钮。再重启电脑即可。
2024年08月13日
3 阅读
0 评论
0 点赞
2024-08-12
serv00注册等系列教程,服务器清理,ssh连接不上问题轻松解决,非挂代理
serv00系列教程,服务器清理,ssh连接不上问题轻松解决,非挂代理一、FTP、ssh 无法连接1、修改链接地址,sXXX.serv00.com 换成 webXXX.serv00.comssh服务器清理pkill -kill -u ${username} chmod -R 755 ~/* chmod -R 755 ~/.* rm -rf ~/.* rm -rf ~/*sN.serv00.com 18(或其IP)+端口22(或80或443)webN.serv00.com 12(或其IP)+端口22cacheN.serv00.com 8(或其IP)+端口22panelN.serv00.com 5 +端口22panelN.serv00.net +端口22USER.serv00.net +端口22其中大写的 N 是邮件中给定的服务器号2、ip被blockip解锁地址:https://www.serv00.com/ip_unban二、注册1、serv00注册对ip要求较高,邮箱也有可能收不到邮件和在垃圾箱中,所以正常注册不上就只能 换ip,换邮箱 。2、推荐下面方法:打开ProxySite-免费网络代理,在代理中注册,地址随意,最好选波兰ProxySite-免费网络代理 serv00注册输入:https://www.serv00.com/offer/create_new_accountct8注册输入【代理地址必须选择🇵🇱波兰】:https://www.ct8.pl/offer/create_new_account可选临时邮箱 ,最好是自己的邮箱,信息填完后serv00最下面一栏填写:freect8最下面一栏填写:MyDevil.net三、cloudflare保活1、登录 cloudflare ,创建 Workers 或 Pages 项目2、复制以下代码到 Workers 并部署addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)) }) addEventListener('scheduled', event => { event.waitUntil(handleScheduled(event.scheduledTime)) }) async function handleRequest(request) { return new Response('Worker is running') } async function handleScheduled(scheduledTime) { const accounts = JSON.parse(ACCOUNTS_JSON) const results = await loginAccounts(accounts) await sendSummary(results) } async function loginAccounts(accounts) { const results = [] for (const account of accounts) { const result = await loginAccount(account) results.push({ ...account, ...result }) await delay(Math.floor(Math.random() * 8000) + 1000) } return results } function generateRandomUserAgent() { const browsers = ['Chrome', 'Firefox', 'Safari', 'Edge', 'Opera']; const browser = browsers[Math.floor(Math.random() * browsers.length)]; const version = Math.floor(Math.random() * 100) + 1; const os = ['Windows NT 10.0', 'Macintosh', 'X11']; const selectedOS = os[Math.floor(Math.random() * os.length)]; const osVersion = selectedOS === 'X11' ? 'Linux x86_64' : selectedOS === 'Macintosh' ? 'Intel Mac OS X 10_15_7' : 'Win64; x64'; return `Mozilla/5.0 (${selectedOS}; ${osVersion}) AppleWebKit/537.36 (KHTML, like Gecko) ${browser}/${version}.0.0.0 Safari/537.36`; } async function loginAccount(account) { const { username, password, panelnum, type } = account let url = type === 'ct8' ? 'https://panel.ct8.pl/login/?next=/' : `https://panel${panelnum}.serv00.com/login/?next=/` const userAgent = generateRandomUserAgent(); try { const response = await fetch(url, { method: 'GET', headers: { 'User-Agent': userAgent, }, }) const pageContent = await response.text() const csrfMatch = pageContent.match(/name="csrfmiddlewaretoken" value="([^"]*)"/) const csrfToken = csrfMatch ? csrfMatch[1] : null if (!csrfToken) { throw new Error('CSRF token not found') } const initialCookies = response.headers.get('set-cookie') || '' const formData = new URLSearchParams({ 'username': username, 'password': password, 'csrfmiddlewaretoken': csrfToken, 'next': '/' }) const loginResponse = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Referer': url, 'User-Agent': userAgent, 'Cookie': initialCookies, }, body: formData.toString(), redirect: 'manual' }) console.log(`Login response status: ${loginResponse.status}`) console.log(`Login response headers: ${JSON.stringify(Object.fromEntries(loginResponse.headers))}`) const loginResponseBody = await loginResponse.text() console.log(`Login response body: ${loginResponseBody.substring(0, 200)}...`) if (loginResponse.status === 302 && loginResponse.headers.get('location') === '/') { const loginCookies = loginResponse.headers.get('set-cookie') || '' const allCookies = combineCookies(initialCookies, loginCookies) const dashboardResponse = await fetch(url.replace('/login/', '/'), { headers: { 'Cookie': allCookies, 'User-Agent': userAgent, } }) const dashboardContent = await dashboardResponse.text() console.log(`Dashboard content: ${dashboardContent.substring(0, 200)}...`) if (dashboardContent.includes('href="/logout/"') || dashboardContent.includes('href="/wyloguj/"')) { const nowUtc = formatToISO(new Date()) const nowBeijing = formatToISO(new Date(Date.now() + 8 * 60 * 60 * 1000)) const message = `账号 ${username} (${type}) 于北京时间 ${nowBeijing}(UTC时间 ${nowUtc})登录成功!` console.log(message) await sendTelegramMessage(message) return { success: true, message } } else { const message = `账号 ${username} (${type}) 登录后未找到登出链接,可能登录失败。` console.error(message) await sendTelegramMessage(message) return { success: false, message } } } else if (loginResponseBody.includes('Nieprawidłowy login lub hasło')) { const message = `账号 ${username} (${type}) 登录失败:用户名或密码错误。` console.error(message) await sendTelegramMessage(message) return { success: false, message } } else { const message = `账号 ${username} (${type}) 登录失败,未知原因。请检查账号和密码是否正确。` console.error(message) await sendTelegramMessage(message) return { success: false, message } } } catch (error) { const message = `账号 ${username} (${type}) 登录时出现错误: ${error.message}` console.error(message) await sendTelegramMessage(message) return { success: false, message } } } function combineCookies(cookies1, cookies2) { const cookieMap = new Map() const parseCookies = (cookieString) => { cookieString.split(',').forEach(cookie => { const [fullCookie] = cookie.trim().split(';') const [name, value] = fullCookie.split('=') if (name && value) { cookieMap.set(name.trim(), value.trim()) } }) } parseCookies(cookies1) parseCookies(cookies2) return Array.from(cookieMap.entries()).map(([name, value]) => `${name}=${value}`).join('; ') } async function sendSummary(results) { const successfulLogins = results.filter(r => r.success) const failedLogins = results.filter(r => !r.success) let summaryMessage = '登录结果统计:\n' summaryMessage += `成功登录的账号:${successfulLogins.length}\n` summaryMessage += `登录失败的账号:${failedLogins.length}\n` if (failedLogins.length > 0) { summaryMessage += '\n登录失败的账号列表:\n' failedLogins.forEach(({ username, type, message }) => { summaryMessage += `- ${username} (${type}): ${message}\n` }) } console.log(summaryMessage) await sendTelegramMessage(summaryMessage) } async function sendTelegramMessage(message) { const telegramConfig = JSON.parse(TELEGRAM_JSON) const { telegramBotToken, telegramBotUserId } = telegramConfig const url = `https://api.telegram.org/bot${telegramBotToken}/sendMessage` try { await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ chat_id: telegramBotUserId, text: message }) }) } catch (error) { console.error('Error sending Telegram message:', error) } } function formatToISO(date) { return date.toISOString().replace('T', ' ').replace('Z', '').replace(/\.\d{3}Z/, '') } function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)) }3、设置变量,都在Workers 或 Pages设置中变量1变量名称:ACCOUNTS_JSON其中“帐号1服务器”为,如:你的帐号在s2.serv00.com,则填写:2,帐号可随意增加和减少,最后一个大括号后没逗号。[ { "username": "serv00帐号1", "password": "serv00帐号1密码", "panelnum": "帐号1服务器", "type": "serv00" }, { "username": "serv00帐号2", "password": "serv00帐号2密码", "panelnum": "帐号1服务器", "type": "serv00" }, { "username": "serv00帐号3", "password": "serv00帐号3密码", "panelnum": "帐号1服务器", "type": "serv00" } ]变量2变量名称:ACCOUNTS_JSON设置TG通知,不用不设置{ "telegramBotToken": "TG Token:如72492745590000:AAGCNhe663WD3z_PxTaUvSAYlKFBJ5Q3A2YQQQQ", "telegramBotUserId": "59515042110000" }变量3设置“触发事件”,如以下设置是:每月12号11时4分触发启动,可修改为任意时间11 4 12 * *
2024年08月12日
3 阅读
2 评论
0 点赞
2024-08-09
哪吒面板添加其它信息代码
哪吒面板添加其它信息代码,两种方式中的小鸡多少都可以自由增减,要举一反三。样式一:<script> window.onload = function() { const affLinks = { 1: { price: '⏰2024.10.16;💰9.5$/年'}, 2: { price: '⏰2024.1.29;💰7¥/年'}, 3: { price: '⏰2025.6.5;💰8.8$/年'}, 4: { price: '⏰2024.1.8;💰7¥/年'}, 5: { price: '⏰2025.8.19;💰4.99¥/月'} }; const createPriceTag = (price) => { if (!price) return null; const $priceTag = document.createElement('span'); $priceTag.setAttribute('style', 'background-color: rgba(30, 144, 255, 0.8); color: white; padding: 3px 6px; border-radius: 5px; margin-left: 5px;'); $priceTag.textContent = price; return $priceTag; }; const uiCards = document.querySelectorAll('.ui.card'); uiCards.forEach((card) => { let cardId = card.id; if (cardId && affLinks[cardId]) { let $aLinkBox = document.createElement('div'); $aLinkBox.setAttribute('style', 'position: absolute; bottom: 8px; right: 10px; display: flex; align-items: center;'); let $priceTag = createPriceTag((typeof affLinks[cardId] === 'object') ? affLinks[cardId].price : null); if ($priceTag) { $aLinkBox.appendChild($priceTag); } card.appendChild($aLinkBox); } }); }; </script> 样式二<script> window.onload = function(){ const extraData = { 1: {pid: 23,shop: 'CC',price: ' 💰9.5$ / 年',cycle: '⏰续期:',start: '10/16/2023',expire: '10/16/2024', expire1: '2024.10.16;'}, 2: {pid: 23,shop: 'CC',price: ' 💰9.5$ / 年',cycle: '⏰续期:',start: '10/16/2023',expire: '10/16/2024', expire1: '2024.10.16;'}, 3: {pid: 23,shop: 'CC',price: ' 💰9.5$ / 年',cycle: '⏰续期:',start: '10/16/2023',expire: '10/16/2024', expire1: '2024.10.16;'}, 4: {pid: 23,shop: 'CC',price: ' 💰9.5$ / 年',cycle: '⏰续期:',start: '10/16/2023',expire: '10/16/2024', expire1: '2024.10.16;'}, 5: {pid: 23,shop: 'CC',price: ' 💰9.5$ / 年',cycle: '⏰续期:',start: '10/16/2023',expire: '10/16/2024', expire1: '2024.10.16;'} } const cats = document.querySelectorAll('.ui.accordion'); cats.forEach((e, i)=>{ let $catsTitle = e.querySelector('.title'); let ct = $catsTitle.innerText; ct = ct.trim(); let $itemCard = e.querySelectorAll('.ui.card'); let uiCardCount = $itemCard.length; $catsTitle.innerHTML = $catsTitle.innerHTML.replace(ct, ct+ ' ('+ uiCardCount +')'); $itemCard.forEach((ee, ii)=>{ let $content = ee.querySelector('.content'); let $descriptionGrid = ee.querySelector('.description .ui.grid'); let $itemTitle = $content.querySelector('.header'); let id = ee.getAttribute('id'); if(extraData[id]){ let pid = extraData[id].pid; pid = parseInt(pid); let shop = extraData[id].shop; let price = extraData[id].price; let start = extraData[id].start; let expire = extraData[id].expire; let expire1 = extraData[id].expire1; let cycle = extraData[id].cycle; if(price){ let $priceL = document.createElement('div'); $priceL.setAttribute('class', 'three wide column'); $priceL.innerHTML = '其它'; $descriptionGrid.insertBefore($priceL, $descriptionGrid.childNodes[$descriptionGrid.childNodes.length-3]); let $priceR = document.createElement('div'); $priceR.setAttribute('class', 'thirteen wide column'); $priceR.innerHTML = '<div class="ui blue label">'+cycle+ expire1 +price +'</a></div>'; $descriptionGrid.insertBefore($priceR, $descriptionGrid.childNodes[$descriptionGrid.childNodes.length-3]) } } }); }); } </script> 式样三【在用完整,加入续期和其它】:<style> :root { --popup-filter: blur(10px); --bb: blur(15px) brightness(110%); --lc-color-light: rgba(255, 255, 255, 0.7); --bc-color-light: rgba(255, 255, 255, 0.1); --the-color-light: rgba(255, 255, 255, 0.4); --he-color-light: rgba(255, 255, 255, 0.5); --message-color-light: rgb(22, 22, 22, 1); --popup-color-light:rgba(235, 235, 235, 0.6); --bc-color-dark: rgba(0, 0, 0, 0.3); --lc-color-dark: rgba(55, 55, 55, 0.8); --the-color-dark: rgba(70, 70, 70, 0.1); --he-color-dark: rgba(35, 35, 35, 0.7); --message-color-dark: rgb(235, 235, 235, 0.8); --popup-color-dark:rgba(78, 78, 78, 0.6); } /* 背景图片 */ body { content: " " !important; background: fixed !important; z-index: -1 !important; top: 0 !important; right: 0 !important; bottom: 0 !important; left: 0 !important; background-position: top !important; background-repeat: no-repeat !important; background-size: cover !important; background-image: url(https://121.freewebhostmost.com/) !important; font-family: Arial,Helvetica,sans-serif !important; } /* 大卡片 */ #app .ui.fluid.accordion { background-color: #fbfbfb26 !important; border-radius: 0.4rem !important; } /* 小卡片 */ .ui.four.cards>.card { border-radius: 0.6rem !important; background-color: #fafafaa3 !important; } /* 有点累状态进度条颜色 */ .ui.progress.warning .bar { background-image: linear-gradient(to right, #fa709a 0%, #fee140 100%); !important; } /* 高负载状态进度条颜色 */ .ui.progress.error .bar { background-image: linear-gradient(to top, #ff0844 0%, #ffb199 100%);important; } /* 高负载状态进度条颜色续费专用 */ .ui.progress.error1 .bar { background-image: linear-gradient(to right, #00CD00 0%, #008B00 100%);important; } </style> <script> window.onload = function() { const extraData = { 1: { pid: 23, shop: 'CC', price: ' 💰9.5$ / 年;', cycle: '⏰续期:', cycle1: '⏰', cycle2: '月流量:', cycle3: '3T ', cycle4: '⌚', start: '12/13/2023', expire: '12/13/2024', expire1: '2024.12.13;' }, 2: { pid: 23, shop: 'CC', price: ' 💰9.5$ / 年;', cycle: '⏰续期:', cycle1: '⏰', cycle2: '月流量:', cycle3: '3T ', cycle4: '⌚', start: '12/13/2023', expire: '12/13/2024', expire1: '2024.12.13;' }, 3: { pid: 23, shop: 'CC', price: ' 💰9.5$ / 年;', cycle: '⏰续期:', cycle1: '⏰', cycle2: '月流量:', cycle3: '3T ', cycle4: '⌚', start: '12/13/2023', expire: '12/13/2024', expire1: '2024.12.13;' }, } const cats = document.querySelectorAll('.ui.accordion'); cats.forEach((e, i) => { let $catsTitle = e.querySelector('.title'); let ct = $catsTitle.innerText; ct = ct.trim(); let $itemCard = e.querySelectorAll('.ui.card'); let uiCardCount = $itemCard.length; $catsTitle.innerHTML = $catsTitle.innerHTML.replace(ct, ct + ' (' + uiCardCount + ')'); $itemCard.forEach((ee, ii) => { let $content = ee.querySelector('.content'); let $descriptionGrid = ee.querySelector('.description .ui.grid'); let $itemTitle = $content.querySelector('.header'); let id = ee.getAttribute('id'); if (extraData[id]) { let pid = extraData[id].pid; let shop = extraData[id].shop; let price = extraData[id].price; let start = extraData[id].start; let expire = extraData[id].expire; let expire1 = extraData[id].expire1; let cycle = extraData[id].cycle; let cycle1 = extraData[id].cycle1; let cycle2 = extraData[id].cycle2; let cycle3 = extraData[id].cycle3; let cycle4 = extraData[id].cycle4; if (price) { let $priceL = document.createElement('div'); $priceL.setAttribute('class', 'three wide column'); $priceL.innerHTML = '续期'; $descriptionGrid.insertBefore($priceL, $descriptionGrid.childNodes[$descriptionGrid.childNodes.length - 3]); let remainingTime = ''; if (expire !== '∞') { let endTime = new Date(expire).getTime(); let nowTime = new Date().getTime(); let timeDiff = endTime - nowTime; let daysRemaining = Math.ceil(timeDiff / (1000 * 3600 * 24)); remainingTime = daysRemaining > 0 ? `<span style="color: red;"> 剩${daysRemaining}天</span>` : '<span style="color: red;">(已过期)</span>'; } let $priceR = document.createElement('div'); $priceR.setAttribute('class', 'thirteen wide column'); $priceR.innerHTML = '<div class="ui blue label">' + cycle1 + expire1 + cycle4 + remainingTime + '</div>'; $descriptionGrid.insertBefore($priceR, $descriptionGrid.childNodes[$descriptionGrid.childNodes.length - 3]); } if (price) { let $priceL = document.createElement('div'); $priceL.setAttribute('class', 'three wide column'); $priceL.innerHTML = '其它'; $descriptionGrid.insertBefore($priceL, $descriptionGrid.childNodes[$descriptionGrid.childNodes.length - 3]); let $priceR = document.createElement('div'); $priceR.setAttribute('class', 'thirteen wide column'); $priceR.innerHTML = '<div class="ui blue label">' + price + ' ' + cycle2 + ' ' + cycle3 + '</div>'; $descriptionGrid.insertBefore($priceR, $descriptionGrid.childNodes[$descriptionGrid.childNodes.length - 3]); } } }); }); } </script> <style> body { overflow-y: scroll; } </style> <!-- 返回顶部按钮 --> <button id="topBtn" class="top-btn" style="display: none; position: fixed; bottom: 20px; right: 20px; z-index: 9999; background-color: #ffcc00; color: white; border: none; border-radius: 50%; width: 40px; height: 40px; font-size: 20px; display: flex; align-items: center; justify-content: center; cursor: pointer;">▲</button> <script> // 获取返回顶部按钮 const topBtn = document.getElementById('topBtn'); // 当DOM加载完成后执行 document.addEventListener('DOMContentLoaded', function() { // 监听滚动事件 window.onscroll = function() { scrollFunction(); }; // 显示或隐藏返回顶部按钮 function scrollFunction() { if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) { topBtn.style.display = "block"; } else { topBtn.style.display = "none"; } } // 当点击按钮时滚动到顶部 topBtn.addEventListener('click', function() { document.body.scrollTop = 0; // 对于 Safari document.documentElement.scrollTop = 0; // 对于 Chrome, Firefox, IE 和 Opera }); }); </script>
2024年08月09日
3 阅读
0 评论
0 点赞
1
...
7
8
9
...
12