豆腐生活

豆腐的平静生活
随笔 - 129, 评论 - 906, 引用 - 60

导航

关于

豆腐制作 都是精品

每月存档

最新留言

广告

 

今天化了一个下午的时间研究了一下MSN的协议,对MSN的协议注意了有很长的时间了,但是却一直没有亲自做过什么程序。
前面有开心的MSN,后来也给陈锐发过,今天决定自己做一个程序连带学习托管C++
基于MSN的开发其实非常简单,关键是熟悉MSN的协议,大家可以在这里学习到详细的MSN协议的知识,唯一可惜的就是全部英文,有心人可以翻译过来http://www.hypothetic.org/docs/msn/index.php
MSN的协议整体是比较简单易用的,只要解决了登录的问题,其它都非常简单.根据协议来看,应该有一个gateway.messenger.hotmail.com:80的登录服务器,但是我一直连接不上,
所以就和大家一样使用messenger.hotmail.com:1863来登录了,MS为了避免这个服务器负担过重,在协议中需要根据具体的情况换登录服务器,这些都需要在程序中加以考虑,我遇到了连续
登录三次给的服务器地址以后,还要换地址的情况,看来MSN登录太慢也应该就是这个原因的了.
在一个比较关键的问题就是passport验证的问题,这里采用的是https验证的方法,上次看MSDN Show的时候CHRIS SELLS说还有另外的一个办法
不过我在这里没有采用.仍然是传统的办法
方法就是通过连接passport的nexus服务器,然后根据nexus服务器的响应进行passport登录,通过这样的练习可以熟悉passport的一部分运作机制和原理,将来在自己的服务器调用passport服务的时候就不用让用户再看到MS的影子了笑脸
程序调试过程中得到了 蝈蝈小马哥的大力帮助,让我这个dot net门外汉不至于找不到门.
我是用Managed c++进行这个开发的,在codeproject上有一个C#的project,我做完自己的程序以后发现,我们两个的代码真的很类似,说抄袭都没有人不信,但是我真的是自己写的
如果你对自己进行协议层的MSN开发没有兴趣,而对应用层的开发有兴趣,你可以联系开心或者去这里
codeproject上的demo在这里:http://www.codeproject.com/csharp/ConnectingToMSN.asp

我把我的代码贴到文章里面了,没有什么特色,大家见笑了。

打印 | 张贴于 2004-03-16 18:20:00 | Tag:暂无标签

留言反馈

#回复: 利用MSN协议开发 编辑
yangming.wu@hotmail.com 交流msn客户端开发
2007-12-03 16:41:00 | [匿名:yangming]
#re: 利用MSN协议开发 编辑
你好!我想问一下MSN客户端有不断向服务器发送保持连接包吗?如果有的话是不是每个包中都有用户的帐号信息!因为我想提取包中的用户帐号信息!
2006-10-05 21:39:00 | [匿名:CC]
#re: 利用MSN协议开发 编辑
有谁用sip做过 msn 登录的,现在以一点头绪都没有了
2006-08-23 09:46:00 | [匿名:frank]
#★★★在哥们,Help Me: 怎样才能用VB编程实例简单的MSN功能? 编辑
我想用MSN功能和单片机编程实现远程设备控制,无奈不知道才能实现MSN那种收发信息的功能,找了个VB版的MSN源代码可登录不上,请大哥们帮帮忙。有什么高招!

联系:msnmailgj@163.com
2006-03-18 12:42:00 | [匿名:TT]
#re: 利用MSN协议开发 编辑
哪位大哥了解MSN传输文件的协议。。
新版本的好像和以前不太一样了。。
交流:MSN: timixu at hotmail.com
2006-03-06 09:20:00 | [匿名:timixu]
#help me!!就是没有Authentication-Info! 编辑
Connection = close
Date = Mon, 23 Jan 2006 06:14:53 GMT
Server = Microsoft-IIS/6.0
PPServer = PPV: 30 H: BAYPPLOG2A06 V: 0
Content-Type = text/html; charset=iso-8859-1
Expires = Mon, 23 Jan 2006 06:13:53 GMT
Cache-Control = no-cache
Pragma = no-cache
P3P = CP="DSP CUR OTPi IND OTRi ONL FIN"
Set-Cookie = MSPRequ=lt=1137996893&co=1&id=N
Set-Cookie = MSPBack=0; domain=.passport.com;path=/;version=1
Connection = Keep-Alive
Content-Length = 823
2006-01-23 14:18:00 | [匿名:sunny]
#没法取到Authentication-Info,其它的http响应头如Server和P3P能取到,请求帮助! 编辑
public void GetClientTicket(String password,
String username,
String challengeString,
Vector vc) throws IOException {
System.out.println("在getClientTicket里vc.size()=" + vc.size());
for (int i = 0; i < vc.size(); i++) {
System.out.println("在geClientTicket中取的vc=" + vc.get(i));
if (i == DALOGIN) {
//uri = vc.get(1).toString();
uri = "login.passport.com";
}
}
System.out.println("GetClientTicket中的uri=" + uri);
// 执行postMethod
try {
while (true) {
int step = 1;
HttpClient httpClient = new HttpClient();
String uri2 = null;
System.out.println("uri" + uri);
String uriReall = null;
if (step != 1) {
uriReall = "https://" + uri2;
} else {
uriReall = "https://" + uri;
}
GetMethod postMethod = new GetMethod(uriReall);
postMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler());

httpClient.getParams().setVersion(HttpVersion.HTTP_1_0);
postMethod.setRequestHeader(new Header("Authorization",
"Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in="
+ username.replace("@", "%40") +
",pwd=" +
password + ","
+ challengeString + "\r\n"));
postMethod.setRequestHeader(new Header("Host","login.passport.com\r\n"));
System.out.println("handshake before............");
int statusCode = httpClient.executeMethod(postMethod);
.out.println("statusCode=" + statusCode);
// HttpClient对于要求接受后继服务的请求,象POST和PUT等不能自动处理转发
if (statusCode == HttpStatus.SC_OK) {
System.out.println("AAAAAAAAAAA");
System.out.println("P3P=" +postMethod.getResponseHeader("P3P").getValue());

Header Authentication = postMethod.getResponseHeader(
"Authentication-Info");
if(Authentication == null){
System.out.println("Authentication-Info is null");
}else{
System.out.println("Authentication-Info isn't null");
}
System.out.println("BBBBBBBBBBBBB");
} else if (statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {
// 从头中取出转向的地址
Header locationHeader = postMethod.getResponseHeader(
"Location");
uri2 = locationHeader.getValue();
String location = null;
if (locationHeader != null) {
location = locationHeader.getValue();
uri2 = location;
System.out.println("The page was redirected to:" +
location);
System.out.println("cache-control=:" +
postMethod.getResponseHeader(
"cache-control=").getValue());
} else {
System.err.println("Location field value is null.");
}

}
step++;
} //end while
} catch (Exception e) {
e.printStackTrace();
}
}
2006-01-23 11:37:00 | [匿名:sunny]
#re: 利用MSN协议开发 编辑
public void GetClientTicket(String password,
String username,
String challengeString,
Vector vc) throws IOException {
System.out.println("在getClientTicket里vc.size()=" + vc.size());
for (int i = 0; i < vc.size(); i++) {
System.out.println("在geClientTicket中取的vc=" + vc.get(i));
if (i == DALOGIN) {
//uri = vc.get(1).toString();
uri = "login.passport.com";
}
}
System.out.println("GetClientTicket中的uri=" + uri);
// 执行postMethod
try {
while (true) {
int step = 1;
HttpClient httpClient = new HttpClient();
String uri2 = null;
System.out.println("uri" + uri);
String uriReall = null;
if (step != 1) {
uriReall = "https://" + uri2;
} else {
uriReall = "https://" + uri;
}
GetMethod postMethod = new GetMethod(uriReall);
postMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler());

httpClient.getParams().setVersion(HttpVersion.HTTP_1_0);
postMethod.setRequestHeader(new Header("Authorization",
"Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in="
+ username.replace("@", "%40") +
",pwd=" +
password + ","
+ challengeString + "\r\n"));
postMethod.setRequestHeader(new Header("Host","login.passport.com\r\n"));
System.out.println("handshake before............");
int statusCode = httpClient.executeMethod(postMethod);
.out.println("statusCode=" + statusCode);
// HttpClient对于要求接受后继服务的请求,象POST和PUT等不能自动处理转发
if (statusCode == HttpStatus.SC_OK) {
System.out.println("AAAAAAAAAAA");
System.out.println("P3P=" +postMethod.getResponseHeader("P3P").getValue());

Header Authentication = postMethod.getResponseHeader(
"Authentication-Info");
if(Authentication == null){
System.out.println("Authentication-Info is null");
}else{
System.out.println("Authentication-Info isn't null");
}
System.out.println("BBBBBBBBBBBBB");
} else if (statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {
// 从头中取出转向的地址
Header locationHeader = postMethod.getResponseHeader(
"Location");
uri2 = locationHeader.getValue();
String location = null;
if (locationHeader != null) {
location = locationHeader.getValue();
uri2 = location;
System.out.println("The page was redirected to:" +
location);
System.out.println("cache-control=:" +
postMethod.getResponseHeader(
"cache-control=").getValue());
} else {
System.err.println("Location field value is null.");
}

}
step++;
} //end while
} catch (Exception e) {
e.printStackTrace();
}
}
2006-01-23 11:34:00 | [匿名:看看这这段code,可就是没法取里Authentication-]
#re: 利用MSN协议开发 编辑
我也想用ASP。NET做一个可以和MSN结合的程序,就像网上的“SORSS”一样,但我不知该从何下手,请给点指点!


谢谢你!
2005-12-29 16:09:00 | [匿名:李晓]
#re: 利用MSN协议开发 编辑
我也在对MSN协议编成,现在已经完成登陆和信息发送,发送
但是认证上老出问题
<<<CHL 0 29792109415679580616
>>>QRY 11 PROD00504RLUG%WL 32
1a384df6f29cb61a6f61eb286f704141
<<<QRY 11
然后就把我断开
不知为什么
渴求交流
13202941007
2005-12-28 10:19:00 | [匿名:osboy]
#re: 利用MSN协议开发 编辑
想用VC做一个实现MSN基本功能的DLL,包括登录,加好友,收发信息的功能,大家有相应的demo或网上有现成的不?
请给我发一份吧,感激不尽
dragon_lsl@163.com
2005-11-15 13:00:00 | [匿名:dragon]
#re: 利用MSN协议开发 编辑
请问:如何在登陆后获取该HOTMAIL的好友列表?
求高手解答!
我的MSN:OCEANHC@HOTMAIL.COM
2005-09-15 12:50:00 | [匿名:OCEAN]
#我在做MSN协议分析。 编辑
我在做MSN的协议分析,wangyan12@21cn.com
2005-08-12 14:45:00 | [匿名:wangyan]
#模拟msn源代码-(与NS服务器通信)- - 编辑
模拟msn源代码-(与NS服务器通信)- -
2005-05-29 12:17:00 | [匿名:模拟msn源代码-(与NS服务器通信)- -]
#re: 利用MSN协议开发 编辑
我近期也在开发通讯工具,想和MSN结合,有谁能提供demo,小弟用的开发工具是delphi+java,我的邮箱是erictian03@163.com,
在下先谢了
2005-05-15 10:18:00 | [匿名:erictian03]
#re: 利用MSN协议开发 编辑
你好,我现在在用lcs 和 windows messenger做开发,但是不知道怎么才能和windows messenger通信阿,msnp8上有一个dotmsn, 不知道sip上有什么比较好用的sdk没有,微软的rtc倒是可以做,但是太复杂了
2005-04-12 13:23:00 | [匿名:mikey]
#re: MSNЭ鿪 编辑
?
2005-02-26 11:17:00 | [匿名:ZTH]
#re: MSNЭ鿪 编辑
?
2005-02-26 11:14:00 | [匿名:ZTH]
#re: 利用MSN协议开发 编辑
__gc public class MsnLib

{

public:

MsnLib(void)

: m_pServer(NULL)

, m_pNs(NULL)

{

}

这块代码是什么意思呢?能不能解释一下啊?谢谢哈!
2004-12-03 21:33:00 | [匿名:fancc]
#re: 利用MSN协议开发 编辑
请问我架设了一台EXCHANGE主机于公网合法IP上,同时在上面装了LCS2003,邮件用玉米收发都很正常的,而LCS必须使用相同网断的才可以LOGIN上去,我在内部地址可以PING通外网主机,玉米解析也到位的,如何正确设置LOGIN项才可以在别的网段也可以LOGIN呢?谢谢了!
2004-10-22 13:49:00 | [匿名:大恐龙]
#re: 利用MSN协议开发--验证问题 编辑
关于,验证问题,参考英文文档,可以作到用 hotmail 的油箱登陆,但是如果采用其他的油箱 登陆,却无法实现,那位可以帮忙?
2004-09-15 17:56:00 | [匿名:woo]
#re: 利用MSN协议开发 编辑
为什么我在用ConnectingToMSN时,登录成功后在别人的MSN上看不到在线呢。我使用CHG命令,返回的总是MIME....
2004-08-15 11:12:00 | [匿名:tt]
#re: 利用MSN协议开发 编辑
怎 么进行passport验证,可以发个邮件告诉我吗。。
132xyz20@163.com小弟在此谢过了
2004-08-03 15:46:00 | [匿名:叶小平]
#回复: 利用MSN协议开发 编辑
有人用过jMsn开发吗
2004-06-24 11:52:00 | [匿名:wangjunjoe@hotmail.com]
#回复: 利用MSN协议开发 编辑
呵呵,我也对MSN协议很感兴趣,而且也研究一阵子了。
我发现微软经常对MSN协议进行小改动,呵呵~
我用 C++ 和 VB 都成功登陆了,不过,UTF-8解码确实烦人~
2004-05-24 11:57:00 | [匿名:Hex]
#回复: 利用MSN协议开发 编辑
messenger.hotmail.com:1863这个服务器我在开发过程中一直可以登陆阿?你说得换服务器是不是换到NS服务器阿?
2004-03-25 00:00:00 | [匿名:阿闻]
#回复: 利用MSN协议开发 编辑
呵呵,好巧阿,我也刚刚写过一个类似的程序,我在开发初期是参照jmml写的,我把有关msn的功能都封装在了一个dll里面,这样可以便于以后调用,我正在用这个写一个web上登录msn的程序,同样可以用来开发机器人,这不过时间和水平有限,这个东西还是比较多bug和效率比较低下。
2004-03-24 23:56:00 | [匿名:阿闻]
#回复: 利用MSN协议开发 编辑
好复杂啊:(

豆腐,如果连上了,怎么通信?不明白~~
2004-03-18 17:55:00 | [匿名:溺水妖精]
#回复: 利用MSN协议开发 编辑
To 小峰:
MSN Messenger或者说Windows Messenger的普通帐号使用的都是MSNP协议。这也是我们最常使用的。
而SIP是LCS及原来的Exchange IM Server所使用的协议。
简单来说,SIP只能在AD环境下使用,而MSNP则是广域网的,只需要Passport就可以了:)
2004-03-17 10:19:00 | [匿名:开心就好]
#回复: 利用MSN协议开发 编辑
MSN应该用的是SIP协议吧
2004-03-16 23:12:00 | [匿名:小峰]
#回复: 利用MSN协议开发 编辑
gz
我们刚好有一个需求,就是将OA电子表单链接发送到MSN.
2004-03-16 19:01:00 | [匿名:Dream]
#回复: 利用MSN协议开发 编辑
那个站点是偶像级人物诶:) 那时候开发短信的东西没少跑那里.
2004-03-16 18:50:00 | [匿名:Bz]
#回复: 利用MSN协议开发 编辑
开发一个MSN Robet,可以自动订阅博客堂的RSS以及接收自己的回复通知?好不好呀?:)
我可以给你提供结口:)
2004-03-16 18:38:00 | [匿名:开心就好]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.2.0