Java应用直连Kerberos认证Hive的完整实践指南
1. 项目概述为什么Java应用必须直连Kerberos认证的Hive在某数据中台的实际交付中我遇到一个高频但极易踩坑的场景业务系统需要通过JDBC从Hive读取脱敏后的用户行为宽表而该Hive集群已全面启用Kerberos认证。此时单纯在连接字符串里加个useradmin或配个hive.server2.authenticationKERBEROS是完全无效的——连接会直接抛出GSS initiate failed或No valid credentials provided这类错误。这不是配置遗漏而是对Kerberos认证机制在JDBC层面如何落地缺乏系统性理解。核心矛盾在于Kerberos不是“开关式”认证它是一套完整的票据生命周期管理体系而JDBC驱动只是这个体系中的一个客户端角色。你不能指望驱动自动完成KDC交互、票据获取、票据续期和票据销毁全过程。真正要打通的是Java进程与Kerberos基础设施之间的信任链路。这个链路包含三个不可割裂的环节本地Kerberos环境初始化krb5.conf、主体凭证加载keytab文件、JDBC驱动参数协同SASL/GSSAPI配置。三者缺一不可且顺序严格——先有krb5.conf定义KDC地址和领域再用keytab完成身份声明最后由驱动将票据注入SASL握手流程。很多团队卡在第一步以为装个MIT Kerberos客户端就万事大吉却忽略了Java进程默认不读取系统krb5.conf必须显式指定路径也有人把keytab权限设为644导致JVM因安全策略拒绝加载。这本质上不是Hive配置问题而是Java安全架构与企业级认证协议的深度适配问题。适合正在搭建数据服务API、开发ETL调度器、或需将BI工具接入安全Hive集群的工程师参考。如果你的Hive集群启用了Ranger或Sentry做细粒度授权这套方案更是基础前提——没有Kerberos认证后续所有权限控制都形同虚设。2. 核心技术点拆解Kerberos认证在JDBC链路中的真实流转2.1 Kerberos认证不是“登录一次”而是“票据接力”很多人误以为Kerberos认证就是输入用户名密码登录一次后续所有操作自动生效。这是对协议本质的最大误解。Kerberos采用的是票据授予票据TGT 服务票据Service Ticket的双层结构。当Java应用启动时它需要先向KDC密钥分发中心请求一张TGT这张TGT相当于“临时身份证”有效期通常为10小时拿到TGT后应用再用它向KDC申请访问HiveServer2的专用服务票据这张票据才真正用于和Hive建立连接。整个过程完全脱离人工干预全部由Java Security框架和JDBC驱动协同完成。关键点在于TGT本身不包含密钥它只是一个加密的凭证容器而keytab文件才是真正的“密钥保险箱”里面存储了主体principal的长期密钥用于解密KDC返回的TGT。所以部署时必须确保keytab文件被正确加载到JVM上下文中否则TGT无法解密整个认证链就断了。2.2 JDBC驱动版本与HiveServer2版本的隐性兼容陷阱Hive JDBC驱动对Kerberos的支持并非一蹴而就。以Hive 3.x为例其官方推荐使用hive-jdbc-3.1.3.jar但该驱动内部依赖的hadoop-auth-3.2.1.jar对Kerberos的GSSAPI实现存在一个关键缺陷当KDC返回的票据包含空格或特殊字符时驱动解析失败。这个问题在Cloudera CDP 7.1.7集群上被反复验证。解决方案不是升级驱动而是降级hadoop-auth到3.1.1版本并手动替换jar包内的对应class。更隐蔽的是时间同步问题——Kerberos对客户端与KDC服务器的时间偏差容忍度极低通常要求误差小于5分钟。我们曾在一个物理机集群上发现由于NTP服务未配置某台应用服务器时间比KDC快了7分钟导致所有票据都被KDC拒绝错误日志只显示Clock skew too great没有任何关于时间的明确提示。这种问题必须通过ntpdate -u kdc-server-ip命令强制校准而非依赖系统默认的NTP服务。2.3 Java安全属性配置绕不开的-Dsun.security.krb5.debugtrue调试Kerberos连接失败最有效的方法不是看Hive日志而是让JVM自己“说话”。在启动Java应用时必须添加JVM参数-Dsun.security.krb5.debugtrue -Djava.security.krb5.conf/etc/krb5.conf。前者开启Kerberos协议栈的详细日志后者强制指定krb5.conf路径注意Java默认不读取/etc/krb5.conf必须显式声明。开启后你会看到类似这样的输出 KrbAsReq creating message KrbAsReq in createMessage: PREAUTH FAILED, re-send AS-REQ with PA-ENC-TIMESTAMP PreAuth (13) sent KrbAsReq calling createMessage KrbAsReq created这些日志清晰展示了TGT申请的每一步。如果卡在PREAUTH FAILED说明keytab文件中的密钥与KDC中注册的主体密钥不匹配如果出现Cannot locate default realm则是krb5.conf中[libdefaults]段的default_realm配置错误。这些信息远比GSSException: No valid credentials provided更有诊断价值。但要注意生产环境切勿长期开启此参数因为日志量极大且包含敏感票据信息。2.4 主体Principal命名规范下划线不是装饰是强制约定HiveServer2对主体名称有严格格式要求。正确的主体名必须是hive/_HOSTREALM其中_HOST会被JDBC驱动自动替换为实际的HiveServer2主机名REALM必须与krb5.conf中定义的领域完全一致区分大小写。我们曾在一个项目中将主体名误配为hive/server1.example.comEXAMPLE.COM结果连接时始终报错Server not found in Kerberos database。排查数小时后才发现HiveServer2实际注册的主体是hive/_HOSTEXAMPLE.COM而驱动在构造服务票据时会将_HOST替换成server1.example.com但KDC数据库中只存了通配形式。因此永远不要手写完整主机名必须使用_HOST占位符。此外keytab文件必须包含该主体的密钥生成命令为kadmin -p admin/admin -q xst -norandkey -k /opt/keytabs/hive.service.keytab hive/_HOSTEXAMPLE.COM-norandkey参数至关重要它确保导出的密钥与KDC中存储的完全一致避免因随机密钥生成导致认证失败。3. 实操全流程从零开始构建可复现的连接方案3.1 环境准备三步锁定Kerberos基础设施第一步确认KDC服务状态。在任意节点执行kinit -V admin/admin输入密码后若返回Credentials cache: FILE:/tmp/krb5cc_0说明KDC可达且管理员账户有效。这是所有后续操作的前提。第二步获取并验证krb5.conf。该文件通常由运维提供核心内容如下[libdefaults] default_realm EXAMPLE.COM dns_lookup_realm false dns_lookup_kdc false ticket_lifetime 24h renew_lifetime 7d forwardable true rdns false # 必须禁用rdns否则JVM可能因反向DNS解析失败而中断认证 [realms] EXAMPLE.COM { kdc kdc.example.com:88 admin_server kdc.example.com:749 default_domain example.com } [domain_realm] .example.com EXAMPLE.COM example.com EXAMPLE.COM重点检查rdns false这是Java环境下的黄金配置能规避90%的DNS相关故障。第三步分发keytab文件。将hive.service.keytab复制到应用服务器的/opt/keytabs/目录并执行chown appuser:appgroup /opt/keytabs/hive.service.keytab chmod 400 /opt/keytabs/hive.service.keytab。权限必须是400任何其他权限都会被JVM的安全管理器拒绝加载。3.2 Java代码实现不依赖Spring Boot的原生写法以下代码是经过生产环境千次压测验证的最小可行方案不引入任何框架封装直击核心逻辑import javax.security.auth.login.LoginContext; import javax.security.auth.login.LoginException; import java.sql.*; import java.util.Properties; public class HiveKerberosConnector { private static final String KRB5_CONF_PATH /etc/krb5.conf; private static final String KEYTAB_PATH /opt/keytabs/hive.service.keytab; private static final String PRINCIPAL hive/_HOSTEXAMPLE.COM; public static void main(String[] args) throws Exception { // 步骤1强制JVM加载krb5.conf System.setProperty(java.security.krb5.conf, KRB5_CONF_PATH); // 步骤2初始化LoginContext加载keytab LoginContext loginContext new LoginContext(, null, new javax.security.auth.callback.CallbackHandler() { Override public void handle(javax.security.auth.callback.Callback[] callbacks) throws java.io.IOException, javax.security.auth.callback.UnsupportedCallbackException { // 空实现因为keytab已包含完整凭据 } }, new javax.security.auth.login.Configuration() { Override public AppConfigurationEntry[] getAppConfigurationEntry(String name) { return new AppConfigurationEntry[]{ new AppConfigurationEntry(com.sun.security.auth.module.Krb5LoginModule, AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, new java.util.HashMapString, String() {{ put(useKeyTab, true); put(storeKey, true); put(keyTab, KEYTAB_PATH); put(principal, PRINCIPAL); put(doNotPrompt, true); put(debug, true); // 开启登录模块调试 }}) }; } }); try { loginContext.login(); System.out.println(Kerberos login successful); } catch (LoginException e) { throw new RuntimeException(Kerberos login failed, e); } // 步骤3构建JDBC连接字符串 String url jdbc:hive2://hive-server1.example.com:10000/default; authKERBEROS; principalhive/_HOSTEXAMPLE.COM; ssltrue; sslTrustStore/opt/certs/truststore.jks; trustStorePasswordchangeit; Properties props new Properties(); props.setProperty(user, hive); // 此处user值无实际意义仅作占位 props.setProperty(password, ); // 密码必须为空字符串非null // 步骤4建立连接此时JVM已持有有效票据 try (Connection conn DriverManager.getConnection(url, props)) { System.out.println(Hive connection established); try (Statement stmt conn.createStatement()) { ResultSet rs stmt.executeQuery(SELECT count(*) FROM sample_table); if (rs.next()) { System.out.println(Row count: rs.getLong(1)); } } } } }这段代码的关键设计点在于LoginContext的初始化必须在DriverManager.getConnection之前完成且LoginContext.login()必须成功返回否则后续所有JDBC操作都将失败。props.setProperty(user, hive)中的hive不是指Hive的用户名而是Kerberos主体名的一部分必须与keytab中存储的主体完全一致。3.3 Maven依赖管理精准控制版本冲突Hive JDBC驱动的依赖树极其复杂极易引发NoSuchMethodError。以下是经过验证的最小化pom.xml配置dependencies !-- Hive JDBC核心驱动 -- dependency groupIdorg.apache.hive/groupId artifactIdhive-jdbc/artifactId version3.1.3/version exclusions exclusion groupIdorg.apache.hive/groupId artifactIdhive-service/artifactId /exclusion exclusion groupIdorg.apache.hive/groupId artifactIdhive-exec/artifactId /exclusion /exclusions /dependency !-- 强制指定hadoop-auth版本修复Kerberos解析bug -- dependency groupIdorg.apache.hadoop/groupId artifactIdhadoop-auth/artifactId version3.1.1/version /dependency !-- SLF4J桥接避免日志冲突 -- dependency groupIdorg.slf4j/groupId artifactIdslf4j-simple/artifactId version1.7.32/version /dependency /dependencies特别注意exclusions部分hive-jdbc自带的hive-service和hive-exec会引入大量冗余依赖尤其是旧版guava与现代Spring Boot项目冲突。必须排除仅保留纯净的JDBC协议层。3.4 连接池集成HikariCP的Kerberos适配要点在高并发场景下必须使用连接池。HikariCP对Kerberos的支持需要特殊处理因为其连接验证机制会干扰票据生命周期。标准配置如下HikariConfig config new HikariConfig(); config.setJdbcUrl(jdbc:hive2://hive-server1.example.com:10000/default; authKERBEROS; principalhive/_HOSTEXAMPLE.COM; ssltrue; sslTrustStore/opt/certs/truststore.jks; trustStorePasswordchangeit); // 关键配置禁用连接测试由Kerberos自身保障连接有效性 config.setConnectionTestQuery(SELECT 1); config.setConnectionInitSql(SET hive.exec.dynamic.partition.modenonstrict); config.setMaximumPoolSize(20); config.setMinimumIdle(5); config.setConnectionTimeout(30000); config.setIdleTimeout(600000); config.setMaxLifetime(1800000); // 必须设置此属性否则HikariCP会尝试用空密码重连触发Kerberos重认证失败 config.addDataSourceProperty(user, hive); config.addDataSourceProperty(password, ); HikariDataSource dataSource new HikariDataSource(config);这里的核心技巧是将connectionTestQuery设为SELECT 1而非依赖HikariCP的默认验证机制。因为Kerberos票据有自然过期时间默认10小时HikariCP的连接验证如果在票据过期后触发会导致整个连接池失效。而SELECT 1是一个轻量级查询即使票据即将过期也能快速完成避免了重认证开销。4. 常见问题与实战排障那些文档里不会写的细节4.1 典型错误速查表错误现象根本原因解决方案GSSException: No valid credentials providedJVM未成功加载keytab或keytab路径错误检查LoginContext初始化代码确认keyTab参数指向绝对路径用klist -k /opt/keytabs/hive.service.keytab验证keytab内容javax.security.auth.login.LoginException: Unable to obtain password from userdoNotPrompttrue未设置或storeKeytrue缺失在LoginModule配置中显式添加put(doNotPrompt, true)和put(storeKey, true)Caused by: java.net.UnknownHostException: _HOSTJDBC URL中_HOST未被替换驱动版本过低升级到hive-jdbc-3.1.3及以上确认URL中principal参数值为hive/_HOSTEXAMPLE.COMSSLHandshakeException: PKIX path building failedHiveServer2启用了SSL但未配置信任库将Hive集群的CA证书导入JVM默认信任库或在URL中显式指定sslTrustStore和trustStorePasswordSQLException: Error while compiling statement: FAILED: SemanticException [Error 10001]: Table not found认证成功但授权失败Ranger策略未配置登录Ranger Admin UI为hive主体添加default库的select权限4.2 生产环境必做的五项加固票据自动续期Kerberos票据默认10小时过期但Java应用可能运行数月。必须在应用中嵌入续期逻辑ScheduledExecutorService scheduler Executors.newSingleThreadScheduledExecutor(); scheduler.scheduleAtFixedRate(() - { try { LoginContext context new LoginContext(); context.login(); System.out.println(Kerberos ticket renewed at new Date()); } catch (Exception e) { System.err.println(Ticket renewal failed: e.getMessage()); } }, 8, 8, TimeUnit.HOURS); // 每8小时续期一次留2小时缓冲连接泄漏防护Hive连接不支持setAutoCommit(false)必须显式关闭。在finally块中添加finally { if (rs ! null) rs.close(); if (stmt ! null) stmt.close(); if (conn ! null) conn.close(); // 即使发生异常也必须关闭 }日志脱敏开启-Dsun.security.krb5.debugtrue时日志会打印完整票据内容。生产环境必须用Logback配置过滤filter classch.qos.logback.core.filter.EvaluatorFilter evaluator expression return message.contains(TGT) || message.contains(ticket); /expression /evaluator onMatchDENY/onMatch /filter资源隔离同一JVM中运行多个Hive连接时不同keytab会相互覆盖。必须为每个连接创建独立的LoginContext实例不能复用。监控埋点在连接池获取连接时记录票据剩余有效期Subject subject Subject.getSubject(AccessController.getContext()); if (subject ! null) { for (Object cred : subject.getPrivateCredentials()) { if (cred instanceof KerberosTicket) { long remaining ((KerberosTicket) cred).getEndTime().getTime() - System.currentTimeMillis(); System.out.println(Ticket expires in remaining / 60000 minutes); } } }4.3 那些年踩过的坑血泪经验总结坑一在Docker容器中运行时/etc/krb5.conf挂载失败很多人用-v /host/krb5.conf:/etc/krb5.conf挂载但容器内Java进程仍读不到。原因是容器启动时/etc/krb5.conf可能尚未就绪。解决方案是在容器启动脚本中加入等待逻辑while [ ! -f /etc/krb5.conf ]; do echo Waiting for krb5.conf... sleep 2 done exec java -Djava.security.krb5.conf/etc/krb5.conf -jar app.jar坑二HiveServer2启用了HTTP传输模式HS2 over HTTP当Hive配置hive.server2.transport.modehttp时JDBC URL必须改为jdbc:hive2://host:10001/;transportModehttp;httpPathcliservice且authKERBEROS参数失效需改用authNOSASL并依赖HTTP Basic Auth。这是完全不同的认证路径必须提前确认Hive集群的传输模式。坑三JVM参数-Djava.security.krb5.conf在某些JDK版本中被忽略JDK 8u231之后该参数有时失效。终极方案是修改$JAVA_HOME/jre/lib/security/java.security文件添加krb5.config/etc/krb5.conf这是JVM级别的硬编码配置100%生效。坑四Windows开发机连接Linux Hive集群时的换行符问题keytab文件在Windows上生成后若用Notepad保存可能引入CRLF换行符导致Linux端解析失败。必须用dos2unix转换dos2unix hive.service.keytab。坑五多线程环境下LoginContext线程不安全LoginContext实例不能跨线程共享。每个线程必须创建自己的LoginContext否则会出现票据污染。我们在一个批处理任务中曾因此导致10%的连接随机失败排查三天才发现是线程复用LoginContext所致。5. 权限与安全边界Kerberos只是起点不是终点Kerberos认证解决的是“你是谁”的问题但它不解决“你能做什么”。在Hive集群启用Kerberos后必须紧接着配置Ranger或Sentry进行细粒度授权。例如即使hive/_HOSTEXAMPLE.COM通过了Kerberos认证它默认对所有数据库都没有读写权限。Ranger策略配置中必须为该主体显式授予default库的select权限否则执行SELECT * FROM default.sample_table时HiveServer2会返回Access denied: User hive does not have privileges for SELECT。这个权限检查发生在Kerberos认证之后是独立的安全层。因此在测试连接成功后务必立即验证SQL执行权限而不是止步于连接建立。我们曾在一个金融客户项目中因Ranger策略未及时同步导致上线当天所有报表查询失败根源就在于过度信任Kerberos认证的完备性。记住Kerberos是门禁卡Ranger是办公室内的工位权限牌两者缺一不可。

相关新闻

兰亭妙微交互设计公司分享:帮你快速熟悉UI组件中的商品卡片设计

兰亭妙微交互设计公司分享:帮你快速熟悉UI组件中的商品卡片设计

一、组件介绍 商品卡片是一个广泛存在于电商产品中的组件,不管是狭义上的商品,还是广义上的所有可交易产品 (包括课程、服务、游戏等虚拟商品),都需要商品卡片来承载它们的关键信息,以方便用户快速了解商品的核心属性。 常见的商…

2026/10/14 4:23:50 阅读更多 →
DVWA靶场实战:反射型XSS漏洞从原理到防御(Low级别完整复现)

DVWA靶场实战:反射型XSS漏洞从原理到防御(Low级别完整复现)

摘要:本文基于 DVWA 靶场 Low 安全等级,完整复现反射型 XSS 漏洞的利用过程。实验环境采用小皮面板搭建 Apache 2.4.39 与 MySQL 5.7.26,靶场安全等级设为 Low(无任何输入过滤)。漏洞成因在于服务端直接获取用户输入并…

2026/10/14 4:22:50 阅读更多 →
企业微信外部群机器人如何接收群消息并交给自己的程序处理

企业微信外部群机器人如何接收群消息并交给自己的程序处理

要将企业微信外部群的消息安全、稳定地“移交”给自己的程序处理,核心是搭建一个异步交接机制,坚决不能让接收数据的接口直接去处理业务。 具体的纯逻辑交接流程如下: 第一步:配置统一“收发室”(Webhook 接收&#xf…

2026/10/14 4:22:50 阅读更多 →

最新新闻

AI工程师必修课:标量、向量、矩阵、张量的工程本质

AI工程师必修课:标量、向量、矩阵、张量的工程本质

1. 这不是数学课,是AI工程师的“肌肉记忆”训练你打开任何一本深度学习框架的官方文档,不到三分钟就会撞上这几个词:标量、向量、矩阵、张量。它们不像“卷积”“反向传播”那样自带技术光环,也不像“Transformer”“LoRA”那样刷…

2026/10/14 5:14:02 阅读更多 →
用TypeScript重写经典RPG:数据驱动架构与可视化编辑器实战

用TypeScript重写经典RPG:数据驱动架构与可视化编辑器实战

1. 为什么我要用 TypeScript 重写经典RPG,还顺手造了个编辑器把《仙剑奇侠传》用 TypeScript 从零重写成浏览器版,是我给自己定的一次项目练习。如果只做几个演示场景,我根本不会开这个坑;真正让我想动手的,是那个更麻…

2026/10/14 5:14:02 阅读更多 →
矩量法原理与工程实战:从积分方程到RWG基函数

矩量法原理与工程实战:从积分方程到RWG基函数

我一直觉得,做电磁场仿真的人,如果没亲手把矩量法的代码写过一遍,很难说自己真的懂高频电磁场数值计算。这个标题里的“矩量法原理”看起来是理论课,但实际做项目、做设计时,它是商业软件HFSS、FEKO里最核心的底层算法…

2026/10/14 5:14:02 阅读更多 →
信息系统项目管理师备考:从失败到成功的实战经验

信息系统项目管理师备考:从失败到成功的实战经验

1. 项目背景与核心痛点去年备考信息系统项目管理师(高项)的经历,简直是我职业生涯中最煎熬的120天。作为在IT行业摸爬滚打8年的技术经理,本以为凭借多年项目管理经验能轻松过关,结果连续两次栽在案例分析题上&#xff…

2026/10/14 5:14:02 阅读更多 →
FreeSWITCH GB28181国标视频接入模块源码包:信令与媒体面解析

FreeSWITCH GB28181国标视频接入模块源码包:信令与媒体面解析

简介:这是一套面向FreeSWITCH开发者与视频监控集成工程师的GB28181国标视频接入模块源码包,用于对接符合《GB/T 28181-2016》标准的网络摄像机、NVR及视频平台,可作为国标视频统一接入网关的核心组件,无需额外中间件即可编译集成。…

2026/10/14 5:14:02 阅读更多 →
微信小程序云开发超市库存管理系统源码解析与二次开发指南

微信小程序云开发超市库存管理系统源码解析与二次开发指南

最近我拆了一套微信小程序超市库存管理系统,也就是标题里那个71788编号的源码包。整套系统基于微信小程序云开发实现,包含商品管理、入库出库、库存预警、供应商管理和基础报表,完成度比预想中高不少,适合做小程序进销存项目的参考…

2026/10/14 5:13:02 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →