搞自动化跑脚本的人,早晚都会遇到两个特别朴素的需求:一是找个地方把临时文本塞一下,二是让手机及时响一声。这两件事,对应的就是标题里的“文本读写API”和“在线通知API”。最近大模型API的讨论确实很热,但今天不蹭那个热度,只聊两类更轻量、更适合个人开发者白嫖的API工具。这篇文章把我自己实测过的免费文本存储服务和通知推送服务整理成一份清单,包括选型思路、接入代码、组合玩法,以及我踩过的坑。适合谁看?定时任务维护者、爬虫脚本作者、家里有NAS或树莓派想搞远程通知的人,还有不想为一个小需求掏服务器钱的朋友。
1. 为什么这两类API值得单独整理一份清单
先说结论:文本读写API解决的是“状态和数据的临时存放”,在线通知API解决的是“把变化及时推到你面前”。两者单拎出来都不起眼,组合在一起,能覆盖掉绝大多数个人自动化场景。
1.1 我遇到的实际痛点:脚本和手机之间的“断头路”
我最早折腾定时任务,是在一台小主机上跑几个Python脚本。脚本本身写得不复杂,但运维起来很恶心——半夜脚本挂了,第二天早上打开电脑才发现日志停在凌晨两点。更尴尬的是,有时候脚本跑通了,但关键结果只有我自己看得见,想告诉家里人设备状态,还得截图发微信。
后来我试着搞一套自建方案:一台云服务器,一个数据库,再配一个公网接口。结果发现为了“偶尔存一段文字、发一条通知”这种事,付出的成本完全不成比例。云服务器要续费,数据库要备份,公网接口还要处理安全加固。说白了,杀鸡用了牛刀。
1.2 自建 vs 白嫖:为什么不划算
做个简单对比你就明白了。自建方案,一个月至少几十块服务器费用,还要花时间维护;免费API方案,零成本接入,十分钟能跑通,唯一的顾虑是可靠性和额度。但对于“脚本状态写入”“设备心跳上报”“异常通知推送”这类低频操作,免费额度完全够用。
这类需求有个共同特征:单次请求量很小、频率很低、数据不敏感或者已经脱敏。免费API的定位就是伺候这种“低频轻量”场景。你要是拿它存高并发业务数据,那是你不对,不是人家的问题。
1.3 整体思路:“存”加“推”两步走
我在实际项目里的套路很固定:脚本产生数据,先写入文本读写API;一旦检测到状态变化或异常,再通过通知API推送到微信、钉钉或手机App。这样数据有地方放,通知能到达人,中间的逻辑全部用HTTP请求完成。
下面这个表是我常用的组合方式,后面会逐个讲用法:
| 用途 | 可选服务 | 触达方式 | 特点 |
|---|---|---|---|
| 临时数据存储 | JSONBin / jsonblob / KVdb | 网页/API读写 | 零部署,但注意数据可见性 |
| 国内稳定存储 | LeanCloud / 腾讯云开发CloudBase | API/SDK | 免费额度有限但更稳 |
| 微信推送 | PushPlus / Server酱 | 微信公众号 | 扫个码就能收通知 |
| 群机器人推送 | 企业微信群机器人 / 钉钉机器人 | 群消息 | 免认证,加群就能用 |
| iOS推送 | Bark | iPhone通知 | 需装App,可自托管 |
2. 免费文本读写API的横向实测:我留下的是这几个
文本读写API说白了就是一个“在线记事本接口”:你通过HTTP请求往里写一段JSON或字符串,之后再通过HTTP请求读出来。听上去简单,但选型时门道不少。
2.1 先看评测维度,再动手
我筛选免费文本存储服务时,主要看五个维度:
- 请求频次限制:每分钟或每天能调多少次,决定了脚本不能太“话痨”。
- 是否需要注册/密钥:有的服务给一个URL就能用,有的需要申请API Key,注册本身就有门槛。
- 数据可见范围:公有的还是私有的?一个URL能不能被别人猜到?
- 是否支持CORS:如果要在浏览器前端直接调用,这个很关键;只在服务器端调用就没那么重要。
- 服务的存活年龄和背景:免费服务说关就关,活得久、有公司背景的更稳。
2.2 JSONBin:功能最全,但别被CORS坑到
JSONBin是我用得最多的一家。它的逻辑是把一段JSON封装成一个“bin”,每个bin有唯一的ID,通过REST接口读写。
基本用法是这样的:注册后在后台能看到你的X-Master-Key,所有API请求都要带这个Key。创建一个bin:
curl -X POST "https://api.jsonbin.io/v3/b" \ -H "Content-Type: application/json" \ -H "X-Master-Key: 你的主密钥" \ -d '{"task":"site-check","status":"up","time":"2025-01-01 08:00:00"}'响应里会返回bin的ID,之后读取这个bin的内容:
curl "https://api.jsonbin.io/v3/b/{binId}/latest" \ -H "X-Master-Key: 你的主密钥"更新内容用PUT,逻辑是把整个bin内容替换成新的。实际使用中,我的Python脚本一般这样写:
import requests API_KEY = "你的主密钥" BIN_ID = "创建bin后拿到的ID" def read_bin(): url = f"https://api.jsonbin.io/v3/b/{BIN_ID}/latest" resp = requests.get(url, headers={"X-Master-Key": API_KEY}) return resp.json().get("record", {}) def write_bin(data): url = f"https://api.jsonbin.io/v3/b/{BIN_ID}" resp = requests.put(url, json=data, headers={"X-Master-Key": API_KEY}) return resp.status_code == 200这里有个坑得提前说:JSONBin对浏览器端的跨域限制比较严格,你要是打算在纯前端页面直接调用,多半会撞上CORS报错。我的建议是,文本读写API尽量在服务器端或脚本里调用,不要省事直接从网页调。
2.3 jsonblob:没密钥也能用,适合临时实验
要说简单,jsonblob算是天花板级别。它不需要注册,也没有API Key,发一个POST请求就能创建一个blob,响应头的Location字段会直接给你一个带ID的地址。
curl -X POST "https://jsonblob.com/api/jsonBlob" \ -H "Content-Type: application/json" \ -d '{"hello":"world"}'创建完就能用GET请求读,用PUT请求更新。Python端操作同样直观:
import requests BLOB_URL = "https://jsonblob.com/api/jsonBlob/12345" def read_blob(): resp = requests.get(BLOB_URL) return resp.json() def write_blob(data): resp = requests.put(BLOB_URL, json=data, headers={"Content-Type": "application/json"}) return resp.status_code == 200但代价也很明显:谁拿到这个URL,谁就能读写这个blob。数据完全是“裸奔”状态,没有权限控制。所以我只建议拿它存测试数据、临时白名单、或者对外公开的静态配置。一旦放传感器历史记录这类东西,我心里就不踏实。
2.4 KVdb:一个bucket一把钥匙
KVdb走的是一条更极简的路:注册后给你一个bucket,本质上就是一个命名空间,往里塞key-value对。每个bucket有专属URL,读写某个key非常直接。
curl -X PUT "https://kvdb.io/{bucket}/{key}" -d "value" curl "https://kvdb.io/{bucket}/{key}"它的免费层有每日请求数限制,用来记录“设备最后一次在线时间”“当前版本号”这类单key场景非常合适。但坦白讲,这类极简服务最近的存活情况波动比较大,我遇到过服务商连官网都打不开的情况,所以只把它当备胎,不在关键路径上依赖它。
2.5 国内的选择:稳定优先时可以看看这两个
如果对网络稳定性和数据隐私要求高一点,我建议把目光放回国内。LeanCloud的数据存储服务,开发版免费额度虽然一直在调整,但基本的增删改查还是能扛住低频场景。腾讯云开发CloudBase也有免费体验额度,云数据库配个API调用,用起来和前面几个差不多。
这两个方案的好处是背靠大厂,服务存活风险小很多;坏处是接入比“发个请求”要重,要看文档、建环境。我的取舍标准是:临时实验用jsonblob或JSONBin,产品化或长期任务用CloudBase这类国内正规服务。
3. 在线通知API:把消息真正送到你面前
文本读写解决“放哪里”,通知API解决“怎么让人知道”。这一节我把几个主流的免费通知通道拉出来,逐个讲接入方式和适用场景。
3.1 通知API的本质:一个HTTP请求换一次推送
不管服务商怎么包装,在线通知API的核心逻辑都差不多:你向一个URL发POST或GET请求,带上你的身份标识、消息标题和正文,服务商再通过微信、App或群机器人把消息推到用户面前。整个链条走通,快则几百毫秒,慢则两三秒。
这个词儿可以这样理解:你给服务商的服务器打了个电话,说“麻烦喊一下我”,服务商挂断电话后,再用自己的通道把你的话塞进我的手机里。你不需要自己攒一套推送通道,只需要会用HTTP。
3.2 主流免费通道横向对比
我实际用过并且目前还在维护的通道有五个,各有各的脾气,选型时直接看这张表:
| 通道 | 接入成本 | 最终呈现 | 免费限制 | 适合场景 |
|---|---|---|---|---|
| PushPlus | 扫微信码,拿token | 微信公众号模板消息 | 每日条数有限额 | 个人告警、定时任务结果 |
| Server酱 | 微信扫码绑定,拿SendKey | 微信服务号消息 | 免费版条数有限 | 和个人一样,备选通道 |
| Bark | iPhone装App,填设备Key | iOS系统通知 | 基本无限制 | 苹果用户的推送首选 |
| 企业微信群机器人 | 群里加机器人,拿Webhook地址 | 企业微信群消息 | 频率有限制,单条有长度上限 | 团队协作、告警群播 |
| 钉钉群机器人 | 群里加机器人,拿AccessToken | 钉钉群消息 | 自定义关键字或加签 | 团队协作、值班告警 |
3.3 最快收到第一条推送:PushPlus实操
PushPlus可能是目前从零到第一次收到通知最顺畅的。打开官网,用微信扫码登录,个人信息页里直接能看到token。拿到token以后,发一个最朴素的请求:
curl "http://www.pushplus.plus/send" \ -H "Content-Type: application/json" \ -d '{"token":"你的token","title":"任务完成","content":"今天的数据采集跑完了"}'微信里马上就能收到一条消息。Python版本更简单:
import requests def send_wechat(title, content): url = "http://www.pushplus.plus/send" data = {"token": "你的token", "title": title, "content": content} requests.post(url, json=data)注意一个细节:content支持纯文本,也支持部分HTML,比如换行最好写成<br>,不然在微信里容易挤成一大坨。我的经验是,重要告警标题直接写明“某某任务失败”,正文里再放详细信息,一眼能扫到。
3.4 企业微信群机器人:适合团队协作的免认证方案
企业微信机器人是个被很多人忽略的宝藏通道。它好用在不需要申请企业认证,拉一个群,在群设置里添加机器人,就能拿到一个webhook地址。发消息时POST一个JSON:
curl "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的key" \ -H "Content-Type: application/json" \ -d '{"msgtype":"text","text":{"content":"[告警] 订单同步脚本挂了,请检查"}}'它不需要每个用户都注册一个token,只要在群里,大家都能收到。配合“@机器人”还能实现更复杂的交互。不过它有频率限制,单条消息也有长度上限,所以别拿它刷屏,正经发告警完全够用。
3.5 内容设计比API本身更值钱
很多人用通知API,只会发“Error”“成功”这种一个词,结果真出问题时压根看不出是哪个脚本、哪台机器、什么时候出的问题。我的习惯是推一个结构化的模板,类似这样:
【任务状态】订单同步 结果:失败 时间:2025-01-01 08:30:22 实例:cron-job-03 错误:连接数据库超时这样不管推给PushPlus还是企业微信群,别人(包括几周后的你)都能一眼看明白发生了什么。这个习惯比选哪个API重要得多。
4. 组合实操:给定时任务加一个“状态抽屉 + 异常呼喊”
前面讲的都是零件,这一节把它们组装起来,做一个完整的、能直接改改就用的监控小工具。功能很简单:定时检查一个网页是否在线,把状态写入文本读写API作为历史记录,一旦状态发生变化或请求异常,就通过通知API推到微信。
4.1 目标与整体逻辑
这个脚本要处理三件事:
- 从jsonblob读取上一次状态。
- 检查目标网站/服务的当前状态。
- 状态发生变化时,写入新状态,并调用PushPlus推送告警。
好处是:状态一直存在一个有URL的地方,随时可以打开看;通知只在变化时触发,不会一天轰炸你几十条。
4.2 完整实现:状态读写与通知推送
下面这个脚本可以直接保存为site_monitor.py,记得把BLOB_URL、PUSHPLUS_TOKEN等占位符换成你自己的信息。
import requests from datetime import datetime BLOB_URL = "https://jsonblob.com/api/jsonBlob/你的blobID" PUSHPLUS_TOKEN = "你的PushPlus token" TARGET_URL = "https://example.com" def read_status(): try: resp = requests.get(BLOB_URL, timeout=10) if resp.status_code == 200: return resp.json().get("status") except Exception: return None return None def write_status(status): try: data = {"status": status, "last_check": datetime.now().strftime("%Y-%m-%d %H:%M:%S")} resp = requests.put(BLOB_URL, json=data, timeout=10) return resp.status_code == 200 except Exception: return False def send_notification(title, content): try: data = {"token": PUSHPLUS_TOKEN, "title": title, "content": content} resp = requests.post("http://www.pushplus.plus/send", json=data, timeout=10) return resp.status_code == 200 except Exception: return False def check_site(): try: resp = requests.get(TARGET_URL, timeout=15) status = "up" if resp.status_code == 200 else f"down-{resp.status_code}" except Exception: status = "unreachable" return status def main(): current = check_site() previous = read_status() if current != previous: write_status(current) title = "网站状态变化" if previous is not None else "网站监控初始化" content = f"目标:{TARGET_URL}\n变化:{previous} -> {current}\n时间:{datetime.now():%Y-%m-%d %H:%M:%S}" send_notification(title, content) else: write_status(current) if __name__ == "__main__": main()这个脚本的逻辑并不复杂,但把两类API都用上了:jsonblob负责读写历史状态,PushPlus负责把变化告诉人。如果网站状态一直没变,它只会默默更新记录,不打扰你;一旦变化,立刻推送。
4.3 为什么不在每次检查时都通知
很多人第一次写监控脚本,习惯是“每次检查到失败就马上发一条告警”。结果网站抖动了几分钟,微信就被刷了几十条,真出大事时反而不想看了。
我在脚本里做了一个对比逻辑:只有“状态发生变化”时才通知。这样即使网站每5分钟失败一次、又恢复一次,你也只会收到两条消息,一进一出,逻辑清晰。这也叫“变化才通知”,是减少推送噪音最有效的方法。
4.4 部署方式:三种环境跑法任选
脚本写好了,怎么定时跑?我用过三种方式,没有绝对优劣,看你的环境:
Linux服务器用cron最简单。执行crontab -e,加一行:
*/5 * * * * /usr/bin/python3 /path/to/site_monitor.py每5分钟跑一次。Windows用户用计划任务程序,在“触发器”里设置“每天重复一次、间隔5分钟、持续时间无限”,操作里选“启动程序”指向Python解释器,参数填脚本绝对路径。
如果你不想自己开服务器,GitHub Actions也能跑。新建.github/workflows/monitor.yml,内容大致是:
name: site-monitor on: schedule: - cron: '*/5 * * * *' workflow_dispatch: jobs: monitor: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: '3.12' - run: pip install requests - run: python site_monitor.pyGitHub Actions的免费额度够个人项目用,好处是机器不用你自己管。
4.5 再扩展一步:结合其他“检测结果”做通知
同样的套路,稍改几行就能变成别的工具。比如检查一个商品页面是否上架,把“stock_count”写入blob,数量一变就推通知;或者检查一个网页的关键字是否出现,把关键字版本存起来,发现变化就通知。文本读写API的通用性就在这里,它不挑数据格式,你想存什么就存什么。
5. 白嫖免费API的真实边界:不付费也能稳,但要懂规则
免费API用起来舒服,但边界不搞清楚,早晚要翻车。这一章全是我真金白银踩出来的经验。
5.1 公共bin的数据是裸奔的:别存密钥和隐私
jsonblob、KVdb甚至JSONBin的公开bin,本质都是“URL即钥匙”。谁拿到URL,谁就能读甚至改内容。我在早期干过一件蠢事:把某平台的API密钥直接存进了一个公开blob,后来发现搜索引挚可能都会抓取这类URL,吓得赶紧删掉。
现在的规矩是,文本读写API里一律只放非敏感数据:状态字段、公开配置、脱敏后的数字;真要存敏感信息,先加密再写入。记住一个原则:能被人用浏览器打开的存储,默认就当它是公开的。
5.2 限流与配额:为什么你的脚本突然报错
免费服务不可能让你无限刷。我遇到过好几次,脚本跑到一半突然返回402或429,一查是当日配额用完了。解决办法是:脚本里加一个简单的重试和退避逻辑,比如遇到429就等30秒再试一次,再失败就发一条通知告诉你“配额耗尽了”。同时主动降低请求频率,能5分钟写一次就不要每秒写一次。
5.3 免费服务的存活率:给“上游挂掉”留后手
免费服务最大的风险不是功能少,而是不知道哪一天官网就打不开了。我经历过至少两三次,某天脚本突然连不上存储API,排查半天发现是服务商悄悄关停了。从那以后我养成了一个习惯:核心数据在本地日志里永远留一份,云端API只做状态同步,不做唯一存储。API地址和token全部放进配置文件,换服务商只改配置不动代码。
5.4 通知API别当成短信轰炸机
在线通知API方便归方便,但别拿来做违规的事情。企业微信机器人和钉钉机器人都有频率限制和内容安全策略,同一时间刷太多条,机器人会被禁;内容违规,整个账号都可能受影响。我的态度是:通知API是服务自己的工具,该不发的时候就不发,只在真正需要的时候喊一嗓子。
5.5 最后一个小技巧:重要告警走双通道
真正的生产环境里,我不太依赖单一通知通道。万一PushPlus的服务挂了,或者微信消息没送达,告警就彻底石沉大海了。我的做法是:同一个告警事件,同时发给PushPlus和企业微信群机器人,一个通知走个人端,一个通知走群组端。代码上就多调一个webhook的事,但可靠性翻倍。这个习惯救过我很多次,建议你直接抄。
踩过几次坑之后,我对免费API的期待变得很现实:它们不是万能的,但只要你把数据放对地方、把通知设计好、把降级预案备好,它们完全能扛住个人项目和中小型自动化场景。如果你手里也有类似的折腾经历,或者正在纠结选哪家文本读写和通知服务,按这个思路搭一套,应该能少走不少弯路。