关闭

php模拟点击器,刷新,清除ie的get和post请求

标签: phpiesocketfunctioncookiesstream
1815人阅读 评论(0) 收藏 举报
分类:
  1. <?
  2. //在 PHP.4.3.11, socket 上测试通过
  3. define( 'NL', "/r/n" );
  4.  
  5. class Transferer
  6. {
  7.     var $mHost;
  8.     var $mPort;
  9.     var $mRequest;
  10.     var $mResponse;
  11.     var $mCookies;
  12.     var $mParams;
  13.     var $mAgent;
  14.     var $mError;
  15.  
  16.     function Transferer ( $host = '', $port = 80 )
  17.     {
  18.         $this->mHost = '';
  19.         $this->mPort = 0;
  20.         $this->mRequest = '';
  21.         $this->mResponse = '';
  22.         $this->mCookies = '';
  23.         $this->mParams = '';
  24.         $this->mAgent = 'Transferer/1.0 (compatible; Snakevil; ERiW)';
  25.         $this->mError = FALSE;
  26.  
  27.         if ( strLen( $host ) && $port )
  28.         {
  29.             $this->Open( $host, $port );
  30.         }
  31.         return;
  32.     }
  33.  
  34.     function SetAgent ( $agent = '' )
  35.     {
  36.         if ( strLen( $agent ) )
  37.         {
  38.             // Personal User-Agent.
  39.             $this->mAgent = $agent;
  40.             return TRUE;
  41.         }
  42.         return FALSE;
  43.     }
  44.  
  45.     function Open ( $host = '', $port = 0 )
  46.     {
  47.         if ( $this->mError )
  48.         {
  49.             return FALSE;
  50.         }
  51.         if ( 0 === strPos( $host, 'http://' ) )
  52.         {
  53.             // Remove "http://".
  54.             $host = subStr( $host, 7 );
  55.         }
  56.         if ( strLen( $host ) - 1 === strrPos( $host, '/' ) )
  57.         {
  58.             // Remove "/" at last.
  59.             $host = subStr( $host, 0, -1 );
  60.         }
  61.         if ( ! strLen( $host ) || ! $port )
  62.         {
  63.             // No Host or No Port.
  64.             return FALSE;
  65.         }
  66.         if ( getHostByName( $host ) == $host )
  67.         {
  68.             // Invalid Domain.
  69.             return FALSE;
  70.         }
  71.         $this->mHost = $host;
  72.         $this->mPort = $port;
  73.         return TRUE;
  74.     }
  75.  
  76.     function Close ()
  77.     {
  78.         $this->mError = FALSE;
  79.         return TRUE;
  80.     }
  81.  
  82.     function ClearError ()
  83.     {
  84.         $this->mError = FALSE;
  85.         $this->mResponse = '';
  86.         return TRUE;
  87.     }
  88.  
  89.     function AddParam ( $name = '', $value = '' )
  90.     {
  91.         if ( ! strLen( $name ) )
  92.         {
  93.             // Params Name should have content.
  94.             return FALSE;
  95.         }
  96.         $name .= '=';
  97.         if ( FALSE !== strPos( $this->mParams, $name ) )
  98.         {
  99.             // Ignore Exist Param.
  100.             return FALSE;
  101.         }
  102.         if ( ! is_string( $value ) )
  103.         {
  104.             $value = strVal( $value );
  105.         }
  106.         $name .= urlEncode( $value );
  107.         if ( strLen( $this->mParams ) )
  108.         {
  109.             $this->mParams .= '&';
  110.         }
  111.         $this->mParams .= $name;
  112.         return TRUE;
  113.     }
  114.  
  115.     function Send ( $method = 'get', $uri = '', $fromUrl = '', $updCookie = FALSE )
  116.     {
  117.         if ( $this->mError )
  118.         {
  119.             return FALSE;
  120.         }
  121.         $method = strToUpper( $method );
  122.         if ( ! in_array( $method, array( 'GET', 'POST' ) ) )
  123.         {
  124.             // HTTP Method should be one in GET or POST.
  125.             return FALSE;
  126.         }
  127.         $ii = strPos( $uri, '?' );
  128.         if ( $ii )
  129.         {
  130.             $uri = subStr( $uri, 0, $ii );
  131.         }
  132.         $this->mRequest = '';
  133.         $this->mResponse = '';
  134.         switch ( $method )
  135.         {
  136.             case 'GET':
  137.                 if ( strLen( $this->mParams ) )
  138.                 {
  139.                     $uri .= '?' . $this->mParams;
  140.                 }
  141.                 $this->mRequest = 'GET /' . $uri . ' HTTP/1.1' . NL
  142.                 . 'Accept: */*' . NL;
  143.                 if ( strLen( $fromUrl ) )
  144.                 {
  145.                     $this->mRequest .= 'Referer: ' . $fromUrl . NL;
  146.                 }
  147.                 $this->mRequest .= 'Accept-Language: zh-cn' . NL
  148.                 . 'Accept-Encoding: gzip, deflate' . NL
  149.                 . 'User-Agent: ' . $this->mAgent . NL
  150.                 . 'Host: ' . $this->mHost . NL
  151.                 . 'Connection: close' . NL;
  152.                 if ( strLen( $this->mCookies ) )
  153.                 {
  154.                     $this->mRequest .= 'Cookie: ' . $this->mCookies . NL;
  155.                 }
  156.                 $this->mRequest .= NL;
  157.                 break;
  158.             case 'POST':
  159.                 $this->mRequest = 'POST /' . $uri . ' HTTP/1.1' . NL
  160.                 . 'Accept: */*' . NL;
  161.                 if ( strLen( $fromUrl ) )
  162.                 {
  163.                     $this->mRequest .= 'Referer: ' . $fromUrl . NL;
  164.                 }
  165.                 $this->mRequest .= 'Accept-Language: zh-cn' . NL
  166.                 . 'Content-Type: application/x-www-form-urlencoded' . NL
  167.                 . 'Accept-Encoding: gzip, deflate' . NL
  168.                 . 'User-Agent: ' . $this->mAgent . NL
  169.                 . 'Host: ' . $this->mHost . NL
  170.                 . 'Content-Length: ' . strLen( $this->mParams ) . NL
  171.                 . 'Connection: close' . NL
  172.                 . 'Cache-Control: no-cache' . NL;
  173.                 if ( strLen( $this->mCookies ) )
  174.                 {
  175.                     $this->mRequest .= 'Cookie: ' . $this->mCookies . NL;
  176.                 }
  177.                 $this->mRequest .= NL
  178.                 . $this->mParams . NL;
  179.                 break;
  180.             default:
  181.         }
  182.         $this->mParams = '';
  183.         $h_sock = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
  184.         if ( FALSE === $h_sock )
  185.         {
  186.             // Fail to Create Socket.
  187.             $this->mResponse = socket_strerror( socket_last_error() );
  188.             $this->mError = TRUE;
  189.         }
  190.         // ::TODO:: Set Write and Read Timeout Here...
  191.         $m_result = socket_connect( $h_sock, $this->mHost, $this->mPort );
  192.         if ( ! $m_result )
  193.         {
  194.             // Fail to Connect to Server.
  195.             $this->mResponse = socket_strerror( socket_last_error( $h_sock ) );
  196.             $this->Close();
  197.             $this->mError = TRUE;
  198.             return FALSE;
  199.         }
  200.         // Send Request Data through TCP Socket.
  201.         $m_result = socket_write( $h_sock, $this->mRequest, strLen( $this->mRequest ) );
  202.         if ( FALSE === $m_result )
  203.         {
  204.             // Fail to Send Request Headers.
  205.             $this->mResponse = socket_strerror( socket_last_error( $h_sock ) );
  206.             $this->Close();
  207.             $this->mError = TRUE;
  208.             return FALSE;
  209.         }
  210.         $m_result = socket_read( $h_sock, 1024, PHP_BINARY_READ );
  211.         if ( FALSE === $m_result )
  212.         {
  213.             // Fail to Receive Response Headers.
  214.             $this->mResponse = socket_strerror( socket_last_error( $h_sock ) );
  215.             $this->Close();
  216.             $this->mError = TRUE;
  217.             return FALSE;
  218.         }
  219.         $a_data = explode( NL . NL, $m_result );
  220.         $this->mResponse = $a_data[0];
  221.         if ( $updCookie )
  222.         {
  223.             // Regroup Exist Cookies.
  224.             $a_cookies = array();
  225.             if ( strLen( $this->mCookies ) )
  226.             {
  227.                 $a_tmp = explode( '; ', $this->mCookies );
  228.                 for ( $ii = 0, $jj = count( $a_tmp ); $ii < $jj; $ii++ )
  229.                 {
  230.                     $kk = strPos( $a_tmp[$ii], '=' );
  231.                     $s_name = subStr( $a_tmp[$ii], 0, $kk );
  232.                     $s_value = subStr( $a_tmp[$ii], $kk + 1 );
  233.                     $a_cookies[$s_name] = $s_value;
  234.                 }
  235.             }
  236.             // Check Each Header.
  237.             $a_tmp = explode( NL, $this->mResponse );
  238.             for ( $ii = 0, $jj = count( $a_tmp ); $ii < $jj; $ii++ )
  239.             {
  240.                 if ( 0 === strPos( $a_tmp[$ii], 'Set-Cookie: ' ) )
  241.                 {
  242.                     $a_tmp2 = explode( '; ', subStr( $a_tmp[$ii], 12 ) );
  243.                     $kk = strPos( $a_tmp2[0], '=' );
  244.                     $s_name = subStr( $a_tmp2[0], 0, $kk );
  245.                     $s_value = subStr( $a_tmp2[0], $kk + 1 );
  246.                     $i_now = time();
  247.                     $i_expires = $i_now + 3600;
  248.                     if ( isSet( $a_tmp2[1] ) && 0 === strPos( $a_tmp[1], 'expires=' ) )
  249.                     {
  250.                         $i_expires = strtotime( subStr( $a_tmp2[1], 8 ) );
  251.                     }
  252.                     if ( $i_now > $i_expires && isSet( $a_cookies[$s_name] ) )
  253.                     {
  254.                         unset( $a_cookies[$s_name] );
  255.                     }
  256.                     if ( $i_now <= $i_expires )
  257.                     {
  258.                         $a_cookies[$s_name] = $s_value;
  259.                     }
  260.                 }
  261.             }
  262.             // Update Cookies.
  263.             $a_tmp = array();
  264.             reset( $a_cookies );
  265.             while ( list( $s_name, $s_value ) = each( $a_cookies ) )
  266.             {
  267.                 $a_tmp[] = $s_name . '=' . $s_value;
  268.             }
  269.             $this->mCookies = implode( '; ', $a_tmp );
  270.         }
  271.         socket_clear_error( $h_sock );
  272.         socket_close( $h_sock );
  273.         return TRUE;
  274.     }
  275.  
  276.     function GetError ()
  277.     {
  278.         if ( ! $this->mError )
  279.         {
  280.             return '';
  281.         }
  282.         return $this->mResponse;
  283.     }
  284.  
  285.     function GetRequest ()
  286.     {
  287.         return $this->mRequest;
  288.     }
  289.  
  290.     function GetResponse ()
  291.     {
  292.         return $this->mResponse;
  293.     }
  294.  
  295.     function GetCookies ()
  296.     {
  297.         return $this->mCookies;
  298.     }
  299. }
  300.  
  301. //例子
  302. $o_trans = new Transferer( 'www.domain.com', 80 ); // start work
  303. $o_trans->Send( 'get', '', '', TRUE ); // receive base cookie
  304. $o_trans->AddParam( 'username', 'myname' ); // set login user name
  305. $o_trans->AddParam( 'password', 'mypass' ); // set login user password
  306. $o_trans->AddParam( 'submit', 'LOGIN' ); // add login button
  307. $o_trans->Send( 'post', 'login.php', 'http://www.domain.com/', TRUE ); // login and update cookie
  308. $o_trans->Send( 'get', 'click.php', 'http://www.domain.com/referer.php' ); // try click
  309. $o_trans->Close(); 
  310.  
  311. ?>
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:118758次
    • 积分:1392
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:72篇
    • 译文:0篇
    • 评论:5条
    文章分类
    最新评论
    javascript