页面刷新php实现 — IT技术
120
帮个朋友做一个点击器开始的,后来逐步完善,再次温习 RFC,尝试用 nc 抓取更标准更有效的 request & response headers。
最后就成了下面的这么一个玩意:(在 PHP.4.3.11, --enable-socket 上测试通过^_^),enjoy
<?
define( 'NL', "\r\n" );
class Transferer
{
var $mHost;
var $mPort;
var $mRequest;
var $mResponse;
var $mCookies;
var $mParams;
var $mAgent;
var $mError;
function Transferer ( $host = '', $port = 80 )
{
$this->mHost = '';
$this->mPort = 0;
$this->mRequest = '';
$this->mResponse = '';
$this->mCookies = '';
$this->mParams = '';
$this->mAgent = 'Transferer/1.0 (compatible; Snakevil; ERiW)';
$this->mError = FALSE;
if ( strLen( $host ) && $port )
{
$this->Open( $host, $port );
}
return;
}
function SetAgent ( $agent = '' )
{
if ( strLen( $agent ) )
{
// Personal User-Agent.
$this->mAgent = $agent;
return TRUE;
}
return FALSE;
}
function Open ( $host = '', $port = 0 )
{
if ( $this->mError )
{
return FALSE;
}
if ( 0 === strPos( $host, 'http://' ) )
{
// Remove "http://".
$host = subStr( $host, 7 );
}
if ( strLen( $host ) - 1 === strrPos( $host, '/' ) )
{
// Remove "/" at last.
$host = subStr( $host, 0, -1 );
}
if ( ! strLen( $host ) || ! $port )
{
// No Host or No Port.
return FALSE;
}
if ( getHostByName( $host ) == $host )
{
// Invalid Domain.
return FALSE;
}
$this->mHost = $host;
$this->mPort = $port;
return TRUE;
}
function Close ()
{
$this->mError = FALSE;
return TRUE;
}
function ClearError ()
{
$this->mError = FALSE;
$this->mResponse = '';
return TRUE;
}
function AddParam ( $name = '', $value = '' )
{
if ( ! strLen( $name ) )
{
// Params Name should have content.
return FALSE;
}
$name .= '=';
if ( FALSE !== strPos( $this->mParams, $name ) )
{
// Ignore Exist Param.
return FALSE;
}
if ( ! is_string( $value ) )
{
$value = strVal( $value );
}
$name .= urlEncode( $value );
if ( strLen( $this->mParams ) )
{
$this->mParams .= '&';
}
$this->mParams .= $name;
return TRUE;
}
function Send ( $method = 'get', $uri = '', $fromUrl = '', $updCookie = FALSE )
{
if ( $this->mError )
{
return FALSE;
}
$method = strToUpper( $method );
if ( ! in_array( $method, array( 'GET', 'POST' ) ) )
{
// HTTP Method should be one in GET or POST.
return FALSE;
}
$ii = strPos( $uri, '?' );
if ( $ii )
{
$uri = subStr( $uri, 0, $ii );
}
$this->mRequest = '';
$this->mResponse = '';
switch ( $method )
{
case 'GET':
if ( strLen( $this->mParams ) )
{
$uri .= '?' . $this->mParams;
}
$this->mRequest = 'GET /' . $uri . ' HTTP/1.1' . NL
. 'Accept: */*' . NL;
if ( strLen( $fromUrl ) )
{
$this->mRequest .= 'Referer: ' . $fromUrl . NL;
}
$this->mRequest .= 'Accept-Language: zh-cn' . NL
. 'Accept-Encoding: gzip, deflate' . NL
. 'User-Agent: ' . $this->mAgent . NL
. 'Host: ' . $this->mHost . NL
. 'Connection: close' . NL;
if ( strLen( $this->mCookies ) )
{
$this->mRequest .= 'Cookie: ' . $this->mCookies . NL;
}
$this->mRequest .= NL;
break;
case 'POST':
$this->mRequest = 'POST /' . $uri . ' HTTP/1.1' . NL
. 'Accept: */*' . NL;
if ( strLen( $fromUrl ) )
{
$this->mRequest .= 'Referer: ' . $fromUrl . NL;
}
$this->mRequest .= 'Accept-Language: zh-cn' . NL
. 'Content-Type: application/x-www-form-urlencoded' . NL
. 'Accept-Encoding: gzip, deflate' . NL
. 'User-Agent: ' . $this->mAgent . NL
. 'Host: ' . $this->mHost . NL
. 'Content-Length: ' . strLen( $this->mParams ) . NL
. 'Connection: close' . NL
. 'Cache-Control: no-cache' . NL;
if ( strLen( $this->mCookies ) )
{
$this->mRequest .= 'Cookie: ' . $this->mCookies . NL;
}
$this->mRequest .= NL
. $this->mParams . NL;
break;
default:
}
$this->mParams = '';
$h_sock = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
if ( FALSE === $h_sock )
{
// Fail to Create Socket.
$this->mResponse = socket_strerror( socket_last_error() );
$this->mError = TRUE;
}
// ::TODO:: Set Write and Read Timeout Here...
$m_result = socket_connect( $h_sock, $this->mHost, $this->mPort );
if ( ! $m_result )
{
// Fail to Connect to Server.
$this->mResponse = socket_strerror( socket_last_error( $h_sock ) );
$this->Close();
$this->mError = TRUE;
return FALSE;
}
// Send Request Data through TCP Socket.
$m_result = socket_write( $h_sock, $this->mRequest, strLen( $this->mRequest ) );
if ( FALSE === $m_result )
{
// Fail to Send Request Headers.
$this->mResponse = socket_strerror( socket_last_error( $h_sock ) );
$this->Close();
$this->mError = TRUE;
return FALSE;
}
$m_result = socket_read( $h_sock, 1024, PHP_BINARY_READ );
if ( FALSE === $m_result )
{
// Fail to Receive Response Headers.
$this->mResponse = socket_strerror( socket_last_error( $h_sock ) );
$this->Close();
$this->mError = TRUE;
return FALSE;
}
$a_data = explode( NL . NL, $m_result );
$this->mResponse = $a_data[0];
if ( $updCookie )
{
// Regroup Exist Cookies.
$a_cookies = array();
if ( strLen( $this->mCookies ) )
{
$a_tmp = explode( '; ', $this->mCookies );
for ( $ii = 0, $jj = count( $a_tmp ); $ii < $jj; $ii++ )
{
$kk = strPos( $a_tmp[$ii], '=' );
$s_name = subStr( $a_tmp[$ii], 0, $kk );
$s_value = subStr( $a_tmp[$ii], $kk + 1 );
$a_cookies[$s_name] = $s_value;
}
}
// Check Each Header.
$a_tmp = explode( NL, $this->mResponse );
for ( $ii = 0, $jj = count( $a_tmp ); $ii < $jj; $ii++ )
{
if ( 0 === strPos( $a_tmp[$ii], 'Set-Cookie: ' ) )
{
$a_tmp2 = explode( '; ', subStr( $a_tmp[$ii], 12 ) );
$kk = strPos( $a_tmp2[0], '=' );
$s_name = subStr( $a_tmp2[0], 0, $kk );
$s_value = subStr( $a_tmp2[0], $kk + 1 );
$i_now = time();
$i_expires = $i_now + 3600;
if ( isSet( $a_tmp2[1] ) && 0 === strPos( $a_tmp[1], 'expires=' ) )
{
$i_expires = strtotime( subStr( $a_tmp2[1], 8 ) );
}
if ( $i_now > $i_expires && isSet( $a_cookies[$s_name] ) )
{
unset( $a_cookies[$s_name] );
}
if ( $i_now <= $i_expires )
{
$a_cookies[$s_name] = $s_value;
}
}
}
// Update Cookies.
$a_tmp = array();
reset( $a_cookies );
while ( list( $s_name, $s_value ) = each( $a_cookies ) )
{
$a_tmp[] = $s_name . '=' . $s_value;
}
$this->mCookies = implode( '; ', $a_tmp );
}
socket_clear_error( $h_sock );
socket_close( $h_sock );
return TRUE;
}
function GetError ()
{
if ( ! $this->mError )
{
return '';
}
return $this->mResponse;
}
function GetRequest ()
{
return $this->mRequest;
}
function GetResponse ()
{
return $this->mResponse;
}
function GetCookies ()
{
return $this->mCookies;
}
}
?>
字体[ 进入论坛] [ 推荐给朋友]