如何从 input.txt 文件读取参数并传递给 Python HTTP 请求

本文介绍如何将 input.txt 中定义的键值对(支持纯文本格式与标准 json 格式)安全、灵活地解析为字典,并作为 `params` 传入 `requests.get()`,同时处理常见格式异常与编码问题。

在实际开发中,将请求参数外置到配置文件(如 input.txt)是提升代码可维护性与环境适配性的常用做法。但需注意:原始示例中的 input.txt 并非标准 JSON,而是类查询字符串格式(key=value,key=value),而答案中给出的 JSON 格式虽更规范,却与原始文件内容不一致。因此,一个健壮的解决方案应同时兼容两种常见格式,并具备错误处理能力。

✅ 推荐方案:优先尝试 JSON,降级解析键值对

import json
import requests
from urllib.parse import parse_qsl
from pathlib import Path

def load_params(file_path: str) -> dict:
    """安全加载参数:先尝试 JSON,失败则按 key=value 格式解析"""
    p = Path(file_path)
    if not p.exists():
        raise FileNotFoundError(f"参数文件未找到: {file_path}")

    try:
        # 尝试解析为标准 JSON(推荐:input.txt 内容为合法 JSON 对象)
        with open(p, "r", encoding="utf-8") as f:
            return json.load(f)
    except json.JSONDecodeError:
        # 降级处理:按逗号分隔 + 等号分割(兼容原始 input.txt 格式)
        with open(p, "r", encoding="utf-8") as f:
            content = f.read().strip()
        if not content:
            return {}
        # 支持形如 "term=...,country=...,action=..." 的单行格式
        pairs = [pair.strip() for pair in content.split(",")]
        params = {}
        for pair in pairs:
            if "=" in pair:
                k, v = pair.split("=", 1)  # 只分割第一个等号,避免值中含=时出错
                params[k.strip()] = v.strip().strip('"\'')  # 去除可能的引号
        return params

# 使用示例
api_url = "https://lei-registrations.in/wp/wp-admin/admin-ajax.php"
input_file_path = "input.txt"

params = load_params(input_file_path)

headers = {
    "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:122.0) Gecko/20100101 Firefox/122.0"
}

try:
    response = requests.get(api_url, params=params, headers=headers, timeout=10)
    response.raise_for_status()
    data = response.json()

    if data.get("success"):
        from bs4 import BeautifulSoup
        soup = BeautifulSoup(data["data"], "html.parser")
        for r in soup.select(".searchResults_title"):
            name = r.select_one(".searchResults_name")
            number = r.select_one(".searchResults_number")
            if name and number:
                print(f"{name.text.strip():<50} {number.text.strip()}")
    else:
        print("API 返回失败:", data.get("message", "未知错误"))

except requests.exceptions.RequestException as e:
    print("网络请求异常:", e)
except Exception as e:
    print("解析或处理异常:", e)

⚠️ 注意事项与最佳实践

  • 文件编码:始终显式指定 encoding="utf-8",避免 Windows/Linux 换行符或中文乱码问题;
  • JSON 更推荐:将 input.txt 改为 params.json 并使用标准 JSON 格式(如答案所示),语义清晰、易校验、天然支持嵌套与特殊字符;
  • 安全性:切勿用 eval() 或 exec() 解析任意文本——本方案仅使用 json.load() 和安全的字符串分割;
  • 空格与引号:原始格式中值可能带引号(如 "IN"),解析时应自动剥离;
  • 健壮性:添加 Path.exists() 检查、timeout、raise_for_status() 和异常分类捕获,确保脚本在生产环境中稳定运行。

通过该方案,你既能无缝迁移旧格式,又能平滑升级至更规范的 JSON 配置方式,兼顾兼容性与可维护性。