海风域名查询工具v1.0:纯PHP单文件WHOIS查询模块源码拆解
简介海风域名查询工具 v1.0 是一套基于 PHP 开发的域名信息查询系统源码面向需要在 Linux 主机上搭建域名查询服务的站长、运维人员及 PHP 学习者。该工具可帮助用户快速部署一个可自主运营的域名查询站点适合具备基础 PHP 环境配置能力的中级开发者使用。压缩包为 rar 格式整体约 372KB包内以 PHP 源码文件与 SQL 数据文件为主其中 PHP 文件承担查询逻辑与后台管理功能SQL 文件用于初始化数据库结构另含站点地图等辅助文件安装时需将相关文件权限设为 777 并运行安装入口完成部署后台默认账号密码均为 admin。目前已有 118 人学习下载。通过这份源码读者可获得一套可直接运行的域名查询工具了解其前后台目录组织方式、数据库初始化流程与权限配置要点并在此基础上进行二次开发或功能扩展适合作为 PHP 建站与查询类项目练手的参考实例。1. 海风域名查询工具 v1.0一个能塞进任何 PHP 站点的轻量查询模块手上有个老 PHP 项目后台需要加个域名查询入口运营想批量看一批域名的注册状态、到期时间和 NS 记录。找了一圈现成方案要么是独立部署的服务要么依赖外部接口还要配密钥塞进现有代码里都嫌重。后来翻到这个「海风域名查询工具 v1.0」单文件入口、纯 PHP 实现、不依赖数据库扔进站点目录改两行配置就能跑。它适合两类人一类是手里有 PHP 环境、想快速给后台加个域名查询能力的开发者另一类是想拿它当练手项目看一个完整的「输入校验 → 查询调度 → 结果渲染」链路在 PHP 里怎么组织。这篇就把这份 php 源码拆开从目录结构讲到二次开发怎么改查询源。2. 项目结构与技术选型为什么是纯 PHP 单入口2.1 目录骨架与文件职责拿到源码包第一件事是看目录。这个项目的结构非常扁平没有引入 Composer 依赖也没有框架痕迹典型的「下载即用」型工具。常见做法是长这样haifeng-domain/ ├── index.php # 唯一入口处理请求分发与页面渲染 ├── config.php # 配置文件查询源、超时、缓存开关 ├── lib/ │ ├── Query.php # 查询调度核心类 │ ├── Parser.php # 原始响应解析提取注册信息 │ └── Cache.php # 文件缓存实现 ├── assets/ │ ├── style.css # 页面样式 │ └── app.js # 前端交互提交查询、渲染结果 └── cache/ # 缓存目录需可写index.php是唯一对外暴露的入口所有请求都从这里进。lib/下三个类各管一摊Query负责决定用哪个查询源、发请求、拿原始数据Parser把原始数据转成统一结构Cache做一层文件缓存避免同一个域名短时间内重复查询。config.php把可变部分抽出来改配置不用动业务代码。这种拆法的好处是查询源可以换解析逻辑可以单独测缓存可以关掉互不影响。2.2 技术选型背后的取舍为什么不用框架因为这个工具的使用场景就是「塞进已有项目」。如果引入 Laravel 或 ThinkPHP光依赖安装就得折腾半天还跟宿主项目的依赖可能冲突。纯 PHP 加 spl_autoload_register 手动注册类文件是最低摩擦的方案。为什么用文件缓存而不是 Redis因为目标用户的环境里不一定有 Redis。文件缓存虽然并发性能一般但对「后台偶尔查几个域名」这个场景完全够用而且零配置。Cache.php里用域名做 key 的 md5存成 json 文件带过期时间戳读的时候判断一下是否过期。查询源这块项目默认走的是公开的 WHOIS 查询和 DNS 记录查询两条路。WHOIS 走 socket 连 43 端口DNS 走 PHP 内置的 dns_get_record。这两条路都不需要 API Key但稳定性看网络环境所以config.php里留了超时和重试次数的配置项。提示如果你的服务器禁用了 fsockopen 或 allow_url_fopenWHOIS 查询会直接失败部署前先确认这两个函数没被 disable_functions 拦掉。3. 核心查询链路拆解从表单提交到结果返回3.1 入口分发与输入校验index.php的逻辑很直白判断请求方法GET 渲染页面POST 处理查询。关键在输入校验这一步域名格式不校验的话后面拼 WHOIS 查询命令容易出问题。// index.php 入口分发片段 require_once __DIR__ . /config.php; // 手动注册类文件加载 spl_autoload_register(function ($class) { $file __DIR__ . /lib/ . $class . .php; if (is_file($file)) { require_once $file; } }); $domain isset($_POST[domain]) ? trim($_POST[domain]) : ; if ($_SERVER[REQUEST_METHOD] POST) { // 域名格式校验只允许字母数字连字符和点长度不超过 253 if (!preg_match(/^([a-z0-9-]\.)[a-z]{2,}$/i, $domain) || strlen($domain) 253) { $error 域名格式不正确; } else { $query new Query($config); $result $query-lookup($domain); } }这段代码里spl_autoload_register是替代 Composer 的轻量方案按类名去lib/目录找同名文件。域名校验用了一条正则限制字符集和总长度避免把奇怪的东西传给 WHOIS 服务器。$config从config.php里来是个关联数组包含超时、缓存开关、查询源优先级这些。参数说明$domain是用户提交的原始字符串trim 去掉首尾空格正则里[a-z]{2,}限制顶级域名至少两位字母实际使用中如果遇到 punycode 域名xn-- 开头需要额外放行这个后面二次开发章节会讲。3.2 Query 类的查询调度逻辑Query.php是整个工具的核心它决定先查缓存还是直接查、用哪个查询源、失败了怎么降级。// lib/Query.php 查询调度核心 class Query { private $config; private $cache; public function __construct(array $config) { $this-config $config; $this-cache new Cache($config[cache_dir], $config[cache_ttl]); } public function lookup(string $domain): array { // 先查缓存命中直接返回 if ($this-config[cache_enable]) { $cached $this-cache-get($domain); if ($cached ! null) { $cached[from_cache] true; return $cached; } } $raw $this-fetchWhois($domain); if ($raw false) { // WHOIS 失败时降级到 DNS 查询 $raw $this-fetchDns($domain); } $parser new Parser(); $result $parser-parse($domain, $raw); if ($this-config[cache_enable] !empty($result)) { $this-cache-set($domain, $result); } return $result; } }逻辑分四步缓存命中判断、WHOIS 查询、失败降级到 DNS、解析后写缓存。fetchWhois方法用fsockopen连 WHOIS 服务器的 43 端口发送域名加换行读取响应。fetchDns用dns_get_record拿 A 记录和 NS 记录。降级策略是「WHOIS 拿不到就至少给个 DNS 结果」保证页面不会空着。参数说明cache_ttl控制缓存有效期默认 3600 秒cache_dir必须可写否则Cache类会抛异常。from_cache标记用来在前端提示用户「这是缓存结果」。3.3 Parser 类的响应解析WHOIS 返回的是一大段文本不同后缀的格式还不一样。Parser.php的职责就是从这段文本里把注册商、创建时间、到期时间、域名状态这几个字段抠出来。// lib/Parser.php 关键字段提取 class Parser { public function parse(string $domain, $raw): array { $result [ domain $domain, registrar , created , expires , status [], nameservers [], ]; if (is_array($raw)) { // DNS 降级结果 $result[nameservers] $raw[ns] ?? []; return $result; } // WHOIS 文本按行解析匹配常见字段前缀 $lines explode(\n, $raw); foreach ($lines as $line) { $line trim($line); if (stripos($line, Registrar:) 0) { $result[registrar] trim(substr($line, 10)); } elseif (stripos($line, Creation Date:) 0) { $result[created] trim(substr($line, 14)); } elseif (stripos($line, Registry Expiry Date:) 0) { $result[expires] trim(substr($line, 20)); } elseif (stripos($line, Domain Status:) 0) { $result[status][] trim(substr($line, 14)); } } return $result; } }解析用的是最朴素的前缀匹配没有上正则表达式。原因是 WHOIS 文本格式虽然不统一但主流后缀的字段名就那么几个前缀匹配足够覆盖大部分情况而且比正则好调试。stripos不区分大小写因为有些服务器返回的是小写字段名。参数说明$raw可能是字符串WHOIS 响应或数组DNS 降级结果所以先判断类型。status和nameservers是数组字段因为一个域名可能有多个状态和多个 NS。注意WHOIS 查询有频率限制同一个 IP 短时间内查太多会被临时封禁。config.php里的cache_ttl别设太短生产环境建议不低于 1800 秒。4. 部署与运行从上传到跑通的最小步骤4.1 环境要求与上传这个工具对环境的要求很低PHP 7.0 以上开启fsockopen和dns_get_record可用cache/目录可写。不需要 MySQL不需要 Composer不需要 Web 服务器特殊配置。部署步骤把整个目录上传到 Web 根目录下的某个子目录比如/tools/domain/。给cache/目录写权限Linux 下chmod 755 cache或chmod 777 cache看运行用户。浏览器访问http://你的域名/tools/domain/index.php。在输入框里填一个域名点查询看是否返回结果。如果页面能打开但查询一直转圈大概率是fsockopen连不上 WHOIS 服务器。先在服务器上telnet whois.verisign-grs.com 43试一下通不通。如果服务器在国内且没有外网直连WHOIS 查询基本会超时这时候要么换查询源要么把cache_enable打开并预热缓存。4.2 配置文件逐项说明config.php返回一个数组每一项都影响运行行为// config.php 配置项 return [ cache_enable true, // 是否开启缓存 cache_dir __DIR__ . /cache, // 缓存目录 cache_ttl 3600, // 缓存有效期秒 whois_timeout 5, // WHOIS 连接超时秒 whois_server whois.verisign-grs.com, // 默认 WHOIS 服务器 dns_enable true, // 是否允许降级到 DNS 查询 ];whois_server这个配置项只对.com和.net生效其他后缀需要走 IANA 的 referral 机制。项目里Query::fetchWhois的做法是先连whois.iana.org问这个后缀的 WHOIS 服务器是谁再连过去查。这个过程多一次网络往返所以whois_timeout别设太短5 秒是保守值。dns_enable关掉之后WHOIS 失败就直接返回空结果不会降级。如果你的场景只关心注册信息不关心 DNS可以关掉省一次查询。4.3 前端交互与结果渲染assets/app.js负责把表单提交改成异步避免整页刷新。核心逻辑是监听表单 submit阻止默认行为用 fetch 发 POST拿到 JSON 后动态渲染结果表格。// assets/app.js 异步查询 document.getElementById(query-form).addEventListener(submit, function (e) { e.preventDefault(); const domain document.getElementById(domain-input).value.trim(); if (!domain) return; const resultBox document.getElementById(result-box); resultBox.innerHTML p查询中.../p; fetch(index.php, { method: POST, headers: { Content-Type: application/x-www-form-urlencoded }, body: domain encodeURIComponent(domain) ajax1 }) .then(res res.json()) .then(data { // 根据返回字段渲染表格 let html table; html trtd注册商/tdtd (data.registrar || -) /td/tr; html trtd创建时间/tdtd (data.created || -) /td/tr; html trtd到期时间/tdtd (data.expires || -) /td/tr; html /table; resultBox.innerHTML html; }) .catch(() { resultBox.innerHTML p查询失败请稍后重试/p; }); });这里有个细节POST 请求里带了ajax1参数index.php判断到这个参数时返回 JSON 而不是渲染 HTML。这样同一个入口既能服务页面请求也能服务异步请求不用额外开一个 api.php。参数说明encodeURIComponent对域名做 URL 编码防止特殊字符截断请求体。data.registrar这些字段名跟Parser返回的数组 key 一一对应改解析逻辑时前端也要同步改。5. 避坑与常见问题查询失败、缓存异常、格式兼容5.1 查询一直超时或返回空现象输入域名后页面卡住或者返回的结果里所有字段都是空的。原因fsockopen连不上 WHOIS 服务器或者连上了但服务器返回了错误信息比如「No match for domain」表示域名未注册。另外如果服务器开了防火墙只允许 80 和 443 出站43 端口会被拦。解决先在服务器上用php -r var_dump(fsockopen(whois.verisign-grs.com, 43, $e, $s, 5));测一下能不能连。连不上就换查询源或者把dns_enable打开至少能拿到 DNS 记录。如果连上了但返回空检查Parser里的字段前缀是否匹配当前后缀的 WHOIS 格式不同后缀的字段名可能不一样。5.2 缓存目录不可写导致查询报错现象页面直接报 500或者提示「缓存写入失败」。原因cache/目录权限不对PHP 运行用户没有写权限。常见于 Linux 下用 root 上传文件目录属主是 root而 PHP-FPM 跑在 www-data 用户下。解决chown -R www-data:www-data cache/或者chmod 777 cache/。如果不想给写权限把cache_enable设为 false工具会跳过缓存直接查询但查询频率会变高。5.3 特殊后缀域名解析失败现象.cn、.io、.co这些后缀查不出结果或者结果字段错位。原因不同后缀的 WHOIS 服务器返回格式差异很大。.cn的 WHOIS 服务器是whois.cnnic.cn字段名跟.com完全不同。项目默认的Parser只适配了主流 gTLD 的格式。解决在Parser::parse里加后缀判断针对不同后缀走不同的字段映射。或者更省事的做法是只提取「冒号分隔」的通用字段不依赖具体字段名。二次开发章节会展开讲这个改法。5.4 并发查询触发频率限制现象批量查询时前面几个成功后面全部失败。原因WHOIS 服务器对同一 IP 有查询频率限制短时间发太多请求会被临时封禁。解决在Query::lookup里加一个简单的 sleep比如每次查询前usleep(500000)停半秒。或者把批量查询改成队列模式前端一个一个提交后端串行处理。缓存也能缓解这个问题同一个域名第二次查就走缓存了。提示如果部署在共享主机上你的 IP 可能已经被其他用户「用脏」了WHOIS 查询失败不一定是代码问题换个环境试试。6. 二次开发换查询源、加后缀适配、接自己的缓存6.1 把查询源换成 HTTP API默认的 WHOIS socket 查询在有些网络环境下不稳定改成 HTTP API 是最常见的改造方向。假设你有一个返回 JSON 的域名查询接口改Query::fetchWhois就行// lib/Query.php 改用 HTTP API 查询 private function fetchWhois(string $domain) { $url https://api.example.com/whois?domain . urlencode($domain); $ctx stream_context_create([ http [ timeout $this-config[whois_timeout], header Accept: application/json, ] ]); $resp file_get_contents($url, false, $ctx); if ($resp false) { return false; } $data json_decode($resp, true); // 直接把 API 返回的字段映射成 Parser 期望的格式 return $data ?: false; }改完之后Parser也要跟着调因为 API 返回的是结构化数据不需要再按行解析。我一般会在Parser里加一个parseApi方法判断$raw是数组且带特定 key 时走 API 解析分支。这样 WHOIS 和 API 两种源可以共存配置里加个query_source开关切换。6.2 加后缀适配层针对.cn、.io这些格式不同的后缀最干净的做法是在Parser里加一个后缀映射表// lib/Parser.php 后缀适配 private $fieldMap [ default [ registrar Registrar:, created Creation Date:, expires Registry Expiry Date:, ], cn [ registrar Registrar:, created Registration Time:, expires Expiration Time:, ], ];解析时先取域名后缀查表拿到对应的字段前缀再按前缀匹配。这样加新后缀只需要在表里加一项不用改解析逻辑。改完之后拿几个不同后缀的域名各测一遍确认字段都能对上。6.3 接 Redis 或数据库缓存文件缓存在并发高的时候会有读写冲突换成 Redis 很简单把Cache类的方法体换掉就行接口保持不变// lib/Cache.php 换成 Redis 实现 class Cache { private $redis; private $ttl; public function __construct(string $dir, int $ttl) { $this-redis new Redis(); $this-redis-connect(127.0.0.1, 6379); $this-ttl $ttl; } public function get(string $domain) { $val $this-redis-get(whois: . md5($domain)); return $val ? json_decode($val, true) : null; } public function set(string $domain, array $data) { $this-redis-setex(whois: . md5($domain), $this-ttl, json_encode($data)); } }接口不变的好处是Query类完全不用动只换Cache的实现。这也是当初把缓存单独拆一个类的原因。改完之后记得在config.php里把cache_dir换成 Redis 连接信息或者干脆加一个cache_driver配置项。6.4 验证改造是否生效改完代码别急着上生产按这个顺序验一遍先单域名查一个已知注册的域名确认字段都有值再查一个未注册的域名确认不会报错而是返回「未注册」提示然后连续查同一个域名两次第二次应该走缓存看返回里的from_cache标记最后拿几个不同后缀的域名各查一次确认后缀适配表生效。我自己的习惯是改完查询源之后先在本机用 PHP 内置服务器php -S localhost:8000跑一遍确认没有语法错误和致命异常再传到测试环境。从那以后我每次改Parser的字段映射都强制拿.com、.cn、.io三个后缀各跑一遍回归不然总有一个后缀的字段会漏掉。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

修改Unity Timeline编辑器DLL:ILSpy反编译与IL指令定制

修改Unity Timeline编辑器DLL:ILSpy反编译与IL指令定制

拿到Unity项目里的Timeline模块,最烦的一件事是什么?我可以直接说——当需求方提出来要修改Timeline编辑器自身的交互逻辑,而官方API又没有一个可用的Hook点时,很多人第一反应是放弃,第二反应是到处搜插件。而我的习惯…

2026/10/17 4:57:16 阅读更多 →
Unity DLL反编译实战:dnSpyEx精准解析混淆代码与热调试

Unity DLL反编译实战:dnSpyEx精准解析混淆代码与热调试

简介:本资源是面向Unity游戏开发者与逆向分析学习者的dnSpy反编译工具完整安装包,专为解析Unity项目中托管代码(如C#脚本编译后的DLL)提供开箱即用的调试与反编译环境。资源包含1736个文件,主体为1583个.NET程序集&…

2026/10/17 4:57:16 阅读更多 →
openDCIM部署实战:LAMP环境下的轻量级数据中心资产台账系统

openDCIM部署实战:LAMP环境下的轻量级数据中心资产台账系统

简介:openDCIM是一款遵循GPL v3协议的开源数据中心基础设施管理(DCIM)应用程序,专为IT运维人员、数据中心管理员及DevOps工程师设计,用于统一跟踪机柜、服务器、网络设备、电源与空间等物理资产,适用于从单…

2026/10/17 4:57:16 阅读更多 →

最新新闻

Codex+VS Code构建可审计的AI Coding工程化实践

Codex+VS Code构建可审计的AI Coding工程化实践

1. 项目概述:这不是又一个“AI写代码”的演示,而是真实开发流里的生存实验“AI Coding 实践(再续)”——这个标题里最值得咀嚼的不是“AI”,也不是“Coding”,而是那个轻描淡写的“再续”。它意味着前序实践…

2026/10/17 5:40:28 阅读更多 →
CTF实战:GET/POST混合请求与BurpSuite+HackBar全流程解析

CTF实战:GET/POST混合请求与BurpSuite+HackBar全流程解析

CTF的Web题做多了你会发现,一半以上的题目卡住的点根本不是什么高深漏洞,而是你对HTTP请求本身的理解不够扎实。这次分享的实战演练,就是用一道典型的"GET/POST混合请求"CTF挑战,把BurpSuite和HackBar这两个工具完整串一…

2026/10/17 5:40:28 阅读更多 →
S7-1214C与机器人Modbus TCP通信:从角色分配到避坑全指南

S7-1214C与机器人Modbus TCP通信:从角色分配到避坑全指南

简介:面向工业自动化与机器人集成工程师,围绕西门子S7-1214C PLC与机器人间的Modbus TCP通信,整理了从网络配置、功能码应用、寄存器地址映射到数据交换的完整设置方案。压缩包共34个文件,总大小约6.96MB,以PDF编程教程…

2026/10/17 5:40:28 阅读更多 →
西门子S7-1214C与机器人Modbus TCP通信配置与调试指南

西门子S7-1214C与机器人Modbus TCP通信配置与调试指南

简介:面向自动化工程师与PLC编程人员,系统讲解西门子S7-1214C紧凑型PLC与机器人之间基于Modbus TCP协议的通信配置方法,涵盖主从站角色选择、IP地址分配、寄存器映射、功能码使用等关键环节,并提供S7-1215C相关参考文档以便对照学…

2026/10/17 5:40:28 阅读更多 →
揭秘ice-012-audio的杀手锏Active Acoustic Adapter:声学韵律双向条件化如何实现声音控制

揭秘ice-012-audio的杀手锏Active Acoustic Adapter:声学韵律双向条件化如何实现声音控制

【免费下载链接】ice-012-audio 项目地址: https://ai.gitcode.com/hf_mirrors/darkps/ice-012-audio 点击查看 免费下载 如果你正在寻找一个支持 590 种语言、还能精准控制性别、音高、口音和语速的开源语音合成方案,那么 ice-012-audio 值得重点关注。…

2026/10/17 5:40:28 阅读更多 →
XSS常用语句、绕过思路与场景化防御实战指南

XSS常用语句、绕过思路与场景化防御实战指南

说到XSS,不少人脑子里第一反应就是弹窗alert。我以前带新人时,总有人背了一堆payload,真到测试环境全被拦下来,就开始怀疑人生。这篇就是我从日常工作中沉淀出来的XSS常用语句和绕过思路,不讨论宏大的攻击链&#xff0…

2026/10/17 5:39:28 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →