编写YouTube时长限制Python代码时遇报错,请求错误排查
修复YouTube使用时长限制代码中的错误
代码中的核心问题
- 重复导入
requests模块,冗余无意义 datetime.datetime.now()生成无时区信息的对象,与带时区的start_Date直接相减会触发TypeErrorget_website_start_date可能返回字符串类型错误信息,后续减法操作会报错- 依赖安装命令拼写错误:
pip install request pytz应为pip install requests pytz - 无限
while True循环未加延迟,导致CPU占用过高
修正后的完整代码
import requests import pytz import datetime import time # 新增用于循环延迟 def is_website_active(): try: response = requests.head("https://www.youtube.com/") return response.status_code // 100 == 2 except requests.exceptions.RequestException: return False def get_website_start_date(): try: response = requests.head("https://www.youtube.com/") if 'Date' in response.headers: server_time = datetime.datetime.strptime(response.headers['Date'], '%a, %d %b %Y %H:%M:%S %Z') # 直接绑定UTC时区,避免localize潜在问题 server_time_utc = server_time.replace(tzinfo=pytz.utc) pacific_timezone = pytz.timezone('US/Pacific') return server_time_utc.astimezone(pacific_timezone) else: raise ValueError("响应头中未找到Date字段") except requests.exceptions.RequestException as e: raise RuntimeError(f"请求出错: {str(e)}") # 初始化开始时间,捕获初始化错误 try: start_date = get_website_start_date() except (ValueError, RuntimeError) as e: print(f"初始化失败: {e}") exit(1) # 循环检查并计算时长 while True: if is_website_active(): # 生成带太平洋时区的当前时间,确保与时区一致 now_pt = datetime.datetime.now(pytz.timezone('US/Pacific')) time_diff = now_pt - start_date print(f"已使用时长: {time_diff}") # 每秒检查一次,降低CPU消耗 time.sleep(1)
关键修正说明
- 时区统一:使用
datetime.datetime.now(pytz.timezone('US/Pacific'))生成带时区的当前时间,确保与start_date时区匹配,可正常计算时间差 - 错误处理优化:将
get_website_start_date的错误返回改为抛出异常,避免后续类型不匹配问题 - 性能优化:添加
time.sleep(1)控制循环频率,降低CPU占用 - 代码简化:精简
is_website_active的返回逻辑,去除冗余代码
实现时长限制的扩展思路
如果要完成最终的时长限制目标,可以在循环中判断累计时长是否超过阈值,触发屏蔽操作:
# 设定时长阈值:1小时(单位:秒) LIMIT_SECONDS = 3600 while True: if is_website_active(): now_pt = datetime.datetime.now(pytz.timezone('US/Pacific')) time_diff = now_pt - start_date print(f"已使用时长: {time_diff}") if time_diff.total_seconds() >= LIMIT_SECONDS: print("使用时长已达上限,即将屏蔽YouTube") # 示例:修改hosts文件屏蔽(Windows系统) # with open(r'C:\Windows\System32\drivers\etc\hosts', 'a') as f: # f.write('\n127.0.0.1 www.youtube.com') break time.sleep(1)
内容的提问来源于stack exchange,提问作者Erez Ben-Zvi
相关产品推荐
相关产品推荐

