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平台上,获取手机通讯录信息是常见的功能需求,尤其对于开发社交类或者管理类应用来说,这是一项基本操作。本`Android获取手机通讯录信息demo`提供了简单易用的方法来实现这一功能。下面我们将详细探讨相关...
在Java编程领域,"Java-Mail-list.zip_JAVA list通讯录"是一个示例项目,它展示了如何使用Java语言来实现一个基本的通讯录系统。这个项目包含添加联系人、搜索联系人、删除联系人以及查询联系人等核心功能,是学习...
4. **类设计**:设计一个`Contact`类,包含姓名、电话、邮箱等属性,并提供相应的get和set方法。可能还需要一些方法,如ToString()以方便显示联系人信息,以及重写Equals()和GetHashCode()方法,用于比较和查找联系...
用java获取各邮箱的联系人。测试代码如下: public static void main(String[] args) { ContactsImporter importer= ContactsImporterFactory.getTomContacts( emailAddress , password ) ; List<Contact> contacts ...
同时,为了方便管理和查找,可以设计一个`ContactList`类来存储和操作这些学生信息。 3. **界面设计**:MFC提供了丰富的控件类,如CEdit用于文本输入,CListBox或CTreeCtrl用于显示列表,CButton用于按钮交互。我们...
例如,使用React创建ContactList组件,展示联系人列表,ContactDetail组件展示单个联系人的详细信息。此外,前端需要实现搜索框,实时过滤显示匹配的联系人。 2. **后端开发**:后端处理数据存储和业务逻辑。可以...
在这个程序中,我们通常会选择使用结构体来定义一个联系人,包含姓名、电话号码、邮箱等关键信息。例如: ```cpp struct Contact { string name; string phoneNumber; string email; }; ``` 接着,我们需要创建...
【C++通讯录管理程序】是一个使用C++编程语言实现的个人通讯录系统,它能够帮助用户存储、管理和检索联系人信息。这个程序的核心功能包括添加联系人、删除联系人、查询联系人以及修改联系人信息,对于学习C++编程和...
Console.WriteLine($"姓名:{contact.Name}, 电话:{contact.PhoneNumber}, 邮箱:{contact.Email}"); } } // 根据姓名查找联系人 public Contact FindContactByName(string name) { return contacts.Find(c...
在Java中,实现这样一个通讯录系统首先需要定义一个`Contact`类,该类用来表示单个联系人,可能包含姓名、电话、邮箱等属性。例如: ```java public class Contact { private String name; private String phone...
2. **面向对象编程(OOP)**:C++支持OOP,程序可能包含了类(Class)的设计,如`Contact`类来表示联系人信息,包含姓名、电话、邮箱等属性,并提供添加、删除、查找和显示联系人等方法。 3. **标准输入输出流(I/O...
考虑到通讯录记录包括姓名、电话、邮箱等多种信息,通常会选择使用结构体来存储每个联系人。在C++中,可以定义一个包含字符串类型字段的结构体,如`struct Contact { string name; string phone; string email; }`,...
例如,可以有一个`Contact`类,包含姓名、电话、邮箱、地址等字段,并提供相应的getter和setter方法。为了支持数据操作,可能还有一个`ContactsManager`类,负责管理所有联系人,提供增删查改的接口。 在数据库层面...
- 如果使用List,则可以使用`contacts.Add(new Contact());` 9. **控制台交互**: - 使用`Console.ReadLine()`获取用户输入,例如`name = Console.ReadLine();`,然后将输入值赋给`Contact`对象的属性。 10. **...
**通讯录管理系统**是初学者学习C++编程时常见的一个实践项目,它旨在帮助用户存储、查找和管理联系人的信息,如姓名、电话号码、邮箱等。本项目使用C++语言编写,配合Visual C++ IDE,让初学者能更好地理解和应用...
这里可以使用`scanf`或`fgets`等函数获取用户输入,然后解析并执行相应的操作。 为了提高用户体验,还可以加入一些额外功能,比如按姓名首字母排序、搜索特定字段(如电话或邮箱)、批量导入导出联系人等。这些功能...
首先,我们需要定义一个`Contact`类,它将包含联系人的基本信息,如姓名、电话号码、邮箱地址等。在C++中,我们可以为这些属性设置访问控制(public或private),并提供相应的get和set方法。例如: ```cpp class ...
- 使用`List<Contact>`或者`Dictionary, Contact>`来存储多个联系人,键可以是联系人的名字,便于快速查找。 2. **用户界面设计**: - 使用Windows Forms或WPF(Windows Presentation Foundation)来创建图形用户...
接下来,为了方便地管理和操作这些联系人,我们可以创建一个`ContactManager`类,它包含一个`List<Contact>`来存储所有联系人,以及添加、查找、删除和修改联系人的方法: ```csharp public class ContactManager {...