MSN机器人-头像显示

这里只描述下如何设置机器人的头像,并且传输给用户。
1.使用CHG指令告诉MSN服务器你更换了头像

例如: CHG 15 NLN 1610612736 [ MSNObjectStr ]
CHG指令格式不介绍了,[msnobjectStr]字符串的生成,这里给出代码,最终需要urlencode下:

public class MSNObject {

private String creator;
private String type;
private String sha1d;
private String sha1c;
private String size;
private String location;
private String friendly;

public static MSNObject parse(String msnObjStr) {
if (msnObjStr == null)
return null;
MSNObject obj = new MSNObject();
String regex = "\\s+([^\\=]+)\\=\"([^\"]+)\"";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(msnObjStr);
while (m.find()) {
try {
obj.getClass().getMethod("set" + toLowerUp1Case(m.group(1)), new Class[] { String.class }).invoke(obj, m.group(2));
} catch (Exception e) {
e.printStackTrace();
}
}

return obj;
}

public String getCreator() {
return creator;
}

public void setCreator(String creator) {
this.creator = creator;
}


public String getSha1d() {
return sha1d;
}

public void setSha1d(String sha1d) {
this.sha1d = sha1d;
}

public String getFriendly() {
return friendly;
}

public void setFriendly(String friendly) {
this.friendly = friendly;
}

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

public String getSize() {
return size;
}

public void setSize(String size) {
this.size = size;
}

public String getLocation() {
return location;
}

public void setLocation(String location) {
this.location = location;
}

public static String toLowerUp1Case(String str){
StringBuffer sb = new StringBuffer(str);
sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
for (int i = 1; i < sb.length(); i++) {
Character temp = sb.charAt(i);
sb.setCharAt(i, Character.toLowerCase(temp));
}
return sb.toString();
}

public String toString(){
StringBuilder sb = new StringBuilder();
sb.append("<msnobj Creator=\"");
sb.append(creator);
sb.append("\" Size=\"");
sb.append(size);
sb.append("\" Type=\"");
sb.append(type);
sb.append("\" Location=\"");
sb.append(location);
sb.append("\" Friendly=\"");
sb.append(friendly);
sb.append("\" SHA1D=\"");
sb.append(sha1d);
StringBuilder sha1c = new StringBuilder();
sha1c.append("Creator");
sha1c.append(creator);
sha1c.append("Size");
sha1c.append(size);
sha1c.append("Type");
sha1c.append(type);
sha1c.append("Location");
sha1c.append(location);
sha1c.append("Friendly");
sha1c.append(friendly);
sha1c.append("SHA1D");
sha1c.append(sha1d);
try{
sb.append("\" SHA1C=\""+StringUtil.sha1(sha1c.toString().getBytes("utf-8")));
}catch(Exception e){}
sb.append("\"/>");
return sb.toString().replaceAll("\\n","");
}

public String getSha1c() {
return sha1c;
}

public void setSha1c(String sha1c) {
this.sha1c = sha1c;
}

下面是SHA-1摘要的base64加密字符串方法:

public static String sha1(byte[] data) {
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(data);
byte[] b = md.digest();
return new BASE64().encode(b);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}


2.当对方和你的机器人通讯的时候,对方msn发出一个p2p请求。
3.应答请求invite acknowledge,并且回复200 OK p2p消息
4.对方回复200 OK acknowledge
5.你告诉对方Data prepare
6.对方响应Data prepare acknowledge
7.发送p2p data数据
8.对方回复p2p data acknowledge
9.对方回复bye p2p 消息
10.你响应bye acknowlege

这里面需要理解binaryheader中的各字段的含义:
每次p2p数据的解析和生成都至关重要,一个字段错误就不能进入下个环节。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值