Работа с ICQ в PHP

Разработка своих веб-приложений и страничек

Работа с ICQ в PHP

Сообщение zk » 08 сен 2007, 17:22

В нашем ФОСе нет открытых серверов электронной почты, поэтому обмен информацией происходит в основном через IM сеть ICQ.

Рассматривать работу с ICQ будем используя
mlICQ.7z
класс mlICQ
(12.31 Кб) Скачиваний: 1496

Он обладает широкой функциональностью и пригоден даже для организации ICQ бота.

Пример 1. Отправка сообщения из формы на сайте.

Для начала рассмотрим простой пример, форму для отправки сообщений на странице:
Код: Выделить всёРазвернуть
<FORM action="index.php" method="POST">
ICQ:<br /><INPUT type="text" name="icq" size="9"><br />
Текст сообещния:<br />
<INPUT type="text" name="msg" size="45"><br />
<INPUT type="submit" name="submit" value="Отправить">

</FORM>

<?php

$icq_number 
= '111111';         //Номер от которого будем подключаться
$icq_password = 'password';  //Пароль

if ($_POST[icq] && $_POST[msg]) {

require(
"mlICQ.php");

set_time_limit (0);
ignore_user_abort(true);

$mlCQ = new mlCQ();
$mlCQ->start_logging('huge.log'); //лог для отладки

$mlCQ->create_identity("me", $icq_number, $icq_password); 
$mlCQ
->connect();
$mlCQ->login();

$mlCQ->set_status('ONLINE', 'DCDISABLED');
$mlCQ->request_offline_messages();
$mlCQ->delete_offline_messages();

// sample send message

$mlCQ->send_message($_POST[icq], $_POST[msg]);

sleep(5); //поспим немного

$mlCQ->close(); 

}

?>

Этот код будет подключать указанный номер ICQ посылать сообщения на номер заданный в форме.
Чтобы отключить вывод отладочной информации измените значение переменной $debug в mlICQ.php с 1 на 0.
При частом подключении/отключении сервер ICQ попросит вас подождать минут 15, лучше подключаться не чаще чем раз в 3-5 минут.

В следующий раз напишу пример ICQ бота. Его можно будет использовать для частой отправки сообщений.
zk
Администратор
 
Сообщения: 1971
Зарегистрирован: 02 сен 2007, 16:04
Домен: vfose.ru

Re: Работа с ICQ в PHP

Сообщение m1rr0r » 08 сен 2007, 17:42

Что подразумевается под "частой отправкой сообщений"?
На сервере же вроде стоит лимит на частоту отправки. Как ты его собираешься обойти?
Аватара пользователя
m1rr0r
Начинающий участник
 
Сообщения: 5
Зарегистрирован: 08 сен 2007, 17:38

Re: Работа с ICQ в PHP

Сообщение zk » 08 сен 2007, 17:50

Первый пример подразумевает подключение к серверу, отправку, и отлкючение.
И я имею ввиду что при каждой отправке через веб форму, эта процедура будет повторятся.
Сервер может временно забанить если чаще черз в 3-5 минут.

В случае демона, который будет висеть и читать сообщения из файла или БД, можно будет с помошью веб формы отправлять сообщения уже не 1 раз в 3 минуты, а чаще.
zk
Администратор
 
Сообщения: 1971
Зарегистрирован: 02 сен 2007, 16:04
Домен: vfose.ru

Re: Работа с ICQ в PHP

Сообщение m1rr0r » 08 сен 2007, 17:59

Я в свое пытался настроить бота, правда у меня другие библиотеки, но вот не понял как сделать чтобы клиент бота отображался как QIP, знаешь что там за это отвечает?
Аватара пользователя
m1rr0r
Начинающий участник
 
Сообщения: 5
Зарегистрирован: 08 сен 2007, 17:38

Re: Работа с ICQ в PHP

Сообщение zk » 08 сен 2007, 18:02

знаешь что там за это отвечает?

705-716 строчки в библиотеке, это сигнатуры идентификации клиентов.
zk
Администратор
 
Сообщения: 1971
Зарегистрирован: 02 сен 2007, 16:04
Домен: vfose.ru

Re: Работа с ICQ в PHP

Сообщение m1rr0r » 08 сен 2007, 18:03

А вообще у меня есть библиотека которая по-легче, но вполне функциональна.
webicqlite.class.zip
Библиотека WebIcqLite
(3.43 Кб) Скачиваний: 1107

Вот пример отправки сообщения с номера
Код: Выделить всёРазвернуть
<?php
    include('WebIcqLite.class.php');
    define('UIN', 123456);
    define('PASSWORD', 'pass');
    $icq = new WebIcqLite();
    if($icq->connect(UIN, PASSWORD)){
        if(!$icq->send_message('111111', 'Hello from php!!!')){
            echo $icq->error;
        }else{
            echo 'Message sent';
        }
            //здесь бот будет висеть и принимать сообщения
   /*
   do {
      $message=$icq->get_message();

      $uin=$message["from"];
      $text=$message["message"];

           $icq->send_message($uin, $text);
   } while ($text!="!exit" || $uin!=111111);
   */
        $icq->disconnect();
    }else{
        echo $icq->error;
    }
?>
Аватара пользователя
m1rr0r
Начинающий участник
 
Сообщения: 5
Зарегистрирован: 08 сен 2007, 17:38

Re: Работа с ICQ в PHP

Сообщение RnG » 11 окт 2007, 20:13

Попробывал пример с использованием библиотеки webicqlite и вот что получил ....
Fatal error: Call to undefined function: socket_create() in w:\home\non-existent-host\WebIcqLite.class.php on line 393
и как же мне объявить эту функцию? ну или как исправить эту ошибку мб в конфигурации сервера че нить править
RnG
Начинающий участник
 
Сообщения: 14
Зарегистрирован: 11 окт 2007, 19:57

Re: Работа с ICQ в PHP

Сообщение zk » 11 окт 2007, 21:57

У вас в PHP не хватает библиотеки php_sockets.dll, доустановите её.

Только не надо спрашивать о том как это сделать а этой ветке, если вы ставили php отдельно, то это труда не составит, если вы используете какой либо сервер приложений, обратитесь к документации по нему.
zk
Администратор
 
Сообщения: 1971
Зарегистрирован: 02 сен 2007, 16:04
Домен: vfose.ru

Re: Работа с ICQ в PHP

Сообщение zk » 12 дек 2007, 00:32

Пример написания ICQ-бота при помощи библиотеки mlICQ.php

Код: Выделить всёРазвернуть
<?php

require("mlICQ.php");

set_time_limit (0);
ignore_user_abort(true);

$mlCQ = new mlCQ();
$mlCQ->start_logging('my.log'); // с логом всегда лучше
$mlCQ->create_identity("me", '123456', 'paSSword123');  // создаём себя

$mlCQ->settings['server'] = '64.12.161.153';    // иногда действеннее login.icq.com =)

if (!$mlCQ->connect()) {    // есть коннект?
    $mlCQ->close();
    die ("Could not connect to ICQ server");
}
   
if (!$mlCQ->login()) {  // есть логин?
    $mlCQ->close();
    die ("Could not log in to ICQ");
}
$mlCQ->set_status('ONLINE', 'DCDISABLED');  // ни о каком Direct Connect речи пока не идёт, поэтому 'DCDISABLED'
$mlCQ->request_offline_messages();  // отсылаем запрос на оффлайновые сообщения - иначе сервер нам их просто так не пришлёт =)

/*
* Как можно отсылать сообщения: $mlCQ->send_message(123456789, 'Месседж');
* ...удалить оффлайновые сообщения с сервера: $mlCQ->delete_offline_messages();
* ...изменить статус: $mlCQ->set_status($status, 'DCDISABLED'); - желательно не опускать 'DCDISABLED'; $status = ONLINE/AWAY/NA/OCCUPIED/DND/FREE4CHAT и др. Можно комбинировать несколько и делать $status массивом
* ...запросить статус другого номера: $mlCQ->query_status(123456789);
* ...запросить краткую информацию о пользователе: $mlCQ->request_short_userinfo(123456789);
* ...ответить на запрос авторизации: $mlCQ->auth_reply($кому, $даилинет, 'необязательная причина');
*/

$still_there = true;    // всё ещё там
$tries = 0; $code = '';

$mlCQ->id['no_conf_snac'] = array(654321);  // массив номеров, которым не нужно отсылать MSG_ACK. Полезно, если на той стороне Jimm, который от этих пакетов вылетает. Опасно, если там Miranda - Она будет считать, что мессаги не уходят

while ($still_there) {
    if (!is_resource($mlCQ->sock) || feof($mlCQ->sock)) { // проблемы?
        $mlCQ->close();
        $mlCQ->log('Connection lost, retrying... [' . $tries . ']');
        sleep (3);
        $mlCQ->connect(); // реконнект
        $mlCQ->login();
        if ($tries++ > 50) // совсем много проблем? Умираем.
            $still_there = false;
    }
    if (!$code) sleep(1);    // если в прошлый раз ничего не случилось, можно поспать секунду...
    $code = $mlCQ->dance_for('me'); // ...а потом проверить, не случилось ли чего
    // несколько основных кодов, которые возвращает dance_for
    switch ($code) {
        case 7: // сообщение пришло
            $msg = $mlCQ->id['in_messages']['last'];
            // что-то с ним делаем
            // например, можно умереть, если поступит такая команда с UIN'а админа
            if ($msg['uin'] == 1991216 && $msg['text'] == '!exit')
                $still_there = false;
            break;
        case 8: // сообщение из небытия оффлайна
            $msg = $mlCQ->id['in_messages']['last'];
            // ещё что-то делаем
            break;
        case 9: // краткая юзеринфа пришла
            $msg = "[Short userinfo]:\r\nNickname: " . $mlCQ->id['uinfo']['last']['nickname'];
            $msg .= "\r\nReal Name: " . $mlCQ->id['uinfo']['last']['first_name'] . " " . $mlCQ->id['uinfo']['last']['last_name'];
            // ну, и что-то тут ещё
            break;
        case 10:    // уведомление о пропущенном сообщении
            $notice = $mlCQ->id['general_notes'][0];
            // и что-то с ним делаем
            break;
        case 71:    // результат проверки на наличие юзера в онлайне: да, он там
            $num = $mlCQ->snacs[0]['header']['req_id'];
            // тут его номер, если забыли
            break;
        case 72:    // то же, но юзер оказался оффлайн
            break;
        default:
            // ничего
            break;
    }
}

$mlCQ->close();

?>
zk
Администратор
 
Сообщения: 1971
Зарегистрирован: 02 сен 2007, 16:04
Домен: vfose.ru

Re: Работа с ICQ в PHP

Сообщение Alexsandrit » 04 мар 2008, 21:23

Использую скипт из первого поста. При отправке сообщения символы русского языка отображаются вот так: ‹СЏРІРїР°СЂСЂРїР» :shock: Как исправить? Кодировку страницы менял.
Изображение
:roll:
Alexsandrit
Активный участник
 
Сообщения: 256
Зарегистрирован: 29 сен 2007, 16:47
Домен: http://proekts.vfose.ru/

След.

Вернуться в PHP, HTML, CSS...

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29