欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

PHP模拟POST表单提交(支持HTTP、HTTPS等) 有大用

shiping1 的头像

PHP模拟POST表单提交(支持HTTP、HTTPS等) 2012-12-31 14:49:53

标签:PHP

 php模拟post提交数据,用处很多,可用来网站的采集,登陆等等

 

<?php

//以程序登陆一个论坛登录为例
function bbslogin($user_login, $password, $host, $port = "80") {
	//需要提交的post数据
	$argv = array('cookie' => array('user_login' => $user_login, 'password' => $password, '_wp_http_referer' => '/bbpress/', 're' => '', 'remember' => true));
	foreach ($argv['cookie'] as $key => $value) {
		$params[] = $key . '=' . $value;
	}
	$params = implode('&', $params);
	$header = "POST /bbpress/bb-login.php HTTP/1.1\r\n";
	$header .= "Host:$host:$port\r\n";
	$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
	$header .= "Content-Length: " . strlen($params) . "\r\n";
	$header .= "Connection: Close\r\n\r\n";
	$header .= $params;
	$fp = fsockopen($host, $port);
	fputs($fp, $header);
	while (!feof($fp)) {
		$str = fgets($fp);
		//以下是自己的逻辑代码,这里主要是模拟cookie,可用来同步登陆
		if (!(strpos($str, "Set-Cookie:") === false)) {
			$tmparray = explode(" ", $str);
			$cookiearray = explode("=", $tmparray[1]);
			$cookiepaths = explode("=", $tmparray[6]);
			$cookiename = urldecode($cookiearray[0]);
			$cookievalue = urldecode(substr($cookiearray[1], 0, strlen($cookiearray[1]) - 1));
			$cookietime = time() + 3600 * 24 * 7;
			$cookiepath = urldecode(substr($cookiepaths[1], 0, strlen($cookiepaths[1]) - 1));
			setcookie($cookiename, $cookievalue, $cookietime, $cookiepath);
		}
	}
	fclose($fp);
}
?>

注:上述不支持https协议,下面才支持:
function vpost($url,$data){ // 模拟提交数据函数
    $curl =  curl_init();  // 启动一个CURL会话
    curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
    curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
// CURLOPT_FOLLOWLOCATION ,当你把这个参数设置为true时,curl会根据任何重定向命令更深层次的获取转向路径,举个例子:当你尝试获取一个PHP的页面,然后这个PHP的页面中有一段跳转代码 ,curl将从http://new_url获取内容,而不是返回跳转代码。
    curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
    curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
    curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
    curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回 设置cURL 参数,
                                                    //要求结果保存到字符串中还是输出到屏幕上
    $tmpInfo = curl_exec($curl); // 执行操作
    if (curl_errno($curl)) {
       echo 'Errno'.curl_error($curl);//捕抓异常
    }
    curl_close($curl); // 关闭CURL会话
    return $tmpInfo; // 返回数据
}

$url = "https://xxx.xxx.xxx/xxx";
$data ="x=xxxxxx";
$result = vpost($url,$data);

很不错奥!!!

来自 http://gtskk.blog.51cto.com/6249856/1105071




 

PHP模拟POST提交数据函数

分类: PHP 292人阅读 评论(0) 收藏 举报
  1. function vpost($url,$data){ // 模拟提交数据函数  

  2.     $curl = curl_init(); // 启动一个CURL会话  

  3.     curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址  

  4.     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查  

  5.     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在  

  6.     curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器  

  7.     curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转

  8. // CURLOPT_FOLLOWLOCATION ,当你把这个参数设置为true时,curl会根据任何重定向命令更深层次的获取转向路径,举个例子:当你尝试获取一个PHP的页面,然后这个PHP的页面中有一段跳转代码 ,curl将从http://new_url获取内容,而不是返回跳转代码。

     

  9.     curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer  

  10.     curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求  

  11.     curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包  

  12.     curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环  

  13.     curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容  

  14.     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回  //设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上

  15.     $tmpInfo = curl_exec($curl); // 执行操作  

  16.     if (curl_errno($curl)) {  

  17.        $tmpInfo = 'Errno'.curl_error($curl);//捕抓异常  

  18.     }  

  19.     curl_close($curl); // 关闭CURL会话  

  20.     return $tmpInfo// 返回数据  

  21. }  

  22.   

  23.   

  24. $url = "https://www.sandbox.paypal.com/cgi-bin/webscr";  

  25. $data = 'cmd=_notify-validate&mc_gross=1.59';  

  26. echo $result = vpost($url,$data);  

来自 http://blog.csdn.net/liuensong/article/details/8264264


一个小示例

如果一切就绪,下面是一个小例程:

﹤?php
// 初始化一个 cURL 对象
$curl = curl_init();

// 设置你需要抓取的URL
curl_setopt($curl, CURLOPT_URL, 'http://cocre.com');

// 设置header
curl_setopt($curl, CURLOPT_HEADER, 1);

// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

// 运行cURL,请求网页
$data = curl_exec($curl);

// 关闭URL请求
curl_close($curl);

// 显示获得的数据
var_dump($data);


来自 http://developer.51cto.com/art/200904/121739.htm

 


普通分类: