`
mengdejun
  • 浏览: 410233 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

MSN、QQ、GTalk机器人实现原理及代码

    博客分类:
  • .Net
阅读更多

腾讯滔滔近期发布,各大IT网站争相报道
最后的结论是滔滔不会做MSN、GTalk机器人,所以饭否、唧歪类网站在腾讯入侵后仍然有生存的余地。
twitter模式,即迷你博客网站的兴起、流行主要是因为接入方法多样我们打开这些网站,可以发现迷你博客内容的发布多数不是来自网页,超过半数是来自IM.因为IM是互联网发展到现在非常成功的一个产品,其中QQ、MSN、GTalk占有绝对优势.

 

我们的网民每天上网都会使用IM,而饭否、唧歪类网站是第一批开始借助IM运作的互联网产品
饭否是目前国内模仿twitter模式较为成功的,我们以饭否为例,IM我们以MSN为例
我们可以通过MSN接入饭否做以下事情,首先加饭否的MSN机器人为好友,记我的MSN帐号为A,饭否机器人MSN帐号为B,我在饭否加了一个好友为C:
1.A打开B,输入“H”,即A发送消息“H”给B,B马上把使用帮助信息发送给A
2.A打开B,输入其他字符串,马上饭否网站A的迷你博客有了一条新的,内容是这个字符串
3.C在饭否通过一种方式发布了一个迷你博客,A这时在用MSN,B为主动发送一个消息给A,消息内容是:C发布了迷你博客“迷你博客内容”
具体到技术层面,这些功能是怎么实现的呢?
微软公司的MSN,现在叫做Live Messager,提供了开发接口,通过更容易做二次开发的当推DotMSN2.0
开发平台为Visual Studio 2005,基于.net 2.0

我们对DotMSN2.0源代码进行了分析、改造,现总结如下:
先通过改造后的程序功能介绍让列位看官有一个感性的认识
整个应用程序有2个主体类

public partial class Robot : Form
//界面,实现机器人MSN帐号的登录,以及定时读取数据库
class MyConversation
//实现机器人与好友对话的功能
//Robot的实现:
// Create a Messenger object to use DotMSN.
private XihSolutions.DotMSN.Messenger messenger = new Messenger();
//构造函数
public Robot()
{
InitializeComponent();
// by default this example will emulate the official microsoft windows messenger client
messenger.Credentials.ClientID = "msmsgs@msnmsgr.com";
messenger.Credentials.ClientCode = "Q1P7W2E4J9R8U3S5";
//登录成功之后触发事件
messenger.NameserverProcessor.ConnectionEstablished += new EventHandler(NameserverProcessor_ConnectionEstablished);
messenger.Nameserver.SignedIn += new EventHandler(Nameserver_SignedIn);
messenger.ConversationCreated += new ConversationCreatedEventHandler(messenger_ConversationCreated);
}
//MSN机器人登录函数
private void login_Click(object sender, EventArgs e)
{
if (messenger.Connected)
{
SetStatus("Disconnecting from server");
messenger.Disconnect();
}
// set the credentials, this is ofcourse something every DotMSN program will need to
// implement.
messenger.Credentials.Account = account.Text;
messenger.Credentials.Password = password.Text;

// inform the user what is happening and try to connecto to the messenger network.
SetStatus("Connecting to server");
messenger.Connect();
// note that Messenger.Connect() will run in a seperate thread and return immediately.
// it will fire events that informs you about the status of the connection attempt.
// these events are registered in the constructor.
}
//Robot Form定时器执行函数
private void Timer_Tick(object sender, EventArgs e)
{
//遍历MSN机器人的所有好友
foreach (Contact contact in messenger.ContactList.All)
{
if (contact != null && contact.Online == true)
{
//实例化一个机器人与好友的对话
Conversation conversation = messenger.CreateConversation();
conversation.Invite(contact);//邀请好友参与对话
MyConversation agent = CreateMyConversation(conversation);//实例化一个对话处理
}
}
}
//对话处理的实例化(这个很关键)
/// <summary>
/// A delegate passed to Invoke in order to create the conversation form in the thread of the main form.
/// </summary>
private delegate MyConversation CreateConversationDelegate(Conversation conversation);

private MyConversation CreateMyConversation(Conversation conversation)
{
// create a new conversation. However do not show the window untill a message is received.
// for example, a conversation will be created when the remote client sends wants to send
// you a file. You don't want to show the conversation form in that case.
MyConversation agent = new MyConversation(conversation);

// do this to create the window handle. Otherwise we are not able to call Invoke() on the
// conversation form later.
//agent.Handle.ToInt32();

return agent;
}
//如果是第一次好友主动向MSN机器人发送消息,则调用
private void messenger_ConversationCreated(object sender, ConversationCreatedEventArgs e)
{
// check if the request is initiated remote or by this object
// if it is initiated remote then we have to create a conversation form. Otherwise the
// form is already created and we don't need to create another one.
if (e.Initiator == null)
{
// use the invoke method to create the form in the main thread
this.Invoke(new CreateConversationDelegate(CreateMyConversation), new object[] { e.Conversation });
}
}
//再来看看class MyConversation
private Conversation _conversation;

/// <summary>
/// The conversation object which is associated with the form.
/// </summary>
public Conversation Conversation
{
get { return _conversation; }
}
public MyConversation(Conversation conversation)
{
_conversation = conversation;
//绑定事件,处理好友发送消息给MSN机器人
Conversation.Switchboard.TextMessageReceived += new TextMessageReceivedEventHandler(Switchboard_TextMessageReceived);
Conversation.Switchboard.SessionClosed += new SBChangedEventHandler(Switchboard_SessionClosed);
Conversation.Switchboard.ContactJoined += new ContactChangedEventHandler(Switchboard_ContactJoined);
Conversation.Switchboard.ContactLeft += new ContactChangedEventHandler(Switchboard_ContactLeft);
}
//MSN机器人给好友发送消息
public void SendInput(String inputMessage)
{
// check whether there is input
if (inputMessage.Length == 0) return;

// if there is no switchboard available, request a new switchboard session
if (Conversation.SwitchboardProcessor.Connected == false)
{
Conversation.Messenger.Nameserver.RequestSwitchboard(Conversation.Switchboard, this);
}

// note: you can add some code here to catch the event where the remote contact lefts due to being idle too long
// in that case Conversation.Switchboard.Contacts.Count equals 0.

TextMessage message = new TextMessage(inputMessage);

/* You can optionally change the message's font, charset, color here.
* For example:
* message.Color = Color.Red;
* message.Decorations = TextDecorations.Bold;
*/

Conversation.Switchboard.SendTextMessage(message);
}
private void Switchboard_ContactJoined(object sender, ContactEventArgs e)
{
SendInput("定时发送的消息");//实现MSN机器人向好友主动推送消息
}
private void PrintText(string name, string text)
{
if (text.ToLower().Equals("h"))
{
SendInput(" 帮助命令如下:r输入“on”接收朋友信息r输入“off”停止接收朋友信息r输入“@用户名+空格+内容”给某人发送信息r输入“*用户名+空格+内容”给某人发送悄悄话r输入“find+空格+关键字”查询用户r输入“add+空格+用户名”添加某人为好友r输入其他信息则发送到有趣吧。");
}
}
//MSN机器人接收消息
private void Switchboard_TextMessageReceived(object sender, TextMessageEventArgs e)
{
PrintText(e.Sender.Name, e.Message.Text);
}
 



通过以上程序,即对dotmsn2.0实例代码的改造,初步实现了类似饭否、唧歪这些仿twitter的MSN机器人
我们结合上面的程序,再来看看饭否的MSN机器人
1.我们的MSN输入h给机器人,机器人可以把一个固定的字符串发过来,这就对应上面代码的Switchboard_TextMessageReceived模块;
2.我们输入其他信息给机器人,还是这个模块,只不过继续改装把这个消息数据写入到饭否的数据库;
3.我们的好友在饭否发布了消息,MSN机器人会马上主动把这个消息推送给我,这个怎么实现呢?
上面我给出的代码,Timer时间间隔设置为2秒,然后 Timer_Tick继续改造
先读取数据库,看有没有新的消息,如果有,则把这个消息发送者的关注者(并且绑定了MSN)形成一个MSN用户列表
这些用户肯定是MSN机器人的好友,于是下面可以把这个消息主动推送给这些用户,其他功能类似。

遗憾的是,在DotMSN2.0中还没有找到MSN用户个性签名变化引发的消息,希望列位看官有知道的给予补充。

这篇博文介绍了饭否类网站MSN机器人的实现
而GTalk机器人实现更为简单,因为Google公布了GTalk的协议以及开发文档,后面的文章会进行介绍
那么QQ机器人是怎么做的呢?我们研究了linux平台下的lumaqq源代码,并进行改造,后面的文章也会介绍QQ机器人是怎么实现,敬请关注。

另外MSN机器人会在我们的网站有趣吧(http://www.youqubar.com )使用,只要你添加我们的MSN机器人为好友
这个机器人会主动推送网站上新的趣图给您,敬请关注。

 

转自:http://herosoft.itpub.net/post/5802/471638

分享到:
评论

相关推荐

    MSN、QQ、GTalk机器人实现原理及代码.doc

    MSN、QQ、GTalk 机器人实现原理及代码 本文将对 MSN、QQ、GTalk 机器人的实现原理及代码进行详细的剖析和介绍。通过对 MSN 机器人的实现原理和代码的分析,我们可以了解到机器人是如何与用户进行交互的,以及机器人...

    vb.net Gtalk机器人

    【VB.NET GTalk机器人】是一种基于Google Talk(简称GTalk)协议开发的自动化程序,它允许开发者通过VB.NET编程语言创建一个能够与GTalk用户进行交互的机器人。这个机器人不仅能够自动发送预设的消息给指定的好友,...

    java Gtalk机器人

    Java GTalk机器人是一种使用Java编程语言开发的程序,它能够与Google Talk(简称Gtalk)聊天服务进行交互,实现自动化消息发送、接收以及各种自定义功能。Gtalk机器人通常是通过Google的Jabber协议实现的,这是一个...

    gtalk-robot:gtalk 机器人

    【gtalk-robot: Python构建的GTalk机器人】 在IT领域,尤其是自动化和通信技术方面,GTalk(Google Talk)机器人是一种使用编程语言与GTalk服务进行交互的应用程序。在这个案例中,我们关注的是"gtalk-robot",一个...

    asp.net获取MSN、Gtalk好友列表例子

    在本示例中,我们将探讨如何使用ASP.NET来获取MSN(Microsoft Messenger)和GTalk(Google Talk)的好友列表,以便在你的应用中实现朋友邀请功能。 首先,我们需要理解MSN和GTalk的协议。MSN使用微软的实时通信...

    架设在GAE上的GTalk翻译机器人

    架设在GAE上的GTalk翻译机器人 **目前已经存在的功能: 1. (0.1版开始支持) 可以直接识别中文和英文,并自动进行互译 1. (0.1版开始支持) 可以翻译一段文章,而不单单只是一个单词** **以后可能会有的功能: 1. (0.2...

    和gtalk一样的聊天工具

    由于某些单位可能只允许使用gtalk而屏蔽了其他如QQ、MSN等聊天工具,描述中提到的软件是为了解决这种限制,让用户能够在这些环境下也能实现类似的沟通需求。 Miranda IM(Miranda Instant Messenger)是文件名...

    fantalker:饭否GTalk机器人

    ==介绍==FanTalker是部署在Google App Engine云计算平台上的基于xmpp的Google Talk饭否机器人,使用JAVA开发。支持饭否的发送消息、查看时间线、回复消息等功能,更多功能即将上线。命令参考自[ TwitalkerPlus]和[ ...

    ch25_gtalk.rar_android_ch25_gtalk_gtalk_gtalk andro

    “ch25_gtalk”源代码为开发者提供了一个了解GTalk内部工作原理的窗口,特别是对于那些希望在Android上开发类似即时通讯应用的开发者来说,可以从中学到以下几点: 1. 如何在Android上集成和使用XMPP协议。 2. 如何...

    支持多协议的聊天工具,包括msn,qq,icq,gtalk,yahoo messenger!

    这意味着用户无需分别安装微软的MSN Messenger、腾讯的QQ、AOL的ICQ、Google的GTalk以及雅虎的Yahoo Messenger,只需通过Pidgin(根据压缩包中的文件名pidgin-2.5.2.exe推测出的软件名称)即可实现跨平台的聊天。...

    取得gtalk, aim, msn, yahoo message联系人java代码

    取得gtalk, aim, msn, yahoo message联系人java代码 所需jar包: http://download.csdn.net/source/968186 http://download.csdn.net/source/968173 http://download.csdn.net/source/968173 ...

    导出你的所有QQ好友

    好多朋友都开始转移到MSN、Gtalk等等服务。 可是qq很吝啬,没有提供好友导出功能。 一时冲动写了一个小程序来抓取所有好友列表。主要原理是利用qq邮箱来获取好友列表。 一些细节问题在源代码中都有说明,为了能够...

    gtalk样式自定义方法

    在探讨“gtalk样式自定义方法”的过程中,我们首先需要理解GTalk,即Google Talk,是谷歌曾经推出的一款即时通讯软件,它不仅提供了文本聊天、语音通话等功能,还允许用户自定义界面样式,以满足个性化需求。...

    GTalkSMS源码

    然后你就可以用你的主控端发送消息的方式控制你的手机 "&gt;GTalkSMS实现了一个xmpp机器人 只要你在自己的gtalk(xmpp)上增加这个机器人为好友 就能像聊天一样远程操作自己的android手机了 使用简单就像是在即时聊天...

    GTalk 绿色单文件版

    GTalk 绿色单文件版

    android/ophone开发完全讲义

    2. **机器人实现**:详述如何使用Java或Kotlin编写GTalk机器人,处理消息事件并回应用户。 3. **位置服务原理**:解释Android的位置服务架构,包括LocationManager和LocationProvider的概念。 4. **获取位置信息**:...

    Gtalk C# 开发

    3. **C#网络编程**:要实现GTalk客户端,你需要掌握C#的套接字编程,包括TCP连接、数据包封装和解封装等。 4. **事件驱动编程**:即时通讯应用通常需要实时监听服务器的事件,如新消息到达、用户上线或离线等。C#的...

    android Gtalk.apk

    Google Talk(Gtalk)是Google公司开发的即时通讯工具,Gtalk除了具备一般IM功能外,还加上了Viop功能,Gtalk界面清晰大方,可直接链接Gmail,轻松接受邮件。欢迎下载最新版google talk。

    mailpv后台获取邮箱密码,支持msn,outlook,gtalk

    可获取电脑内msn,outlook和gtalk内存储的账户与密码

Global site tag (gtag.js) - Google Analytics