Этот сайт не наркоманов. Это сайт программистов.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Мы в твиттере!
Мы вконтакте!
Мы на яндексе!

Краснодарское время: 11 Февраль, 2012, 06:23:03

Страниц: [1]
Печать
Автор Тема: Пишем бота для Skype на C#  (Прочитано 6038 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Frozzeg    ↓ 
07 Октябрь, 2011, 11:32:18
НЕ ХУЕТА! ХУЕТА!

Группа: Санитары

Карма: 80
Сообщений: 5308
Сила слова: 1.51

Сделаю оговорочку сразу спешил фор кулхацкеров: бот не умеет спамить, рассылать сообщения и т.д., он просто отвечает если ему кто-то напишет.
 
Давайте напишем бота, который будет показывать время сервера. Серверные команды будут начинаться с символа "!".
 
Для начала качаем COM обертку для работы со Skype API отсюда.
 
Распаковываем архив и регистрируем dll в системе: Пуск -> Выполнить -> "regsvr32 E:\Skype4COM.dll", где "E:\" - путь к dll.
 

 
Теперь создаем новый проект Winforms и добавим в него ссылку на dl: Project - Add References - Browse (находим библиотеку и нажимаем Ok).
 

 
Перейдем к коду.
 
Объявляем пространства имен:
C#
using System;
using System.Windows.Forms;
using SKYPE4COMLib;

Инициализация объектов:
C#
private Skype skype;
        private int count;

Создаем новый экземпляр класса Skype и ставим обработчик событий:
C#
public Form1()
        {
            InitializeComponent();
 
            skype = new Skype();
            // Совокупляемся со скайпом))
            skype.Attach(7, false);
            // Начинаем слушать сообщения
            skype.MessageStatus += new _ISkypeEvents_MessageStatusEventHandler(skype_MessageStatus);
        }

Обработчик событий:
C#
private void skype_MessageStatus(ChatMessage msg, TChatMessageStatus status)
        {
            // Если вначале сообщения стоит символ "!"
            if (msg.Body.IndexOf("!") == 0)
            {
                count++; // увеличиваем количество вызванных обработчиков
                if (count == 2) // если обработчик вызван второй раз обрабатываем команду !time и отсылаем результат клиенту
                {
                    // Отсылаем результат клиенту
                    skype.SendMessage(msg.Sender.Handle, CommandHandler(msg.Body.Replace("!", "")));
                    count = 0;
                }
            }
        }
По непонятным причинам метод skype_MessageStatus вызывается дважды.
 

Обработчик команд:
C#
private string CommandHandler(string str)
        {
            string result = "";
            switch (str.ToLower())
            {
                case "time":
                    result = "Current Time is: " + DateTime.Now.ToLongTimeString();
                    break;
            }
            return result;
        }

Компилируем, запускаем скайп, затем нашего бота - в скапе должно появится такое окошно
 

 
жмем "Дать доступ" и наслаждаемся)
 

* SkypeBot.rar (997.7 Кб - загружено 341 раз.)
« Последнее редактирование: 07 Октябрь, 2011, 11:32:18 от Frozzeg » Записан

Эксперт — это человек, который в узкой области допустил все возможные ошибки. © Нильс Бор.
adw0rd    ↓ 
16 Август, 2009, 04:20:08 , спустя
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: Джедаи

Карма: не нужна
Сообщений: 17223
Сила слова: 1.65

Таки дописал :)
Записан

FreeBSD, Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch
Кинсбург * Либург * Футбург * Мой блог
Frozzeg    ↓ 
16 Август, 2009, 04:22:11 , спустя 2 минуты 3 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: Санитары

Карма: 80
Сообщений: 5308
Сила слова: 1.51

угу)
 
ночью что-то делать - это пиздец, на ровном месте ошибки появляются... все я спать
Записан

Эксперт — это человек, который в узкой области допустил все возможные ошибки. © Нильс Бор.
adw0rd    ↓ 
16 Август, 2009, 04:25:15 , спустя 3 минуты 4 секунды
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: Джедаи

Карма: не нужна
Сообщений: 17223
Сила слова: 1.65


угу)
 
ночью что-то делать - это пиздец, на ровном месте ошибки появляются... все я спать
угу, я щ тоже закомичу новый нотифер для пм и тоже спать
Записан

FreeBSD, Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch
Кинсбург * Либург * Футбург * Мой блог
Qpal-off    ↓ 
19 Июль, 2011, 08:50:35 , спустя 702 дня 4 часа 25 минут 20 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 1
Сила слова: 0

Подскажите как при входе в Skype менять  юзера и пароль через API (Skype4COM.dll)?
Записан
Frozzeg    ↓ 
19 Июль, 2011, 09:03:06 , спустя 12 минут 31 секунду
НЕ ХУЕТА! ХУЕТА!

Группа: Санитары

Карма: 80
Сообщений: 5308
Сила слова: 1.51

хз
Записан

Эксперт — это человек, который в узкой области допустил все возможные ошибки. © Нильс Бор.
phpdude    ↓ 
19 Июль, 2011, 09:11:14 , спустя 8 минут 8 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 339
Сообщений: д-о-х-у-я!
Сила слова: 1.72

msg.Body.Replace("!", "")
пиздец ошибка критическая по факту. У тебя идентификатор команду боту - наличие ! в начале сообщения. нахуй менять везде то?) или это только одну замену произведет? я точно не помню а доку открывать лень.
 
по сути тебе тут сабстр надо было юзать да и все
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
Frozzeg    ↓ 
19 Июль, 2011, 09:24:08 , спустя 12 минут 54 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: Санитары

Карма: 80
Сообщений: 5308
Сила слова: 1.51

да пиздец ))
Записан

Эксперт — это человек, который в узкой области допустил все возможные ошибки. © Нильс Бор.
phpdude    ↓ 
19 Июль, 2011, 09:25:01 , спустя 53 секунды
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 339
Сообщений: 19718
Сила слова: 1.72


да пиздец ))
HEADSHOT!!! MULTIKILL!!!!
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
megajohn    ↓ 
10 Октябрь, 2011, 06:08:07 , спустя 83 дня 8 часов 43 минуты 6 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 1
Сила слова: 0

По непонятным причинам метод skype_MessageStatus вызывается дважды.
это потому что status не анализируется, а там  cmsReceived либо cmsSent либо еще всякое
Записан
Sinkler    ↓ 
10 Октябрь, 2011, 06:12:04 , спустя 3 минуты 57 секунд
НЕ ХУЕТА! ХУЕТА!

Похуй, пляшем!
Группа: Джедаи

Карма: 61
Сообщений: 6102
Сила слова: 1

чет много развелось не пхпшников
Записан

Frozzeg    ↓ 
10 Октябрь, 2011, 07:29:56 , спустя 1 час 17 минут 52 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: Санитары

Карма: 80
Сообщений: 5308
Сила слова: 1.51

megajohn, это было давно и неправда
Записан

Эксперт — это человек, который в узкой области допустил все возможные ошибки. © Нильс Бор.
Nickitee    ↓ 
11 Октябрь, 2011, 08:32:35 , спустя 1 день 1 час 2 минуты 39 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 1
Сила слова: 0

Полезная тема, но был просто убит на повал, когда на одном форуме нашёл темку где продаётся "cпамер" Skype за 70$, ему краснючая цена 5$, тем более что всё на ладони.
Если кому пригодится, то вот пример как проверить приатачился скайп или нет.
После объявления скайпа:
C#
((_ISkypeEvents_Event)skype).AttachmentStatus += AttachedOrNot;
      bool attached = false;
Сама функция:
C#
                private void AttachedOrNot(TAttachmentStatus status)
        {
                if (status == TAttachmentStatus.apiAttachPendingAuthorization)
                {
                    richTextBox1.AppendText("\nAttaching to Skype...");
                }
                if (status == TAttachmentStatus.apiAttachSuccess)
                {
                    richTextBox1.AppendText("\nSkype attached!");
                    attached = true;
                }
                if (status != TAttachmentStatus.apiAttachPendingAuthorization && status != TAttachmentStatus.apiAttachSuccess)
                {
                    richTextBox1.AppendText("\n" + status.ToString());
                }
        }
 
и код на ту же кнопку:
C#

            try
            {
                if (skype.Client.IsRunning)
                {
                    if (attached)
                    { }
                    else
                    {
                        skype.Attach(7, false);
                    }
                }
                else
                {
                    richTextBox1.AppendText("\n Skype is not running, please start Skype and try attach again");
                }
            }
            catch (Exception ex)
            {
                richTextBox1.AppendText("\n" + ex.Message);
            }
 
Записан
AngelicCare    ↓ 
28 Декабрь, 2011, 07:06:24 , спустя 77 дней 10 часов 33 минуты 49 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 1
Сила слова: 0

Исправлен баг
 
C#

using System;
using System.Windows.Forms;
using SKYPE4COMLib;
    
class HelloWorld
{
    
//    public static int Main(string[] args)
        static void Main(string[] args)
        {
            System.Windows.Forms.Application.Run(new MyWindow());
        }
}
class MyWindow: Form
{
        //конструктор
        private static Skype skype;
        static uint ProcCallCount = 0;
        public MyWindow() {
            System.Console.WriteLine("Initializing Skype...");
            skype = new Skype();
            // Совокупляемся со скайпом))
            skype.Attach(8, false);
            // Начинаем слушать сообщения
            skype.MessageStatus += new _ISkypeEvents_MessageStatusEventHandler(skype_MessageStatus);
        }
        private static void skype_MessageStatus(ChatMessage msg, TChatMessageStatus status)
        {
            // Если в начале сообщения стоит символ "!"
            if (msg.Body.IndexOf("!") == 0)
            {
                ProcCallCount++; // увеличиваем количество вызванных обработчиков
                Console.WriteLine("Incoming Skype Message: " + msg.Body + " status:" + status.ToString());
               
                // если обработчик вызван по получении - обрабатываем команду !time и отсылаем результат клиенту
                if(status.ToString() == "cmsRead") // другой раз - при уведомлении о том, что пользователь прочёл (получил доступ к тексту сообщения)
                    return;
                   
                // Отсылаем результат клиенту
                skype.SendMessage(msg.Sender.Handle, SkypeCommandHandler(msg.Body.Substring(1)));
            }
        }
        private static string SkypeCommandHandler(string str)
        {
            string result = "";
            switch (str.ToLower())
            {
                case "time":
                    result = "Current Time is: " + DateTime.Now.ToLongTimeString();
                    break;
            }
            return result;
        }
       
}   
 
Записан
Ivan    ↓ 
28 Декабрь, 2011, 07:26:32 , спустя 20 минут 8 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 19
Сообщений: 922
Сила слова: 2.06

Если в начале сообщения стоит символ "!"
Тогда зачем осуществлять поиск по строке?) Или в C# нельзя строку по символам разбирать? В перл/пхп можно
Спустя 3 минуты добавил
string result = "";
А просто string result что сделает?)
 
Какая-то странная конструкция - class MyWindow: Form, и System.Console.WriteLine("Initializing Skype...");
Странный язык у балмера...
Спустя 2 минуты 20 секунд добавил
И какой тут смысл в ProcCallCount если она ни в чем не используется?
Спустя 2 минуты 3 секунды добавил
Хе, C# мне незнаком, но такое ощуещение что весь код понимаю
Записан

#define TRUE FALSE // удачной отладки суки
Страниц: [1]
Печать
 

Перейти в: