You need to enable JavaScript to run this app. Python用while True循环调用CoWIN接口出现JSON序列化报错如何修复
优惠活动
大模型
产品
解决方案
定价
更多

Python用while True循环调用CoWIN接口出现JSON序列化报错如何修复

问题修复方案

错误根因

你当前仅捕获了IndexError类型异常,当调用CoWIN接口出现网络波动、接口限流、请求频率超限等问题时,接口会抛出HTTPError异常,你未捕获该异常,此时available_centers实际是HTTPError对象而非可序列化的接口返回字典,传入json.dumps时就会触发序列化失败报错。同时代码还存在变量名冲突、时间不更新、请求频率过高等隐含问题。

修复步骤

  • 新增HTTPError等网络请求相关异常的捕获逻辑,避免未捕获异常导致脚本直接终止,可新增日志打印异常信息方便排查
  • 修正变量名冲突问题:你导入了time模块后又定义了同名全局变量time,会覆盖模块导致后续time.sleep等方法无法调用
  • 将时间获取逻辑移到vaccine_check函数内部,避免全局时间固定为脚本启动时间,不会随循环更新
  • 无限循环中新增休眠间隔,避免短时间高频请求被CoWIN接口拦截,疫苗数据15分钟更新一次,设置60~300秒休眠即可
  • 优化接种点遍历逻辑,不要硬编码遍历前100个接种点,直接遍历返回的centers列表即可,避免无意义的索引错误

修复后完整代码

from cowin_api import CoWinAPI
import json
import datetime
import numpy as np 
import os
from twilio.rest import Client
import selenium
from selenium import webdriver
import time # 注意不要定义同名变量覆盖该模块
import io
import requests
from requests.exceptions import HTTPError # 导入HTTPError异常类
from selenium.common.exceptions import ElementClickInterceptedException
from selenium.webdriver.common.keys import Keys
from threading import Thread

state_id = '21'
district_id = '395'
min_age_limit = 18

cowin = CoWinAPI()

# 此处获取接种点与疫苗信息
def vaccine_check():
    # 每次调用都获取最新时间
    current_time = datetime.datetime.now()
    try:
        available_centers = cowin.get_availability_by_district(district_id)
        # 输出到JSON文件后回读
        json_output = json.dumps(available_centers, indent=4)
        f = open(f'tests/vaccinecheck[{current_time.strftime("%b %d %Y %H|%M")}].json', 'w')
        f.write(json_output)
        f.close()

        with open(f.name) as file:
            data = json.load(file)

        # 直接遍历返回的centers列表,不要硬编码100个
        for center in data["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 IndexError: # 捕获无更多接种点的错误
        pass 
    except HTTPError as e:
        print(f"接口请求出错:{e}, 等待下次重试")
    except Exception as e:
        print(f"未知错误:{e}, 等待下次重试")

def twilio_send():
    client = Client()
    from_whatsapp_number='whatsapp:twilio api demo num'
    to_whatsapp_number='whatsapp:my phone num'
    client.messages.create(body='vaccine available - book now!',
                       from_=from_whatsapp_number,
                       to=to_whatsapp_number)

if __name__ == "__main__":
    # 先判断tests目录是否存在,不存在则创建避免写入文件报错
    if not os.path.exists("tests"):
        os.mkdir("tests")
    while True:
        vaccine_check()
        # 每次请求后休眠60秒,可自行调整间隔
        time.sleep(60)

内容的提问来源于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 23:06:08