当前位置:首页 » 编程语言 » php模拟登陆

php模拟登陆

发布时间: 2024-03-04 19:37:41

php如何获取需要登陆后才能看到的网页HTML代码

实际上是个模拟登陆的问题,需要写个登陆模块,解决两个问题:
1,请求登陆并刷新的函数部分:

<?php
/*****************函数部分**************************/
/*获取指定网页的内容
$url为网页地址
*/
function getcontent($url){
if($open=file($url)){
$count=count($open);
for($i=0;$i<$count;$i++)
{
$theget.=$open[$i];
}
}else{
die('请求过多,超时,请刷新');
}
return $theget;
}
?>
2,偷取程序部分,也分两部分,
1),PHP与XML不同之处是需要特殊的调用才能支持COOKIE.或者记录SessionID(后面有说明程序)

php代码如下
<?PHP
//登陆并保存COOKIE
$f = fsockopen("www.url.net",80);
$cmd = <<<EOT
GET /test/login.php?name=test&password=test HTTP/1.0

EOT;
fputs($f,$cmd);
$result = '';
$cookie = '';
$location = '';
while($line = fgets($f))
{
$result .= $line;
//取得location跟setCookie头HTTP头信息
$tmp = explode(":",$line);
if($tmp[0]=="Set-Cookie")
$cookie .= $tmp[1];
if($tmp[0]=="Location")
$location = $tmp[1];
}
fclose($f);
2),获取页面
//下面访问你要访问的页面(这部分也可以参考下面的核心例程)
$f = fsockopen("www.url.net",80);l
//下面的cookie就是发送前页保存下的的cookie
$cmd = <<<EOT
GET /test/test.php HTTP/1.0
cookie:$cookie

EOT;
fputs($f,$cmd);
while($line = fgets($f))
{
echo $line;
}
fclose($f);
?>

核心例程就是fsockopen();
不妨再给段代码你瞧瞧:
--------------------------------------------------------------------------------

function posttohost($url, $data)
{
$url = parse_url($url);
if (!$url) return "couldn't parse url";
if (!isset($url['port'])) { $url['port'] = ""; }
if (!isset($url['query'])) { $url['query'] = ""; }
$encoded = "";
while (list($k,$v) = each($data))
{
$encoded .= ($encoded ? "&" : "");
$encoded .= rawurlencode($k)."=".rawurlencode($v);
}
$fp = fsockopen($url['host'], $url['port'] ? $url['port'] : 80);
if (!$fp) return "Failed to open socket to $url[host]";
fputs($fp, sprintf("POST %s%s%s HTTP/1.0", $url['path'], $url['query'] ? "?" : "", $url['query']));
fputs($fp, "Host: $url[host]");
fputs($fp, "Content-type: application/x-www-form-urlencoded");
fputs($fp, "Content-length: " . strlen($encoded) . "");
fputs($fp, "Connection: close");
fputs($fp, "$encoded");
$line = fgets($fp,1024);
if (!eregi("^HTTP/1\\.. 200", $line)) return $line ;
$results = ""; $inheader = 1;
while(!feof($fp))
{
$line = fgets($fp,1024);
if ($inheader && ($line == "" || $line == "\r")) {
$inheader = 0;
}
elseif (!$inheader) {
$results .= $line;
}
}
fclose($fp);
return $results;
}
$data=array();
$data["msg"]="HELLO THIS IS TEST MSG";
$data["Type"]="TEXT";
echo posttohost("http://url/xxx", $data);

应该说明白了吧?
另外登陆部分还有一种简单方法是把SessionID保存下来

源代码:

<?php
/*
* 得到网页内容
* 参数:$host [in] string
* 主机名称(例如: www.url.com.cn)
* 参数:$method [in] string
* 提交方法:POST, GET, HEAD ... 并加上相应的参数( 具体语法参见 RFC1945,RFC2068 )
* 参数:$str [in] string
* 提交的内容
* 参数:$sessid [in] string
* PHP的SESSIONID
*
* @返回 网页内容 string
*/
function GetWebContent($host, $method, $str, $sessid = '')
{
$ip = gethostbyname($host);
$fp = fsockopen($ip, 80);
if (!$fp) return;
fputs($fp, "$method\r\n");
fputs($fp, "Host: $host\r\n");
if (!empty($sessid))
{
fputs($fp, "Cookie: PHPSESSID=$sessid; path=/;\r\n");
}
if ( substr(trim($method),0, 4) == "POST")
{
fputs($fp, "Content-Length: ". strlen($str) . "\r\n"); // 别忘了指定长度
}
fputs($fp, "Content-Type: application/x-www-form-urlencoded\r\n\r\n");
if ( substr(trim($method),0, 4) == "POST")
{
fputs($fp, $str."\r\n");
}
while(!feof($fp))
{
$response .= fgets($fp, 1024);
}
$hlen = strpos($response,"\r\n\r\n"); // LINUX下是 "\n\n"
$header = substr($response, 0, $hlen);
$entity = substr($response, $hlen + 4);
if ( preg_match('/PHPSESSID=([0-9a-z]+);/i', $header, $matches))
{
$a['sessid'] = $matches[1];
}
if ( preg_match('/Location: ([0-9a-z\_\?\=\&\#\.]+)/i', $header, $matches))
{
$a['location'] = $matches[1];
}
$a['content'] = $entity;
fclose($fp);
return $a;
}

/* 构造用户名,密码字符串 */
$str = ("username=test&password=test");
$response = GetWebContent("localhost","POST /login.php HTTP/1.0", $str);
echo $response['location'].$response['content']."<br>";
echo $response['sessid']."<br>";
if ( preg_match('/error\.php/i',$response['location']))
{
echo "登陆失败<br>";
} else {
echo "登陆成功<br>";
// 不可以访问user.php,因为不带sessid参数
$response = GetWebContent("localhost","GET /user.php HTTP/1.0", '', '');
echo $response['location']."<br>"; // 结果:error.php?errcode=2

// 可以访问user.php
$response = GetWebContent("localhost","GET /user.php HTTP/1.0", '', $response['sessid']);
echo $response['location']."<br>"; // 结果:user.php
}
?>

② 如何通过php程序模拟用户登录

模拟用户可以用php的curl的post,例如
$url = "http://www.uzuzuz.com";
$post_data = array ("username" => "uzuzuz","password" => "12345");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// post数据
curl_setopt($ch, CURLOPT_POST, 1);
// post的变量
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
curl_close($ch);
//打印获得的数据
print_r($output);

具体参考:http://www.uzuzuz.com/article/4.html

③ PHP CURL 实现 模拟登陆 为何目标网站没有登陆的反应呢 高手请进

1、表单登陆地址不对

2、表单名不对,名字是username 和 password 没有ls

<?php
$curl=curl_init();
$cookie_jar=tempnam('./tmp','cookie');
curl_setopt($curl,CURLOPT_URL,'http://bbs.miaozhan360.com/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes');//这里写上处理登录的界面
curl_setopt($curl,CURLOPT_POST,1);
$request='username=wonderwiller&password=wonderwiller';
curl_setopt($curl,CURLOPT_POSTFIELDS,$request);//传递数据
curl_setopt($curl,CURLOPT_COOKIEJAR,$cookie_jar);//把返回来的cookie信息保存在$cookie_jar文件中
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);//设定返回的数据是否自动显示
curl_setopt($curl,CURLOPT_HEADER,false);//设定是否显示头信息
curl_setopt($curl,CURLOPT_NOBODY,false);//设定是否输出页面内容
$r=curl_exec($curl);//返回结果
echo$r;

curl_close($curl);//关闭
$curl2=curl_init();
curl_setopt($curl2,CURLOPT_URL,'http://bbs.miaozhan360.com/forum.php');//登陆后要从哪个页面获取信息
curl_setopt($curl2,CURLOPT_HEADER,false);
curl_setopt($curl2,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl2,CURLOPT_COOKIEFILE,$cookie_jar);
$content=curl_exec($curl2);
echo$content;
?>

④ PHP的curl模拟·登录老是失败出现了405错误

405 是指请求的 URL 不支持请求的方法, htm(除伪静态)是静态页面,是只能使用 get 方法的,而你要登录,要用post,而你这里也确实是用的 post,那么我觉得你应该是 URL 取错了。像这种 post 的地址都要是有程序处理的,你再回去看看原来页面中 form 上的 action 地址吧

⑤ 微信php模拟登录,老是报错:{"base_resp":{"ret":-4,"err_msg":"invalid referrer"}}

设置Referert头标

⑥ 在PHP中如何模拟HTTP_USER_AGENT

在curl里可以设置UA

<?php
//client
$ch=curl_init();
curl_setopt_array($ch,
array(
CURLOPT_URL=>'http://localhost/ua.php',
CURLOPT_USERAGENT=>"YeRenChai_v1.0",
CURLOPT_RETURNTRANSFER=>True,
CURLOPT_FOLLOWLOCATION=>True,
)
);
$response=curl_exec($ch);
if(!$response)exit(curl_error($ch));
var_mp($response);
?>
<?php//server
echo$_SERVER['HTTP_USER_AGENT'];
?>
热点内容
怎么用安卓手机查苹果的序列号 发布:2024-11-29 06:21:08 浏览:507
r11s原始密码是多少 发布:2024-11-29 05:52:20 浏览:79
c语言枚举法 发布:2024-11-29 05:50:58 浏览:125
大数据系统如何配置 发布:2024-11-29 05:48:44 浏览:89
连战访问西安小学 发布:2024-11-29 05:45:03 浏览:316
怎么编译原生安卓手机 发布:2024-11-29 05:44:28 浏览:193
java代码编译java文件 发布:2024-11-29 05:44:27 浏览:208
如何部署远程服务器 发布:2024-11-29 05:34:37 浏览:523
红米系统存储与手机存储 发布:2024-11-29 05:33:55 浏览:198
qt反编译工具 发布:2024-11-29 05:29:31 浏览:480