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日

相关文章

  • 基于@JsonProperty的使用说明

    让我来详细介绍一下如何在Java应用程序中使用基于@JsonProperty的技术。 什么是基于@JsonProperty的技术? @JsonProperty是一个Jackson库中的注解,它可以帮助我们在Java对象和JSON文本之间进行转换。当Java对象被序列化和反序列化时,@JsonProperty注解可以将Java属性名和对应的JSON字段名进行映…

    Java 2023年5月26日
    00
  • Spring Cloud 使用 Resilience4j 实现服务熔断的方法

    Spring Cloud 使用 Resilience4j 实现服务熔断的方法 简介 在微服务架构中,服务之间的调用是通过网络通信实现的,当前服务如果调用其他服务时发生异常,这可能会导致雪崩效应,严重影响整个系统的稳定性和可用性。为了解决这个问题,可以引入服务熔断机制,当某个服务异常达到一定的阀值时,取消对该服务的调用,直接返回给调用方一个错误响应,从而减小对…

    Java 2023年5月19日
    00
  • hibernate 配置数据库方言的实现方法

    Hibernate配置数据库方言是一个重要的操作,因为它能让Hibernate根据不同的数据库语言,生成不同的SQL语句,从而保证操作数据库的正确性。下面是hibernate配置数据库方言的实现方法: 1.首先在Hibernate的配置文件中,需要添加一个属性:hibernate.dialect。该属性用于配置数据库方言,根据不同的数据库方言填写不同的值。例…

    Java 2023年5月20日
    00
  • 基于SpringBoot bootstrap.yml配置未生效的解决

    在Spring Boot应用程序中,我们可以使用bootstrap.yml或bootstrap.properties文件来配置应用程序的属性。但是,有时候我们可能会遇到配置未生效的问题。下面是详解基于Spring Boot bootstrap.yml配置未生效的解决方案的完整攻略: 确认配置文件位置 首先,我们需要确认bootstrap.yml文件的位置是否…

    Java 2023年5月14日
    00
  • java8中的lambda表达式,看这篇绝对够

    Java 8中的lambda表达式:完整攻略 简介 Lambda表达式是Java 8中最具有关注度的特性之一。它是一种类似于匿名方法的语法结构,使得我们可以将方法作为参数进行传递,从而实现更为简洁和灵活的代码编写。本篇攻略将会详细介绍Java 8中的Lambda表达式,并给出一些示例来说明。 Lambda表达式的语法 Java 8中Lambda表达式的基本语…

    Java 2023年5月26日
    00
  • java获取文件大小的几种方法

    当我们需要获取文件的大小时,有多种方法可以实现。下面将介绍java中获取文件大小的几种方法。 使用File类的length方法获取文件大小 File类是Java中常用的文件操作类,它提供了获取文件大小的方法length。该方法返回的是文件的字节数。 import java.io.File; public class FileSizeTest { public…

    Java 2023年5月20日
    00
  • Java(JDK/Tomcat/Maven)运行环境配置及工具(idea/eclipse)安装详细教程

    下面是Java运行环境配置及工具安装的详细教程,包括JDK、Tomcat、Maven以及IDE(idea和eclipse)的安装和配置。 一、安装JDK 1.下载JDK安装包 你可以在Oracle官网下载适用于你的操作系统的JDK安装包,也可以到JDK官网下载。下载时要注意区分JDK的版本和平台,一般建议选择稳定版本(如JDK8)。 2.安装JDK 运行下载…

    Java 2023年5月19日
    00
  • Spring Security保护用户密码常用方法详解

    Spring Security保护用户密码常用方法详解 前言 在现代的Web开发中,安全性已经成为一个重要的问题。尤其是涉及到用户密码的相关处理,更是需要严格保护。 Spring Security是一个开源的Web安全框架,它提供了一些集成化的解决方案,可以快速、轻松地保护我们的应用程序的安全。这篇文章将介绍Spring Security保护用户密码的一些常…

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