漫长的国庆长假,没女朋友陪,和几个同学在在寝室玩游戏,闲来无聊,操起FireFox+fireBug把WebFetion大卸八块,写了个飞信的开发包,没什么技术含量,纯属无聊。项目地址:http://code.google.com/p/litefetion/
邮箱: [email protected]基本实现的功能有:1. 使用WebFetion的协议
2. 支持使用飞信号或者手机号登陆
3. 接收和发送短信或则飞信
4. 给自己发送短信
5. 以飞信号或者手机号添加好友
6. 同意或者拒绝对方添加好友请求
7. 修改自己个性签名
8. 修改在线状态
9. 获取好友头像
10.将好友加入黑名单
11.支持好友分组
12.完全同的步的操作主要是登录和发消息需要验证码,无法完全自动化,有点遗憾,不过已经完全可以做个简单的登录飞信给好友或者自己发送短信的功能了,嵌入自己的应用中。没有测试能否部署到GAE上, 理论上完全可行,但就是不知道飞信的服务器封了GAE的URLFetch服务器的地址没,如果没有完全可以部署到GAE上。欢迎CSDN的高手批评指正。另外给个贴个测试代码,懒得写了,直接贴发布包里面的测试代码:
public class LiteFetionTest
{
public static void main(String [] arg) throws Exception {
final LiteFetion client = new LiteFetion();

//首先获取登录验证码
VerifyImage image = client.retireVerifyImage(VerifyImage.TYPE_LOGIN);
VerifyDialog dialog = new VerifyDialog(image, client);
dialog.setVisible(true);
image = dialog.waitOK();
//执行登录
ActionResult r = client.login("15912345678","1234", Presence.AWAY, image);
System.out.println("LoginReulst:"+r.toString());
if(r==ActionResult.SUCCESS) {

//默认分组
Iterator<Buddy> bit = client.getBuddyList().iterator();
System.out.println("-------------[ 默认分组 ]------------------");
while(bit.hasNext()) {
System.out.println(bit.next());

Buddy testBuddy = client.getBuddyByUserId(335284404);

//尝试给自己发送消息
System.out.println("SendSMStoSelf:"+client.sendSelfSMS("来自LiteFetion的短信"));

//给好友发送飞信
System.out.println("SendMessage:"+client.sendMessage(testBuddy, "来自LiteFetion的飞信。", false));

//给好友发送短信
System.out.println("SendSMS:"+client.sendMessage(testBuddy, "来自LiteFetion的短信。", true));

//设置心情短语
System.out.println("SetImpresa:"+client.setImpresa("ABDEE"));

//设置在线状态
System.out.println("SetPresence:"+client.setPresence(Presence.AWAY, "我吃饭去了~~~"));

//添加好友
VerifyImage vc = client.retireVerifyImage(VerifyImage.TYPE_ADD_BUDDY);
dialog = new VerifyDialog(vc, client);
dialog.setVisible(true);
vc = dialog.waitOK();
System.out.println("AddBuddy:"+client.addBuddy("13887654321`", "小牛", "峰子", null ,vc ));


//加入黑名单
System.out.println("BlackBuddy:"+client.blackBuddy(testBuddy));

//获取头像
System.out.println("RetirePortrait:"+client.retirePortrait(testBuddy, 4));
if(testBuddy.getPortrait()!=null) {
ImageIO.write(testBuddy.getPortrait(), "JPG", new File("portrait-"+testBuddy.getUserId()+".jpg"));
}

//启动类似于windows的消息循环,获取服务器发送的通知,比如好友在线状态,接受消息等...
boolean isLogout = false;
while(!isLogout) {
List<Notify> list = client.pollNotify(); //总是返回一个size>=0的通知列表 ,所以直接迭代,不用判断null
Iterator<Notify> nit = list.iterator();
while(nit.hasNext()) {
Notify notify = nit.next();
switch(notify.getType()) {
case BUDDY_MESSAGE: //好友消息消息
BuddyMessageNotify bn = (BuddyMessageNotify) notify;
System.out.println("收到好友消息:text="+bn.getMessage()+"; from="+bn.getBuddy().getDisplayName());

//尝试发送相同的消息
client.sendMessage(bn.getBuddy(), "你说:"+bn.getMessage(), false);
break;

case CLIENT_STATE: //客户端状态
ClientStateNotify cn = (ClientStateNotify) notify;
System.out.println("客户端状态改变了:"+cn.getClientState());
if(cn.getClientState()==ClientState.NET_ERROR || cn.getClientState()==ClientState.OTHER_LOGIN) {
isLogout = true;
client.logout();
}
break;

case BUDDY_STATE: //好友状态改变
BuddyStateNotify sn = (BuddyStateNotify) notify;
System.out.println("好友状态改变了:buddy="+sn.getBuddy().getDisplayName()+", current="+sn.getCurrentState()+", before="+sn.getBeforeState());
break;

case BUDDY_APPLICATION:
BuddyApplicationNotify an = (BuddyApplicationNotify) notify;
System.out.println("收到了好友请求:buddy="+an.getBuddy().getDisplayName()+", 说明:"+an.getDesc());
System.out.println("自动同意添加好友请求:"+client.handleBuddyApplication(an.getBuddy(), true, null, null));
break;

case APPLICATION_CONFIRMED:
ApplicationConfirmedNotify fn = (ApplicationConfirmedNotify) notify;
System.out.println("收到添加好友的回复:"+fn.getBuddy().getDisplayName()+" "+(fn.isAgreed()?"同意":"拒绝")+"了你添加好友的请求。");

if(!fn.isAgreed()) {
vc = client.retireVerifyImage(VerifyImage.TYPE_ADD_BUDDY);
dialog = new VerifyDialog(vc, client);
dialog.setVisible(true);
vc = dialog.waitOK();
System.out.println("未同意添加好友请求,重新发起添加好友请求:"+client.addBuddy(""+fn.getBuddy().getMobile(), "xxx", null, null, vc));
}
break;

}
}

}
client.logout();
}
}
}

解决方案 »

  1.   

    不会呀,我是使用UTF8编码的,如你需要编译,一定要更改Eclipse里面工程的编码,因为Eclipse在windows下面默认的是GBK。
      

  2.   

      
    你可以参考下test/net/solosky/litefetion/LiteFetionTest.java这个测试类来使用。
      

  3.   

    自己写的包如何加入到JDK里??一直不明白怎么弄呢··
      

  4.   

    记得2008年写个一个手机版本的fetion当时fetion协议是不公开的,我也是抓包出来的  现在fetion开源了吗? 学习学习
      

  5.   


    LiteFetion是模拟WebFetion的协议,既然是Web版的飞信,协议自然没法隐藏了。
    MapleFetion使用的就是和官方客户端一样的协议,如果有兴趣,可以参考下。