如何用PHP Curl实现设备Web表单登录并获取CONTROL.HTM数据?
PHP cURL模拟无用户名Web登录实现方案
实现步骤
- 获取登录页面的Nonce值:先请求目标设备的登录页面,提取隐藏字段
pA的初始值(即JS里的nonce)。 - 计算加密后的密码哈希:按照页面JS逻辑,将
nonce与实际密码拼接后做MD5哈希,得到提交用的pA值。 - 构造POST请求参数:根据页面表单结构,提交两个空的
q参数(对应密码输入框和提交按钮的name),加上计算后的pA值。 - 发起请求并保持会话:用cURL的cookie持久化功能维持会话状态,获取登录后的响应页面数据。
完整代码示例
<?php // 配置参数 $targetUrl = 'http://10.168.168.144/CONTROL.HTM'; $password = '你的实际密码'; // 替换为设备登录密码 $cookieFile = tempnam(sys_get_temp_dir(), 'cookie_'); // 临时cookie文件 // 初始化cURL $ch = curl_init(); // 第一步:GET登录页面,提取nonce值 curl_setopt($ch, CURLOPT_URL, $targetUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // 保存cookie curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // 读取cookie $loginPage = curl_exec($ch); // 解析页面获取pA的nonce值(两种方式可选) // 方式1:DOM解析(更健壮) $dom = new DOMDocument(); @$dom->loadHTML($loginPage); $xpath = new DOMXPath($dom); $nonceNode = $xpath->query('//input[@id="hpsw_id"]')->item(0); $nonce = $nonceNode ? $nonceNode->getAttribute('value') : ''; // 方式2:正则匹配(页面结构简单时用) // preg_match('/<input id="hpsw_id" type="hidden" name="pA" value="([^"]+)"/', $loginPage, $matches); // $nonce = $matches[1] ?? ''; if (empty($nonce)) { die('无法获取Nonce值,请检查页面结构是否变化'); } // 第二步:计算MD5哈希 $encryptedPsw = md5($nonce . $password); // 第三步:构造POST参数 $postData = http_build_query([ 'q' => ['', ''], // 两个空q参数,对应密码框和提交按钮 'pA' => $encryptedPsw ]); // 第四步:发起POST请求 curl_setopt($ch, CURLOPT_URL, $targetUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 自动处理登录重定向 $response = curl_exec($ch); // 检查请求错误 if (curl_errno($ch)) { die('cURL请求错误:' . curl_error($ch)); } // 输出或处理响应内容 echo $response; // 清理资源 curl_close($ch); unlink($cookieFile); ?>
注意事项
- 替换代码中的
$password为设备实际登录密码。 - 若设备登录后有跳转,确保开启
CURLOPT_FOLLOWLOCATION。 - 页面结构变化时,需调整Nonce值的解析逻辑。
- 部分设备可能校验User-Agent,可添加
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/115.0');模拟浏览器请求。
内容的提问来源于stack exchange,提问作者Egor
相关产品推荐
相关产品推荐

