Форум программистов, компьютерный форум, киберфорум
C#: API, боты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
1 / 1 / 2
Регистрация: 23.09.2015
Сообщений: 5

ICQ Bot и игнорирование событие onDisconnect

02.10.2015, 19:13. Показов 1572. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток.
Написал ICQ Бота на основе примера взятого [Форум]

Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
Public Class Form1
    Public WithEvents icq As New vbicq4.vbicq4  'создаем объект движка
    'делегирование события ошибки 
    Delegate Sub ErrDelegate(ByVal d As String)
    'делегирование события приема сообщения 
    Delegate Sub MsgDelegate(ByVal u As String, ByVal m As String)
    'делегирование события соединения 
    Delegate Sub OnConDelegate()
 
    'Константы
    Const BuffSize = 100    'размер очереди отправки
    Const SendTimeout = 1500 'таймаут между отправками (1.5 сек)
    Const PingTimeout = 10000 'Таймаут проерки на вылет (10 сек)
    'кодировка файлов бота
    Dim cp As System.Text.Encoding = System.Text.Encoding.GetEncoding(1251)
 
    Dim buffer As New List(Of String)   'очередь рассылки
    Dim StopTime As DateTime = Now   'им проверяем себя на вылет
 
    'Кнопка "Подключить"
    Private Sub Button1_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) Handles Button1.Click
        icq.UIN = TextBox1.Text         'задаем uin
        icq.pass = TextBox2.Text        'задаем пароль
        icq.connect()                   'подключаемся
        TextBox3.Text = "Подключаемся..." & vbCrLf
        'включим таймер отправки
        StopTime = Now.AddSeconds(5)     'даем 5 секунд на логин
        Timer1.Interval = SendTimeout    'отправляем не чаще чем 1.5 сек, иначе вылетим
        Timer1.Enabled = True       'включаем таймер
    End Sub
 
    'Кнопка "Отключить"
    Private Sub Button2_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) Handles Button2.Click
        Timer1.Enabled = False    'отключаем отпарвку
        icq.DisConnect()          'Разъединяемся
    End Sub
 
 
    'Если зашли в асю
    Private Sub icq_onConnect() Handles icq.onConnect
        'Проверяем на ошибку доступа из разных потоков:
        If InvokeRequired Then
            Me.BeginInvoke(New OnConDelegate(AddressOf icq_onConnect))
            Exit Sub
        End If
        'Напишем что мы в сети
        TextBox3.Text &= "В сети!" & vbCrLf
    End Sub
 
    'Если нас выкинуло:
    Private Sub icq_onDisconnect() Handles icq.onDisconnect
        'Проверяем на ошибку доступа из разных потоков:
        If InvokeRequired Then
            Me.BeginInvoke(New OnConDelegate(AddressOf icq_onDisconnect))
            Exit Sub
        End If
        'Напишем что мы в сети
        TextBox3.Text &= "Вылетели" & vbCrLf
    End Sub
 
    'если произошла ошибка:
    Private Sub icq_onError(ByVal Description As String) Handles icq.onError
        'Проверяем на ошибку доступа из разных потоков:
        If InvokeRequired Then
            Me.BeginInvoke(New ErrDelegate(AddressOf icq_onError), Description)
            Exit Sub
        End If
        'Выводим текст ошибки
        TextBox3.Text &= "Ошибка: " & Description & vbCrLf
 
        'Проверим, не за частый ли логин нас выкинуло:
        If InStr("Cлишком часто", Description) Then
            'если да - сбавим обороты:
            StopTime = Now.AddMinutes(15) 'ждем 15 минуток
            TextBox3.Text &= "Слишком часто ломились в сеть. Ждём 15 минут" & vbCrLf
        End If
    End Sub
 
    'Если пришло сообщение:
    Private Sub icq_onMessage(ByVal uin As String, _
                              ByVal message As String) Handles icq.onMessage
        'Проверяем на ошибку доступа из разных потоков:
        If InvokeRequired Then
            Me.BeginInvoke(New MsgDelegate(AddressOf icq_onMessage), _
                           New Object() {uin, message})
            Exit Sub
        End If
        'Печатаем сообщение:
        TextBox3.Text &= uin & ": " & message & vbCrLf
 
        'обрабатываем запрос:
        'если очередь больше допустипого то выходим
        If buffer.Count > BuffSize Then Exit Sub
        'иначе - обрабатываем запрос:
        ' если прислали !Help
        If LCase(Strings.Left(message, 5)) = "!help" Then
            'добавим в очередь ответ
            buffer.Add(uin & ":" & IO.File.ReadAllText("help.txt", cp))
            Exit Sub    'Выходим
        End If
        'Если хотят знать погоду:
        If LCase(Strings.Left(message, 7)) = "!pogoda" Then
            'добавим в очередь ответ
            buffer.Add(uin & ":" & IO.File.ReadAllText("pogoda.txt", cp))
            Exit Sub    'Выходим
        End If
 
        'если до сих пор не вышли - значит команда не найдена:
        buffer.Add(uin & ":Команда " & message & " не найдена")
        Exit Sub    'Выходим
    End Sub
 
    'Тик таймера рассылки
    Private Sub Timer1_Tick(ByVal sender As System.Object, _
                            ByVal e As System.EventArgs) Handles Timer1.Tick
        'Сперва проверим не вылетели ли мы
        If icq.KeepAlive Then
            'если мы в сети то можно отправить сообщение
            'отправляем нулевой элемент очереди (если есть)
            Dim i As Integer
            If buffer.Count > 0 Then
                'вытащим uin и сообщение
                Dim uin As String = Split(buffer(i), ":")(0)
                Dim message As String = Split(buffer(i), ":")(1)
                icq.SendMessage(uin, message) 'отправим
                buffer.RemoveAt(0)  'удалим отправленное из очереди
                Exit Sub        'теперь можем выйти
            End If
        Else
            'если вылетели - может пора зайти снова?
            If StopTime < Now Then
                'сместим время след. проверки на величину таймаута
                StopTime = Now.AddMilliseconds(PingTimeout)
                icq.connect()     'попытаемся соединиться
            End If
        End If
    End Sub
End Class

На некоторых сайтах было примечание что у этой Dll есть косяк с onDisconnect.
Т.е. icq.state ="В сети", событие onDisconnect не происходит, но Бот не получает сообщения.
Вопрос вот в чем можно ли как нибудь еще отследить что программа уже не в сети и выполнить скажем перезагрузку.
Есть конечно вариант создать второго бота который будет отправлять тестовые сообщения и если не получит ответ перезагрузит программу.
Сейчас я это делаю вручную.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.10.2015, 19:13
Ответы с готовыми решениями:

Icq-bot
Есть у кого исходники icq бота написанного на си++ в среде c++builder 6?(ну или в другой среде, главное чтобы без использывания MFC)

Easy ICQ ActiveX - компонент для разработки собственного ICQ совместимого приложения.
Easy ICQ ActiveX - компонент для разработки собственного ICQ совместимого приложения. С помощью этого компонента можно легко работать с...

Как убрать ICQ из пуска? после закрытия окна программы, ICQ остается в пуске
Как сделать предосмотр на картинках включеный а на папках выключеный? Как убрать ICQ из пуска? после закрытия окна программы, ICQ...

1
1 / 1 / 2
Регистрация: 23.09.2015
Сообщений: 5
14.10.2015, 20:11  [ТС]
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Решил вопрос. Просто бот отправляет себе тестовое сообщение сбрасывающее таймер перезагрузки.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.10.2015, 20:11
Помогаю со студенческими работами здесь

MaskedTextBox1 событие по системным часам - что должно вызывать это событие?
Добрый день! Помогите разобраться с ситуацией пожалуйста. На форме висит элемент maskedTextBox с маской DateTime. (00:00) Задача, чтобы он...

Событие выбора строки при выборе мышкой событие обрабатывается два раза
Есть JTable, обрабатываю событие выбора строки след. образом: ListSelectionModel r = jTable1.getSelectionModel(); ...

Принудительно вызвать событие, если произошло другое событие
Сразу оговорюсь, это тема про события, а НЕ про Windows Forms, да бы ни кто не переносил тему. В Windows Forms у тех или иных...

Как обработать событие click и событие нажития стрелки?
Допустим есть кнопка влево-вправо для горизонтального листания товаров. Как нужно кроссбраузерно обрабатывать одновременно событие click...

В каждом из n независимых испытаний событие А происходит с вероятностью p. Найти вероятность того, что событие А произошло
В каждом из n независимых испытаний событие А происходит с вероятностью p. Найти вероятность того, что событие А произошло: а) точно G...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru