You need to enable JavaScript to run this app. Python调用COWIN API报JSONDecodeError修复及无限循环实现咨询
优惠活动
大模型
产品
解决方案
定价
更多

Python调用COWIN API报JSONDecodeError修复及无限循环实现咨询

问题解答

1. 报错类型与含义

你遇到的确实是json.decoder类抛出的错误,具体是JSONDecodeError("Extra data", s, end),含义是JSON解码器在解析完一个合法的JSON对象后,发现文件中还有多余的未解析数据,不符合单JSON文件的语法规范。

2. 报错原因

问题出在冗余IO逻辑上:

  • 打开存储JSON的文件时你用了追加模式'a',如果目标文件之前已经存在内容,新序列化的JSON字符串会追加到原有内容之后,导致文件里存在多个顶层JSON值
  • 更关键的是:你本来就已经有现成的Python字典对象available_centers,完全没必要序列化写文件再反序列化读回来,这个多余的操作直接导致了报错

3. 修复方案

最优方案(推荐):删除冗余的文件读写逻辑,直接使用内存中的字典对象

修改后的vaccine_check函数如下:

def vaccine_check():
    # 每次调用更新时间,不要用全局的固定时间
    current_time = datetime.datetime.now()
    try:
        available_centers = cowin.get_availability_by_district(district_id)

        # 若需要保留写日志文件的需求,可保留这段写文件逻辑
        json_output = json.dumps(available_centers, indent=4)
        # 把追加模式'a'改成覆盖模式'w',避免文件内多JSON冲突
        f = open(f'tests/vaccinecheck[{current_time.strftime("%b %d %Y %H|%M")}].json', 'w')
        f.write(json_output)
        f.close()

        # 直接遍历centers列表,不要硬取100个下标
        for center in available_centers["centers"]:
            session = center["sessions"][0]
            if session["min_age_limit"] == 45:
                continue
            print(f'[{current_time.strftime("%b %d %Y %H:%M")}]', center["name"], '-- vaccines:', session['available_capacity'], '-- age-limit:', session["min_age_limit"])
            if session["available_capacity"] >= 1:
                twilio_send()
    # 可根据需求调整异常捕获范围
    except Exception as e:
        print(f"运行异常: {str(e)}")

临时修复方案(不删读写逻辑)

如果一定要保留写了再读的逻辑,只要把打开文件的模式从'a'改成'w'覆盖写入即可,保证每次文件内只有一个合法JSON。

4. 无限循环执行方法

在脚本末尾调用vaccine_check的位置改成死循环,每次执行完间隔一段时间再调用(COWIN公开API有调用频率限制,建议间隔10~15分钟,避免被封禁):

if __name__ == "__main__":
    import time
    while True:
        vaccine_check()
        # 每次查询间隔900秒=15分钟,可自行调整
        time.sleep(900)

内容的提问来源于stack exchange,提问作者bigman1234

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 22:45:03