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日

相关文章

  • Java面试题之HashMap 的 hash 方法原理是什么

    HashMap 的 hash 方法原理是什么 在了解HashMap的原理之前, 我们先看看hash散列表是怎么工作的, 他的原理是什么。 散列表的原理是将关键字通过散列函数映射到固定的位置上, 并对原始值进行处理, 最终得到的值就是我们所说的哈希值, 即在HashMap中所表现出来的值。在JDK1.7之前,HashMap的内部实现方式是数组 + 链表,数组的…

    Java 2023年5月26日
    00
  • Java经典排序算法之二分插入排序详解

    Java经典排序算法之二分插入排序详解 什么是二分插入排序? 二分插入排序是插入排序的升级版,它采用二分查找来寻找插入位置,从而提高插入操作的效率。 与插入排序不同的是,插入排序是将待排序的元素插入到已排好序的序列中,找到正确的插入位置需要比较多的次数,时间效率较低。而二分插入排序是通过二分查找的方式来寻找插入的位置,可以减少比较次数,提高时间效率。 二分插…

    Java 2023年5月19日
    00
  • java操作json对象出现StackOverflow错误的问题及解决

    如果你在 Java 中操作 JSON 对象时遇到 StackOverflow 错误,可能是因为实体类中的字段中包含了一个指向同一类型的对象,而这个对象又有一个指向同一类型的对象……以此类推,最终导致了无限循环。这将导致无限递归,直到抛出 StackOverflow 错误。 解决这种情况的最简单方式是使用“@JsonManagedReference”和…

    Java 2023年5月26日
    00
  • Linux下PHP+MYSQL+APACHE配置过程 (摘)第1/2页

    针对“Linux下PHP+MYSQL+APACHE配置过程”这一话题,我会提供一个完整的攻略,并在过程中举两个实例说明,内容如下: Linux下PHP+MYSQL+APACHE配置过程 安装apache 在Linux系统下,Apache是一款非常流行的Web服务器软件,可以通过以下步骤进行安装: 更新包管理器 sudo apt update 安装apache…

    Java 2023年6月2日
    00
  • Java中JSON处理工具类使用详解

    Java中JSON处理工具类使用详解 什么是JSON JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。JSON格式常…

    Java 2023年5月26日
    00
  • Maven生命周期和及插件原理用法详解

    Maven生命周期和插件原理用法详解 什么是Maven生命周期? Maven生命周期指的是一些固定的、预定义的构建顺序,Maven通过定义一系列阶段(Phase),每个阶段表示一些特定的任务,它们按照一定的顺序执行,最终完成项目构建。Maven生命周期包括三个阶段:- 清理周期:此周期主要是负责清理相关的上一次构建的内容- 默认周期:此周期是最主要的构建阶段…

    Java 2023年5月20日
    00
  • SpringBoot数据层处理方案精讲

    Spring Boot是一个流行的Java框架,可以帮助开发人员更加高效地构建和部署应用程序。在Spring Boot中,数据层处理是非常重要的一部分,它可以帮助我们管理和操作数据。在本文中,我们将详细讲解Spring Boot数据层处理方案的精髓。 数据层处理方案 在Spring Boot中,数据层处理方案通常包括以下几个方面: 数据库访问:Spring …

    Java 2023年5月15日
    00
  • Java中Properties类的操作实例详解

    Java中Properties类的操作实例详解 Properties类是什么? Properties类是Java中常用的一个类,主要用于处理属性文件。属性文件是一种配置文件,其中包含了键值对,用于保存程序运行时需要动态设置的参数值,例如数据库连接参数、日志输出级别等等。 Properties类的基本用法 Properties类位于java.util包中,可以…

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