我需要创建一个登录网站的脚本。这样说,我将从登录页面获取 CSRF 令牌并将其发布到登录操作URL。 [接受的数据是json。]
这是登录方式:
public function login()
{
$login = 'https://XXXXXXXXXXXXXXXXXXX';
$csrf = $this->token();
$data = array(
"email" => 'email@email.com',
"password" => '123456',
"displayType" => 'json',
"csrf" => $csrf
);
$json = json_encode($data);
$ch = curl_init($login);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, true); // For debugging purposes
curl_setopt($ch, CURLOPT_HTTPHEADER, $this->headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
return $result;
}
这里是令牌抓取器方法:
public function token()
{
$source = $this->get("https://OOOOOOOOOOOOOOOOOOO");
$dom = new DOMDocument();
$dom->loadHTML($source);
$dxp = new DOMXpath($dom);
$csrf = $dxp->query('//input[@name="csrf"]/@value')->item(0)->value;
return $csrf;
}
成功提取令牌,但在同一会话中的每次通话中都会更改。的为什么?我正在以这种方式初始化会话:
public function __construct($url)
{
if(session_status() == PHP_SESSION_NONE)
session_start();
...
}
答案 0 :(得分:0)
当然$ this-> get(并且您的功能登录在被叫网站上使用不同的"会话" 您需要将Cookie存储在会话中并重新使用它们。您需要使用cURL重写get函数并添加以下行:
$cookie_path = 'mycookie.txt';
curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookie_path );
curl_setopt( $ch, CURLOPT_COOKIEFILE, $cookie_path );