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

如何改进URL状态码检查器:添加200状态通知与循环检测?

解决方案

以下是满足你需求的实现方案,在原有代码基础上优化了循环检测逻辑、消息通知功能和文件保存规则:

import requests
import csv
import time

import urllib3
urllib3.disable_warnings()

# 配置参数
SLEEP_INTERVAL = 5  # 检测失败后的重试间隔(秒),可按需调整
SUCCESS_FILE = "successful_urls.csv"  # 存储成功URL的文件

# Telegram配置(按需启用,替换成自己的参数)
TELEGRAM_BOT_TOKEN = "你的Telegram机器人Token"
TELEGRAM_CHAT_ID = "你的聊天ID"

# Discord配置(按需启用,替换成自己的Webhook地址)
DISCORD_WEBHOOK_URL = "你的Discord Webhook URL"


def get_status_code(url):
    try:
        # 优先用HEAD请求提升速度,部分服务器拒绝HEAD则降级为GET
        r = requests.head(url, verify=False, timeout=5)
        return r.status_code
    except requests.exceptions.RequestException:
        try:
            r = requests.get(url, verify=False, timeout=5)
            return r.status_code
        except:
            return -1


def send_telegram_message(message):
    if not TELEGRAM_BOT_TOKEN or not TELEGRAM_CHAT_ID:
        return
    api_url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage"
    payload = {"chat_id": TELEGRAM_CHAT_ID, "text": message}
    try:
        requests.post(api_url, json=payload, timeout=10)
    except:
        print("Telegram消息发送失败")


def send_discord_message(message):
    if not DISCORD_WEBHOOK_URL:
        return
    payload = {"content": message}
    try:
        requests.post(DISCORD_WEBHOOK_URL, json=payload, timeout=10)
    except:
        print("Discord消息发送失败")


def save_successful_url(url):
    # 检查URL是否已存在,避免重复写入
    existing_urls = []
    try:
        with open(SUCCESS_FILE, "r", newline="") as f:
            reader = csv.reader(f)
            existing_urls = [row[0] for row in reader]
    except FileNotFoundError:
        pass  # 文件不存在则直接创建

    if url not in existing_urls:
        with open(SUCCESS_FILE, "a", newline="") as f:
            writer = csv.writer(f)
            writer.writerow([url])
        print(f"已保存成功URL: {url}")


def process_url(url):
    print(f"开始检测URL: {url}")
    while True:
        status_code = get_status_code(url)
        if status_code == 200:
            success_msg = f"URL检测成功: {url} 返回状态码200"
            print(success_msg)
            send_telegram_message(success_msg)
            send_discord_message(success_msg)
            save_successful_url(url)
            break
        else:
            print(f"URL检测失败: {url} 返回状态码{status_code},{SLEEP_INTERVAL}秒后重试")
            time.sleep(SLEEP_INTERVAL)


if __name__ == "__main__":
    url_list = []
    with open('urls.csv', newline='') as f:
        reader = csv.reader(f)
        for row in reader:
            url = row[0].strip()
            if url:  # 跳过空行,避免无效检测
                url_list.append(url)

    for url in url_list:
        process_url(url)

关键改动说明

  1. 循环检测逻辑:新增process_url函数,通过while True持续检测目标URL,直到返回200状态码才退出循环,避免一次性检测遗漏。
  2. 请求兼容性优化:原代码仅使用HEAD请求,部分服务器可能拒绝该方法,新增降级逻辑,HEAD失败时自动改用GET请求。
  3. 消息通知功能:实现Telegram和Discord两种消息推送方式,只需替换对应配置参数即可启用,推送失败时仅打印提示不中断程序。
  4. 文件保存规则:仅保存首次返回200的URL,避免重复写入;文件不存在时自动创建,成功后追加写入保证实时性。
  5. 空行处理:读取URL列表时自动跳过空行,减少无效检测操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:30:50