首先我们来先了解一下什么是cURL。
cURL是一个计算机软件项目,它可以利用URL语法,向网络服务器发送请求并获取数据。cURL支持多种协议,包括 HTTP、HTTPS、FTP、FTPS、SCP、SFTP、TFTP、TELNET、DICT、LDAP、LDAPS、IMAP、POP3 和 SMTP。cURL还支持HTTPS认证、HTTP POST方法、FTP上传文件、做表单认证、做代理、访问cookie等等。
然后我们可以根据以下流程操作,来实现登录163邮箱并抓取邮箱好友列表的代码:
-
通过cURL POST方式登录163邮箱,成功登录后可以获取到登录成功后的Cookie。
-
通过传递Cookie,模拟该用户浏览器加载好友列表页面。
-
在页面中解析出好友列表数据。
我们可以参考以下代码来实现:
//login.php
<?php
function curl_request($url, $postFields = null)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FAILONERROR, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
if (is_array($postFields) && 0 < count($postFields)) {
$postBodyString = "";
$postMultipart = false;
foreach ($postFields as $k => $v) {
if ("@" != substr($v, 0, 1)) {
// 判断是不是文件上传
$postBodyString .= "$k=" . urlencode($v) . "&";
} else {
//文件上传用multipart/form-data,否则用www-form-urlencoded
$postMultipart = true;
$postFields[$k] = new \CURLFile(substr($v, 1));
}
}
unset($k, $v);
curl_setopt($ch, CURLOPT_POST, true);
if ($postMultipart) {
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
} else {
curl_setopt($ch, CURLOPT_POSTFIELDS, substr($postBodyString, 0, -1));
}
}
$reponse = curl_exec($ch);
//返回结果头 放在body内容之前
$header = curl_getinfo($ch);
$header['errno'] = curl_errno($ch);
$header['errmsg'] = curl_error($ch);
curl_close($ch);
$header['content'] = $reponse;
return $header;
}
$loginUrl = 'https://mail.163.com/entry/cgi/ntesdoor?';
$postData = array(
"funcid" => "loginone",
"language" => "-1",
"passtype" => "1",
"product" => "mail163",
"savelogin" => "1",
"url2" => "http://mail.163.com/errorpage/error163.htm",
"username" => "xxxxx",
"password" => "xxxxx"
);
$result = curl_request($loginUrl, $postData);
if ($result['errno'] != 0) {
echo "login_error";
} else {
//登录成功后能得到一个Set-Cookie值,需要保存下来以便之后使用
$cookies = $result["header"]["Set-Cookie"];
//模拟访问好友列表页面,返回好友列表
$url = "https://twebmail.mail.163.com/js4/s?sid={$result['header']['set-cookie']}&&func=member:getAllMemberData&group=%2523contacts%2523&order=desc&sort=writeDate&exportonly=false&t=" . time();
$friends = curl_request($url, null, $cookies);
//处理返回的数据,比如解析出好友列表json数据
$friendJson = substr($friends["content"],7);
$friendJson = urldecode($friendJson);
$friendJson = str_replace(" ", " ", $friendJson);
$friendList = json_decode($friendJson, true);
//输出好友列表数据
var_dump($friendList);
}
?>
运行以上代码,可以获得登录并获取好友列表的过程。需要注意的是,在 postData
中配置自己的邮箱账号和密码,才可以登录成功。另外,获取好友列表的请求地址及参数需要根据具体邮箱系统进行调整。
下面给出另一个示例,在$loginURL
后添加referer:
$loginUrl = 'https://mail.163.com/entry/cgi/ntesdoor?referer=https%3A%2F%2Fmail.163.com%2F';
$postData = array(
"funcid" => "loginone",
"language" => "-1",
"passtype" => "1",
"product" => "mail163",
"savelogin" => "1",
"url2" => "http://mail.163.com/errorpage/error163.htm",
"username" => "xxxxx",
"password" => "xxxxx"
);
在登录时指定Referer信息,可以避免部分邮件系统的多次重定向造成的登录失败问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php curl 登录163邮箱并抓取邮箱好友列表的代码(经测试) - Python技术站