当我使用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;
}
?>
答案 0 :(得分:0)
您的代码存在两个问题:
1)当您使用真实浏览器导航网站时,在获取页面时会存储/更新Cookie,并在每次后续请求时将其发送回服务器。你不是存储cookie也不是发送它们。
2)你传递的token
因每个请求而异。这是一种验证请求的“密码”。
要解决此问题,首先要设置curl选项来管理Cookie。 Cookie将存储在您选择的小文本文件中。
然后你必须分两步拆分任务:
第一步:加载页面并解析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";