PHP接口返回HTML而非JSON的问题排查与解决
问题分析与解决方案
你遇到的核心问题是:服务器返回了人机验证脚本(而非你PHP脚本输出的JSON),这是因为请求被服务器的反爬/人机验证机制拦截了。下面分步骤解决:
一、先修复PHP脚本本身的错误
你的PHP脚本存在几个小问题,先修正以确保逻辑正确:
- 重复执行了
mysqli_query,冗余代码会导致资源浪费 - 错误使用了变量
$connection(实际是$conn) - 使用
nl2br输出JSON会破坏格式,需设置正确的响应头
修正后的PHP代码:
<?php include('connect.php'); $sql = "select * from parent"; $result = mysqli_query($conn, $sql) or die("Error in Selecting: " . mysqli_error($conn)); $emparray = array(); while($row = mysqli_fetch_assoc($result)) { $emparray[] = $row; } // 设置JSON响应头,告诉客户端返回的是JSON格式 header('Content-Type: application/json'); echo json_encode($emparray); ?>
二、解决人机验证拦截问题
服务器返回的AES解密脚本是典型的反爬验证(比如Cloudflare JS挑战、主机商防爬机制),需要让请求模拟正常浏览器行为:
1. 给C#请求添加浏览器特征头
修改C#客户端代码,添加浏览器UA、Accept等请求头,让服务器认为是正常访问:
var client = new HttpClient(); // 添加浏览器标识、接受类型等头信息 client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"); client.DefaultRequestHeaders.Accept.ParseAdd("application/json, text/javascript, */*; q=0.01"); var response = await client.GetAsync("你的PHP接口URL"); var contentString = await response.Content.ReadAsStringAsync(); // 检查是否仍被拦截返回HTML if (contentString.StartsWith("<html>")) { // 手动获取浏览器访问后的有效Cookie(步骤见下方) client.DefaultRequestHeaders.Add("Cookie", "__test=xxx; 其他Cookie键值对"); // 重新发起请求 response = await client.GetAsync("你的PHP接口URL"); contentString = await response.Content.ReadAsStringAsync(); } var content = JsonSerializer.Deserialize<Parent[]>(contentString); foreach (var item in content) { Console.WriteLine("Parent ID: {0}", item.parent_id); Console.WriteLine("Name: {0}", item.name); Console.WriteLine("Mobile: {0}", item.mobile); Console.WriteLine("CPR: {0}", item.cpr); Console.WriteLine("Email: {0}", item.email); }
2. 手动获取有效Cookie
如果添加头后仍被拦截,需要从浏览器获取验证通过后的Cookie:
- 用Chrome/Firefox打开你的PHP接口URL
- 按F12打开开发者工具,切换到「Application」标签
- 在左侧「Cookies」下找到
__test等验证相关的Cookie,复制其键值对 - 将复制的Cookie添加到C#请求的
Cookie头中
3. 调整服务器防护设置
如果是你自己的服务器:
- 检查是否开启Cloudflare的「JS挑战」,可暂时关闭或添加请求IP到白名单
- 查看主机商的防爬插件(如ModSecurity),调整规则避免拦截合法请求
- 控制请求频率,避免短时间内大量触发反爬机制
内容的提问来源于stack exchange,提问作者nooona alnon
相关产品推荐
相关产品推荐

