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

