65.9K
CodeProject 正在变化。 阅读更多。
Home

在 .NET 中创建你的 Skype 机器人

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (24投票s)

2009年7月7日

CPOL

3分钟阅读

viewsIcon

279383

downloadIcon

10581

本文介绍了如何在 .NET 中创建 Skype 机器人。

skypebot.jpg

引言

本文的目的是解释

  • 如何让 Skype 与 .NET 协同工作。
  • 如何创建一个自动回复机器人。

当你输入命令 *!Date*(假设)时,它将显示当前日期。你可以扩展此应用程序以创建自己的机器人来处理你自己的请求。

几个月前,我为 Cropper(一个开源屏幕捕获工具)编写了一个 Skype 插件,名为 SendToSkype,基于相同的概念。如果你愿意,可以在 这里 查看它。

必备组件

  • Skype。我使用的是 4.0.0.227 版本。
  • 我使用的是 Visual C# 2008 Express Edition。但你可以使用任何版本。
  • COM 包装器 - Skype4COM,你可以在 这里 下载。我使用的是 1.0.31.0 版本,这是撰写本文时可用的最新版本。

什么是 Skype4COM COM 包装器?

Skype4COM 是一个接口,它将 Skype API 表示为具有属性、命令、事件和通知的对象。在任何 ActiveX 环境(如 Visual Studio 或 Delphi)中使用 Skype4COM,并使用熟悉的脚本语言,如 Visual Basic、PHP 或 JavaScript。阅读更多 此处

当你从头开始开发应用程序时...

  1. 下载 *Skype4COM.dll*。
  2. 在你的项目中“添加引用”到此 DLL。

示例代码

以下是附加的示例应用程序的代码。我想在这里粘贴整个代码,因为它只有几行。

using System;
using System.Windows.Forms;
using SKYPE4COMLib; // Our COM library

namespace SkypeBing
{
    public partial class Form1 : Form
    {
        private Skype skype;
        private const string trigger = "!"; // Say !help
        private const string nick = "BOT";
        
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            skype = new Skype();
            // Use skype protocol version 7 
            skype.Attach(7, false); 
            // Listen 
            skype.MessageStatus += 
              new _ISkypeEvents_MessageStatusEventHandler(skype_MessageStatus);
        }
        private void skype_MessageStatus(ChatMessage msg, 
                     TChatMessageStatus status)
        {
            // Proceed only if the incoming message is a trigger
            if (msg.Body.IndexOf(trigger) == 0)
            {
                // Remove trigger string and make lower case
                string command = msg.Body.Remove(0, trigger.Length).ToLower();

                // Send processed message back to skype chat window
                skype.SendMessage(msg.Sender.Handle, nick + 
                      " Says: " + ProcessCommand(command));
            }
        }

        private string ProcessCommand(string str)
        {
            string result;
            switch (str)
            {
                case "hello":
                    result = "Hello!";
                    break;
                case "help":
                    result = "Sorry no help available";
                    break;
                case "date":
                    result = "Current Date is: " + 
                             DateTime.Now.ToLongDateString();
                    break;
                case "time":
                    result = "Current Time is: " + 
                             DateTime.Now.ToLongTimeString();
                    break;
                case "who":
                    result = "It is Praveen, aka NinethSense " + 
                             "who wrote this tutorial";
                    break;
                default:
                    result = "Sorry, I do not recognize your command";
                    break;
            }

            return result;
        }
    }
}

记住!

当你尝试运行此应用程序时,请确保 Skype 也在运行。你将看到一个对话框,如下所示,请求你允许你的应用程序与 Skype 通信。

Screenshot_1.jpg

所以不要紧张。这没什么不寻常的。

源代码解释

声明

一旦你引用了 *Skype4COM.dll*,你就可以使用 SKYPE4COMLib,它是我们的核心 Skype 通信组件。

using SKYPE4COMLib;

接下来,我创建了一个私有对象 skype,类型为 SKYPE4COMLib.Skype,以便我可以在所有内部方法(Form1_Load()skype_MessageStatus()ProcessCommand())中使用它。

我使用了两个标识符来存储触发键和昵称,这样我们在 Skype 中使用的普通聊天消息就不会与触发器混淆。

private const string trigger = "!"; // Say !help
private const string nick = "BOT";

一个聊天的例子如下

>>Blah
>>!hello
>>BOT Says: Hello!

你可以根据自己的喜好更改触发器和昵称。

创建一个 Skype 对象并附加到 Skype

skype = new Skype(); // Usual c# object creation
skype.Attach(7, false);

这里,7 是 Skype 协议。

监听传入的消息

你需要基于 _ISkypeEvents_MessageStatusEventHandler 创建一个新的事件。

skype.MessageStatus += 
  new _ISkypeEvents_MessageStatusEventHandler(skype_MessageStatus);

你在 Skype 聊天窗口中输入的所有消息都将被监控并传递给名为 skype_MessageStatus() 的方法,以处理传入的消息/命令。

处理命令

这里是核心机器人操作。在方法 skype_MessageStatus 中,我们的应用程序检查传入的消息是否为命令。此外,为了避免区分大小写,我将消息转换为小写,以便在处理方法 (ProcessCommand()) 中,我只需要检查小写命令。

if (msg.Body.IndexOf(trigger) == 0)
{
    // Remove trigger string and make lower case
    string command = msg.Body.Remove(0, trigger.Length).ToLower();

    // Send processed message back to skype chat window
    skype.SendMessage(msg.Sender.Handle, nick + " Says: " + 
                      ProcessCommand(command));
}

skype.SendMessage() 是将字符串发送到 Skype 文本窗口的命令。msg.Sender.Handle 定义将消息发送给哪个 Skype 用户。

这是命令处理部分。此方法只是检查传入的命令并返回预定义的文本。我相信这里不需要太多解释。

private string ProcessCommand(string str)
{
    string result;
    switch (str)
    {
        case "hello":
            result = "Hello!";
            break;
        case "help":
            result = "Sorry no help available";
            break;
        case "date":
            result = "Current Date is: " + DateTime.Now.ToLongDateString();
            break;
        case "time":
            result = "Current Time is: " + DateTime.Now.ToLongTimeString();
            break;
        case "who":
            result = "It is Praveen, aka NinethSense who wrote this tutorial";
            break;
        default:
            result = "Sorry, I do not recognize your command";
            break;
    }

    return result;
}

你可以看到通过简单地添加更多 case 语句来扩展命令的数量非常容易。

历史

  • 首次发布:2009 年 7 月 7 日。
© . All rights reserved.