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();