php - 使用 curl 登录到 https 站点

标签 php curl

我正在尝试登录网站。该站点使用自动提交和随 secret 钥来提交表单。我尝试了几种方法,但无法通过。所以这是我的代码。任何答案将不胜感激。提前致谢。对于那些想尝试的人,我的假帐户通行证和用户名也可以在代码中使用。我的网址有点长

include 'simple_html_dom.php';
$i = 0;
$html = file_get_html($url);
foreach($html->find('input') as $keys) {
    $ltkey = $keys->value;
    if (++ $i == 1)
        break;
}
$url = 'https://auth.station.sony.com/login?theme=poxnora&cid=1056360&service=https://poxnora.station.sony.com/cas/merge.do&regService=https://poxnora.station.sony.com /play/load.do';
$data = 'lt=' . $ltkey . '&_eventId=submit&username=XXXXXXXX&password=XXXXXXXX';

// curl request
$fp = fopen("cookie.txt", "w");
fclose($fp);
$login = curl_init();
curl_setopt($login, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($login, CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt($login, CURLOPT_TIMEOUT, 40000);
curl_setopt($login, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($login, CURLOPT_URL, $url);
curl_setopt($login, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($login, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($login, CURLOPT_POST, TRUE);
curl_setopt($login, CURLOPT_POSTFIELDS, $data);
curl_setopt($login, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt($login, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($login, CURLOPT_CAINFO, "cert.crt");
$result = curl_exec($login);
curl_close($login);

echo $result;

最佳答案

问题是表单键连接到一个 session 。因此,当您检索表单 key 时,您需要使用您的 cookie 文件。以下是我的做法:

<?php

class PoxnoraAPI {
    const URL = 'https://auth.station.sony.com/login?theme=poxnora&cid=1056360&service=https://poxnora.station.sony.com/cas/merge.do&regService=https://poxnora.station.sony.com /play/load.do';

    protected $cookieFile;

    public function __construct() {
        // create a new cookie file
        $this->getCookieFile();
    }

    // Creates new cookie file in system temp dir
    protected function getCookieFile() {
        $this->cookieFile = tempnam(sys_get_temp_dir(), 'CDL');
    }

    // Gets form key from login page
    protected function getFormKey() {
        $ch = curl_init();
        $this->setCurlOpts($ch);
        $result = curl_exec($ch);
        curl_close($ch);

        $key = $this->matchFormKey($result);

        if (!$key) {
            throw new Exception('Unable to get key from form');
        }

        return $key;
    }

    protected function matchFormKey($result) {
        preg_match_all('<input type="hidden" name="lt" value="(.*)">', $result, $matches);

        return isset($matches[1][0]) ? $matches[1][0] : false;
    }

    // Uses username, password, and form key to login
    public function login($username, $password) {
        $key = $this->getFormKey();

        $ch = curl_init();
        $this->setCurlOpts($ch);

        $data = "lt=$key&_eventId=submit&username=$username&password=$password";
        $this->setCurlPost($ch, $data);

        $result = curl_exec($ch);
        curl_close($ch);

        // check if there's a form key. If there's a form key then we're on
        // the login page again
        $key = $this->matchFormKey($result);

        return !$key;
    }

    // Add post data to curl
    protected function setCurlPost($ch, $postData) {
        curl_setopt($ch, CURLOPT_POST,       true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    }

    // Add default curl params
    protected function setCurlOpts($ch) {
        curl_setopt($ch, CURLOPT_COOKIEJAR,      $this->cookieFile);
        curl_setopt($ch, CURLOPT_COOKIEFILE,     $this->cookieFile);
        curl_setopt($ch, CURLOPT_TIMEOUT,        40000);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_URL,            self::URL);
        curl_setopt($ch, CURLOPT_USERAGENT,      $_SERVER['HTTP_USER_AGENT']);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_REFERER,        self::URL);
    }
}

$api = new PoxnoraAPI();
$isLoggedIn = $api->login('USERNAME_HERE', 'PASSWORD_HERE');

if ($isLoggedIn) {
    echo '<h1>Successfully logged in!<h1>';
} else {
    echo '<h1>Error logging in</h1>';
}

关于php - 使用 curl 登录到 https 站点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16688780/

相关文章:

php - PHP重定向503而不更改URL

php - cURL SSL 证书错误 "Bad Certificate"

php - 如何从多个(指定的)帖子中获取图像附件

mysql - PHP:查看不成功的电子邮件

javascript - 使用ajax/php在表单上显示消息

php - 如何使用包含 cookie 的 PHP 进行 Curl 发布

curl - 运行官方 consul docker 镜像

php - uwamp drupal 8 安装新模块失败

docker - 从另一个容器访问一个Docker容器中的端点

javascript - 将元素 id 从 PHP 传递到 Javascript