php guzzle post 請求 segmentfault 模擬登陸

https://segmentfault.com/q/1010000009734004 php

<?php
require_once __DIR__ . '/vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Cookie\CookieJar;
use GuzzleHttp\Exception\RequestException;

$login_page_url = '/user/login';
$login_url = '/api/user/login?_=';

$client = new Client([
    'base_uri' => 'https://segmentfault.com',
    'headers' => [
        'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0',
        'Content-Type' => 'application/x-www-form-urlencoded; charset=UTF-8',
    ],
    'cookies' => true,
    'http_errors' => true,
]);

$user = [
    'email' => '1@qq.com',
    'password' => '2333',
];

$response = $client->request('GET', $login_page_url);
$body = (string) $response->getBody();
preg_match_all('/<script[\s\S]*?<\/script>/', $body, $matches);
$script = null;
foreach ($matches[0] as $value) {
    if (strpos($value, 'w.SF.token') !== false) {
        $script = $value;
        break;
    }
}
$script = str_replace(['<script>', '</script>'], '', $script);
file_put_contents(__DIR__ . '/test.js', 'var window = {};' . "\r\n" . $script . "\r\n" . 'console.log(window.SF.token);');
$token = shell_exec('/usr/local/bin/node test.js' . " 2>&1");
$token = trim($token);

// get cookie
$config = $client->getConfig();
$cookie = $config['cookies']->toArray()[0];

$cookieJar = CookieJar::fromArray([
    $cookie['Name'] => $cookie['Value'],
], $cookie['Domain']);

try {
    $response = $client->request('POST', $login_url . $token,
        array(
            'cookies' => $cookieJar,
            'form_params' => [
                'username' => $user['email'],
                'password' => $user['password'],
            ],
            'headers' => [
                'Referer' => 'https://segmentfault.com/user/login',
            ],
        )
    );
} catch (RequestException $e) {
    echo $e->getMessage();
}

echo (string) $response->getBody();
相關文章
相關標籤/搜索