laravel - api de connexion à la demande de publication guzzle, la réponse renvoie 404, qu'est-ce qui ne va pas ?
女神的闺蜜爱上我
女神的闺蜜爱上我 2017-06-13 09:24:33
0
1
1578

Le guzzlecode de l'auteur est le suivant :

use GuzzleHttp\Client;
use GuzzleHttp\Cookie\CookieJar;
use GuzzleHttp\Exception\RequestException;

class getSegmentfaultArticle extends Command
{
    protected $signature = 'segmentfault:artical';

    protected $description = '获取 Segmentfault 文章的信息';

    protected $client;
    protected $crawler;

    protected $user = [];

    protected $login_page_url = '/user/login';
    protected $login_url = '/api/user/login?_=775250c435a29c7a335a11ab2f641423';
    protected $sessionId = 'web2~04u8m9qfpnt6abl6ljuqae59l0';
    protected $my_seg_home_url = '/u/greenlightt/articles';

    public function __construct(Crawler $crawler) {
        parent::__construct();

        $this->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,
        ]);
        $this->crawler = $crawler;

        // 获取登录名及密码
        $this->user['email'] = config('services.segmentfault.email');
        $this->user['password'] = config('services.segmentfault.password');
    }

    public function handle() {
        // 较验 auth
        if (is_null($this->user['email']) || is_null($this->user['password'])) {
            $this->error('请在 .env 文件填写 Segmentfault 账号及密码');
            return;
        }
        // 登录获取 cookies
        $this->client->request('GET', $this->login_page_url);
        $this->updateCookies();
        
        $response = $this->client->request('POST', $this->login_url,
            array(
                'form_params' => [
                    'username' => $this->user['email'],
                    'password' => $this->user['password'],
                ],
                'headers' => [
                    'Referer' => '/user/login'
                ]
            )
        );
    }
    
    /*                                                                          
     * 修改 Cookie 中的 PHPSESSID 值                                            
     */                                                                         
     protected function updateCookies() {                                        
        $config = $this->client->getConfig();                                   
        $cookie = $config['cookies']->toArray()[0];                             
        $cookie['Value'] = $this->sessionId;                                    
                                                                                    
        $config['cookies']->setCookie(                                          
           new SetCookie($cookie)                                              
        );                                                                      
     }   
}

Le résultat de l'erreur est le suivant :

女神的闺蜜爱上我
女神的闺蜜爱上我

répondre à tous(1)
三叔

login?_=Le token suivant n'est pas corrigé, vous devez le retirer manuellement de window.SF.token.

De plus, le cookie n'est pas inclus lors de la demande, donc SF détermine que vous faites une demande illégale, 404.

Puisque l'auteur pense que le jeton après _ est un champ arbitraire, vérifions-le ci-dessous le code qui s'exécute correctement (sans laravel)

.

Étant donné que le jeton SF a des champs obscurcis, PHP ne devrait pas être capable de simplement l'analyser, nous utilisons donc directement shell_exe pour appeler node afin d'obtenir le jeton.

<?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' => '/user/login',
            ],
        )
    );
} catch (RequestException $e) {
    echo $e->getMessage();
}

echo (string) $response->getBody();

Résultat de sortie :

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal