php - curl 发布错误

标签 php ssl curl post

当我使用 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/

相关文章:

php - Ajax 中的安全性 : How to prevent cURL to post data?

php - Android GZip 通过 PHP 到 MySQL BLOB

php - 使用 getJSON 连接到在线数据库

php - 在特定 channel pubnub php sdk上获取未读消息

ssl - 将 SSL 与 docker 容器一起使用

php - 将整个网站重定向到 HTTPS

ruby - 如何将 TLS 客户端证书与 RubyGems 注册表一起使用?

curl - 如何仅从 Github PROTECTED 存储库中获取文件

cURL 使用 --ftp-create-dir 创建新目录

javascript - 从文件夹加载所有图像并使用 Laravel 框架将它们滚动到 JS slider 中