Snoopy

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • futureofphp

    #1

    Snoopy

    I need to access a website, Fetch the data, and then logout. Please
    tell me where I am wrong. I dont think its logging out properly.

    <?

    include "Snoopy.class.p hp";
    $snoopy = new Snoopy;

    //Logging in
    $submit_url =
    'http://www.sortingcode s.co.uk/FormsLogin.asp? action=login&UR L=Default%2Easp ';
    $submit_vars["Username"] = "Username"; //my username
    $submit_vars["Password"] = "Password"; //my password
    $submit_vars["Submit"] = "Go";
    $snoopy->submit($submit _url,$submit_va rs);

    //Requesting for info
    $snoopy->setcookies() ;
    $submit_url =
    'http://www.sortingcode s.co.uk/Results.asp?typ e=Sortcode&Page =1&Sortcode=402 343';
    $snoopy->fetch($submit_ url);
    echo $snoopy->results;

    //loggin out
    $snoopy->setcookies() ;
    $snoopy->fetch("http://www.sortingcode s.co.uk/logout.asp");

    ?>

    Thanks

  • Michael Phipps

    #2
    Re: Snoopy

    > include "Snoopy.class.p hp";[color=blue]
    > $snoopy = new Snoopy;[/color]

    What is Snoopy? It would appear most the functionality you're using is in
    that class. We need to see that if we're going to help you.

    What are you actually trying to achieve by logging in and out of another
    website?



    Comment

    • futureofphp

      #3
      Re: Snoopy

      Snoopy is a class thats available on source forge
      http://sourceforge.net/projects/snoopy/
      I have attached the entire class here is you can help me please

      Basically I enter a site after loggin in pick up a few details and then
      log out. I dont think the logout works.

      <?php

      /*************** *************** *************** ****

      Snoopy - the PHP net client
      Author: Monte Ohrt <monte@ispi.net >
      Copyright (c): 1999-2000 ispi, all rights reserved
      Version: 1.2

      * This library is free software; you can redistribute it and/or
      * modify it under the terms of the GNU Lesser General Public
      * License as published by the Free Software Foundation; either
      * version 2.1 of the License, or (at your option) any later version.
      *
      * This library is distributed in the hope that it will be useful,
      * but WITHOUT ANY WARRANTY; without even the implied warranty of
      * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
      * Lesser General Public License for more details.
      *
      * You should have received a copy of the GNU Lesser General Public
      * License along with this library; if not, write to the Free Software
      * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
      USA

      You may contact the author of Snoopy by e-mail at:
      monte@ispi.net

      Or, write to:
      Monte Ohrt
      CTO, ispi
      237 S. 70th suite 220
      Lincoln, NE 68510

      The latest version of Snoopy can be obtained from:


      *************** *************** *************** ****/

      class Snoopy
      {
      /**** Public variables ****/

      /* user definable vars */

      var $host = "www.php.ne t"; // host name we are connecting to
      var $port = 80; // port we are connecting to
      var $proxy_host = ""; // proxy host to use
      var $proxy_port = ""; // proxy port to use
      var $proxy_user = ""; // proxy user to use
      var $proxy_pass = ""; // proxy password to use

      var $agent = "Snoopy v1.2"; // agent we masquerade as
      var $referer = ""; // referer info to pass
      var $cookies = array(); // array of cookies to pass
      // $cookies["username"]="joe";
      var $rawheaders = array(); // array of raw headers to send
      // $rawheaders["Content-type"]="text/html";

      var $maxredirs = 5; // http redirection depth maximum. 0 =
      disallow
      var $lastredirectad dr = ""; // contains address of last redirected
      address
      var $offsiteok = true; // allows redirection off-site
      var $maxframes = 0; // frame content depth maximum. 0 = disallow
      var $expandlinks = true; // expand links to fully qualified URLs.
      // this only applies to fetchlinks()
      // or submitlinks()
      var $passcookies = true; // pass set cookies back through redirects
      // NOTE: this currently does not respect
      // dates, domains or paths.

      var $user = ""; // user for http authentication
      var $pass = ""; // password for http authentication

      // http accept types
      var $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
      */*";

      var $results = ""; // where the content is put

      var $error = ""; // error messages sent here
      var $response_code = ""; // response code returned from server
      var $headers = array(); // headers returned from server sent here
      var $maxlength = 500000; // max return data length (body)
      var $read_timeout = 0; // timeout on read operations, in seconds
      // supported only since PHP 4 Beta 4
      // set to 0 to disallow timeouts
      var $timed_out = false; // if a read operation timed out
      var $status = 0; // http request status

      var $temp_dir = "/tmp"; // temporary directory that the webserver
      // has permission to write to.
      // under Windows, this should be C:\temp

      var $curl_path = "/usr/local/bin/curl";
      // Snoopy will use cURL for fetching
      // SSL content if a full system path to
      // the cURL binary is supplied here.
      // set to false if you do not have
      // cURL installed. See http://curl.haxx.se
      // for details on installing cURL.
      // Snoopy does *not* use the cURL
      // library functions built into php,
      // as these functions are not stable
      // as of this Snoopy release.

      /**** Private variables ****/

      var $_maxlinelen = 4096; // max line length (headers)

      var $_httpmethod = "GET"; // default http request method
      var $_httpversion = "HTTP/1.0"; // default http request version
      var $_submit_method = "POST"; // default submit method
      var $_submit_type = "applicatio n/x-www-form-urlencoded"; // default
      submit type
      var $_mime_boundary = ""; // MIME boundary for
      multipart/form-data submit type
      var $_redirectaddr = false; // will be set if page fetched is a
      redirect
      var $_redirectdepth = 0; // increments on an http redirect
      var $_frameurls = array(); // frame src urls
      var $_framedepth = 0; // increments on frame depth

      var $_isproxy = false; // set if using a proxy server
      var $_fp_timeout = 30; // timeout for socket connection

      /*============== =============== =============== =============== ===========*\
      Function: fetch
      Purpose: fetch the contents of a web page
      (and possibly other protocols in the
      future like ftp, nntp, gopher, etc.)
      Input: $URI the location of the page to fetch
      Output: $this->results the output text from the fetch
      \*============= =============== =============== =============== ============*/

      function fetch($URI)
      {

      //preg_match("|^([^:]+)://([^:/]+)(:[\d]+)*(.*)|",$URI, $URI_PARTS);
      $URI_PARTS = parse_url($URI) ;
      if (!empty($URI_PA RTS["user"]))
      $this->user = $URI_PARTS["user"];
      if (!empty($URI_PA RTS["pass"]))
      $this->pass = $URI_PARTS["pass"];
      if (empty($URI_PAR TS["query"]))
      $URI_PARTS["query"] = '';

      switch($URI_PAR TS["scheme"])
      {
      case "http":
      $this->host = $URI_PARTS["host"];
      if(!empty($URI_ PARTS["port"]))
      $this->port = $URI_PARTS["port"];
      if($this->_connect($fp ))
      {
      if($this->_isproxy)
      {
      // using proxy, send entire URI
      $this->_httprequest($ URI,$fp,$URI,$t his->_httpmethod) ;
      }
      else
      {
      $path = $URI_PARTS["path"].($URI_PARTS["query"] ?
      "?".$URI_PA RTS["query"] : "");
      // no proxy, send only the path
      $this->_httprequest($ path, $fp, $URI, $this->_httpmethod) ;
      }

      $this->_disconnect($f p);

      if($this->_redirectadd r)
      {
      /* url was redirected, check if we've hit the max depth */
      if($this->maxredirs > $this->_redirectdepth )
      {
      // only follow redirect if it's on this site, or offsiteok is
      true
      if(preg_match(" |^http://".preg_quote($t his->host)."|i",$th is->_redirectadd r)
      || $this->offsiteok)
      {
      /* follow the redirect */
      $this->_redirectdepth ++;
      $this->lastredirectad dr=$this->_redirectadd r;
      $this->fetch($this->_redirectaddr) ;
      }
      }
      }

      if($this->_framedepth < $this->maxframes &&
      count($this->_frameurls) > 0)
      {
      $frameurls = $this->_frameurls;
      $this->_frameurls = array();

      while(list(,$fr ameurl) = each($frameurls ))
      {
      if($this->_framedepth < $this->maxframes)
      {
      $this->fetch($frameur l);
      $this->_framedepth+ +;
      }
      else
      break;
      }
      }
      }
      else
      {
      return false;
      }
      return true;
      break;
      case "https":
      if(!$this->curl_path)
      return false;
      if(function_exi sts("is_executa ble"))
      if (!is_executable ($this->curl_path))
      return false;
      $this->host = $URI_PARTS["host"];
      if(!empty($URI_ PARTS["port"]))
      $this->port = $URI_PARTS["port"];
      if($this->_isproxy)
      {
      // using proxy, send entire URI
      $this->_httpsrequest( $URI,$URI,$this->_httpmethod) ;
      }
      else
      {
      $path = $URI_PARTS["path"].($URI_PARTS["query"] ?
      "?".$URI_PA RTS["query"] : "");
      // no proxy, send only the path
      $this->_httpsrequest( $path, $URI, $this->_httpmethod) ;
      }

      if($this->_redirectadd r)
      {
      /* url was redirected, check if we've hit the max depth */
      if($this->maxredirs > $this->_redirectdepth )
      {
      // only follow redirect if it's on this site, or offsiteok is
      true
      if(preg_match(" |^http://".preg_quote($t his->host)."|i",$th is->_redirectadd r)
      || $this->offsiteok)
      {
      /* follow the redirect */
      $this->_redirectdepth ++;
      $this->lastredirectad dr=$this->_redirectadd r;
      $this->fetch($this->_redirectaddr) ;
      }
      }
      }

      if($this->_framedepth < $this->maxframes &&
      count($this->_frameurls) > 0)
      {
      $frameurls = $this->_frameurls;
      $this->_frameurls = array();

      while(list(,$fr ameurl) = each($frameurls ))
      {
      if($this->_framedepth < $this->maxframes)
      {
      $this->fetch($frameur l);
      $this->_framedepth+ +;
      }
      else
      break;
      }
      }
      return true;
      break;
      default:
      // not a valid protocol
      $this->error = 'Invalid protocol "'.$URI_PAR TS["scheme"].'"\n';
      return false;
      break;
      }
      return true;
      }

      /*============== =============== =============== =============== ===========*\
      Function: submit
      Purpose: submit an http form
      Input: $URI the location to post the data
      $formvars the formvars to use.
      format: $formvars["var"] = "val";
      $formfiles an array of files to submit
      format: $formfiles["var"] = "/dir/filename.ext";
      Output: $this->results the text output from the post
      \*============= =============== =============== =============== ============*/

      function submit($URI, $formvars="", $formfiles="")
      {
      unset($postdata );

      $postdata = $this->_prepare_post_ body($formvars, $formfiles);

      $URI_PARTS = parse_url($URI) ;
      if (!empty($URI_PA RTS["user"]))
      $this->user = $URI_PARTS["user"];
      if (!empty($URI_PA RTS["pass"]))
      $this->pass = $URI_PARTS["pass"];
      if (empty($URI_PAR TS["query"]))
      $URI_PARTS["query"] = '';

      switch($URI_PAR TS["scheme"])
      {
      case "http":
      $this->host = $URI_PARTS["host"];
      if(!empty($URI_ PARTS["port"]))
      $this->port = $URI_PARTS["port"];
      if($this->_connect($fp ))
      {
      if($this->_isproxy)
      {
      // using proxy, send entire URI
      $this->_httprequest($ URI,$fp,$URI,$t his->_submit_method ,$this->_submit_type,$ postdata);
      }
      else
      {
      $path = $URI_PARTS["path"].($URI_PARTS["query"] ?
      "?".$URI_PA RTS["query"] : "");
      // no proxy, send only the path
      $this->_httprequest($ path, $fp, $URI, $this->_submit_method ,
      $this->_submit_type , $postdata);
      }

      $this->_disconnect($f p);

      if($this->_redirectadd r)
      {
      /* url was redirected, check if we've hit the max depth */
      if($this->maxredirs > $this->_redirectdepth )
      {
      if(!preg_match( "|^".$URI_P ARTS["scheme"]."://|",
      $this->_redirectaddr) )
      $this->_redirectadd r =
      $this->_expandlinks($ this->_redirectaddr, $URI_PARTS["scheme"]."://".$URI_PART S["host"]);

      // only follow redirect if it's on this site, or offsiteok is
      true
      if(preg_match(" |^http://".preg_quote($t his->host)."|i",$th is->_redirectadd r)
      || $this->offsiteok)
      {
      /* follow the redirect */
      $this->_redirectdepth ++;
      $this->lastredirectad dr=$this->_redirectadd r;
      if( strpos( $this->_redirectadd r, "?" ) > 0 )
      $this->fetch($this->_redirectaddr) ; // the redirect has
      changed the request method from post to get
      else
      $this->submit($this->_redirectaddr, $formvars, $formfiles);
      }
      }
      }

      if($this->_framedepth < $this->maxframes &&
      count($this->_frameurls) > 0)
      {
      $frameurls = $this->_frameurls;
      $this->_frameurls = array();

      while(list(,$fr ameurl) = each($frameurls ))
      {
      if($this->_framedepth < $this->maxframes)
      {
      $this->fetch($frameur l);
      $this->_framedepth+ +;
      }
      else
      break;
      }
      }

      }
      else
      {
      return false;
      }
      return true;
      break;
      case "https":
      if(!$this->curl_path)
      return false;
      if(function_exi sts("is_executa ble"))
      if (!is_executable ($this->curl_path))
      return false;
      $this->host = $URI_PARTS["host"];
      if(!empty($URI_ PARTS["port"]))
      $this->port = $URI_PARTS["port"];
      if($this->_isproxy)
      {
      // using proxy, send entire URI
      $this->_httpsrequest( $URI, $URI, $this->_submit_method ,
      $this->_submit_type , $postdata);
      }
      else
      {
      $path = $URI_PARTS["path"].($URI_PARTS["query"] ?
      "?".$URI_PA RTS["query"] : "");
      // no proxy, send only the path
      $this->_httpsrequest( $path, $URI, $this->_submit_method ,
      $this->_submit_type , $postdata);
      }

      if($this->_redirectadd r)
      {
      /* url was redirected, check if we've hit the max depth */
      if($this->maxredirs > $this->_redirectdepth )
      {
      if(!preg_match( "|^".$URI_P ARTS["scheme"]."://|",
      $this->_redirectaddr) )
      $this->_redirectadd r =
      $this->_expandlinks($ this->_redirectaddr, $URI_PARTS["scheme"]."://".$URI_PART S["host"]);

      // only follow redirect if it's on this site, or offsiteok is
      true
      if(preg_match(" |^http://".preg_quote($t his->host)."|i",$th is->_redirectadd r)
      || $this->offsiteok)
      {
      /* follow the redirect */
      $this->_redirectdepth ++;
      $this->lastredirectad dr=$this->_redirectadd r;
      if( strpos( $this->_redirectadd r, "?" ) > 0 )
      $this->fetch($this->_redirectaddr) ; // the redirect has changed
      the request method from post to get
      else
      $this->submit($this->_redirectaddr, $formvars, $formfiles);
      }
      }
      }

      if($this->_framedepth < $this->maxframes &&
      count($this->_frameurls) > 0)
      {
      $frameurls = $this->_frameurls;
      $this->_frameurls = array();

      while(list(,$fr ameurl) = each($frameurls ))
      {
      if($this->_framedepth < $this->maxframes)
      {
      $this->fetch($frameur l);
      $this->_framedepth+ +;
      }
      else
      break;
      }
      }
      return true;
      break;

      default:
      // not a valid protocol
      $this->error = 'Invalid protocol "'.$URI_PAR TS["scheme"].'"\n';
      return false;
      break;
      }
      return true;
      }

      /*============== =============== =============== =============== ===========*\
      Function: fetchlinks
      Purpose: fetch the links from a web page
      Input: $URI where you are fetching from
      Output: $this->results an array of the URLs
      \*============= =============== =============== =============== ============*/

      function fetchlinks($URI )
      {
      if ($this->fetch($URI))
      {

      if(is_array($th is->results))
      {
      for($x=0;$x<cou nt($this->results);$x+ +)
      $this->results[$x] = $this->_striplinks($t his->results[$x]);
      }
      else
      $this->results = $this->_striplinks($t his->results);

      if($this->expandlinks)
      $this->results = $this->_expandlinks($ this->results, $URI);
      return true;
      }
      else
      return false;
      }

      /*============== =============== =============== =============== ===========*\
      Function: fetchform
      Purpose: fetch the form elements from a web page
      Input: $URI where you are fetching from
      Output: $this->results the resulting html form
      \*============= =============== =============== =============== ============*/

      function fetchform($URI)
      {

      if ($this->fetch($URI))
      {

      if(is_array($th is->results))
      {
      for($x=0;$x<cou nt($this->results);$x+ +)
      $this->results[$x] = $this->_stripform($th is->results[$x]);
      }
      else
      $this->results = $this->_stripform($th is->results);

      return true;
      }
      else
      return false;
      }


      /*============== =============== =============== =============== ===========*\
      Function: fetchtext
      Purpose: fetch the text from a web page, stripping the links
      Input: $URI where you are fetching from
      Output: $this->results the text from the web page
      \*============= =============== =============== =============== ============*/

      function fetchtext($URI)
      {
      if($this->fetch($URI))
      {
      if(is_array($th is->results))
      {
      for($x=0;$x<cou nt($this->results);$x+ +)
      $this->results[$x] = $this->_striptext($th is->results[$x]);
      }
      else
      $this->results = $this->_striptext($th is->results);
      return true;
      }
      else
      return false;
      }

      /*============== =============== =============== =============== ===========*\
      Function: submitlinks
      Purpose: grab links from a form submission
      Input: $URI where you are submitting from
      Output: $this->results an array of the links from the post
      \*============= =============== =============== =============== ============*/

      function submitlinks($UR I, $formvars="", $formfiles="")
      {
      if($this->submit($URI,$f ormvars, $formfiles))
      {
      if(is_array($th is->results))
      {
      for($x=0;$x<cou nt($this->results);$x+ +)
      {
      $this->results[$x] = $this->_striplinks($t his->results[$x]);
      if($this->expandlinks)
      $this->results[$x] =
      $this->_expandlinks($ this->results[$x],$URI);
      }
      }
      else
      {
      $this->results = $this->_striplinks($t his->results);
      if($this->expandlinks)
      $this->results = $this->_expandlinks($ this->results,$URI );
      }
      return true;
      }
      else
      return false;
      }

      /*============== =============== =============== =============== ===========*\
      Function: submittext
      Purpose: grab text from a form submission
      Input: $URI where you are submitting from
      Output: $this->results the text from the web page
      \*============= =============== =============== =============== ============*/

      function submittext($URI , $formvars = "", $formfiles = "")
      {
      if($this->submit($URI,$f ormvars, $formfiles))
      {
      if(is_array($th is->results))
      {
      for($x=0;$x<cou nt($this->results);$x+ +)
      {
      $this->results[$x] = $this->_striptext($th is->results[$x]);
      if($this->expandlinks)
      $this->results[$x] =
      $this->_expandlinks($ this->results[$x],$URI);
      }
      }
      else
      {
      $this->results = $this->_striptext($th is->results);
      if($this->expandlinks)
      $this->results = $this->_expandlinks($ this->results,$URI );
      }
      return true;
      }
      else
      return false;
      }



      /*============== =============== =============== =============== ===========*\
      Function: set_submit_mult ipart
      Purpose: Set the form submission content type to
      multipart/form-data
      \*============= =============== =============== =============== ============*/
      function set_submit_mult ipart()
      {
      $this->_submit_type = "multipart/form-data";
      }


      /*============== =============== =============== =============== ===========*\
      Function: set_submit_norm al
      Purpose: Set the form submission content type to
      application/x-www-form-urlencoded
      \*============= =============== =============== =============== ============*/
      function set_submit_norm al()
      {
      $this->_submit_type = "applicatio n/x-www-form-urlencoded";
      }




      /*============== =============== =============== =============== ===========*\
      Private functions
      \*============= =============== =============== =============== ============*/


      /*============== =============== =============== =============== ===========*\
      Function: _striplinks
      Purpose: strip the hyperlinks from an html document
      Input: $document document to strip.
      Output: $match an array of the links
      \*============= =============== =============== =============== ============*/

      function _striplinks($do cument)
      {
      preg_match_all( "'<\s*a\s.*?hre f\s*=\s* # find <a href=
      ([\"\'])? # find single or double quote
      (?(1) (.*?)\\1 | ([^\s\>]+)) # if quote found, match up to next
      matching
      # quote, otherwise match up to next space
      'isx",$document ,$links);


      // catenate the non-empty matches from the conditional subpattern

      while(list($key ,$val) = each($links[2]))
      {
      if(!empty($val) )
      $match[] = $val;
      }

      while(list($key ,$val) = each($links[3]))
      {
      if(!empty($val) )
      $match[] = $val;
      }

      // return the links
      return $match;
      }

      /*============== =============== =============== =============== ===========*\
      Function: _stripform
      Purpose: strip the form elements from an html document
      Input: $document document to strip.
      Output: $match an array of the links
      \*============= =============== =============== =============== ============*/

      function _stripform($doc ument)
      {
      preg_match_all( "'<\/?(FORM|INPUT|SE LECT|TEXTAREA|( OPTION))[^<>]*>(?(2)(.*(?=< \/?(option|select )[^<>]*>[\r\n]*)|(?=[\r\n]*))|(?=[\r\n]*))'Usi",$docum ent,$elements);

      // catenate the matches
      $match = implode("\r\n", $elements[0]);

      // return the links
      return $match;
      }



      /*============== =============== =============== =============== ===========*\
      Function: _striptext
      Purpose: strip the text from an html document
      Input: $document document to strip.
      Output: $text the resulting text
      \*============= =============== =============== =============== ============*/

      function _striptext($doc ument)
      {

      // I didn't use preg eval (//e) since that is only available in PHP
      4.0.
      // so, list your entities one by one here. I included some of the
      // more common ones.

      $search = array("'<script[^>]*?>.*?</script>'si", // strip out
      javascript
      "'<[\/\!]*?[^<>]*?>'si", // strip out html tags
      "'([\r\n])[\s]+'", // strip out white space
      "'&(quot|#34|#0 34|#x22);'i", // replace html entities
      "'&(amp|#38|#03 8|#x26);'i", // added hexadecimal values
      "'&(lt|#60|#060 |#x3c);'i",
      "'&(gt|#62|#062 |#x3e);'i",
      "'&(nbsp|#160|# xa0);'i",
      "'&(iexcl|#161) ;'i",
      "'&(cent|#162); 'i",
      "'&(pound|#163) ;'i",
      "'&(copy|#169); 'i",
      "'&(reg|#174);' i",
      "'&(deg|#176);' i",
      "'&(#39|#039|#x 27);'",
      "'&(euro|#8364) ;'i", // europe
      "'&a(uml|UML);' ", // german
      "'&o(uml|UML);' ",
      "'&u(uml|UML);' ",
      "'&A(uml|UML);' ",
      "'&O(uml|UML);' ",
      "'&U(uml|UML);' ",
      "'&szlig;'i ",
      );
      $replace = array( "",
      "",
      "\\1",
      "\"",
      "&",
      "<",
      ">",
      " ",
      chr(161),
      chr(162),
      chr(163),
      chr(169),
      chr(174),
      chr(176),
      chr(39),
      chr(128),
      "ä",
      "ö",
      "ü",
      "Ä",
      "Ö",
      "Ü",
      "ß",
      );

      $text = preg_replace($s earch,$replace, $document);

      return $text;
      }

      /*============== =============== =============== =============== ===========*\
      Function: _expandlinks
      Purpose: expand each link into a fully qualified URL
      Input: $links the links to qualify
      $URI the full URI to get the base from
      Output: $expandedLinks the expanded links
      \*============= =============== =============== =============== ============*/

      function _expandlinks($l inks,$URI)
      {

      preg_match("/^[^\?]+/",$URI,$mat ch);

      $match = preg_replace("|/[^\/\.]+\.[^\/\.]+$|","",$match[0]);
      $match = preg_replace("|/$|","",$match );

      $search = array( "|^http://".preg_quote($t his->host)."|i",
      "|^(?!http://)(\/)?(?!mailto:)|i ",
      "|/\./|",
      "|/[^\/]+/\.\./|"
      );

      $replace = array( "",
      $match."/",
      "/",
      "/"
      );

      $expandedLinks = preg_replace($s earch,$replace, $links);

      return $expandedLinks;
      }

      /*============== =============== =============== =============== ===========*\
      Function: _httprequest
      Purpose: go get the http data from the server
      Input: $url the url to fetch
      $fp the current open file pointer
      $URI the full URI
      $body body contents to send if any (POST)
      Output:
      \*============= =============== =============== =============== ============*/

      function
      _httprequest($u rl,$fp,$URI,$ht tp_method,$cont ent_type="",$bo dy="")
      {
      $cookie_headers = '';
      if($this->passcookies && $this->_redirectadd r)
      $this->setcookies() ;

      $URI_PARTS = parse_url($URI) ;
      if(empty($url))
      $url = "/";
      $headers = $http_method." ".$url." ".$this->_httpversion." \r\n";
      if(!empty($this->agent))
      $headers .= "User-Agent: ".$this->agent."\r\n" ;
      if(!empty($this->host) && !isset($this->rawheaders['Host']))
      $headers .= "Host: ".$this->host."\r\n";
      if(!empty($this->accept))
      $headers .= "Accept: ".$this->accept."\r\n ";
      if(!empty($this->referer))
      $headers .= "Referer: ".$this->referer."\r\n" ;
      if(!empty($this->cookies))
      {
      if(!is_array($t his->cookies))
      $this->cookies = (array)$this->cookies;

      reset($this->cookies);
      if ( count($this->cookies) > 0 ) {
      $cookie_headers .= 'Cookie: ';
      foreach ( $this->cookies as $cookieKey => $cookieVal ) {
      $cookie_headers .= $cookieKey."=". urlencode($cook ieVal)."; ";
      }
      $headers .= substr($cookie_ headers,0,-2) . "\r\n";
      }
      }
      if(!empty($this->rawheaders))
      {
      if(!is_array($t his->rawheaders))
      $this->rawheaders = (array)$this->rawheaders;
      while(list($hea derKey,$headerV al) = each($this->rawheaders))
      $headers .= $headerKey.": ".$headerVal."\ r\n";
      }
      if(!empty($cont ent_type)) {
      $headers .= "Content-type: $content_type";
      if ($content_type == "multipart/form-data")
      $headers .= "; boundary=".$thi s->_mime_boundary ;
      $headers .= "\r\n";
      }
      if(!empty($body ))
      $headers .= "Content-length: ".strlen($body) ."\r\n";
      if(!empty($this->user) || !empty($this->pass))
      $headers .= "Authorizat ion: Basic
      ".base64_encode ($this->user.":".$th is->pass)."\r\n" ;

      //add proxy auth headers
      if(!empty($this->proxy_user))
      $headers .= 'Proxy-Authorization: ' . 'Basic ' .
      base64_encode($ this->proxy_user . ':' . $this->proxy_pass)."\ r\n";


      $headers .= "\r\n";

      // set the read timeout if needed
      if ($this->read_timeout > 0)
      socket_set_time out($fp, $this->read_timeout );
      $this->timed_out = false;

      fwrite($fp,$hea ders.$body,strl en($headers.$bo dy));

      $this->_redirectadd r = false;
      unset($this->headers);

      while($currentH eader = fgets($fp,$this->_maxlinelen) )
      {
      if ($this->read_timeout > 0 && $this->_check_timeout ($fp))
      {
      $this->status=-100;
      return false;
      }

      if($currentHead er == "\r\n")
      break;

      // if a header begins with Location: or URI:, set the redirect
      if(preg_match("/^(Location:|URI :)/i",$currentHead er))
      {
      // get URL portion of the redirect
      preg_match("/^(Location:|URI :)[
      ]+(.*)/",chop($current Header),$matche s);
      // look for :// in the Location header to see if hostname is
      included
      if(!preg_match( "|\:\/\/|",$matches[2]))
      {
      // no host in the path, so prepend
      $this->_redirectadd r =
      $URI_PARTS["scheme"]."://".$this->host.":".$th is->port;
      // eliminate double slash
      if(!preg_match( "|^/|",$matches[2]))
      $this->_redirectadd r .= "/".$matches[2];
      else
      $this->_redirectadd r .= $matches[2];
      }
      else
      $this->_redirectadd r = $matches[2];
      }

      if(preg_match(" |^HTTP/|",$currentHead er))
      {
      if(preg_match(" |^HTTP/[^\s]*\s(.*?)\s|",$c urrentHeader,
      $status))
      {
      $this->status= $status[1];
      }
      $this->response_cod e = $currentHeader;
      }

      $this->headers[] = $currentHeader;
      }

      $results = '';
      do {
      $_data = fread($fp, $this->maxlength);
      if (strlen($_data) == 0) {
      break;
      }
      $results .= $_data;
      } while(true);

      if ($this->read_timeout > 0 && $this->_check_timeout ($fp))
      {
      $this->status=-100;
      return false;
      }

      // check if there is a a redirect meta tag

      if(preg_match(" '<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]*URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results, $match))

      {
      $this->_redirectadd r = $this->_expandlinks($ match[1],$URI);
      }

      // have we hit our frame depth and is there frame src to fetch?
      if(($this->_framedepth < $this->maxframes) &&
      preg_match_all( "'<frame\s+.*sr c[\s]*=[\'\"]?([^\'\"\>]+)'i",$results, $match))
      {
      $this->results[] = $results;
      for($x=0; $x<count($match[1]); $x++)
      $this->_frameurls[] =
      $this->_expandlinks($ match[1][$x],$URI_PARTS["scheme"]."://".$this->host);
      }
      // have we already fetched framed content?
      elseif(is_array ($this->results))
      $this->results[] = $results;
      // no framed content
      else
      $this->results = $results;

      return true;
      }

      /*============== =============== =============== =============== ===========*\
      Function: _httpsrequest
      Purpose: go get the https data from the server using curl
      Input: $url the url to fetch
      $URI the full URI
      $body body contents to send if any (POST)
      Output:
      \*============= =============== =============== =============== ============*/

      function
      _httpsrequest($ url,$URI,$http_ method,$content _type="",$body= "")
      {
      if($this->passcookies && $this->_redirectadd r)
      $this->setcookies() ;

      $headers = array();

      $URI_PARTS = parse_url($URI) ;
      if(empty($url))
      $url = "/";
      // GET ... header not needed for curl
      //$headers[] = $http_method." ".$url." ".$this->_httpversion ;
      if(!empty($this->agent))
      $headers[] = "User-Agent: ".$this->agent;
      if(!empty($this->host))
      $headers[] = "Host: ".$this->host;
      if(!empty($this->accept))
      $headers[] = "Accept: ".$this->accept;
      if(!empty($this->referer))
      $headers[] = "Referer: ".$this->referer;
      if(!empty($this->cookies))
      {
      if(!is_array($t his->cookies))
      $this->cookies = (array)$this->cookies;

      reset($this->cookies);
      if ( count($this->cookies) > 0 ) {
      $cookie_str = 'Cookie: ';
      foreach ( $this->cookies as $cookieKey => $cookieVal ) {
      $cookie_str .= $cookieKey."=". urlencode($cook ieVal)."; ";
      }
      $headers[] = substr($cookie_ str,0,-2);
      }
      }
      if(!empty($this->rawheaders))
      {
      if(!is_array($t his->rawheaders))
      $this->rawheaders = (array)$this->rawheaders;
      while(list($hea derKey,$headerV al) = each($this->rawheaders))
      $headers[] = $headerKey.": ".$headerVa l;
      }
      if(!empty($cont ent_type)) {
      if ($content_type == "multipart/form-data")
      $headers[] = "Content-type: $content_type;
      boundary=".$thi s->_mime_boundary ;
      else
      $headers[] = "Content-type: $content_type";
      }
      if(!empty($body ))
      $headers[] = "Content-length: ".strlen($body) ;
      if(!empty($this->user) || !empty($this->pass))
      $headers[] = "Authorizat ion: BASIC
      ".base64_encode ($this->user.":".$th is->pass);

      for($curr_heade r = 0; $curr_header < count($headers) ; $curr_header++)
      $cmdline_params .= " -H \"".$headers[$curr_header]."\"";

      if(!empty($body ))
      $cmdline_params .= " -d \"$body\"";

      if($this->read_timeout > 0)
      $cmdline_params .= " -m ".$this->read_timeout ;

      $headerfile = tempnam($temp_d ir, "sno");

      $safer_URI = strtr( $URI, "\"", " " ); // strip quotes from the URI
      to avoid shell access
      exec($this->curl_path." -D \"$headerfile\" ".$cmdline_para ms."
      \"".$safer_URI. "\"",$results,$ return);

      if($return)
      {
      $this->error = "Error: cURL could not retrieve the document, error
      $return.";
      return false;
      }


      $results = implode("\r\n", $results);

      $result_headers = file("$headerfi le");

      $this->_redirectadd r = false;
      unset($this->headers);

      for($currentHea der = 0; $currentHeader < count($result_h eaders);
      $currentHeader+ +)
      {

      // if a header begins with Location: or URI:, set the redirect
      if(preg_match("/^(Location: |URI:
      )/i",$result_head ers[$currentHeader]))
      {
      // get URL portion of the redirect
      preg_match("/^(Location:
      |URI:)\s+(.*)/",chop($result_ headers[$currentHeader]),$matches);
      // look for :// in the Location header to see if hostname is
      included
      if(!preg_match( "|\:\/\/|",$matches[2]))
      {
      // no host in the path, so prepend
      $this->_redirectadd r =
      $URI_PARTS["scheme"]."://".$this->host.":".$th is->port;
      // eliminate double slash
      if(!preg_match( "|^/|",$matches[2]))
      $this->_redirectadd r .= "/".$matches[2];
      else
      $this->_redirectadd r .= $matches[2];
      }
      else
      $this->_redirectadd r = $matches[2];
      }

      if(preg_match(" |^HTTP/|",$result_head ers[$currentHeader]))
      $this->response_cod e = $result_headers[$currentHeader];

      $this->headers[] = $result_headers[$currentHeader];
      }

      // check if there is a a redirect meta tag

      if(preg_match(" '<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]+URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results, $match))
      {
      $this->_redirectadd r = $this->_expandlinks($ match[1],$URI);
      }

      // have we hit our frame depth and is there frame src to fetch?
      if(($this->_framedepth < $this->maxframes) &&
      preg_match_all( "'<frame\s+.*sr c[\s]*=[\'\"]?([^\'\"\>]+)'i",$results, $match))
      {
      $this->results[] = $results;
      for($x=0; $x<count($match[1]); $x++)
      $this->_frameurls[] =
      $this->_expandlinks($ match[1][$x],$URI_PARTS["scheme"]."://".$this->host);
      }
      // have we already fetched framed content?
      elseif(is_array ($this->results))
      $this->results[] = $results;
      // no framed content
      else
      $this->results = $results;

      unlink("$header file");

      return true;
      }

      /*============== =============== =============== =============== ===========*\
      Function: setcookies()
      Purpose: set cookies for a redirection
      \*============= =============== =============== =============== ============*/

      function setcookies()
      {
      for($x=0; $x<count($this->headers); $x++)
      {
      if(preg_match('/^set-cookie:[\s]+([^=]+)=([^;]+)/i',
      $this->headers[$x],$match))
      $this->cookies[$match[1]] = urldecode($matc h[2]);
      }
      }


      /*============== =============== =============== =============== ===========*\
      Function: _check_timeout
      Purpose: checks whether timeout has occurred
      Input: $fp file pointer
      \*============= =============== =============== =============== ============*/

      function _check_timeout( $fp)
      {
      if ($this->read_timeout > 0) {
      $fp_status = socket_get_stat us($fp);
      if ($fp_status["timed_out"]) {
      $this->timed_out = true;
      return true;
      }
      }
      return false;
      }

      /*============== =============== =============== =============== ===========*\
      Function: _connect
      Purpose: make a socket connection
      Input: $fp file pointer
      \*============= =============== =============== =============== ============*/

      function _connect(&$fp)
      {
      if(!empty($this->proxy_host) && !empty($this->proxy_port))
      {
      $this->_isproxy = true;

      $host = $this->proxy_host;
      $port = $this->proxy_port;
      }
      else
      {
      $host = $this->host;
      $port = $this->port;
      }

      $this->status = 0;

      if($fp = fsockopen(
      $host,
      $port,
      $errno,
      $errstr,
      $this->_fp_timeout
      ))
      {
      // socket connection succeeded

      return true;
      }
      else
      {
      // socket connection failed
      $this->status = $errno;
      switch($errno)
      {
      case -3:
      $this->error="socke t creation failed (-3)";
      case -4:
      $this->error="dns lookup failure (-4)";
      case -5:
      $this->error="connect ion refused or timed out (-5)";
      default:
      $this->error="connect ion failed (".$errno.") ";
      }
      return false;
      }
      }
      /*============== =============== =============== =============== ===========*\
      Function: _disconnect
      Purpose: disconnect a socket connection
      Input: $fp file pointer
      \*============= =============== =============== =============== ============*/

      function _disconnect($fp )
      {
      return(fclose($ fp));
      }


      /*============== =============== =============== =============== ===========*\
      Function: _prepare_post_b ody
      Purpose: Prepare post body according to encoding type
      Input: $formvars - form variables
      $formfiles - form upload files
      Output: post body
      \*============= =============== =============== =============== ============*/

      function _prepare_post_b ody($formvars, $formfiles)
      {
      settype($formva rs, "array");
      settype($formfi les, "array");
      $postdata = '';

      if (count($formvar s) == 0 && count($formfile s) == 0)
      return;

      switch ($this->_submit_type ) {
      case "applicatio n/x-www-form-urlencoded":
      reset($formvars );
      while(list($key ,$val) = each($formvars) ) {
      if (is_array($val) || is_object($val) ) {
      while (list($cur_key, $cur_val) = each($val)) {
      $postdata .= urlencode($key) ."[]=".urlencode($c ur_val)."&";
      }
      } else
      $postdata .= urlencode($key) ."=".urlencode( $val)."&";
      }
      break;

      case "multipart/form-data":
      $this->_mime_bounda ry = "Snoopy".md5(un iqid(microtime( )));

      reset($formvars );
      while(list($key ,$val) = each($formvars) ) {
      if (is_array($val) || is_object($val) ) {
      while (list($cur_key, $cur_val) = each($val)) {
      $postdata .= "--".$this->_mime_boundary ."\r\n";
      $postdata .= "Content-Disposition: form-data;
      name=\"$key\[\]\"\r\n\r\n";
      $postdata .= "$cur_val\r \n";
      }
      } else {
      $postdata .= "--".$this->_mime_boundary ."\r\n";
      $postdata .= "Content-Disposition: form-data;
      name=\"$key\"\r \n\r\n";
      $postdata .= "$val\r\n";
      }
      }

      reset($formfile s);
      while (list($field_na me, $file_names) = each($formfiles )) {
      settype($file_n ames, "array");
      while (list(, $file_name) = each($file_name s)) {
      if (!is_readable($ file_name)) continue;

      $fp = fopen($file_nam e, "r");
      $file_content = fread($fp, filesize($file_ name));
      fclose($fp);
      $base_name = basename($file_ name);

      $postdata .= "--".$this->_mime_boundary ."\r\n";
      $postdata .= "Content-Disposition: form-data;
      name=\"$field_n ame\"; filename=\"$bas e_name\"\r\n\r\ n";
      $postdata .= "$file_content\ r\n";
      }
      }
      $postdata .= "--".$this->_mime_boundary ."--\r\n";
      break;
      }

      return $postdata;
      }
      }

      ?>

      Michael Phipps wrote:[color=blue][color=green]
      > > include "Snoopy.class.p hp";
      > > $snoopy = new Snoopy;[/color]
      >
      > What is Snoopy? It would appear most the functionality you're using is in
      > that class. We need to see that if we're going to help you.
      >
      > What are you actually trying to achieve by logging in and out of another
      > website?[/color]

      Comment

      • Michael Phipps

        #4
        Re: Snoopy

        // Snoopy will use cURL for fetching
        // SSL content if a full system path to
        // the cURL binary is supplied here.
        // set to false if you do not have
        // cURL installed. See http://curl.haxx.se
        // for details on installing cURL.
        // Snoopy does *not* use the cURL
        // library functions built into php,
        // as these functions are not stable
        // as of this Snoopy release.

        I'll try and help through a process of illimination.

        Are you using this class on your own server where you control everything in
        the environment, or are you using virtual hosting? This class uses the
        actual cURL library rather than the built in php functions, so wants to know
        the actual location of cURL.

        Have you had ANY success using this class? Using the inbuilt PHP curl
        libraries can achieve a similar result to Snoopy (except Snoopy has methods
        to make it easier to extract information from the result data.)




        Comment

        • futureofphp

          #5
          Re: Snoopy

          There is no SSL its just cookies that I have to handle and that gives
          me the problem. Cookies are quite difficult to get through. Using the
          code I mentioned above and snoopy, I can actually login, fetch the data
          and then logout. The problem is when I try to login again sometimes it
          works and sometimes it doesnt.

          Can CURL handle cookies or do we pass the cookies? Can you give me an
          example please.
          Thanks

          Comment

          Working...