You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写YouTube时长限制Python代码时遇报错,请求错误排查

修复YouTube使用时长限制代码中的错误

代码中的核心问题

  • 重复导入requests模块,冗余无意义
  • datetime.datetime.now()生成无时区信息的对象,与带时区的start_Date直接相减会触发TypeError
  • get_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)

关键修正说明

  1. 时区统一:使用datetime.datetime.now(pytz.timezone('US/Pacific'))生成带时区的当前时间,确保与start_date时区匹配,可正常计算时间差
  2. 错误处理优化:将get_website_start_date的错误返回改为抛出异常,避免后续类型不匹配问题
  3. 性能优化:添加time.sleep(1)控制循环频率,降低CPU占用
  4. 代码简化:精简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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:25:27