`

使用contact-list获取邮箱通讯录

    博客分类:
  • Web
阅读更多

contact-list https://github.com/flyerhzm/contactlist

 

    在一项目中使用了contact-list获取邮箱通讯录,因作者没有时间继续更新这个项目,现在不能取得163邮箱通讯录。

   

    我对OneSixThreeImporter做了一些修改,可以获得联系人了。其中contactsUrl 使用了 "http://tg4a84.mail.163.com/jy3/address/addrprint.jsp",使用Jsoup解析DOM。

 

    在pom中需增加jsoup:

    <dependency>
       <groupId>org.jsoup</groupId>
       <artifactId>jsoup</artifactId>
       <version>1.7.3</version>
    </dependency>


OneSixThreeImporter代码:
package com.huangzhimin.contacts.email;

 

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.NameValuePair;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import com.huangzhimin.contacts.Contact;
import com.huangzhimin.contacts.exception.ContactsException;

 

/**
 * 导入163联系人列表
 *
 * @author flyerhzm
 *
 */
public class OneSixThreeImporter extends EmailImporter {

 // 登录url
 private String loginUrl = "http://reg.163.com/login.jsp?type=1&url=http://entry.mail.163.com/coremail/fcg/ntesdoor2?lightweight%3D1%26verifycookie%3D1%26language%3D-1%26style%3D3";

 

 /**
  * 构造函数
  *
  * @param email
  * @param password
  */
 public OneSixThreeImporter(String email, String password) {
    super(email, password, "UTF-8");
 }

 

 /**
  * 登录163邮箱
  *
  * @throws ContactsException
  */
 public void doLogin() throws ContactsException {
  try {
     NameValuePair params[] = { new NameValuePair("verifycookie", "1"),
         new NameValuePair("product", "mail163"),
         new NameValuePair("username", getUsername(email)),
         new NameValuePair("password", password),
         new NameValuePair("selType", "jy") };
     Calendar calendar = Calendar.getInstance();
     calendar.set(2099, 11, 31);
     client.getState().addCookies(
         new Cookie[] {
               new Cookie(".163.com", "ntes_mail_firstpage",
                "normal", "/", calendar.getTime(), false),
               new Cookie(".163.com", "loginType", "js", "/",
               calendar.getTime(), false) });
     String responseStr = doPost(loginUrl, params, "http://mail.163.com/");

     String redirectUrl = getJSRedirectLocation(responseStr);
     doGet(redirectUrl, loginUrl);
   } catch (Exception e) {
     throw new ContactsException("163 protocol has changed", e);
  }
 }

 

 /**
  * 进入联系人列表页面,并读取所有的联系人信息
  *
  * @return 所有的联系人信息
  * @throws ContactsException
  */
 public List<Contact> parseContacts() throws ContactsException {
   try {
       String contactsUrl = "http://tg4a84.mail.163.com/jy3/address/addrprint.jsp?" + getSid(lastUrl);
       String content = doGet(contactsUrl);

       List<Contact> contacts = new ArrayList<Contact>();
       Document doc = Jsoup.parse(content);
       Elements names = doc.select(".gTitleSub .mTT");
       Elements addresses = doc.select(".gTable tbody tr:first-child td");
       int size = names.size();
       for (int i = 0; i < size; i++) {
            String username = names.get(i).text().trim();
            String email = addresses.get(i).text().trim();
            contacts.add(new Contact(username, email));
       }

       return contacts;
   } catch (Exception e) {
       throw new ContactsException("163 protocol has changed", e);
  }
 }

 

 private String getSid(String url) {
      return url.substring(url.indexOf("sid="));

 }
}

分享到:
评论

相关推荐

    Android获取手机通讯录信息demo

    在Android平台上,获取手机通讯录信息是常见的功能需求,尤其对于开发社交类或者管理类应用来说,这是一项基本操作。本`Android获取手机通讯录信息demo`提供了简单易用的方法来实现这一功能。下面我们将详细探讨相关...

    Java-Mail-list.zip_JAVA list通讯录

    在Java编程领域,"Java-Mail-list.zip_JAVA list通讯录"是一个示例项目,它展示了如何使用Java语言来实现一个基本的通讯录系统。这个项目包含添加联系人、搜索联系人、删除联系人以及查询联系人等核心功能,是学习...

    c#课程设计-模仿手机通讯录

    4. **类设计**:设计一个`Contact`类,包含姓名、电话、邮箱等属性,并提供相应的get和set方法。可能还需要一些方法,如ToString()以方便显示联系人信息,以及重写Equals()和GetHashCode()方法,用于比较和查找联系...

    java获取邮箱联系人

    用java获取各邮箱的联系人。测试代码如下: public static void main(String[] args) { ContactsImporter importer= ContactsImporterFactory.getTomContacts( emailAddress , password ) ; List&lt;Contact&gt; contacts ...

    C++课程设计-MFC 学生通讯录系统(源码+数据库).zip

    同时,为了方便管理和查找,可以设计一个`ContactList`类来存储和操作这些学生信息。 3. **界面设计**:MFC提供了丰富的控件类,如CEdit用于文本输入,CListBox或CTreeCtrl用于显示列表,CButton用于按钮交互。我们...

    仿微信通讯录

    例如,使用React创建ContactList组件,展示联系人列表,ContactDetail组件展示单个联系人的详细信息。此外,前端需要实现搜索框,实时过滤显示匹配的联系人。 2. **后端开发**:后端处理数据存储和业务逻辑。可以...

    tong-xun-lu.rar_小通讯录_程序 设计 通讯 排序_通讯录排序

    在这个程序中,我们通常会选择使用结构体来定义一个联系人,包含姓名、电话号码、邮箱等关键信息。例如: ```cpp struct Contact { string name; string phoneNumber; string email; }; ``` 接着,我们需要创建...

    c++通讯录管理程序

    【C++通讯录管理程序】是一个使用C++编程语言实现的个人通讯录系统,它能够帮助用户存储、管理和检索联系人信息。这个程序的核心功能包括添加联系人、删除联系人、查询联系人以及修改联系人信息,对于学习C++编程和...

    C#实验3 通讯录

    Console.WriteLine($"姓名:{contact.Name}, 电话:{contact.PhoneNumber}, 邮箱:{contact.Email}"); } } // 根据姓名查找联系人 public Contact FindContactByName(string name) { return contacts.Find(c...

    通讯录 java

    在Java中,实现这样一个通讯录系统首先需要定义一个`Contact`类,该类用来表示单个联系人,可能包含姓名、电话、邮箱等属性。例如: ```java public class Contact { private String name; private String phone...

    简单的通讯录程序 c++

    2. **面向对象编程(OOP)**:C++支持OOP,程序可能包含了类(Class)的设计,如`Contact`类来表示联系人信息,包含姓名、电话、邮箱等属性,并提供添加、删除、查找和显示联系人等方法。 3. **标准输入输出流(I/O...

    Personal-Address-Book.zip_personal_通讯录排序

    考虑到通讯录记录包括姓名、电话、邮箱等多种信息,通常会选择使用结构体来存储每个联系人。在C++中,可以定义一个包含字符串类型字段的结构体,如`struct Contact { string name; string phone; string email; }`,...

    java实现班级通讯录

    例如,可以有一个`Contact`类,包含姓名、电话、邮箱、地址等字段,并提供相应的getter和setter方法。为了支持数据操作,可能还有一个`ContactsManager`类,负责管理所有联系人,提供增删查改的接口。 在数据库层面...

    c#面向对象控制台-通讯录数组添加联系人

    - 如果使用List,则可以使用`contacts.Add(new Contact());` 9. **控制台交互**: - 使用`Console.ReadLine()`获取用户输入,例如`name = Console.ReadLine();`,然后将输入值赋给`Contact`对象的属性。 10. **...

    通讯录管理系统_c++通讯录_通讯录Visualc++_

    **通讯录管理系统**是初学者学习C++编程时常见的一个实践项目,它旨在帮助用户存储、查找和管理联系人的信息,如姓名、电话号码、邮箱等。本项目使用C++语言编写,配合Visual C++ IDE,让初学者能更好地理解和应用...

    C语言课程设计:通讯录管理系统.zip

    这里可以使用`scanf`或`fgets`等函数获取用户输入,然后解析并执行相应的操作。 为了提高用户体验,还可以加入一些额外功能,比如按姓名首字母排序、搜索特定字段(如电话或邮箱)、批量导入导出联系人等。这些功能...

    C++编写的通讯录

    首先,我们需要定义一个`Contact`类,它将包含联系人的基本信息,如姓名、电话号码、邮箱地址等。在C++中,我们可以为这些属性设置访问控制(public或private),并提供相应的get和set方法。例如: ```cpp class ...

    C#通讯录,课程设计,程序

    - 使用`List&lt;Contact&gt;`或者`Dictionary, Contact&gt;`来存储多个联系人,键可以是联系人的名字,便于快速查找。 2. **用户界面设计**: - 使用Windows Forms或WPF(Windows Presentation Foundation)来创建图形用户...

    c#编写通讯录

    接下来,为了方便地管理和操作这些联系人,我们可以创建一个`ContactManager`类,它包含一个`List&lt;Contact&gt;`来存储所有联系人,以及添加、查找、删除和修改联系人的方法: ```csharp public class ContactManager {...

Global site tag (gtag.js) - Google Analytics