mirror of
https://github.com/NanmiCoder/MediaCrawler.git
synced 2026-05-30 06:27:26 +08:00
The PR adds API limit overrides and static proxy support, but the review found that the default proxy provider changed to an invalid static placeholder and the new API fields accepted unbounded values. This keeps the existing proxy default intact, makes static proxy explicit via config or CLI, validates API limit ranges, and adds focused regression coverage for both paths. Constraint: PR branch must remain contributor-branch compatible and avoid adding dependencies Rejected: Keep static as the default provider | breaks existing --enable_ip_proxy defaults with an invalid placeholder URL Rejected: Accept arbitrary integer limits | lets API callers request negative or excessive crawl sizes Confidence: high Scope-risk: narrow Directive: Do not change proxy provider defaults when adding new providers; new providers should be opt-in and covered by provider-specific tests Tested: uv run pytest tests/test_api_limits.py tests/test_static_proxy_provider.py Tested: uv run pytest tests Tested: uv run pytest test/test_utils.py Tested: uv run python -m compileall api cmd_arg config proxy tests Tested: git diff --cached --check Not-tested: Live crawler run against external platforms or real proxy vendor endpoints
60 lines
2.1 KiB
Python
60 lines
2.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright (c) 2025 relakkes@gmail.com
|
|
#
|
|
# This file is part of MediaCrawler project.
|
|
# Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/proxy/types.py
|
|
# GitHub: https://github.com/NanmiCoder
|
|
# Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1
|
|
#
|
|
|
|
# 声明:本代码仅供学习和研究目的使用。使用者应遵守以下原则:
|
|
# 1. 不得用于任何商业用途。
|
|
# 2. 使用时应遵守目标平台的使用条款和robots.txt规则。
|
|
# 3. 不得进行大规模爬取或对平台造成运营干扰。
|
|
# 4. 应合理控制请求频率,避免给目标平台带来不必要的负担。
|
|
# 5. 不得用于任何非法或不当的用途。
|
|
#
|
|
# 详细许可条款请参阅项目根目录下的LICENSE文件。
|
|
# 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。
|
|
|
|
|
|
# -*- coding: utf-8 -*-
|
|
# @Author : relakkes@gmail.com
|
|
# @Time : 2024/4/5 10:18
|
|
# @Desc : Basic types
|
|
import time
|
|
from enum import Enum
|
|
from typing import Optional
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class ProviderNameEnum(Enum):
|
|
KUAI_DAILI_PROVIDER: str = "kuaidaili"
|
|
WANDOU_HTTP_PROVIDER: str = "wandouhttp"
|
|
STATIC_PROVIDER: str = "static"
|
|
|
|
|
|
class IpInfoModel(BaseModel):
|
|
"""Unified IP model"""
|
|
|
|
ip: str = Field(title="ip")
|
|
port: int = Field(title="port")
|
|
user: str = Field(title="Username for IP proxy authentication")
|
|
protocol: str = Field(default="https://", title="Protocol for proxy IP")
|
|
password: str = Field(title="Password for IP proxy authentication user")
|
|
expired_time_ts: Optional[int] = Field(default=None, title="IP expiration time")
|
|
|
|
def is_expired(self, buffer_seconds: int = 30) -> bool:
|
|
"""
|
|
Check if proxy IP has expired
|
|
Args:
|
|
buffer_seconds: Buffer time (seconds), how many seconds ahead to consider expired to avoid critical time request failures
|
|
Returns:
|
|
bool: True means expired or about to expire, False means still valid
|
|
"""
|
|
if self.expired_time_ts is None:
|
|
return False
|
|
current_ts = int(time.time())
|
|
return current_ts >= (self.expired_time_ts - buffer_seconds)
|