首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决登录远程站点cookie未启用的问题?

如何解决登录远程站点cookie未启用的问题?
EN

Stack Overflow用户
提问于 2019-01-13 02:55:08
回答 1查看 41关注 0票数 0

我使用php,file_get_contentsdom documment登录到第三方网站(gmail)。但是当我运行代码时,它显示cookie问题文本页面:Turn cookies on or off,这意味着我没有启用cookie。但是我已经用这个代码$http_response_header打开了它,检查下面的代码,你就会明白了。

我不想使用curl。Curl支持cookies,但file_get_contents不支持cookies。我想只使用php进行远程登录,所以我没有使用curl。我不明白我的错误在哪里,为什么在代码中添加cookie函数后显示cookie问题。失败后,我在这里提交了这篇文章,以便从天才那里获得解决方案。

以下是我的gmail.php代码:

代码语言:javascript
复制
<?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代码:

代码语言:javascript
复制
<?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);
?>

注:我在代码中隐藏了我的个人邮箱和密码。对不起,我的英语不好。谢谢

EN

回答 1

Stack Overflow用户

发布于 2019-01-13 04:09:57

我认为您在google上执行请求的方式不是正确的形式。您的代码没有错,因为您尝试验证自己的方式。请查看this文档,也许它会有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54162864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档