资讯动态

我写了个终端盯盘工具,按一下 b 键就能假装在编译代码

发布时间:2026/8/10 11:55:59 来源:尧图企业网站定制
我写了个终端盯盘工具按一下 b 键就能假装在编译代码项目已更新到 v0.2.1新增持仓与收益显示按t切换、中英界面切换按l、快捷键提示按h并默认全英文 UI 强化「在工作」的伪装。事情是这样的。某天下午三点我第五次切到同花顺看了一眼又切回来继续写代码。动作很流畅不到一秒。但隔壁工位的同事还是注意到了。“你股票亏了多少”我说没亏。他不信。因为屏幕上一片红绿你说没亏谁信啊。但其实问题不是亏不亏而是盯盘这件事本身是公开的。你每一次切屏、每一次盯着红绿数字看都等于在告诉别人——我现在没在工作。哪怕你确实只是扫了一眼就回来改 bug 了那种被抓到的感觉也很不爽。我在终端里工作。一天八个小时不是在 Vim 里就是在 tmux 里。我当时想的是如果能在终端里看行情就好了别人路过看到的全是代码我也用不着来回切窗口了。翻了翻已有的方案都不太对劲tushare/baostock要注册、要 token数据接口是给量化分析用的不是给人盯盘用的。同花顺/东方财富的 Web 版一个浏览器标签页在那摆着标题就写着行情掩耳盗铃。curl 请求然后 grep能用但这个体验讲真你盯不了三分钟。于是我开始写了。选型需求很明确终端里跑不要开浏览器不要 API Key不要注册别人路过看一眼时不能一眼看出是在看股票安装尽量简单第三点是最重要的。纯文本还不够——要是上面写着贵州茅台 1690.00 0.90%懂行的看一眼就知道你在干嘛。必须有一个一键切换伪装模式的功能。所以最后的选型是Python 3.10 标准库 三个第三方包Rich 做终端 UILive TableSina Finance API 做数据源免费的不需要 KeyTOML 做配置文件整个项目叫 BossKey-Stock。这个 BossKey老板键才是核心功能。架构代码不多拆了几个模块bosskey_stock/ ├── __main__.py CLI 入口 ├── app.py 主循环 终端控制 ├── data.py Sina 数据源 ├── boss.py 老板模式伪装 ├── config.py 配置读写 └── i18n.py 中英文案对照表v0.2.1 新增CLI 层没什么好说的argparse 路由几个子命令。配置读写就是 tomlkit 读写 ~/.bosskey.toml。有意思的部分是终端控制和老板模式。Rich LiveRich 自带一个 Live 组件可以在终端里维护一个动态区域内容可以实时更新。实现上它用了 alternate screen buffer——就是 vim、top 那种模式程序退出后终端会恢复到之前的内容。典型用法就是withLive(auto_refreshFalse,screenTrue)aslive:whileTrue:live.update(build_table(),refreshTrue)time.sleep(interval)直接这样写的话刷新间隔内程序是卡死的没法处理键盘输入。所以需要一点改造。非阻塞键盘输入这也是踩坑最多的地方。为什么不用 input()input() 是行缓冲的——它要等到用户按了回车才会返回。但我要的是单键响应按 b 立刻切模式按 q 立刻退出不能等回车。为什么不用 cursescurses 可以做到但它接管了整个终端和 Rich 的 Live 组件有冲突。Rich 依赖底层的终端控制来做色彩和渲染curses 一插手就乱套了。两个库抢终端控制权谁都不让谁。方案直接操作 termios。Python 标准库提供了 termios 和 select可以精确控制终端的行为。核心思路是只改输入的配置不改输出侧。def_setup_tty(fd):attrstermios.tcgetattr(fd)# 输入侧关掉 ICANON逐键模式、ECHO不回显、ISIG不发信号attrs[3]~(termios.ECHO|termios.ICANON|termios.ISIG)# 输出侧不动保留 OPOST确保 \n → \r\n 正常转换termios.tcsetattr(fd,termios.TCSAFLUSH,attrs)改完之后os.read(fd, 1) 就能读到单个按键了不需要回车。然后主循环里用 select 做非阻塞检查def_read_key(fd):r,_,_select.select([fd],[],[],0.5)# 最多等 0.5 秒ifr:returnos.read(fd,1).decode(utf-8,errorsreplace)returnNone这里有个细节select 的 timeout 设成 0.5 秒而不是用非阻塞模式。原因是主循环里还要做定时刷新每 3 秒拉一次行情不能真的阻塞在 read 上。select 返回后如果是超时没按键就继续往下走检查要不要刷新数据。如果用户按了键就处理按键逻辑。这样整个主循环就在一个线程里完成了键盘监听 定时刷新 UI 渲染。不需要后台线程不需要锁。一个容易踩的坑ICRNL。在调试过程中发现一个奇怪的现象回车键(\r)会被转换成换行(\n)导致按键检测出错。这个问题只在某些终端模拟器上出现。查了一下是 termios 的 ICRNL 标志在搞鬼。这个标志会把收到的 \r 自动转成 \n。我的解决方案是关掉它attrs[0]~(termios.ICRNL|termios.IXON)# ICRNL 是关键老板模式老板模式的实现其实很简单。就是按 b 键时切换一个布尔值然后渲染不同的内容ifboss_mode:live.update(boss.render(),refreshTrue)continueboss.render() 生成一段模拟的 Docker build 日志。核心逻辑就是随机选一些步骤组合成看起来像正经构建的输出。为了让日志更逼真我加了一些细节Docker 的构建步骤编号偶尔的 WARNING 信息Running time: MM:SS 的计时器日志每秒滚动两行通过时间来偏移数组位置这些逻辑都在 BossGenerator 类里有个预生成的日志池子5 倍重复后循环滚动。效果还不错——我让公司另一个同事看了看他说你又在折腾 Docker我说对一直在折腾。数据层数据源是 Sina Finance 的行情接口。不需要 API Key只要一个 HTTP 请求GET https://hq.sinajs.cn/listsh600519,sz000001 Referer: https://finance.sina.com.cn返回的是 JavaScript 变量赋值GBK 编码var hq_str_sh600519贵州茅台,1680.00,1675.00,1690.00,1700.00,1670.00,...;解析逻辑不复杂按逗号分割取需要的字段。但有一些需要注意的点代码前缀转换。以 6 和 9 开头的代码是上交所sh 前缀其他是深交所sz 前缀。正则从响应行里提取代码时用的是 hq_str_[a-z](\d) 这个模式。成交量格式化。Sina 返回的成交量单位是股不是手。A 股一手等于 100 股。显示时要转成手为单位。交易时段检测。没必要在非交易日和休息时间刷数据。判断逻辑是周一到周五9:30-11:30 或 13:00-15:00。非交易时段显示 [After Hours] 并展示数据源的最后成交时间。离线处理。网络请求超时或异常时requests 不会抛异常而是返回 None。主循环里检测到 None 会显示 [Offline] 黄色提示并且保留上一次拉到的数据而不是清空表格。v0.2.x持仓收益、中英切换、快捷键提示首版能看行情、能伪装之后这个月又迭代了两版v0.2.0 / v0.2.1几个关键更新持仓与收益显示光看行情还不够摸鱼党还得知道自己赚没赚钱。v0.2.0 加了完整的持仓管理CLI 子命令pos add/pos rm/pos list。pos add是交互式的——从监控列表里多选股票逐个录入股数和成本价自动加入监控列表。TUI 里按t循环切换持仓、成本、持仓收益率、今日收益率列。底部同步汇总总市值 / 总成本、总收益率、今日收益率。收益计算很简单持仓收益 (现价 − 成本) × 股数今日收益 涨跌额 × 股数。收益列红盈绿亏独立着色和行情表反过来一眼看清。中英界面切换v0.2.1 把界面文案全部抽到了 i18n.pykey → (en, zh) 对照表然后默认英文。这个默认值是有讲究的英文界面配合老板模式伪装才完整——中文一眼就能读出持仓“收益这几个词英文对非母语者一眼难读看起来更像在写代码时瞥一眼日志”。切换方式有三种按需选TUI 内按l会话内即时切换CLI 全局参数--lang {en,zh}单次覆盖配置文件 ~/.bosskey.toml 的 [display] lang 设置初始语言。老板模式的日志主体保持英文 Docker 命令只有底部状态行本地化——毕竟 Docker 日志本来就是英文的中英都改了反而穿帮。快捷键提示按h开关底部快捷键提示行默认隐藏维持极简。第一次用不知道按什么键按一下 h 就全列出来了用熟了再按一下隐藏。顺手还清理了一处冗余原来今日收益模式里有个 TodayP/L% 列数值和基础列 Chg%涨跌幅完全一样删了模式 3 现在是 14 列。现在的完整快捷键键功能b老板模式 / 切回行情t切换持仓 / 成本 / 持仓收益 / 今日收益列l中英界面切换h快捷键提示行开关r手动刷新q/ CtrlC退出摸鱼之外回到最开始的问题。这个工具解决的其实不是能看股票而是看股票这件事不给别人带来心理压力。老板键这个概念其实很老了——从 DOS 时代就有按一下 F1 把一个游戏界面变成一张正版的 Lotus 1-2-3 表格。我做的这个只不过是把终端变成了伪装工具。技术上没什么特别高深的。但这个过程让我想通了一件事很多看似偷懒的需求本质是对当前环境的一种不适应。程序员在终端里工作 8 小时偶尔想看一眼行情这是很正常的。不正常的是这个行为在办公室里带有负面的社会信号——“他不好好工作”。工具解决不了这个问题但至少让人少了一点尴尬。安装pipinstallbosskey-stock运行bosskey即可。需要 Python 3.10。当前版本 v0.2.1。相关链接项目源码github.com/Angryshark128/bosskey-stockPyPIpypi.org/project/bosskey-stock使用说明README.md含 normal / boss / demo 三份截图可用 scripts/make_screenshots.py 复现

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价