PHP - https:// POST 请求?

发布于 2024-12-08 14:24:14 字数 2086 浏览 0 评论 0原文

我的代码错误在哪里?

<?php
    error_reporting(-1);
    function PostRequest($url, $referer, $_data) {
        // convert variables array to string:
        $data = array();
        while(list($n,$v) = each($_data)){
            $data[] = "$n=$v";
        }
        $data = implode('&', $data);
        // format --> test1=a&test2=b etc.

        // parse the given URL
        $url = parse_url($url);

        // extract host and path:
        $host = $url['host'];
        $path = $url['path'];

        // open a socket connection on port 80
        $fp = fsockopen("ssl://".$host, 443);

        // send the request headers:
        fputs($fp, "POST $path HTTP/1.1\r\n");
        fputs($fp, "Host: $host\r\n");
        fputs($fp, "Referer: $referer\r\n");
        fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
        fputs($fp, "Content-length: ". strlen($data) ."\r\n");
        fputs($fp, "Connection: close\r\n\r\n");
        fputs($fp, $data);

        $result = '';
        $safe=0;
        while(!feof($fp)&&$safe<1000) {
            // receive the results of the request
            $result .= fgets($fp, 128);
            $safe++;
        }

        // close the socket connection:
        fclose($fp);

        // split the result header from the content
        $result = explode("\r\n\r\n", $result, 2);

        $header = isset($result[0]) ? $result[0] : '';
        $content = isset($result[1]) ? $result[1] : '';

        // return as array:
        return array($header, $content);
    }

    /*
    ** The example:
    */

    // submit these variables to the server:
    $data = array(
        'email'=>'testemail',
        'pass'=>'testpass'
    );

    list($header, $content) = PostRequest("https://login.facebook.com/login.php", "http://facebook.com", $data);
    // print the result of the whole request:
    print $content;
?>

我想为一些私人使用的网站制作一个自动登录脚本,此代码应该执行到 facebook 的重定向并自动登录帐户,但该代码不起作用,我的浏览器窗口仍然是空白的。

如果有人能帮助我,那就太好了。我已经用 CURL 尝试过了,但我的测试站点 Facebook 说 Cookie 未启用。

where's my mistake in the code?

<?php
    error_reporting(-1);
    function PostRequest($url, $referer, $_data) {
        // convert variables array to string:
        $data = array();
        while(list($n,$v) = each($_data)){
            $data[] = "$n=$v";
        }
        $data = implode('&', $data);
        // format --> test1=a&test2=b etc.

        // parse the given URL
        $url = parse_url($url);

        // extract host and path:
        $host = $url['host'];
        $path = $url['path'];

        // open a socket connection on port 80
        $fp = fsockopen("ssl://".$host, 443);

        // send the request headers:
        fputs($fp, "POST $path HTTP/1.1\r\n");
        fputs($fp, "Host: $host\r\n");
        fputs($fp, "Referer: $referer\r\n");
        fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
        fputs($fp, "Content-length: ". strlen($data) ."\r\n");
        fputs($fp, "Connection: close\r\n\r\n");
        fputs($fp, $data);

        $result = '';
        $safe=0;
        while(!feof($fp)&&$safe<1000) {
            // receive the results of the request
            $result .= fgets($fp, 128);
            $safe++;
        }

        // close the socket connection:
        fclose($fp);

        // split the result header from the content
        $result = explode("\r\n\r\n", $result, 2);

        $header = isset($result[0]) ? $result[0] : '';
        $content = isset($result[1]) ? $result[1] : '';

        // return as array:
        return array($header, $content);
    }

    /*
    ** The example:
    */

    // submit these variables to the server:
    $data = array(
        'email'=>'testemail',
        'pass'=>'testpass'
    );

    list($header, $content) = PostRequest("https://login.facebook.com/login.php", "http://facebook.com", $data);
    // print the result of the whole request:
    print $content;
?>

I want to make an auto login script for some sites for the private use, this code should perform a redirection to facebook and automaticly log into an account, but the code isn't working, my browser window is still blank.

Would be great if anyone, could help me. I already tried this with CURL, but my test-site Facebook says, that Cookies aren't enabled.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

攀登最高峰 2024-12-15 14:24:14

我的猜测是响应是没有正文的标头重定向。

使用我为情况编写的 此类 尝试一下其中 cURL 不可用 - 它完全执行您想要执行的操作,但通过为您处理连接和消息构造以及标头重定向来完成大量工作。还提供有意义的错误消息。记录在文件顶部的注释中。

使用上面的类并尝试以下代码(EDITED FOR COOKIES):

<?php

  function process_cookies ($httpobj, $cookiejar = array()) {
    // Function get the cookies that should be sent in the next request
    if (!count($cookies = $httpobj->getResponseCookies())) return $cookiejar;
    foreach ($cookies as $key => $data) {
      if ($data['value'] !== '' && (!isset($data['expirestime']) || $data['expirestime'] > time())) {
        $cookiejar[$key] = $data['value'];
      } else if (isset($cookiejar[$key])) {
        unset($cookiejar[$key]);
      }
    }
    return $cookiejar;
  }

  $url1 = 'http://www.facebook.com/';
  $url2 = 'https://login.facebook.com/login.php';

  // Fetch the class
  require('class.httprequest.php');

  // Create an object and get the main page of facebook.com
  $request1 = new httprequest;
  if (!$request1->setRequestURL($url1)) exit("Error setting request 1 URL: ".$request1->getLastErrorStr()."<br>\r\n");
  if (!$request1->sendRequest()) exit("Error sending request 1: ".$request1->getLastErrorStr()."<br>\r\n");

  // Create an object for the POST request
  $request2 = new httprequest;

  // Set request method and URL      
  $request2->setRequestMethod('POST');
  if (!$request2->setRequestURL($lastLocation = $url2)) exit("Error setting request URL: ".$request2->getLastErrorStr()."<br>\r\n");

  // All the other headers will be built by the class but we need
  // set this one explicitly
  $request2->setRequestHeader('Referer',$url1);

  // Get the cookies sent by the last request and forward them on
  $cookiejar = process_cookies($request1);
  if (count($cookiejar)) $request2->setRequestCookies($cookiejar);

  // Set the request body
  $data = array(
    'email'=>'testemail',
    'pass'=>'testpass'
  );
  $request2->setRequestControls($data);

  // We need to handle redirects ourselves to make sure the cookies are sent correctly
  $request2->setHandleRedirects(FALSE);

  // Keep looping until we get a 2xx response
  while (TRUE) {
    if (!$request2->sendRequest()) exit("Error sending request: ".$request2->getLastErrorStr()."<br>\r\n");
    if ($request2->getResponseCode() >= 200 && $request2->getResponseCode() < 300) break;
    if ($request2->getResponseCode() >= 300 && $request2->getResponseCode() < 400) {
      $nextLocation = $request2->getRequestHeader('location');
      if (!$nextLocation) exit("Error: Server responded with redirect response code ".$request2->getResponseCode().", but did not send a valid location header<br>\r\n");
      $cookiejar = process_cookies($request2,$cookiejar);
      $request2->resetRequestCookies();
      $request2->setRequestCookies($cookiejar);
      $request2->setRequestHeader('Referer',$lastLocation);
      if (!$request2->setRequestURL($lastLocation = $nextLocation)) exit("Error setting request URL: ".$request2->getLastErrorStr()."<br>\r\n");
      continue;
    }
    exit("Server responded with unhandled HTTP response code: ".$request2->getResponseCode()."<br>\r\n");
  }

  // validate and display the response
  if (!$response = $request2->getResponseBodyData(TRUE)) exit('Error: No body data returned<br>'."\r\n");
  exit($response);

?>

My guess is that the response is a header redirect with no body.

Try it using this class I wrote for situations where cURL is not available - it does exactly what you are trying to do there, but takes a lot of the work out of it by handling the connection and message construction for you, as well as header redirects. Also provides meaningful error messages. Documented in comments at the top of the file.

Use the above class and try the following code (EDITED FOR COOKIES):

<?php

  function process_cookies ($httpobj, $cookiejar = array()) {
    // Function get the cookies that should be sent in the next request
    if (!count($cookies = $httpobj->getResponseCookies())) return $cookiejar;
    foreach ($cookies as $key => $data) {
      if ($data['value'] !== '' && (!isset($data['expirestime']) || $data['expirestime'] > time())) {
        $cookiejar[$key] = $data['value'];
      } else if (isset($cookiejar[$key])) {
        unset($cookiejar[$key]);
      }
    }
    return $cookiejar;
  }

  $url1 = 'http://www.facebook.com/';
  $url2 = 'https://login.facebook.com/login.php';

  // Fetch the class
  require('class.httprequest.php');

  // Create an object and get the main page of facebook.com
  $request1 = new httprequest;
  if (!$request1->setRequestURL($url1)) exit("Error setting request 1 URL: ".$request1->getLastErrorStr()."<br>\r\n");
  if (!$request1->sendRequest()) exit("Error sending request 1: ".$request1->getLastErrorStr()."<br>\r\n");

  // Create an object for the POST request
  $request2 = new httprequest;

  // Set request method and URL      
  $request2->setRequestMethod('POST');
  if (!$request2->setRequestURL($lastLocation = $url2)) exit("Error setting request URL: ".$request2->getLastErrorStr()."<br>\r\n");

  // All the other headers will be built by the class but we need
  // set this one explicitly
  $request2->setRequestHeader('Referer',$url1);

  // Get the cookies sent by the last request and forward them on
  $cookiejar = process_cookies($request1);
  if (count($cookiejar)) $request2->setRequestCookies($cookiejar);

  // Set the request body
  $data = array(
    'email'=>'testemail',
    'pass'=>'testpass'
  );
  $request2->setRequestControls($data);

  // We need to handle redirects ourselves to make sure the cookies are sent correctly
  $request2->setHandleRedirects(FALSE);

  // Keep looping until we get a 2xx response
  while (TRUE) {
    if (!$request2->sendRequest()) exit("Error sending request: ".$request2->getLastErrorStr()."<br>\r\n");
    if ($request2->getResponseCode() >= 200 && $request2->getResponseCode() < 300) break;
    if ($request2->getResponseCode() >= 300 && $request2->getResponseCode() < 400) {
      $nextLocation = $request2->getRequestHeader('location');
      if (!$nextLocation) exit("Error: Server responded with redirect response code ".$request2->getResponseCode().", but did not send a valid location header<br>\r\n");
      $cookiejar = process_cookies($request2,$cookiejar);
      $request2->resetRequestCookies();
      $request2->setRequestCookies($cookiejar);
      $request2->setRequestHeader('Referer',$lastLocation);
      if (!$request2->setRequestURL($lastLocation = $nextLocation)) exit("Error setting request URL: ".$request2->getLastErrorStr()."<br>\r\n");
      continue;
    }
    exit("Server responded with unhandled HTTP response code: ".$request2->getResponseCode()."<br>\r\n");
  }

  // validate and display the response
  if (!$response = $request2->getResponseBodyData(TRUE)) exit('Error: No body data returned<br>'."\r\n");
  exit($response);

?>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文