IPv6反解域名是什么?嫩长一坨还能托管到Cloudflare?SSL签发也没问题?

这是什么 以下内容来自GPT-5 这是一个 IPv6 反向解析(Reverse DNS)域名,遵循 ip6.arpa 格式。 它是把 IPv6 地址每个十六进制数字倒序排列,加上 .ip6.arpa 后缀,用于 DNS 反查时将域名解析回原 IPv6 地址。 将 x.x.x.x.x.x.x.x.x.x.x.x.ip6.arpa 弄到手 视频教程: https://www.bilibili.com/video/BV1q8tBzsEPi/ 前往 Hurricane Electric Free IPv6 Tunnel Broker 注册一个账号(需要用域名邮箱) 创建隧道。需要一台启用了ICMP信令的VPS 填上IP后,TunnelBroker会向其发送Ping请求 如果TunnelBroker收到了回应,并且该IP没有被其他隧道绑定,就会弹出绿色,可绑定的标志 如果该IP曾被绑定,则需要进行HTTP验证 进入这个页面,查看TunnelBroker为你分配的路由IPv6 以 2001:470:24:386::/64 为例 首先加0,每项4位,通过 : 分割,则为 2001047000240386 然后倒过来,则为 6830420007401002 最后,加上 . 和 .ip6.arpa ,则为 6.8.3.0.4.2.0.0.0.7.4.0.1.0.0.2.ip6.arpa 将其添加到Cloudflare 查看Cloudflare要求你设置的NS服务器 回到TunnelBroker进行设置 等待域被激活即可 为其签发SSL 默认 ipra 无法签发SSL,因为会被大部分SSL提供商拒签 将Cloudflare SSL提供商改为 SSL.COM 可以解决这个问题 获取必要信息,发起更改SSL提供商请求 curl --location --request PATCH 'https://api.cloudflare.com/client/v4/zones/<zone_id>/ssl/universal/settings' --header 'X-Auth-Email: 你的CF注册邮箱' --header 'X-Auth-Key: 你的CF全局APIKey' --header 'Content-Type: application/json' --data-raw '{"enabled":true,"certificate_authority":"ssl_com"}' 稍等片刻,CF会自动使用新的SSL提供商签发SSL ...

August 8, 2025 · 1 min · 83 words

Github学生认证 + GitHub Education福利大全

Github学生认证教程 视频: https://www.bilibili.com/video/BV1kAtrzzEkG 确保你是个学生 并且拥有 学生证、录取通知书、毕业证 中的其中一种(我使用录取通知书) 首先来到 Payment Information 确保是你的真实信息,并且姓名使用拼音 如果不是,请进行更改,然后一定要重登Github! 接下来前往 GitHub · Where software is built 推荐使用校园网或者流量 按需选 这里拍照注意!如果你的证件没有英文版的,请不要直接拍原件 找个记事本手动翻译一下 比如我的录取通知书翻译为 然后用手机拍照即可 不出意外,批准! 认证疑难解答 报错什么姓名不符,确保你的Github Payment Information姓名和你提交的证明文件姓名一样,如果不一样,改完一定要注销重新登录Github才行 报错用了VPN或者位置不对,请确保使用中国大陆网络!如果你没有校园网就用流量! GitHub Education 福利领取 通过学生认证后,你就可以前往 GitHub Student Developer Pack 领取各种免费福利啦! 下面介绍一些免费的域名福利: 免费领取一年 .tech 域名 前往 GitHub Student Developer Pack - GitHub Education 一直往下滚,直到找到 .tech 字样的项目,点击蓝色链接进入 输入域名,然后添加到购物车 点击结账 在这里登录Github账户(我已经免费拿一个了所以拿不了噜~) 不出意外你的Total应该是0,点击就购买成功! 接下来来到 https://controlpanel.tech/ 登录你的账户 输入你的域名并跳转到控制台 改NS到Cloudflare~ ...

August 7, 2025 · 1 min · 122 words

你说什么?企业微信能免费用Deepseek?!还能调成猫娘?!!

正式开始 非常简单,首先你要有一个企业微信号 然后前往 工作台 往下拉找到 智能机器人 接下来就可以创建了 在 角色设定 可以提示词注入一下 然后你就得到了 可以通过多种方式使用~

August 6, 2025 · 1 min · 12 words

你是否在寻找一个评论系统而又不想自托管?又饱受垃圾评论的叨扰?

配置Giscus Giscus使用Github Discussion实现存储用户评论,无需自托管 首先你需要创建一个 公开仓库 (建议新开一个干净的空仓库) 然后在仓库设置中 启用 Discussion 功能 前往 https://giscus.app/zh-CN 首先填写你的仓库,通过检查 接下来的 映射关系 十分重要! pathname (最推荐):假如你的文章路径为 posts/helloworld 。那么只要你保证这个路径不变,评论和页面就永远匹配 url:只要你换域名了,评论和页面就无法匹配 title:只要你换标题了,评论和页面就无法匹配 需要特别注意的是:建议 勾选 使用严格的标题匹配 ,避免评论串台。开启后,Giscus会根据你选择的映射关系为每一个新的Discussion(新的页面的评论区)插入一个与众不同的 sha1 指纹 。之后的页面评论区与Github Discussion的映射关系都依赖这个哈希字符串,它在每一个Discussion的正文中,以注释形式写入 如果你弄丢了或者写错了,Giscus之后将会再创建一个同名的Discussion,并写入正确的哈希 若旧Discussion并未删除,并想让Giscus命中一个不同的Discussion,你需要根据Giscus默认分配的页面标题(这取决于你上面勾选的映射关系,若勾选pathname,即为 posts/pin )手动用 sha1 算法算出哈希字符串并手动写入你想要让Giscus映射的Discussion root@AcoFork-NAS:~# echo -n "posts/pin/" | sha1sum 6ae1aef4a17c896d06677a8e55c23b364bb82bbb - root@AcoFork-NAS:~# 分类推荐选择 公告(announcements) 特性按需勾选 主题按喜好选择。更改后主题会立即呈现 最后将这段JS复制,放置在你想作为评论区的区块即可 配置Akismet Akismet (Automattic Kismet) 是应用广泛的一个垃圾留言过滤系统,其作者是大名鼎鼎的 WordPress 创始人 Matt Mullenweg,Akismet 也是 WordPress 默认安装的插件,其使用非常广泛,设计目标便是帮助博客网站来过滤垃圾留言。 注册 akismet.com 选择 Akismet Personal 订阅,将滑块拉到0$,记录得到的 Akismet API Key ...

August 3, 2025 · 1 min · 104 words

平平无奇的一张图,拉高曝光就能显现另一张图?

体验站点 https://imghide.2x.nz/ 视频教程: https://www.bilibili.com/video/BV1wdh3zYESe/ 原理 首先将原图嵌入,然后将隐藏图的亮度降至极低,并以棋盘排列嵌入原图 最终生成的图片呈现一种灰色网格状 默认只能看到原图,虽然隐藏图信息仍在,但是太黑了,人眼只会把他们当作黑色像素点处理 当人为提高曝光后,原图过曝,趋于白色,丢失信息 而隐藏图被拉亮,逐渐可见 最终原图消失,而隐藏图完全显现

August 3, 2025 · 1 min · 11 words

QQ微信不够私密?自建自己的聊天服务器!

前置环境准备 由于Synapse、Matrix(下文简称”矩阵“)手搓部署非常麻烦。所以请安装 1Panel面板 部署PostgreSQL 安装并创建名为 synapse 用户名也为 synapse 的数据库 前往应用商店安装 PGAdmin4 接着点击添加服务器 相关信息可以在连接信息看到 删除刚刚创建的 synapse 这个数据库 重新创建同名数据库 设置所有者(即用户名)为 synapse 将 排序规则 和 字符类型 都改为 C 部署Synapse 首先参照1Panel官方的教程去创建一个存储卷,否则安装 synapse 会失败 安装 synapse 导航到文件管理: /var/lib/docker/volumes/synapse-data/_data 你应该可以看到 编辑 homeserver.yaml ,并按需配置 server_name: "家服务器名称,比如:m.2x.nz" public_baseurl: "公共URL,比如:https://m.2x.nz" pid_file: /data/homeserver.pid serve_server_wellknown: true # 启用联邦 listeners: - port: 8008 tls: false type: http x_forwarded: true resources: - names: [client, federation] compress: false response_headers: Access-Control-Allow-Origin: "https://app.element.io" Access-Control-Allow-Methods: "GET, POST, OPTIONS" Access-Control-Allow-Headers: "Content-Type, Authorization" database: name: psycopg2 args: user: synapse password: 你的数据库密码 dbname: synapse host: 你的PostgreSQL的容器名称 cp_min: 5 cp_max: 10 log_config: "/data/my.matrix.host.log.config" media_store_path: /data/media_store registration_shared_secret: "这里的东西是随机生成的,每个人都不一样,请忽略这一块,并使用你的配置" macaroon_secret_key: "这里的东西是随机生成的,每个人都不一样,请忽略这一块,并使用你的配置" form_secret: "这里的东西是随机生成的,每个人都不一样,请忽略这一块,并使用你的配置" signing_key_path: "/data/my.matrix.host.signing.key" report_stats: false trusted_key_servers: - server_name: "matrix.org" # Github OAuth oidc_providers: - idp_id: github idp_name: Github idp_brand: "github" # optional: styling hint for clients discover: false issuer: "https://github.com/" client_id: "Ov23liaHxxYHybb0jRoZ" # TO BE FILLED client_secret: "e937f214ea7c132924ab34c76d83f4b7099d696e" # TO BE FILLED authorization_endpoint: "https://github.com/login/oauth/authorize" token_endpoint: "https://github.com/login/oauth/access_token" userinfo_endpoint: "https://api.github.com/user" scopes: ["read:user"] user_mapping_provider: config: subject_claim: "id" localpart_template: "{{ user.login }}" display_name_template: "{{ user.name }}" ### ✅ 邮件配置(确保SMTP验证正常) email: smtp_host: "你的SMTP发件服务器" smtp_port: 465 smtp_user: "你的发件邮箱" smtp_pass: "你的SMTP密码" force_tls: true notif_from: "Matrix <你的发件邮箱>" validation_token_lifetime: "5m" ### ✅ 启用注册 + 邮箱验证 + 密码找回 enable_registration: true registrations_require_3pid: - email registration_requires_token: false # 确保不强制邀请码注册(默认关闭) password_config: enabled: true ### ✅ 允许邮箱登录 login_via_existing_session: enabled: true rc_registration: per_second: 0.003 # 每秒允许的注册请求(例如:0.003 ≈ 每5分钟一次) burst_count: 1 # 同一IP地址的最大注册突发数 # 消息发送速率限制 rc_message: per_second: 0.2 # 每秒允许发送的消息数 burst_count: 10 # 突发消息缓冲区大小 # 房间加入速率限制 rc_joins: local: per_second: 0.1 # 本地用户加入房间的速率 burst_count: 10 remote: per_second: 0.01 # 远程用户加入房间的速率 burst_count: 10 # 媒体保留设置 media_retention: # 本地媒体文件的保留时间 local_media_lifetime: 90d # 远程媒体文件的保留时间(来自其他homeserver的媒体) remote_media_lifetime: 14d # 删除陈旧设备的时间 delete_stale_devices_after: 1y auto_join_rooms: - "#XXX:你的家服务器URL" # 需要自动加入的房间 按需配置,更多高级配置参阅: Homeserver Sample Config File - Synapse ...

August 1, 2025 · 2 min · 288 words

大陆直连TG Web?触手可及!

注意,将该项目直接绑定到你的域名会吃Abuse 推荐将 index.html 重命名。让别人访问根路径无法访问到正常页面即可,但不保证永远不会吃Abuse 然后创建一个新的 index.html 写入: <html><head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> <style data-id="immersive-translate-input-injected-css">.immersive-translate-input { position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 2147483647; display: flex; justify-content: center; align-items: center; } .immersive-translate-attach-loading::after { content: " "; --loading-color: #f78fb6; width: 6px; height: 6px; border-radius: 50%; display: block; margin: 12px auto; position: relative; color: white; left: -100px; box-sizing: border-box; animation: immersiveTranslateShadowRolling 1.5s linear infinite; position: absolute; top: 50%; left: 50%; transform: translate(-2000%, -50%); z-index: 100; } .immersive-translate-loading-spinner { vertical-align: middle !important; width: 10px !important; height: 10px !important; display: inline-block !important; margin: 0 4px !important; border: 2px rgba(221, 244, 255, 0.6) solid !important; border-top: 2px rgba(0, 0, 0, 0.375) solid !important; border-left: 2px rgba(0, 0, 0, 0.375) solid !important; border-radius: 50% !important; padding: 0 !important; -webkit-animation: immersive-translate-loading-animation 0.6s infinite linear !important; animation: immersive-translate-loading-animation 0.6s infinite linear !important; } @-webkit-keyframes immersive-translate-loading-animation { from { -webkit-transform: rotate(0deg); } to { -webkit-transform: rotate(359deg); } } @keyframes immersive-translate-loading-animation { from { transform: rotate(0deg); } to { transform: rotate(359deg); } } .immersive-translate-input-loading { --loading-color: #f78fb6; width: 6px; height: 6px; border-radius: 50%; display: block; margin: 12px auto; position: relative; color: white; left: -100px; box-sizing: border-box; animation: immersiveTranslateShadowRolling 1.5s linear infinite; } @keyframes immersiveTranslateShadowRolling { 0% { box-shadow: 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0); } 12% { box-shadow: 100px 0 var(--loading-color), 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0); } 25% { box-shadow: 110px 0 var(--loading-color), 100px 0 var(--loading-color), 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0); } 36% { box-shadow: 120px 0 var(--loading-color), 110px 0 var(--loading-color), 100px 0 var(--loading-color), 0px 0 rgba(255, 255, 255, 0); } 50% { box-shadow: 130px 0 var(--loading-color), 120px 0 var(--loading-color), 110px 0 var(--loading-color), 100px 0 var(--loading-color); } 62% { box-shadow: 200px 0 rgba(255, 255, 255, 0), 130px 0 var(--loading-color), 120px 0 var(--loading-color), 110px 0 var(--loading-color); } 75% { box-shadow: 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0), 130px 0 var(--loading-color), 120px 0 var(--loading-color); } 87% { box-shadow: 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0), 130px 0 var(--loading-color); } 100% { box-shadow: 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0); } } .immersive-translate-toast { display: flex; position: fixed; z-index: 2147483647; left: 0; right: 0; top: 1%; width: fit-content; padding: 12px 20px; margin: auto; overflow: auto; background: #fef6f9; box-shadow: 0px 4px 10px 0px rgba(0, 10, 30, 0.06); font-size: 15px; border-radius: 8px; color: #333; } .immersive-translate-toast-content { display: flex; flex-direction: row; align-items: center; } .immersive-translate-toast-hidden { margin: 0 20px 0 72px; text-decoration: underline; cursor: pointer; } .immersive-translate-toast-close { color: #666666; font-size: 20px; font-weight: bold; padding: 0 10px; cursor: pointer; } @media screen and (max-width: 768px) { .immersive-translate-toast { top: 0; padding: 12px 0px 0 10px; } .immersive-translate-toast-content { flex-direction: column; text-align: center; } .immersive-translate-toast-hidden { margin: 10px auto; } } .immersive-translate-modal { display: none; position: fixed; z-index: 2147483647; left: 0; top: 0; width: 100%; height: 100%; overflow: auto; background-color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0.4); font-size: 15px; } .immersive-translate-modal-content { background-color: #fefefe; margin: 10% auto; padding: 40px 24px 24px; border-radius: 12px; width: 350px; font-family: system-ui, -apple-system, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; position: relative; } @media screen and (max-width: 768px) { .immersive-translate-modal-content { margin: 50% auto !important; } } .immersive-translate-modal .immersive-translate-modal-content-in-input { max-width: 500px; } .immersive-translate-modal-content-in-input .immersive-translate-modal-body { text-align: left; max-height: unset; } .immersive-translate-modal-title { text-align: center; font-size: 16px; font-weight: 700; color: #333333; } .immersive-translate-modal-body { text-align: center; font-size: 14px; font-weight: 400; color: #333333; margin-top: 24px; } @media screen and (max-width: 768px) { .immersive-translate-modal-body { max-height: 250px; overflow-y: auto; } } .immersive-translate-close { color: #666666; position: absolute; right: 16px; top: 16px; font-size: 20px; font-weight: bold; } .immersive-translate-close:hover, .immersive-translate-close:focus { text-decoration: none; cursor: pointer; } .immersive-translate-modal-footer { display: flex; justify-content: center; flex-wrap: wrap; margin-top: 24px; } .immersive-translate-btn { width: fit-content; color: #fff; background-color: #ea4c89; border: none; font-size: 14px; margin: 0 8px; padding: 9px 30px; border-radius: 5px; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: background-color 0.3s ease; } .immersive-translate-btn-container { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; } .immersive-translate-btn:hover { background-color: #f082ac; } .immersive-translate-btn:disabled { opacity: 0.6; cursor: not-allowed; } .immersive-translate-btn:disabled:hover { background-color: #ea4c89; } .immersive-translate-link-btn { background-color: transparent; color: #ea4c89; border: none; cursor: pointer; height: 30px; line-height: 30px; } .immersive-translate-cancel-btn { /* gray color */ background-color: rgb(89, 107, 120); } .immersive-translate-cancel-btn:hover { background-color: hsl(205, 20%, 32%); } .immersive-translate-action-btn { background-color: transparent; color: #ea4c89; border: 1px solid #ea4c89; } .immersive-translate-btn svg { margin-right: 5px; } .immersive-translate-link { cursor: pointer; user-select: none; -webkit-user-drag: none; text-decoration: none; color: #ea4c89; -webkit-tap-highlight-color: rgba(0, 0, 0, 0.1); } .immersive-translate-primary-link { cursor: pointer; user-select: none; -webkit-user-drag: none; text-decoration: none; color: #ea4c89; -webkit-tap-highlight-color: rgba(0, 0, 0, 0.1); } .immersive-translate-modal input[type="radio"] { margin: 0 6px; cursor: pointer; } .immersive-translate-modal label { cursor: pointer; } .immersive-translate-close-action { position: absolute; top: 2px; right: 0px; cursor: pointer; } .imt-image-status { background-color: rgba(0, 0, 0, 0.5) !important; display: flex !important; flex-direction: column !important; align-items: center !important; justify-content: center !important; border-radius: 16px !important; } .imt-image-status img, .imt-image-status svg, .imt-img-loading { width: 28px !important; height: 28px !important; margin: 0 0 8px 0 !important; min-height: 28px !important; min-width: 28px !important; position: relative !important; } .imt-img-loading { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAMAAACfWMssAAAAtFBMVEUAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oK74hAAAAPHRSTlMABBMIDyQXHwyBfFdDMSw+OjXCb+5RG51IvV/k0rOqlGRM6KKMhdvNyZBz9MaupmxpWyj437iYd/yJVNZeuUC7AAACt0lEQVRIx53T2XKiUBCA4QYOiyCbiAsuuGBcYtxiYtT3f6/pbqoYHVFO5r+iivpo6DpAWYpqeoFfr9f90DsYAuRSWkFnPO50OgR9PwiCUFcl2GEcx+N/YBh6pvKaefHlUgZd1zVe0NbYcQjGBfzrPE8Xz8aF+71D8gG6DHFPpc4a7xFiCDuhaWgKgGIJQ3d5IMGDrpS4S5KgpIm+en9f6PlAhKby4JwEIxlYJV9h5k5nee9GoxHJ2IDSNB0dwdad1NAxDJ/uXDHYmebdk4PdbkS58CIVHdYSUHTYYRWOJblWSyu2lmy3KNFVJNBhxcuGW4YBVCbYGRZwIooipHsNqjM4FbgOQqQqSKQQU9V8xmi1QlgHqQQ6DDBvRUVCDirs+EzGDGOQTCATgtYTnbCVLgsVgRE0T1QE0qHCFAht2z6dLvJQs3Lo2FQoDxWNUiBhaP4eRgwNkI+dAjVOA/kUrIDwf3CG8NfNOE0eiFotSuo+rBiq8tD9oY4Qzc6YJw99hl1wzpQvD7ef2M8QgnOGJfJw+EltQc+oX2yn907QB22WZcvlUpd143dqQu+8pCJZuGE4xCuPXJqqcs5sNpsI93Rmzym1k4Npk+oD1SH3/a3LOK/JpUBpWfqNySxWzCfNCUITuDG5dtuphrUJ1myeIE9bIsPiKrfqTai5WZxbhtNphYx6GEIHihyGFTI69lje/rxajdh0s0msZ0zYxyPLhYCb1CyHm9Qsd2H37Y3lugVwL9kNh8Ot8cha6fUNQ8nuXi5z9/ExsAO4zQrb/ev1yrCB7lGyQzgYDGuxq1toDN/JGvN+HyWNHKB7zEoK+PX11e12G431erGYzwmytAWU56fkMHY5JJnDRR2eZji3AwtIcrEV8Cojat/BdQ7XOwGV1e1hDjGGjXbdArm8uJZtCH5MbcctVX8A1WpqumJHwckAAAAASUVORK5CYII="); background-size: 28px 28px; animation: image-loading-rotate 1s linear infinite !important; } .imt-image-status span { color: var(--bg-2, #fff) !important; font-size: 14px !important; line-height: 14px !important; font-weight: 500 !important; font-family: "PingFang SC", Arial, sans-serif !important; } @keyframes image-loading-rotate { from { transform: rotate(360deg); } to { transform: rotate(0deg); } } </style></head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> <div id="screenity-ui"><div class="screenity-shadow-dom"><div><div class="screenity-scrollbar"></div><div class="screenity-scrollbar"></div></div><style type="text/css"> #screenity-ui, #screenity-ui div { background-color: unset; padding: unset; width: unset; box-shadow: unset; display: unset; margin: unset; border-radius: unset; } .screenity-outline { position: absolute; z-index: 99999999999; border: 2px solid #3080F8; outline-offset: -2px; pointer-events: none; border-radius: 5px!important; } .screenity-blur { filter: blur(10px)!important; } .screenity-shadow-dom * { transition: unset; } .screenity-shadow-dom .TooltipContent { border-radius: 30px!important; background-color: #29292F!important; padding: 10px 15px!important; font-size: 12px; margin-bottom: 10px!important; bottom: 100px; line-height: 1; font-family: 'Satoshi-Medium', sans-serif; z-index: 99999999!important; color: #FFF; box-shadow: hsl(206 22% 7% / 35%) 0px 10px 38px -10px, hsl(206 22% 7% / 20%) 0px 10px 20px -15px!important; user-select: none; transition: opacity 0.3 ease-in-out; will-change: transform, opacity; animation-duration: 400ms; animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1); will-change: transform, opacity; } .screenity-shadow-dom .hide-tooltip { display: none!important; } .screenity-shadow-dom .tooltip-tall { margin-bottom: 20px; } .screenity-shadow-dom .tooltip-small { margin-bottom: 5px; } .screenity-shadow-dom .TooltipContent[data-state='delayed-open'][data-side='top'] { animation-name: slideDownAndFade; } .screenity-shadow-dom .TooltipContent[data-state='delayed-open'][data-side='right'] { animation-name: slideLeftAndFade; } .screenity-shadow-dom.TooltipContent[data-state='delayed-open'][data-side='bottom'] { animation-name: slideUpAndFade; } .screenity-shadow-dom.TooltipContent[data-state='delayed-open'][data-side='left'] { animation-name: slideRightAndFade; } @keyframes slideUpAndFade { from { opacity: 0; transform: translateY(2px); } to { opacity: 1; transform: translateY(0); } } @keyframes slideRightAndFade { from { opacity: 0; transform: translateX(-2px); } to { opacity: 1; transform: translateX(0); } } @keyframes slideDownAndFade { from { opacity: 0; transform: translateY(-2px); } to { opacity: 1; transform: translateY(0); } } @keyframes slideLeftAndFade { from { opacity: 0; transform: translateX(2px); } to { opacity: 1; transform: translateX(0); } } #screenity-ui [data-radix-popper-content-wrapper] { z-index: 999999999999!important; } .screenity-shadow-dom .CanvasContainer { position: fixed; pointer-events: all!important; top: 0px!important; left: 0px!important; z-index: 99999999999!important; } .screenity-shadow-dom .canvas { position: fixed; top: 0px!important; left: 0px!important; z-index: 99999999999!important; background: transparent!important; } .screenity-shadow-dom .canvas-container { top: 0px!important; left: 0px!important; z-index: 99999999999; position: fixed!important; background: transparent!important; } .ScreenityDropdownMenuContent { z-index: 99999999999!important; min-width: 200px; background-color: white; margin-top: 4px; margin-right: 8px; padding-top: 12px; padding-bottom: 12px; border-radius: 15px; z-index: 99999; font-family: 'Satoshi-Medium', sans-serif; color: #29292F; box-shadow: 0px 10px 38px -10px rgba(22, 23, 24, 0.35), 0px 10px 20px -15px rgba(22, 23, 24, 0.2); animation-duration: 400ms; animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1); will-change: transform, opacity; } .ScreenityDropdownMenuContent[data-side="top"] { animation-name: slideDownAndFade; } .ScreenityDropdownMenuContent[data-side="right"] { animation-name: slideLeftAndFade; } .ScreenityDropdownMenuContent[data-side="bottom"] { animation-name: slideUpAndFade; } .ScreenityDropdownMenuContent[data-side="left"] { animation-name: slideRightAndFade; } .ScreenityItemIndicator { position: absolute; right: 12px; width: 18px; height: 18px; background: #3080F8; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; } .ScreenityDropdownMenuItem, .ScreenityDropdownMenuRadioItem { font-size: 14px; line-height: 1; display: flex; align-items: center; height: 40px; padding: 0 5px; position: relative; padding-left: 22px; padding-right: 22px; user-select: none; outline: none; } .ScreenityDropdownMenuItem:hover { background-color: #F6F7FB !important; cursor: pointer; } .ScreenityDropdownMenuItem[data-disabled] { color: #6E7684; !important; cursor: not-allowed; background-color: #F6F7FB !important; } @keyframes slideUpAndFade { from { opacity: 0; transform: translateY(2px); } to { opacity: 1; transform: translateY(0); } } @keyframes slideRightAndFade { from { opacity: 0; transform: translateX(-2px); } to { opacity: 1; transform: translateX(0); } } @keyframes slideDownAndFade { from { opacity: 0; transform: translateY(-2px); } to { opacity: 1; transform: translateY(0); } } @keyframes slideLeftAndFade { from { opacity: 0; transform: translateX(2px); } to { opacity: 1; transform: translateX(0); } } </style></div></div></body><div id="immersive-translate-popup" style="all: initial"></div></html> ...

August 1, 2025 · 8 min · 1560 words

对标CF Worker?拿EdgeOne边缘函数做一个随机图API!

正式开始 前往 afoim/EdgeOne_Function_PicAPI: 适用于EdgeOne边缘函数的随机图API 复制 worker.js 代码 部署到EdgeOne边缘函数 将代码开头的 R2_CONFIG 设为你自己的 var R2_CONFIG = { region: 'auto', service: 's3', accountId: '', accessKeyId: '', secretAccessKey: '', bucketName: '' }; 配置你的R2,将横屏随机图放到 ri/h 和 ri/v 。保证跟代码中的路径一样 // 根据路径确定前缀 var prefix = ''; if (pathname === '/h') { prefix = 'ri/h/'; } else if (pathname === '/v') { prefix = 'ri/v/'; } else if (pathname === '/') { 访问 /h 则展示一张横屏随机图,访问 /v 则展示一张竖屏随机图 如果需要绑定域名请设置触发规则 注意 边缘函数每月有300万次的请求数限制,暂不知道超出是否扣费

July 31, 2025 · 1 min · 72 words

CSP标头是什么?为什么有人能神不知鬼不觉地盗走你的信息?

举个例子吧! 这是一个无CSP标头的网站: 点我 不出意外,你的浏览器会弹出一个提示 这是如何做到的? 这个项目开源在 afoim/none_csp_demo HTML内容为 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>欢迎页面</title> </head> <body> <h1>欢迎</h1> <p>你好,<span id="name"></span>!</p> <script> // 从 URL 参数读取用户名并显示 const params = new URLSearchParams(location.search); const name = params.get("name"); document.getElementById("name").innerHTML = name; </script> </body> </html> 这个网站非常简单:页面会通过查询参数 ?name=xxx 动态显示用户名。 比如你输入 https://none-csp-demo.pages.dev/nocsp?name=AcoFork 网页就会显示 从源码可以看出,这个网页是通过 innerHTML 直接插入文本内容的。 这种写法没有做任何安全处理,会把传入内容直接拼接进 HTML。 那么…如果我们给网站这样一个 name 呢? 尝试输入 https://none-csp-demo.pages.dev/nocsp?name=%3Cimg%20src=x%20onerror=%22alert(%27XSS%E6%94%BB%E5%87%BB%E6%88%90%E5%8A%9F%27)%22%3E 你会发现网站并没有打印出任何用户名,而且浏览器还弹出了一个奇怪的窗口 我们F12查看当前网页的源代码 发现在 <span id="name"></span> 中 被插入了一条 <img src="x" onerror="alert('XSS攻击成功')"> ! 也就是说,网页并没有把我们传入的 name 当作纯文本处理, 而是直接把它插入成了 HTML。 因此浏览器并不会把它渲染成普通文字,例如 你好,<img src="x" onerror="alert('XSS攻击成功')"> ! ...

July 30, 2025 · 1 min · 156 words

如何提高网站的SEO?

标题 即每个HTML head部分的 title 不要重名 如果你的标题是中文,请尽量避免和任何知名事物重名。比如,不要叫 树叶博客,而可以换成 叶树博客 这种更容易区分的名字。 搜索引擎通常会给知名事物更高的权重;如果你的站点名称恰好与之重名,用户就很难通过搜索结果准确找到你。 使用英文标题 比如 AcoFork Blog、afoim Blog。 你可以尝试自创一个英文单词。和中文标题一样,最好也不要与知名事物重名。 对于这类独特名称,搜索引擎更容易把它识别为一个独立品牌或独立站点。 这样一来,用户只要直接搜索这个自创单词,比如 AcoFork,大概率就能找到你的网站。 跨页面使用主标题锚定 一个网站大多数情况下都会有多个页面,比如主页、分类页、归档页等等。 除了首页要展示你的主标题,其他页面也应尽量围绕这个主标题展开。 例如,主页面标题为 AcoFork Blog,那么副页面可以写成 分类 - AcoFork Blog,或者: AcoFork Blog - 分类 。 但请尽量不要只写一个 分类。虽然在同一域名下,这未必会严重影响搜索引擎判断,但很可能会误导用户。 例如,用户搜索你的网站时,排在前面的结果标题却只是一个 分类 页面,看起来就会很奇怪。 言简意赅写明description 即每个HTML head部分的 meta name="description" 网站描述不要太短,也不要过长,更不能留空。 我的网站简介是 分享网络技术、服务器部署、内网穿透、静态网站搭建、CDN优化、容器化部署等技术教程与实践经验的个人技术博客,专注于云原生、无服务器架构和前后端开发,作者为AcoFork/afoim/二叉树树 关键词 即每个HTML head部分的 meta name="keywords" 现代搜索引擎基本已经不再重视这个字段,而且它也非常容易被滥用,所以通常不需要填写。 同内容网站只能有一个 如无必要,请不要变更域名。也不要将其他域名指向您的站点 假如我同时拥有 acofork.com 和 acofork.cn,并且都想指向同一个网站,该怎么处理? 请使用 301 重定向 否则你的 SEO 会受到影响,搜索引擎可能不会把这两个站点视为同一个站点。 同时,最好确保这个域名今后只用于重定向。因为 301 重定向会在客户端留下长期缓存。 ...

July 29, 2025 · 1 min · 135 words