当我使用 php CURL 发布到此链接时,我想获取值:“https://www.turkiye.gov.tr/btk-numara-tasima”,但是当我尝试这样做时,我无法获取任何值,下面的代码只显示链接的页面。问题是什么?
<?php
$curl=curl_init();
$data = "txtMsisdn=5441234567&token=%7B730FD6-BC236F-6AE440-B5E1CB-338E67-00EA4E-0C7F28-58EE4A-3FA9F9-EAA9A2%7D";
curl_setopt($curl, CURLOPT_URL, "https://www.turkiye.gov.tr/btk-numara-tasima");
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_VERBOSE, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER,0);
$content = curl_exec($curl);
if(curl_exec($curl) === false){
echo 'Curl error: ' . curl_error($ch);
}else{
echo 'Opatation comlated without error';
echo $content;
}
?>
最佳答案
您的代码有两个问题:
1) 当您使用真实浏览器浏览网站时,cookie 会在获取页面时存储/更新,并在每个后续请求中发送回服务器。您不会存储或发送 cookie。
2) 您传递的 token
因每个请求而异。这是一种验证请求的“密码”。
要解决这个问题,首先要设置 curl 选项来管理 cookie。 Cookie 将存储在您选择的一个小文本文件中。
然后你必须将任务分成两步:
第一步:加载页面并解析token
第二步:发送post请求传递解析后的token
这是对您的原始代码的一些修改。您也可以从命令行运行它。
唯一重要的部分是提取 token ,但实际上,这只是字符串操作。
<?php
// Load the page
$curl=curl_init();
curl_setopt($curl, CURLOPT_URL, "https://www.turkiye.gov.tr/btk-numara-tasima");
// curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_VERBOSE, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($curl, CURLOPT_COOKIEFILE, 'cookies.txt' ); // <-- read/write cookies into a text file
curl_setopt($curl, CURLOPT_COOKIEJAR, 'cookies.txt' ); // <-- read/write cookies into a text file
$content = curl_exec($curl);
curl_close( $curl );
// Parse output to extract token
$content = substr( $content, strpos( $content, '<input type="hidden" name="token" value="' ) + strlen( '<input type="hidden" name="token" value="' ) );
$token = substr( $content, 0, strpos( $content, '"' ) );
$token = urlencode( $token );
// This is the number to query
$number = '5441234567';
// Put together token and number
$data = 'txtMsisdn=' . $number . '&token=' . $token;
// Perform post request
$curl=curl_init();
curl_setopt($curl, CURLOPT_URL, "https://www.turkiye.gov.tr/btk-numara-tasima?submit");
//curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_VERBOSE, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($curl, CURLOPT_COOKIEFILE, 'cookies.txt' ); // <-- read/write cookies into a text file
curl_setopt($curl, CURLOPT_COOKIEJAR, 'cookies.txt' ); // <-- read/write cookies into a text file
$content = curl_exec($curl);
curl_close( $curl );
// Parse output
$content = substr( $content, strpos( $content, '<div class="reminderContainer">' ) + strlen( '<div class="reminderContainer">' ) );
$result = substr( $content, 0, strpos( $content, '</div>' ) );
echo $result . "\n";
关于php - curl 发布错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40807943/