C#接入TuShare获取A股行情实战:从HTTP请求到本地K线库
简介面向C#开发者的Tu Share财经数据接口调用指南解决在.NET Core项目中快速获取股票交易信息的难题。Tu Share提供HTTP API一次调用即可获取全市场数据比传统逐股爬取效率提升明显。这份PDF文档系统梳理了从平台注册、Token获取、HTTP API参数说明到C#端安装Microsoft.Extensions.Http与Newtonsoft.Json包、封装HttpClient POST请求的完整流程并附带可直接套用的接口封装类与调用示例帮助读者快速落地。资源为单份PDF文档约212KB轻量便于随时查阅。已有2346人学习下载适合需要接入股票行情数据或构建量化分析基础的C#开发者。1. C#接入TuShare为什么说这是获取A股行情最稳的一条路我接触过一个做选股工具的个人开发者他最初靠网页抓取拿行情数据结果对方页面一改版整个解析逻辑全部作废前后折腾了两周才缓过劲。后来他切到TuShare这类接口服务发现用C#调HTTP接口拿股票交易信息反而比爬网页省心得多。这就是本文要讲清楚的事C#中利用TuShare获取股票交易信息本质上是一个「HTTP请求 JSON解析 本地落地」的过程没有黑匣子不需要特殊运行环境更不用跟反爬机制搏斗。TuShare把A股日线、每日指标、交易日历、复权因子等数据整理成标准接口你只需要按照约定格式发请求、收响应、做数据清洗。这篇文章适合那些想在C#项目里拿到真实A股行情做分析或做策略验证的开发者也适合刚接触量化想找个可靠数据源的新手。2. 对接前的三个基础准备接口形态、token与最小请求骨架2.1 接口风格HTTP JSONC#天然好接TuShare对外提供服务的方式是HTTP POST请求请求体和响应体都是JSON。这一点非常关键因为C#生态里处理JSON和HTTP的工具链非常成熟System.Text.Json和HttpClient都是内置库不需要额外引入第三方包也不需要依赖某个特定的SDK。很多人在网上搜「TuShare C#」会找到各种各样的包装库但那些库很多已经停止维护接口参数也不一定跟得上自己用HttpClient直接调反而更可控。请求的基本结构是固定的一个JSON对象里包含api_name、token、params、fields四个字段。api_name表示你要调用的接口名比如daily表示日线行情trade_cal表示交易日历token是你注册账号后拿到的密钥params是该接口的具体参数比如股票代码、起止日期fields是你想返回的字段列表用逗号分隔。响应同样是一个JSON对象里面code表示状态码msg是错误信息data里才是真正的数据。2.2 注册拿token、搞清积分与限流的关系使用TuShare之前必须先注册账号并创建应用拿到一串token字符串。token就是你的身份凭证每次请求都要带上。有一点需要提前知道TuShare的接口频次跟账号积分挂钩积分越高每分钟允许的请求次数越多。基础积分刚注册时就能用但频次限制比较紧比如拉全市场几千只股票的数据时如果不做控制很容易在几十秒内就触到上限。拿到的token要妥善保管。我一般会把token放到配置文件里而不是写在代码里这样代码提交到仓库时不会把密钥带出去。后面第3章会详细讲配置分离的做法。另外token是不能分享的别人拿到你的token就可以消耗你的调用额度严重时还可能被平台封禁账号。2.3 一个最小可跑的C#请求骨架先看一个最基础的请求示例它调用daily接口拉取某只股票一天的行情using System.Text; using System.Text.Json; var token 你的token; var apiUrl http://api.tushare.pro; var payload new { api_name daily, token token, params new { ts_code 000001.SZ, trade_date 20240115 }, fields ts_code,trade_date,open,high,low,close,vol,amount }; using var client new HttpClient(); var json JsonSerializer.Serialize(payload); var content new StringContent(json, Encoding.UTF8, application/json); var response await client.PostAsync(apiUrl, content); var responseText await response.Content.ReadAsStringAsync(); Console.WriteLine(responseText);这段代码的逻辑很直白构造请求体序列化成JSONPOST到接口地址然后把响应当成字符串打印出来。关键参数有三个。api_name决定调哪个数据接口这里是dailyparams里的ts_code要写成6位代码加交易所后缀000001.SZ是平安银行.SZ表示深圳交易所.SH表示上海trade_date的格式是YYYYMMDD注意这里传的是字符串20240115但响应里的trade_date字段返回的是整数。跑通这个最小请求后你已经完成了C#中利用TuShare获取股票交易信息的第一步。接下来要解决的是封装、解析和持久化的问题。3. 封装一个可复用的TuShare客户端请求方法、响应解析与配置管理3.1 封装通用POST请求方法避免重复写HttpClient逻辑最小骨架跑通之后如果每个接口都写一遍HttpClient逻辑代码会非常冗余。更常见的做法是封装一个通用的请求方法把api_name、params、fields作为参数传进去方法内部负责序列化、发送、接收和错误码检查。public class TuShareClient { private readonly HttpClient _httpClient; private readonly string _token; private readonly string _apiUrl http://api.tushare.pro; public TuShareClient(string token) { _token token; _httpClient new HttpClient(); _httpClient.Timeout TimeSpan.FromSeconds(30); } public async TaskJsonElement RequestAsync(string apiName, object paramsObj, string fields) { var payload new { api_name apiName, token _token, params paramsObj, fields fields }; var json JsonSerializer.Serialize(payload); var content new StringContent(json, Encoding.UTF8, application/json); var response await _httpClient.PostAsync(_apiUrl, content); var responseText await response.Content.ReadAsStringAsync(); using var doc JsonDocument.Parse(responseText); var root doc.RootElement; if (root.GetProperty(code).GetInt32() ! 0) { throw new Exception($TuShare接口错误: {root.GetProperty(msg).GetString()}); } return root.GetProperty(data).Clone(); } }这个封装有几个点值得说明。HttpClient设置了30秒超时因为TuShare某些接口在拉大量数据时会慢一些超时太短容易误判失败。返回的JsonElement直接取自data节点这样调用方只需要处理纯数据部分。code非0时抛出异常msg里带具体错误原因比如积分不足或参数非法。另外把HttpClient建在类的内部每次实例化会新建连接如果调用很频繁建议把HttpClient提升为单例或静态字段复用避免端口耗尽的问题。用一个异步方法作为入口还有一个额外的好处在并发拉取多只股票的数据时你可以用Task.WhenAll并行发起请求同时配合频控逻辑限制并发数。这个后面第5章避坑部分会细讲。3.2 从JSON到C#对象TuShare的fields与items结构解析TuShare返回的数据结构跟很多开放平台不一样它不直接给对象数组而是给两个平级数组fields是字段名列表items是数据二维数组。items里每一行是一条记录行内每个元素对应fields里同下标字段。第一次拿到这种结构的人容易懵以为需要猜字段名才知道数据顺序实际上这是一一对应的。解析思路有两种。一种是动态解析直接把fields和items组装成ListDictionarystring, object适合快速看数据另一种是定义实体类把items里的元素按顺序填充到实体属性适合后续入库或计算。public ListDictionarystring, object ParseData(JsonElement data) { var fields data.GetProperty(fields) .EnumerateArray() .Select(f f.GetString()) .ToList(); var items data.GetProperty(items).EnumerateArray(); var result new ListDictionarystring, object(); foreach (var row in items) { var dict new Dictionarystring, object(); for (int i 0; i fields.Count; i) { dict[fields[i]] row[i].GetRawText(); } result.Add(dict); } return result; }这里把每个单元格统一用GetRawText转成原始文本是因为TuShare返回里既有整数也有字符串还有可能为空值直接用GetInt32或GetString容易遇到类型不符抛异常。取到文本之后按需再做转换就行。字段顺序以fields数组为准千万不要硬编码下标因为同一个接口在不同时间点可能增加字段。解析完成之后数据就能映射到自定义的日线实体类了。实体类里trade_date建议用DateTime或int存原始整数都行open、high、low、close价格用doublevol是成交量手数amount是成交金额千元。vol和amount的精度问题后面实际入库时要注意。3.3 把token放进配置密钥分离是底线习惯把token直接new在构造函数里只适合本地测试工程化之后要放到配置文件。.NET里常见做法是放进appsettings.json或者用环境变量不让token出现在源码里。{ TuShare: { Token: 你的token, ApiUrl: http://api.tushare.pro } }读取时用ConfigurationManager或者IOptions注入都行。最朴素的做法是var config new ConfigurationBuilder() .AddJsonFile(appsettings.json) .Build(); var token config[TuShare:Token];这样做的好处非常实际代码提交到Git仓库时token不会跟着源码泄露换一台机器部署时只需要改配置文件不需要重新编译。如果团队协作配置文件还能按环境区分测试环境和生产环境用不同的token。另外不要把token打到日志里有些新手在处理异常时习惯把请求体整个打印出来token就这么顺着日志流出去了。4. 实战拉取日线行情、复权因子与交易日历的配合使用4.1 拉取日线数据并将字段对齐到本地实体拿到了通用请求方法和解析逻辑接下来拉日线数据就只是配置参数的问题。var client new TuShareClient(token); var data await client.RequestAsync( daily, new { ts_code 600519.SH, start_date 20240101, end_date 20240131 }, ts_code,trade_date,open,high,low,close,vol,amount ); var rows ParseData(data); foreach (var row in rows) { Console.WriteLine(${row[trade_date]} {row[open]} {row[close]}); }这段代码拉取贵州茅台在2024年1月的日线行情。start_date和end_date都传YYYYMMDD格式的字符串接口会返回闭区间内所有交易日数据。字段列表里没要的字段不会返回可以减少传输体积。日常使用中最常用的字段就是这七个ts_code、trade_date、open、high、low、close、vol、amount。有人在拉数据时容易忽略大小写ts_code里的股票代码后缀必须大写SH/SZ/BJ否则接口直接报参数错误。还有start_date和end_date如果不传默认返回最近一个交易日的数据这个默认行为在写增量更新逻辑时很有用。4.2 复权因子与前后复权daily接口返回的是未复权价有一个特别容易踩的坑daily接口返回的开高低收是未复权价格。什么意思就是上市公司分红送股之后历史价格不会自动调整。如果你直接用这个价格画K线、算涨跌幅遇到有除权除息的日子K线图上会出现跳空技术指标也会失真。TuShare提供单独接口获取复权因子也可以直接用pro_bar接口它内部帮你算了复权逻辑。pro_bar不是通过api_name调用的通用接口而是需要按特定参数组合调用。在C#里有两种做法一是每次拉daily后额外拉一次复权因子自己计算前复权价二是直接调pro_bar接口。我一般用后者简单直接var data await client.RequestAsync( pro_bar, new { ts_code 600519.SH, start_date 20230101, end_date 20240301, adj qfq, asset E, freq D }, ts_code,trade_date,open,high,low,close,vol,amount );参数说明adjqfq表示前复权hfq是后复权不传则返回未复权数据assetE表示股票这个参数用于区分股票、指数、ETFfreqD表示日线。前复权以最新价格为基准调整历史价格后复权以最早价格为基准。做回测时用前复权更贴近实际交易视角做除权除息研究时用后复权更方便。4.3 交易日历不要用自然日判断数据缺口股票市场有休市日、节假日A股交易日跟自然日并不重合。判断某一天该不该有数据不能靠「今天是不是周末」这种逻辑必须查交易日历。var cal await client.RequestAsync( trade_cal, new { exchange SSE, start_date 20240101, end_date 20240401, is_open 1 }, exchange,cal_date,is_open );这个接口返回指定交易所的日历状态is_open传1表示只要开市日。拿到日历后可以本地维护一个交易日列表用来校验拉回来的日线数据是否有缺席。增量更新时也可以先查日历确定下一批要拉哪些日期而不是盲目按自然天去请求。实战里把日历、日线、复权因子三者合并才能构建出一份干净的本地方案。从TuShare拿到单价数据只是第一步落库和校验才是让数据真正可用的关键。5. 避坑调用TuShare最常见的5个翻车现场与排查套路5.1 返回成功却数据为空先查限流再查日期现象请求返回code0但data里items为空数组看起来像是当天没有交易数据。原因有两种可能。第一种是撞上了接口限频TuShare在高频请求时不会直接拒绝而是静默返回空数据这种情况最容易迷惑人。第二种是日期设置问题比如传了周末或者非交易日或者start_date填成了20240000这种不可能存在的日期虽然通过了参数校验但查不到任何记录。解决先在代码里把响应里的完整JSON打出来确认data.fields和data.items是否存在突然为空。然后核对日历确认你请求的日期确实是交易日。如果两个都没问题大概率就是限流降低请求频率或者等一分钟再试。5.2 返回错误提示积分不足不是代码问题是账号权限问题现象请求日线接口返回「抱歉您每分钟最多访问该接口X次」或者「权限不足」。原因TuShare不同积分对应不同的接口权限和频次权限。有些接口需要更高积分才能调用或者每分钟调用次数受限。同一个token在不同时段也可能出现频次抖动。解决错误信息里会明确说限额是多少先做自我保护在客户端里加一个简单的令牌桶限速器比如每次请求间隔不小于1秒。如果确实需要高频调用只能通过官方渠道提升积分。代码层面能做的是把单次批量请求做大减少请求次数比如一次拉一整年的日线数据而不是一天一天拉。5.3 日期字段类型不一致请求时字符串响应时整数现象解析响应时用GetString读取trade_date结果抛异常或者字符串拼接时发现trade_date是数字。原因TuShare的请求参数里日期一般接受字符串但响应数据里trade_date、cal_date这些日期字段返回的是整数。比如响应里trade_date是20240115不是20240115。解决解析时统一用GetRawText先拿原始文本再按需求转换。往数据库存的时候建议直接存整数原始值查询时用大于小于比较更高效。如果业务需要DateTime可以自己写一个int转DateTime的辅助方法把它格式化成DateTime之后再做日期计算。5.4 vol和amount的精度问题导致入库数据错位现象把TuShare返回的vol字段存成int发现某些股票的成交量数字跟行情软件对不上或者amount字段小数部分丢了。原因TuShare的日线接口里vol单位是手amount单位是千元而且这两个字段有时返回的是浮点数而不是整数。用int接收会导致精度丢失或溢出尤其量大的股票。解决实体类里vol和amount都用double或者decimal定义。另外跟行情软件对比时要确认单位一致很多软件显示成交量是股而TuShare给的是手需要乘以100才等于股数。这个换算关系不搞清楚算出来的换手率、成交额指标全是错的。5.5 并发请求被限频并行拉取数据时频繁遭遇空响应现象写了一个并发拉取全市场日线数据的程序用Parallel.ForEach或Task.WhenAll同时发起几百个请求跑着跑着数据就断了大量返回空。原因TuShare服务端对单token的并发连接数有限制超过一定并发多余的请求就会被丢弃或排队超时。C#里Parallel.ForEach默认开的线程数可能远超接口容忍的并发量。解决用SemaphoreSlim限制最大并发数比如控制在5以内再配合每批次之间的延迟。不要图快一次性全怼上去。常规做法是把股票代码分批每批50只每只串行请求批与批之间估算时间再启动下一批。宁可跑得慢一点保证数据完整性。6. 增量更新与本地校验把TuShare数据沉淀成自己的K线库数据落库之后下一步就是让它持续更新。全量数据每次重拉不仅浪费时间还容易触发限流。增量更新的思路很简单本地记录每只股票的最新交易日下次更新时把最新交易日1作为start_date拉到接口返回空为止。var lastDate GetLastTradeDate(600519.SH); // 例如 20240115 var start lastDate 1; var data await client.RequestAsync(daily, new { ts_code 600519.SH, start_date start.ToString(), end_date DateTime.Now.ToString(yyyyMMdd) }, ts_code,trade_date,open,high,low,close,vol,amount);这里的核心是GetLastTradeDate要可靠如果本地库里没有这只股票的数据就退化成拉全量。校验方面我习惯每周做一次完整性检查用trade_cal拿回应该存在的交易日列表再跟本地库逐日比对缺哪一天就补拉哪一天。我还养成了个习惯每次拉完数据先把响应里最后一行的日期跟日历核对一遍再把amount和收盘价跟行情软件抽查对比。数据源偶尔也会有小修小正做量化回测之前最好把整段区间重新拉一遍不要长期用旧数据将就。这一点是之前做模拟项目X时吃过亏的数据里有一个月的除权日期没更新回测结果偏差大得离谱后来每次更新后都强制重拉最近三个月的日线才算把这个问题压住。希望这篇实战笔记能帮你在C#里顺利接上TuShare的数据少踩几个我踩过的坑。本文还有配套的精品资源点击获取

相关新闻

全流程解析:校园二手交易微信小程序开发实战

全流程解析:校园二手交易微信小程序开发实战

1. 项目定位与核心需求拆解先说说这个项目本身。校园二手交易平台,本质上是把大学校园里闲置物品的线下流转搬到线上。每年毕业季,学长学姐的考研资料、自行车、台灯、收纳箱,成堆成堆地当废品处理,而新生又在花高价买全新的。这个…

2026/10/18 21:16:46 阅读更多 →
Vue DevTools 6.5.0 兼容性配置指南:Vue 3/Vite 调试避坑实战

Vue DevTools 6.5.0 兼容性配置指南:Vue 3/Vite 调试避坑实战

简介:本资源为 Vue.js 官方推荐的浏览器调试插件 Vue DevTools 6.5.0 版本完整构建包,专为 Vue 2/3 应用开发者设计,解决组件状态追踪难、虚拟 DOM 可视化弱、生命周期调试低效等核心痛点,适用于中高级前端工程师日常开发与性能调…

2026/10/18 21:16:46 阅读更多 →
STM32F407VE+W5500以太网通信:HAL库移植与实战避坑

STM32F407VE+W5500以太网通信:HAL库移植与实战避坑

简介:这是一套基于STM32F407VE的W5500以太网通信完整工程,使用ST官方HAL库并集成WIZnet最新底层驱动。面向嵌入式开发者、物联网与工业控制场景,可帮助快速验证TCP/UDP通信,也可作为以太网应用项目的起步模板。压缩包共206个文件&…

2026/10/18 21:15:45 阅读更多 →

最新新闻

坚果云版本管理深度解析:从历史版本到文件时光机的完整指南

坚果云版本管理深度解析:从历史版本到文件时光机的完整指南

文章目录一、版本管理的「冰山模型」二、历史版本:每一次修改都有迹可循2.1 自动保存机制2.2 各套餐的版本保留时长2.3 如何查看和恢复历史版本?2.4 Office 文档版本对比三、文件时光机:文件夹的「一键还原」3.1 什么场景需要文件时光机&…

2026/10/19 2:08:31 阅读更多 →
从Obsidian到本地记忆栈:AI长期记忆产品化的关键设计

从Obsidian到本地记忆栈:AI长期记忆产品化的关键设计

从 Obsidian 当 AI 记忆库这件事,看本地记忆栈该怎么产品化我最早对“AI 记忆库”产生兴趣,是因为看到身边不少折腾笔记工具的朋友开始往 Obsidian 里塞 AI 插件。他们不光把 Obsidian 当笔记软件,还让它长期保存对话上下文、任务状态、个人偏…

2026/10/19 2:08:31 阅读更多 →
坚果云文件管理规范和流程:从混乱到有序的完整指南

坚果云文件管理规范和流程:从混乱到有序的完整指南

文章目录一、文件管理规范的「隐形价值」二、文件夹结构设计2.1 三层架构:部门 → 项目 → 阶段2.2 杜威十进制分类法三、文件命名规范3.1 3WX 命名法3.2 命名规范的三大好处3.3 版本号管理四、权限体系搭建4.1 权限分配原则4.2 推荐权限配置4.3 群组管理——权限自…

2026/10/19 2:08:31 阅读更多 →
汽车电子培训怎么选?从课程大纲到实操环境的避坑指南

汽车电子培训怎么选?从课程大纲到实操环境的避坑指南

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

2026/10/19 2:08:31 阅读更多 →
DMA读旧数据?三招解决Cache一致性问题的核心原理与实战

DMA读旧数据?三招解决Cache一致性问题的核心原理与实战

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

2026/10/19 2:08:31 阅读更多 →
02-DevEco Code实战:鸿蒙专属AI开发助手上手指南

02-DevEco Code实战:鸿蒙专属AI开发助手上手指南

DevEco Code实战:鸿蒙专属AI开发助手上手指南me.csdnimg.cn/images/20230724024159.png?origin_urlimages%2F02-cover.png&pos_idimg-tg1Kfjla-1792117900820)适用AI工具:DevEco Code 前置博客:第01篇 预计阅读时间:18分钟一…

2026/10/19 2:07:30 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →