继上一篇台风因子(20251007.typhoon-alpha) 之后, 特朗普让我在十月十号做空大赚一笔, 我现在对新闻交易越发有好感了.
随后一个朋友跟我讲加密货币在A交易所上架新闻发布后, 如果B交易所已经上架, 那么常常会跟着大涨. 我简单找找发现竟然没有一个纯粹做这些提醒的服务以及历史上架汇总. 于是花了一周简单做了定时抓取+LLM(GPT5 nano好便宜)分析标题+Telegram推送, 然后做了个展示网页(https://coin.myuan.fun)
程序在后台会一分钟间隔轮询四个交易所: Binance、Bybit、OKX、Upbit
Coinbase 总是在推特发消息, 推特的反爬有点复杂, 暂时还没有爬取
网页是用 HTMX 写的, 正如你在标题看到的那样, 站在氛围编程不可阻挡的时代, 我选择了一套不太标准的流程: 手工编程(0 vibe coding!), 使用 Sqlite 做数据库, Python Air 做 Web 后端, 基于 Air Tag 直接在 Python 代码里写 HTMX, 网页的所有功能和数据读取混在一个单独的 Python 文件里, 大约 300 行, 所有与Web逻辑相关的代码甚至只有 200 行出头. 这要是用大前端方案, 项目初始化完就超过 100 行了.
你是否感受到有一种 2010 年的美? 我专门调过风格到 Bootstrap/WordPress 风, 而且没有构建服务端直接给出 HTML. 但这应该比 2010 年更好, 毕竟那时候的 Django 可做不到一个文件做这么多事情, 而且这是页面无刷新的更新.
不过后面要是大起来还是得用现代化前端, 当下的交互写起来已经有点难受了, 十分想要回到 Antd Table 和 TypeScript 的怀抱, 要是直接选现代 Web 技术栈这个项目也许会更快一些.
下一个话题是怀念我最爱的 Prisma for Python, Prisma 官方大刀阔斧改动让好多语言的 Prisma 扩展死掉了, Python 失去了它迄今为止最好的 ORM, 我防制了一个(半成品在本项目已经使用), 使用上会是这样比较干净的 dataclass:
@dataclass
class NewsEntry(WithID):
title: str
release_dt: datetime
content_url: str
exchange_id: int
'''see Exchange.id'''
fetch_session_id: int
'''see FetchNewsEntrySession.id'''
news_entry_tb = TypedTable.from_db(db, NewsEntry)
news_entry_tb.where(exchange_id = 2)
news_entry_tb.insert(NewsEntry(...))
但是 where 里的强类型约束并不能直接在 Python 内实现, Python 没有 TypeScript 那么舒服的类型体操, 思来想去只能像 Prisma 那样多一步解析生成过程: 我可以提取所有 dataclass 定义然后生成所有可能的类型约束, 就像 Prisma 那样.
希望后面有空能做出来.