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

使用file_get_contents传递User-Agent调用Discogs API仍报Bad Request错误

解决Discogs API调用返回"Bad Request"的问题

看起来你遇到的核心问题是Discogs API对User-Agent字符串的严格要求——浏览器访问时会自动带上合规的UA,符合Discogs的规则,但file_get_contents默认的UA(比如PHP/7.4.33这类)会被Discogs直接拒绝,导致400错误。另外还要确保认证参数正确传递,我来帮你梳理针对性的解决方案:

关键前提:Discogs的User-Agent要求

Discogs明确规定,所有API请求的User-Agent必须是有辨识度的自定义字符串,官方推荐格式为:

你的应用名称/版本号 (+你的应用官网地址; 你的联系邮箱)

比如:MyVinylCollectionApp/2.1 (+https://myvinylapp.com; support@myvinylapp.com)
这个UA能让Discogs识别你的应用身份,避免被当作恶意请求拦截。

方案1:修复file_get_contents的请求配置

你需要在请求上下文里手动设置合法的User-Agent,同时正确传递consumer key和secret(作为URL参数即可满足公开数据请求)。完整代码示例:

// 从环境变量获取认证信息
$consumer_key = getenv('DISCOGS_CONSUMER_KEY');
$secret_key = getenv('DISCOGS_CONSUMER_SECRET');

// 符合Discogs要求的User-Agent
$user_agent = "MyDiscogsApp/1.0 (+https://myappwebsite.com; contact@myappwebsite.com)";

// 构建API请求URL(以获取某张唱片信息为例,带上认证参数)
$api_url = "https://api.discogs.com/releases/12345?key={$consumer_key}&secret={$secret_key}";

// 创建请求上下文,设置User-Agent头
$context = stream_context_create([
    'http' => [
        'header' => "User-Agent: {$user_agent}\r\n",
        'method' => 'GET'
    ]
]);

// 发起请求并处理结果
$response = file_get_contents($api_url, false, $context);

if ($response === false) {
    $error = error_get_last();
    echo "请求失败: " . $error['message'];
} else {
    $data = json_decode($response, true);
    print_r($data);
}

方案2:改用cURL(更易调试和维护)

如果file_get_contents的上下文配置还是有问题,推荐用cURL——它对HTTP请求的控制更灵活,还能直接查看HTTP状态码,方便快速定位错误:

$consumer_key = getenv('DISCOGS_CONSUMER_KEY');
$secret_key = getenv('DISCOGS_CONSUMER_SECRET');
$user_agent = "MyDiscogsApp/1.0 (+https://myappwebsite.com; contact@myappwebsite.com)";
$api_url = "https://api.discogs.com/releases/12345?key={$consumer_key}&secret={$secret_key}";

$ch = curl_init();
// 设置请求地址
curl_setopt($ch, CURLOPT_URL, $api_url);
// 要求返回响应内容而不是直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 设置合法的User-Agent
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
// 自动跟随重定向(如果有的话)
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

$response = curl_exec($ch);

// 处理请求结果
if (curl_errno($ch)) {
    echo "cURL错误: " . curl_error($ch);
} else {
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    if ($http_code === 200) {
        $data = json_decode($response, true);
        print_r($data);
    } else {
        echo "请求失败,状态码: {$http_code},响应内容: {$response}";
    }
}

curl_close($ch);

排查步骤(如果还是报错)

  1. 检查User-Agent是否合规:可以在浏览器里用开发者工具手动修改UA访问API URL,确认是否能正常返回数据。
  2. 验证环境变量:用var_dump($consumer_key, $secret_key)确认是否正确读取到了认证信息。
  3. 查看实际请求头:用抓包工具(比如Charles、Wireshark)查看请求是否真的带上了设置的User-Agent。
  4. 检查HTTP状态码:如果是401状态码,说明认证参数错误;如果还是400,大概率是User-Agent不符合要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:10:17