Как решить, что вход в удаленный сайт cookie не включает проблему? - PullRequest
0 голосов
/ 12 января 2019

Я использую php file_get_contents и dom documment для входа на сторонний сайт (gmail). Но когда я запускаю свой код, он отображает текстовую страницу с проблемой cookie: Turn cookies on or off, это означает, что я не включаю cookie. Но я уже включаю его, используя этот код $http_response_header, проверьте код ниже, и вы поймете.

Я не хочу использовать локон. Curl поддерживает куки, но file_get_contents не поддерживает куки. Я хочу удаленного входа, используя только php, поэтому я не использовал curl. Я точно не понимаю, где моя ошибка и почему отображается проблема с cookie после добавления функции cookie в код. После неудачного завершения я отправляю этот пост здесь для получения решения от гения.

Вот мой gmail.php Код:

<?php

class LoginGmail
{
  public $request_cookies = '';
  public $response_cookies = '';
  public $content = '';

  public function set_cookies_json($cookies)
  {
    $cookies_json = json_decode($cookies, true);
    $cookies_array = array();
    foreach ($cookies_json as $key => $value)
    {
      $cookies_array[] = $key .'='.$value;
    }
    $this->request_cookies = 'Cookie: ' . join('; ', $cookies_array) . "\r\n";
  }

  public function set_cookies_string($cookies)
  {
    $this->request_cookies = 'Cookie: ' . $cookies . "\r\n";
  }

  private function get_cookies($http_response_header)
  {
    $cookies_array = array();
    foreach($http_response_header as $s)
    {
      if (preg_match('|^Set-Cookie:\s*([^=]+)=([^;]+);(.+)$|', $s, $parts))
      {
        $cookies_array[] = $parts[1] . '=' . $parts[2];
      }
    }

    $this->response_cookies = 'Cookie: ' . join('; ', $cookies_array) . "\r\n";
  }


  public function get($url)
  {
    $opts = array(
      'http' => array(
        'method' => 'GET',
        'header' => "Accept-language: en\r\n" .
                    "User-Agent: com.google.android.apps.maps/984200142 (Linux; U; Android 5.0; en_US; GT-I9500; Build/LRX21M; Cronet/66.0.3359.100)\r\n" .
                    $this->request_cookies
      )
    );
    $context = stream_context_create($opts);
    $this->content = file_get_contents($url, false, $context);
    $this->get_cookies($http_response_header);
    return $this->content;
  }

  public function post($url, $inputs)
  {
    $post_content = array();
    foreach ($inputs as $key => $value)
    {
      $post_content[] = $key .'='.$value;
    }

    $opts = array(
      'http' => array(
        'method' => 'POST',
        'header' => "Content-type: application/x-www-form-urlencoded\r\n" .
                    "User-Agent: com.google.android.apps.maps/984200142 (Linux; U; Android 5.0; en_US; GT-I9500; Build/LRX21M; Cronet/66.0.3359.100)\r\n" .
                    $this->request_cookies,
        'content' => join('&', $post_content),
      )
    );
    $context = stream_context_create($opts);
    $this->content = file_get_contents($url, false, $context);
    $this->get_cookies($http_response_header);
    return $this->content;
  }


  public function postPass($url, $inputs)
  {
    $post_content = array();
    foreach ($inputs as $key => $value)
    {
      $post_content[] = $key .'='.$value;
    }

    $opts = array(
      'http' => array(
        'method' => 'POST',
        'header' => "Content-type: application/x-www-form-urlencoded\r\n" .
                    "User-Agent: com.google.android.apps.maps/984200142 (Linux; U; Android 5.0; en_US; GT-I9500; Build/LRX21M; Cronet/66.0.3359.100)\r\n" .
                    $this->request_cookies,
        'content' => join('&', $post_content),
      )
    );
    $context = stream_context_create($opts);
    $this->content = file_get_contents($url, false, $context);
    $this->get_cookies($http_response_header);
    return $this->content;
  }
}
?>

А вот и мой login.php Код:

<?php

require_once('gmail.php');
$connect = new LoginGmail();

$url = 'https://store.google.com/account';
$first = $connect->get($url);

$domd = @DOMDocument::loadHTML($first);
$xp = new DOMXPath($domd);

foreach($domd->getElementsByTagName("form")->item(0)->getElementsByTagName("input") as $get)
{
    $inputs[$get->getAttribute("name")]=$get->getAttribute("value");
}

$inputs["Email"]="HERE_IS_GMAIL_ID";
$url = $xp->query("//form")->item(0)->getAttribute("action");
$second = $connect->post($url, $inputs);


$domd = @DOMDocument::loadHTML($second);
$xp = new DOMXPath($domd);

foreach($domd->getElementsByTagName("form")->item(0)->getElementsByTagName("input") as $get)
{
    $inputs[$get->getAttribute("name")]=$get->getAttribute("value");
}

$inputs["Passwd"]="HERE_IS_GMAIL_PASSWORD";
$url = $xp->query("//form")->item(0)->getAttribute("action");
echo $connect->postPass($url, $inputs);
?>

NB. Я скрываю свой личный адрес электронной почты и пароль в коде. Извините за не очень хороший английский. Спасибо

1 Ответ

0 голосов
/ 12 января 2019

Я считаю, что то, как вы выполняете запросы в Google, не является правильной формой. Ваш код не так, как вы пытаетесь аутентифицировать себя. Ознакомьтесь с этой документацией, может быть, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...