To use Curl in PHP, you must have the Curl extension compiled in –with-curl, and you’ll want –with-openssl, if you need to be able to hit https pages.
Once you get PHP working with Curl (I could explain how to do that, but for this article, I am focusing on how to use it).
The code below is for PHP5, but I’m sure you could modify it to work with PHP4, just have to change the syntax a bit.
Here is a good Curl class that I wrote, I call is class.Curl.php, don’t worry about the details of this file, just create it, then look at how easy it is to use it (example follows):
class.Curl.php
<?php define('VERIFYHOST', false); define('MAXREDIRS', 10); define('USERAGENT', "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; DKCRL 1.0)"); class Curl { public $url; public $response_code; public $response_header; public $response_headers; public $response_body; public $cookieJar; private $response; private $ch; static $stderr = null; public function __construct($cookieJar=false) { $this->cookieJar = $cookieJar ? $cookieJar : tempnam("/tmp", "cookieJar"); $this->ch = curl_init(); curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, VERIFYHOST); curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, VERIFYHOST); curl_setopt ($this->ch, CURLOPT_USERAGENT, USERAGENT); curl_setopt ($this->ch, CURLOPT_COOKIEJAR, $this->cookieJar); curl_setopt ($this->ch, CURLOPT_COOKIEFILE, $this->cookieJar); curl_setopt ($this->ch, CURLOPT_CRLF, true); curl_setopt ($this->ch, CURLOPT_HEADER, true); curl_setopt ($this->ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt ($this->ch, CURLOPT_ENCODING, "gzip"); // "" means all supported curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($this->ch, CURLOPT_MAXREDIRS, MAXREDIRS); curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($this->ch, CURLOPT_BINARYTRANSFER, true); curl_setopt($this->ch, CURLOPT_USERAGENT, USERAGENT); curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, 300); curl_setopt($this->ch, CURLINFO_HEADER_OUT, true); curl_setopt($this->ch, CURLOPT_HTTPHEADER, array( "Accept: */*", "Accept-Language: en-US" )); } public function __destruct() { // curl_close($this->ch); } public function nextpage($url, $method='GET', $data=false, $referer=false, $extraPost=false) { $this->url = $url; if ( $referer ) curl_setopt ($this->ch, CURLOPT_REFERER, $referer); if (strtoupper($method)=='POST') { curl_setopt($this->ch, CURLOPT_POST, 1); $postdata = array(); foreach ($data as $key=>$val) $postdata[] = urlencode($key)."=".urlencode($val); curl_setopt($this->ch, CURLOPT_POSTFIELDS, implode("&", $postdata).($extraPost ? (count($postdata)>0 ? '&' : '').$extraPost : "")); if ( $extraPost && count($postdata)==0) curl_setopt($this->ch, CURLOPT_HTTPHEADER, array( "Accept: */*", "Accept-Language: en-US", "Content-Type: application/json; charset=utf-8" )); } else curl_setopt($this->ch, CURLOPT_HTTPGET, true); curl_setopt($this->ch, CURLOPT_URL, $url); $this->response = curl_exec($this->ch); $this->parse_response(); $this->url = $this->getUrl(); return $this->response_body; } private function parse_response() { // Split response into header and body sections list($this->response_header, $this->response_body) = split("\r?\n\r?\n", $this->response, 2); $response_header_lines = split("\r?\n", $this->response_header); // First line of headers is the HTTP response code $http_response_line = array_shift($response_header_lines); if(preg_match('@^HTTP/[0-9]\.[0-9] ([0-9]{3})@',$http_response_line, $matches)) { $this->response_code = $matches[1]; } // put the rest of the headers in an array $this->response_headers = array(); foreach($response_header_lines as $header_line) { if ( preg_match("/^\w/", $header_line) ) list($header,$value) = explode(': ', $header_line, 2); else $value = $header_line; $this->response_headers[$header] .= ( $this->response_headers[$header] ? "\n" : "") . $value; } } public function getUrl() { return curl_getinfo ( $this->ch, CURLINFO_EFFECTIVE_URL ); } }
Ok, so now you have class.Curl.php, now here is how to use it, let’s do a USPS Track and Confirm:
<?php
require_once(“class.Curl.php”);$url = “http://www.usps.gov/”;
$aCurl = new Curl();$homePage = $aCurl->nextpage($url);
print “HOMEPAGE: $homePage\n”;
$url = “http://trkcnfrm1.smi.usps.com/PTSInternetWeb/InterLabelInquiry.do”;
$data = array();
$data[“CAMEFROM”] = “OK”;
$data[“strOrigTrackNum”] = “9101150134711177503513”;
$data[“Go to Track & Confirm”] = “Go”;
$resultPage = $aCurl->nextpage($url, ‘POST’, $data);print “Result Page: $resultPage\n”;
?>
Pretty easy, eh? The hard part is knowing what data to put into the $data array. I suggest getting the Firefox HTTP LiveHeaders extension from Mozilla, you can manually perform the steps you want to automate and log all the GET/POST data you made along the way. The POST data is in URL format, you need to convert it to PHP array format, I suggest this little utility I wrote:
I call this “urldecode.php”:
#!/usr/local/bin/php -q
<?php$query = $argv[1];
$parts = explode(“&”, $query);
foreach ($parts as $part)
{
list($key, $val) = explode(“=”, $part);
print “\$data[\””.urldecode($key).”\”] = \””.urldecode($val).”\”;\n”;
}?>
I use is like this, the string I got from HTTP LiveHeaders after performing the search manually with Firefox:
./urldecode.php ‘CAMEFROM=OK&strOrigTrackNum=555555555555&Go+to+Track+%26+Confirm.x=21&Go+to+Track+%26+Confirm.y=9&Go+to+Track+%26+Confirm=Go’
which results in:
$data[“CAMEFROM”] = “OK”;
$data[“strOrigTrackNum”] = “555555555555”;
$data[“Go to Track & Confirm.x”] = “21”;
$data[“Go to Track & Confirm.y”] = “9”;
$data[“Go to Track & Confirm”] = “Go”;
I then copy paste this result into my PHP code.
Comments are closed.