最近同事做了一个聊天的机器人,觉得挺有意思的,就问他怎么实现的。原来是一个叫jMsn的工具,可惜是韩国人做的,文档都是韩文的。
去下载了开发包msnmlib-1.2.2-src.zip,然后上网看了几篇文章,用起来还是挺简单的。
基本的用法
msn = new MSNMessenger("xxx@hotmail.com", "passwd");
msn.setInitialStatus(UserStatus.ONLINE);
msn.addMsnListener(new MSNAdapter(msn));
msn.login();
System.out.println("Waiting for the response....");
try {
System.in.read();
}
catch (IOException ex) {
}
System.out.println("logout");
msn.logout();
关键是实现一个MsnAdapter接口,当收到数据时,有人加自己为好友是应该做些什么
比如如下代码实现了:有人加自己,自己就加他。别人对自己说什么,自己也说一样的话这样的功能。代码比较易读。
/**
* 某人正在输入信息
*/
public void progressTyping(SwitchboardSession ss,MsnFriend friend,String typingUser) {
System.out.println(friend.getLoginName() + "正在输入信息...");
}
/**
* 收到消息的时候执行该方法
*/
public void instantMessageReceived(SwitchboardSession ss,MsnFriend friend,MimeMessage mime) {
System.out.print("接收到消息:" + friend.getFriendlyName() + "->");
System.out.println(mime.getMessage());
try {
//发送相同的回复信息给发送者
messenger.sendMessage(friend.getLoginName(), mime);
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
* 登录成功后执行该方法
*/
public void loginComplete(MsnFriend own) {
System.out.println(own.getLoginName() + " Login OK");
}
/**
* 登录失败后执行该方法
*/
public void loginError(String header) {
System.out.println("Login Failed: " + header);
}
/**
* 好友离线时执行该方法
*/
public void userOffline(String loginName) {
System.out.println("USER " + loginName + " Logout.");
}
/**
* 好友上线时执行该方法
*/
public void userOnline(MsnFriend friend) {
System.out.println( "USER " + friend.getFriendlyName() + " Login.");
}
/**
* 有人加我为好友时执行
*/
public void whoAddedMe(MsnFriend friend) {
System.out.println("USER " + friend.getLoginName() + " Addme.");
try {
messenger.addFriend(friend.getLoginName());
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
* 有人把我从好友列表中删除时执行
*/
public void whoRemovedMe(MsnFriend friend) {
System.out.println("USER " + friend.getLoginName() + " Remove me.");
try {
messenger.removeFriend(friend.getLoginName());
}
catch (Exception e) {
e.printStackTrace();
}
}
还有一个就是获得好友列表以及好友的状态
public List<String> getBuddyList(MSNMessenger msn) {
BuddyGroup buddyGroup = msn.getBuddyGroup();
BuddyList buddyList = buddyGroup.getForwardList();
List list = null;
// check.
if (buddyList == null || buddyList.size() < 1)
return null;
for (int i = 0; i < buddyList.size(); i++) {
list = (list == null) ? new ArrayList() : list;
String fname = buddyList.get(i).getLoginName();
//list.add(buddyList.get(i).getStatus()+"");
list.add(fname);
}
return list;
}
还有就是主动发消息
搜索到的文章是:
最近好多网上的朋友发邮件询问如何通过jMSN主动发送消息的问题,现在给出解决的代码如下:
String lastLogin = "test@hotmail.com";
messenger.doCall(lastLogin);
Thread.sleep(1000);//最好在此有所延迟,要不SwitchboardSession创建容易失败
SwitchboardSession ss = messenger.doCallWait(lastLogin);
MimeMessage msg = new MimeMessage();
msg.setKind(MimeMessage.KIND_MESSAGE);
msg.setMessage("你好,周末愉快!");
ss.sendInstantMessage(msg);
文章出处:http://www.diybl.com/course/3_program/java/javashl/200899/141457.html
可惜我试过不好使
另外找到一个方法就是在MsnAdapter接口里实现如下方法
public void whoJoinSession( SwitchboardSession ss, final MsnFriend join )
{
boolean success=true;
String loginName = join.getLoginName();
if( ss.getSessionId()==null )
return;
MimeMessage msg = new MimeMessage("你好,这是机器人自动与你通话。");
msg.setKind(MimeMessage.KIND_MESSAGE);
try
{
success = messenger.sendMessage(ss.getMsnFriend().
getLoginName(), msg);
}
catch(Exception e)
{e.printStackTrace();
}
}
然后用如下代码触发事件
String lastLogin="xx@hotmail.com";
messenger.setMyStatus(UserStatus.ONLINE);
messenger.doCall(lastLogin);
SwitchboardSession ss = messenger.doCallWait(lastLogin); //这个会建立于xx@hotmail.com的连接。如果成功,就会调用上面的whoJoinSession方法
//当然可以在whoJoinSession方法里判断一下是谁(MsnFriend join),然后更加不同的人说不同的话
发送笑脸之类的可以设置 msg.setKind(2); String 为:|等