473,837 Members | 1,747 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

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

Jul 25 '05 #1
4 8035
> include "Snoopy.class.p hp";
$snoopy = new Snoopy;


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?

Jul 26 '05 #2
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 <mo***@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:
mo***@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:
http://snoopy.sourceforge.net/

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

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:
include "Snoopy.class.p hp";
$snoopy = new Snoopy;


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?


Jul 26 '05 #3
// 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.)


Jul 26 '05 #4
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

Jul 27 '05 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

17
3217
by: Stefan Richter | last post by:
Hi, I would like to conect to a server by a SSL Conection, to send an SMS. The company that offers the SMS service provided some Code for a http connection, but not for a https connection. Here is the code to send an SMS by http, which works great. Can you help / or do you know a good tutorial / website for php and ssl ??? thanx,
6
4161
by: toby casey | last post by:
Dear all, I am brand new to php, but learning quickly. I need to be able to go to website, obtain the form elements, cycle through the form elements, fetch the links for each page that results from the submission of the form elements, and then fetch all the content of the pages refered in the links (its approx 115,000 links). If i understand it right, Snoopy is the way to go with this. But the problem is, is that we cannot get snoopy...
0
1878
by: ChronoFish | last post by:
Hello, Snoopy is reporting: Warning: MagpieRSS: Failed to fetch http://some.domain.com/atom.xml. (HTTP Response: HTTP/1.0 407 Proxy Authentication Required ) in \web\rss\magpie\rss_fetch.inc on line 230 When trying to get through a Squid proxy. I have set user, pass, proxy_host proxy_port, and is_proxy - yet I can't seem to get passed
3
2417
by: elyob | last post by:
Hi guys, I'm playing with snoopy and am stuck on doing two calls in the same script. The second call revisits a website after getting an existing link based on the results of the first call ... If I hard code the URL, then everything is fine. It's this line that goes wrong "$newsnoopy->fetchtext($newurl);" ... If I put $newsnoopy->fetchtext(http://result/of/first/call/); It's fine. Any help appreciated.... error ... "BAD REQUESTYour...
10
2020
by: brett | last post by:
I have a file named Snoopy.class.php on my hosted web server in a directory called d:\home\ABC.COM\blog\wp-content\plugins\ A file named dahnielson_mimetex.php references it. However, when dahnielson_mimetex.php tries to reference the Snoopy file, I get these types of errors: Warning: main() : Failed opening './Snoopy.class.php' for inclusion
1
1874
by: f3l | last post by:
need snoopy samples for file POST upload
3
517
by: Bartholomew Simpson | last post by:
I need to pack two small values into a double data type. I have come up with the following struct, which only takes up 16 bits and can therefore be stored safely in a double. struct mytype_ { unsigned char fld1: 4, fld2: 12; };
0
1264
by: regisma | last post by:
Hi, I will like to use Snoopy class to check the rate and the price to ship a box with Fedex. I have begun with this code but I cannot do domething usefull with it yet. Can someone can assist me? thanks
2
5153
by: jeddiki | last post by:
Hello, I want to create my own index of websites based on my criteria rather than big G's. For example, I might like to index websites according to what they have in their "author" Meta tag ( and rejecting any site that doesn't have one). I will use this idea as a working example. Here is my suggested methodology and I would like some input on problem areas, how to make it better, etc.
0
9847
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
9693
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
10280
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
0
9419
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
0
5680
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
0
5862
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
4481
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
2
4058
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
3
3128
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.