使用java导入某个msn帐号的好友列表并发送消息
导入信息的关键是如何对msn的通讯协议进行封装,这里会有两个选择,一个使用openfire(xmlapp协议),另外就是使用jml,前者配置起来相对复杂,但兼容性较好,openfire能够和任何im进行通讯,包括(skype、msn、smalltalk等)、后者对msn和smalltalk比较好,这里只介绍如何使用jml导入用户的msn好友列表.
(比较郁闷的是,qq的通信协议随着版本的升级不断更改,因此对qq做类似的功能可能不太现实,可能需要和腾讯合作了呵呵).
jml(Java Msn Manager Liberary)是sourceforge上的一个开源项目,相关jar包可在以下地址中下载:
[url]http://sourceforge.net/project/showfiles.php?group_id=118829&package_id=129414&release_id=617947[/url]
建议将其源码一块下载下来,因为需要里面的三个包支持包,jml-src-1.0b3.zip,将lib目录下的jar包copy到你的项目中,然后将jml-1.0b-full.jar包和上述三个包一起引入项目,现在可以写我们的代码了。其实直接copy源代码下的example/的两个类即可,他们分别是:BasicMessenger和SimpleMsn,直接运行simpleMsn就可以了,但是它会报错,原因是你需要传送msn的账户名和密码:代码如下所示:
修改main函数:
public static void main(String[] args) throws Exception
{
new SimpleMsn("123123123123 @hotmail.com", "*********").start();
}
运行下就可以得到我们需要的东东了。会在后台打印,这里面有很多监听接口,比如当登录成功时如何如何,当初始化完毕时如何如何等等,需要你自己来搞定了,我们取得用户列表的代码在这里:
private void listContacts()
{
MsnContact[] cons = messenger.getContactList().getContacts();
System.out.println("您现在有:"+cons.length+"个联系人,列表如下!");
for (MsnContact con : cons) {
System.out.println("姓名:"+con.getDisplayName());
System.out.println("email地址:"+con.getEmail());
System.out.println("在线状态:"+con.getStatus());
if (con.getStatus() != MsnUserStatus.OFFLINE) {
System.out.print(con.getEmail()+"开始导入信息");
messenger.sendText(con.getEmail(), "hello,这是测试信息,并无恶意!");
}
// System.out.println(con.getPersonalMessage());
}
}
呵呵,简单吧,如果要导入qq帐户的话用这个就不行了。等我研究出来再说吧!
对他们的包解压然后加入我的一个小程序,个人根绝还是比较方便的,喜欢的话下载吧:
以下是使用方法:
/**
* 为了让msn彻底退出,这里采用调用子进程的方法
* 启动msn
* 给子进程传递三个运行时参数
* msn帐号 msn密码 和要传递的内容
* 子进程取出的好友email列表通过进程输入流读出(对于父进程来说相当于输出流)
* @author huql
*如果不这样调用,内存可能不能释放,这是个问题
*/
public static void main(String args[]){
System.getenv();
String msnCount=
[email protected];
String password="19820000";
String message="你好,欢迎访问 [url]www.17k.com[/url],更多精彩尽在其中!";
String command="java -cp \"e:/workspace/user.17k.com/web/WEB-INF/lib\"/jml.jar; net.sf.jml.example.SimpleMsn "+msnCount+" "+password+" "+message;
try {
Process p=Runtime.getRuntime().exec(command);
BufferedInputStream in = new BufferedInputStream(p.getInputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String content=br.readLine();
while(content!=null){
System.out.println(content);
content=br.readLine();
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("continue to excute other program...............");
}