php curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)

首先我们来先了解一下什么是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邮箱并抓取邮箱好友列表的代码:

  1. 通过cURL POST方式登录163邮箱,成功登录后可以获取到登录成功后的Cookie。

  2. 通过传递Cookie,模拟该用户浏览器加载好友列表页面。

  3. 在页面中解析出好友列表数据。

我们可以参考以下代码来实现:

//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("&nbsp;", " ", $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技术站

(0)
上一篇 2023年6月16日
下一篇 2023年6月16日

相关文章

  • JSP页面的动态包含和静态包含示例及介绍

    下面我会详细讲解一下“JSP页面的动态包含和静态包含示例及介绍”的攻略。 什么是JSP页面的包含? JSP页可以通过 <%@ include file=”filename.jsp” %> 的方式,包含其他文件或JSP页面。这个操作叫做实现JSP页面的包含。根据包含JSP页面和被包含JSP页面的关系,包含又可以分为静态包含和动态包含。 静态包含 所…

    Java 2023年6月15日
    00
  • JS实现的JSON序列化操作简单示例

    下面我来为你讲解“JS实现的JSON序列化操作简单示例”的完整攻略。 一、JSON序列化简介 JSON序列化是将JavaScript对象转换为JSON字符串的过程,也可以将JSON字符串转换为JavaScript对象。在实际开发中,JSON序列化是很常见的一个操作,尤其是在前后端数据交互时。 二、JSON.stringify方法详解 在JavaScript中…

    Java 2023年5月26日
    00
  • Java File类的详解及简单实例

    Java File类的详解及简单实例 简介 Java中的File类是一个用于操作文件和文件夹的类,可以用于检查文件和文件夹的状态、进行文件和文件夹的删除、重命名等操作。File类中包含的方法较多,它与Java IO的输入输出流中的类相互支持,是进行Java操作文件的重要一环。 File类的构造函数 File(String pathname) 用指定的路径na…

    Java 2023年5月20日
    00
  • Java使用IO模拟注册登录

    下面是Java使用IO模拟注册登录的完整攻略: 1. 需求分析 我们需要设计一套用户注册登录系统,需满足以下几个功能: 用户注册:通过键盘输入用户名和密码,将其写入到本地文件中保存。 用户登录:通过键盘输入用户名和密码,在本地文件中验证用户的正确性。 2. 设计思路 我们需要设计两个类:一个用于用户注册,一个用于用户登录。其中,用户注册需要将用户输入的用户名…

    Java 2023年6月15日
    00
  • Java从零编写吃货联盟订餐系统全程讲解

    Java从零编写吃货联盟订餐系统全程讲解攻略 前言 本文将从零开始,详细讲解如何使用Java编写一个在线订餐系统,旨在帮助大家提升Java编程能力,学习实际开发流程。本文将涵盖以下内容: 需求分析及功能设计 系统架构设计 数据库设计 代码开发及测试 总结和下一步计划 需求分析及功能设计 在设计任何系统之前,需要对需求进行详细分析。我们的订餐系统需要满足以下需…

    Java 2023年5月24日
    00
  • 基于JSP的RSS阅读器的设计与实现方法(推荐)

    基于JSP的RSS阅读器的设计与实现方法 简介 本篇攻略介绍如何使用JSP语言开发一个简单的RSS阅读器。RSS是一种将网站内容以XML格式传递的标准格式。通过使用本篇攻略中的技术,您将能够构建一个具有基本功能的RSS阅读器,包括展示RSS源,获取RSS源更新等功能。 准备工作 在开始之前,我们需要进行一些准备工作: 确保您已经安装了Java和Apache …

    Java 2023年6月15日
    00
  • 通过java记录数据持续变化时间代码解析

    通过Java记录数据持续变化时间代码解析 当我们需要记录某个变量的持续变化时间(即开始变化到结束变化的时间),可以通过Java代码实现。这种方式可以用于监控某个变量,例如温度、湿度等持续变化的情况,也可以用于统计某个变量的变化时长。 实现过程 我们可以定义一个Timer类,包含以下属性: startTime:变量开始变化的时间戳(毫秒) endTime:变量…

    Java 2023年5月20日
    00
  • Java8 Stream流的合并

    最近的需求里有这样一个场景,要校验一个集合中每个对象的多个Id的有效性。比如一个Customer对象,有3个Id:id1,id2,id3,要把这些Id全部取出来,然后去数据库里查询它是否存在。 @Data @AllArgsConstructor public class Customer { private String name; private Stri…

    Java 2023年5月6日
    00
合作推广
合作推广
分享本页
返回顶部