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日

相关文章

  • 微信小程序的引导页实现代码

    下面我将详细讲解微信小程序的引导页实现代码的完整攻略。 引导页介绍 引导页是我们打开小程序时的第一屏,通常用于向用户介绍应用程序功能和使用方法,提高用户的使用率。引导页的设计符合产品风格与用户喜好、功能简介精炼易懂,同时也需要具有一定的美感。 引导页实现步骤 以下为实现引导页的步骤: 创建基本界面 原生或者自定义组件都可以满足需求。此处我选择使用原生组件,创…

    Java 2023年5月23日
    00
  • 基于Java中字符串内存位置详解

    基于Java中字符串内存位置详解攻略 什么是Java字符串 在Java中,字符串(String)是一种对象类型,可以用来存储和操作文本数据。Java中的字符串是不可变的,也就是说,一旦创建,字符串对象的值就无法改变。 例如,我们可以使用以下代码来创建一个字符串对象: String str = "Hello, world!"; Java字符…

    Java 2023年5月26日
    00
  • Java的引用类型常用的四种方法

    Java的引用类型常用的四种方法包含:按值传递、按引用传递、按可变长数组传递、按包装类传递。接下来我会结合示例详细介绍这四种方法。 按值传递 按值传递是将方法外部的值复制到方法内部,在方法中操作该值,但不会对原始值造成影响。示例代码如下: public class Main { public static void main(String[] args) {…

    Java 2023年5月26日
    00
  • 深入浅析Centos 7系统的Tomcat服务器

    深入浅析Centos 7系统的Tomcat服务器 简介 Tomcat 是 Apache 软件基金会(Apache Software Foundation)的一款开源的 Java Servlet 容器,也是一个标准的 JSP 容器。 本文将分步讲解如何在 Centos 7 系统上安装和配置 Tomcat 服务器,以及如何在 Tomcat 中部署网站应用。 安装…

    Java 2023年5月19日
    00
  • 浅谈JAVA字符串匹配算法indexOf函数的实现方法

    浅谈JAVA字符串匹配算法indexOf函数的实现方法 介绍 indexOf 是 JAVA 提供的一个用于字符串匹配的函数,它的作用是在一个给定的字符串中寻找另一个子字符串第一次出现的位置。在 JAVA 中,由于字符串是不可变的,所以 indexOf 是该语言中一个十分常用的方法。 indexOf的实现方法 在 JAVA 中,String 类有一个 inde…

    Java 2023年5月19日
    00
  • Java中ShardingSphere分库分表实战

    关于Java中ShardingSphere分库分表的实战攻略,我将从以下几个方面进行讲解: 简介:什么是ShardingSphere分库分表 分库分表实战攻略:分库分表的具体实现步骤 示例1:如何使用ShardingSphere进行分库分表 示例2:如何根据业务自定义Sharding规则 1. 简介 ShardingSphere是一款非常流行的数据库分库分表…

    Java 2023年5月19日
    00
  • 浅谈servlet与jsp的关系

    浅谈servlet与jsp的关系 Servlet和JSP概述 Servlet Servlet是一种Java Web开发技术,可以用来处理客户端请求并返回响应,它是Java EE规范的一部分。Servlet通常情况下是作为Web服务器上Web应用程序的一部分来运行。Servlet通常用于生成动态网页和响应用户请求。 JSP JSP是Java Server Pa…

    Java 2023年6月15日
    00
  • 最常用的1000个Java类(附代码示例)

    最常用的1000个Java类(附代码示例)攻略 一、简介 最常用的1000个Java类(附代码示例)是一份收集了Java程序员常用的1000个类以及它们的代码示例的列表。该列表涵盖了许多方面,例如:IO、集合、多线程、网络等。它不仅能够为Java编程初学者提供学习的参考,还可以为有经验的开发人员提供快速开发的支持。 二、使用方式 在使用最常用的1000个Ja…

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