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

yizhihongxing

首先我们来先了解一下什么是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日

相关文章

  • 基于SpringBoot2.0版本与老版本的区别

    Spring Boot是一个流行的Java框架,可以帮助开发人员更加高效地构建和部署应用程序。在Spring Boot的发展过程中,不同版本之间存在一些区别。在本文中,我们将详细讲解基于Spring Boot 2.0版本与老版本的区别,并提供两个示例来演示这些区别。 基于Spring Boot 2.0版本与老版本的区别 以下是基于Spring Boot 2.…

    Java 2023年5月15日
    00
  • Struts1教程之ActionMapping_动力节点Java学院整理

    Struts1教程之ActionMapping_动力节点Java学院整理 1. 了解ActionMapping ActionMapping 是 Struts1 框架中的一个重要组件,它主要负责将请求的 URL 映射到相应的 Action 类,以便执行对应的业务逻辑。也就是说,我们可以通过 ActionMapping 来实现 URL 到 Action 类及其方…

    Java 2023年5月20日
    00
  • 一文教你如何使用原生的Feign

    一文教你如何使用原生的Feign 简介 Feign 是一个基于Java的HTTP客户端,用于将HTTP请求映射到界面上,并将调用者与远程服务进行解耦。Feign通过使用注解支持请求/响应编码、注释传播、错误处理等功能。 使用原生的Feign的步骤 步骤一:引入依赖 首先,我们需要在项目中引入feign相关的依赖,以下是一些常用的依赖: <depende…

    Java 2023年5月20日
    00
  • java中的Struts2拦截器详解

    下面是“Java中的Struts2拦截器详解”的完整攻略: 什么是Struts2拦截器 Struts2拦截器(Interceptor)是一种在Struts2应用程序中提供预处理和后处理逻辑的组件。拦截器可以在Action执行之前、Action执行之后和Result返回给客户端之前执行额外的逻辑,通过这些拦截器可以很方便地实现一些通用的功能,例如安全性、日志、…

    Java 2023年5月20日
    00
  • 全面解析java final关键字

    全面解析java final关键字 1. 什么是final关键字 final是Java语言中的一个关键字,它可以用来修饰变量、方法和类,表示该变量、方法或类只能被赋值一次或者在声明时被初始化一次,并不能再被修改或继承。final关键字有时被称为“不可变量”、“常量”、“最终变量”等。 2. final变量 final变量表示的是一旦被初始化,就不能再修改该变…

    Java 2023年5月26日
    00
  • javaweb项目如何实现手机短信登录

    下面我来详细讲解如何实现手机短信登录的完整攻略: 步骤一:申请短信服务 要实现手机短信登录,首先需要申请一个短信服务供应商提供的服务,通常情况下这些服务都需要扣除一定的费用,具体费用因服务供应商而异。以下是两种比较常用的短信服务供应商: 腾讯云短信服务 腾讯云短信服务提供快速、高可靠、低成本、全网覆盖的短信验证码发送服务。首先,你需要去 腾讯云官网 进行注册…

    Java 2023年6月15日
    00
  • java中struts2实现文件上传下载功能

    下面是java中struts2实现文件上传下载功能的完整攻略: 一、文件上传功能的实现 1. 安装文件上传插件 在struts2中实现文件上传功能需要依赖文件上传插件,可以通过以下方式进行安装: 在pom.xml中加入以下依赖: <dependency> <groupId>org.apache.struts</groupId&g…

    Java 2023年5月20日
    00
  • 十种JAVA排序算法实例

    十种JAVA排序算法实例攻略 一、排序算法简介 排序算法是指将一组无序的数据按照一定的顺序重新排列的过程。在计算机领域中,排序算法是最基本的算法之一,大大提高了计算机数据处理的效率。 排序算法的分类可以分为内部排序和外部排序。内部排序是指数据量较小,能全部加载进内存中进行排序的方法,比如插入排序、冒泡排序等。而外部排序是指数据量较大,需要借助外部存储设备进行…

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