PDA

Просмотр полной версии : Пишем ICQ бота на PHP


MDxaker
30.04.2010, 09:09
http://softrank.ru/1.PNG

Статья посвященная созданию ICQ бота на PHP языке!
Автор статьи я! Потому все связаные с ней вопросы ко мне!


Арсенал:

1) Хостинг или дедик
2) Знание PHP
3) Клас ICQ
4) ICQ номер бота
5) Руки

---Шаг первый---

Начнем с того что найдем клас для создания бота.
Этот клас сам разберется со всеми проблемами протокола ICQ и позволит нам подлючится к ICQ за несколько комманд.

Я выбрал mlCQ library v0.4 (Скачать все PHP скрипты сможете вконце темы)
Называем его lib.php и на время забываем.

---Шаг второй---

Создадим файл конфига conf.php!
В нем будут хранится разного рода настройки скрипта и бота.
Например ICQ и пароль бота, его статус и будет ли скрипт вести логи.


conf.php

<?php
DEFINE('UIN_ADMIN','ваша ася'); // Номер ICQ админа

// Уин бота
DEFINE('UIN_BOT','тут аська бота'); // Номер ICQ бота
DEFINE('PASS_BOT','тут пароль'); // Пароль от уина ICQ бота

// Настройки бота
DEFINE('BOT_STATUS','Статус бота X-Traz'); // X-Traz статус бота
DEFINE('BOT_BIRTHDAY','1'); // Шарик день-рождения

// Настройка логирования
DEFINE('LOG_SET','0'); // Если нужны логи поставте 1
DEFINE('LOG_FILE','huge.log'); // Файл логов
?>


Сохраняем в папке с lib.php и забываем!

---Шаг третий---

Перейдем к оболочке бота и скрипте что будет управлять всем функционалом!
Тут будет хранится скрипт входа в on-line, скрипт обработки и еще много чего!

Начнем с того что подключим lib.php и conf.php!

bot.php

<?php
require_once 'lib.php';
require_once 'conf.php';


Теперь определим параметр ICQ birthday, логов и запустим бота

//Birthday
if(BOT_BIRTHDAY=='1') { $BD='BIRTHDAY'; } // Разбираемся с параметром Днюхи бота

//Прочее
set_time_limit(0); // На же не надо чтобы бот постоянно выходил из она?
ignore_user_abort(true); // Игнор аборта

//Подключение
$mlCQ=new mlCQ(); // Создаем клас
$mlCQ->create_identity("me",UIN_BOT,PASS_BOT); //Вводим параметры входа
$mlCQ->connect(); //Создаем подключение
$mlCQ->login(); // Логинимся

// Файл логирования
if(LOG_SET=='1') { $mlCQ->start_logging(LOG_FILE); } // Если нужно, наш клас будет вести логи

//X-Traz
$mlCQ->set_status(BOT_STATUS, $BD); //Статус бота

//Удаляем не нужные офлайн сообщения
$mlCQ->request_offline_messages();
$mlCQ->delete_offline_messages();

$still_there=true; $code='';


Ну а сейчас займёмся списком команд

$list = "Набирите команды что описаны ниже:

person admin - О админе
person you - О Вас
";
$personallist = array(
"admin" => "Админу вчера выполнилось 150 лет. Он живет в г.Черновцы и жрет пиццу",
"you" => "Вы видимо дядя что шяс сидит в асике"
);

$help='Вас приветствует ICQ Info BOT

Команды бота:

help - Вывод справки (её Вы сейчас читаете)
admin ваше_сообщение - Связь с админом
list - Список персонала
person чел - Инфа о нем *
';


Вот теперь самая сложная часть которая разместит в себе весь остаток кода!

while($still_there) {

if(!is_resource($mlCQ->sock) || feof($mlCQ->sock)) $still_there=false; // Проверка
if(!$code) sleep(1); // Спим
$code=$mlCQ->dance_for('me');

switch($code) { //Распознаем ответы
case 7:

$msg=$mlCQ->id['in_messages']['last']; //Получаем последнее сообщение
$from=$msg['uin']; // Аська с которой пришло сообщение
$cmd = explode(' ',$msg['text']); //С помощю explode разделяем сообщение на оболочку
switch($cmd[0]) { //Разбираем сообщение

// Функция вывода хелпа
case 'help':
$mlCQ->send_message($from,$help); // Шлем сообщение с хелпом
break;

// Общение с админом
case 'admin':
$mlCQ->send_message('UIN_ADMIN','Вам пришло сообщение от: '.$from.
'
Текст: '.$cmd.

'
Ответить: send '.$from.' ответ');
break;

// Общение с юзерами
case 'send':
$mlCQ->send_message($cmd[1],'От админа: '.$cmd);
break;



// Отправка листа с командами
case 'list':
$mlCQ->send_message($from,$list);

break;


// Отправка ответа с данными о персоне
case 'person':
$messa = $personallist[$cmd[1]];
if (isset($messa)) {
$mlCQ->send_message($from,"$messa");
} else {
$mlCQ->send_message($from,"Такой персоны не найдено");
}
break;


// Функция остановки работы бота
case 'stop':
if($from==UIN_ADMIN) {
$mlCQ->send_message($from,'Работа бота завершена');
$mlCQ->close(); //Закрываем соединение
}
break;
//Если ни одна из команд не найдена, пишем дефолт сообщение
default:
$mlCQ->send_message($from,"Для вывода справки по командам наберите \"help\" (без кавычек)");
break;
}
}
}

?>


Сохраняем как bot.php, и идем на хостинг

---Шаг четвертый---

Нам нужен хостинг под бота!
Я своего держу на bravohost.ru. Почему там?
Там можно редактировать настройку о том сколько может исполнятся скрипт + есть cron который будет перезапускать скрипт каждые 10 мин.

Если хотите делать на дедике, то устанавливайте любую сборку сервера и в настройках укажите любое нужное Время исполнения, через которое Ваш скрипт остановится (Т.е. Вам надо будет его запускать снова)

Выбрали? Идем на хост и заливаем скрипты.
На папку с скриптом (Если нужны логи) кладем права 777.

Теперь запускаем bot.php и скрипт не должен открыватся (Т.е. Зависнуть)
Добавляйте бота и общайтесь с ним.

Если же ошибка, значит где-то в коде проблема или с хостингом лажа.


Вот пак из скриптов, которые собраны по этой статье!
Там находится клас mlCQ. Конфиг и оболочка бота!
Скачать upwap.ru: Архив с скриптами (http://upwap.ru/848484)

---F.A.Q.---
Бот почему-то сам выходит из онлайна, надо его заново запускать
Нужно изменить тайм-лимит на исполнение скрипта.

Пишет ошибку при выполнении скрипта
Куча причин возможно.
Может быть аська и пароль бота не правильны или хостинг лажет, а может и в скрипте проблемма

Не входит в он-лайн
Пароль с асей могут быть не правильные. Или хостинг не позволяет

Очень долго отвечает бот
Хостинг возможно тупит, или Ваш бот очень загружен

gibson
30.04.2010, 09:17
Будет удалена или перенесена по желанию автора

MDxaker
30.04.2010, 09:22
Перенесите в PHP раздел. Т.к.Это большая статья, выделите ей отдельную тему

MDxaker
30.04.2010, 14:00
Исправил ошибки

[Agent]
30.04.2010, 14:18
да какая это статья к черту? описал класс и как им пользоваться. хотя больше чем уверен, в комментах в классе или на сайте автора их намного больше.

m0Hze
30.04.2010, 14:47
Будет удалено или перенесено в болталку. Либо делай статью, либо читаем выше.

MDxaker
30.04.2010, 14:54
Имхо не каждый поймёт того что написано на сайте автора.

Я сделал готового бота и описал дейвствия.
На звание статьи я не претендовал

yaneblinchik
30.04.2010, 15:08
']да какая это статья к черту? описал класс и как им пользоваться. хотя больше чем уверен, в комментах в классе или на сайте автора их намного больше.
Не порть воздух! Сам хоть что то можешь? ТС отлично справился.

AGENTWPC74
30.04.2010, 15:11
пример рабочего бота можно встудию

MDxaker
30.04.2010, 15:20
Пример бота: 623333322
Писал я

m0Hze
30.04.2010, 15:22
Имхо не каждый поймёт того что написано на сайте автора.

Я сделал готового бота и описал дейвствия.
На звание статьи я не претендовал
Все что нужно - можно найти на сайте автора. Кто не поймет того, что описано там, или (о боже мой!11) в гугле - ну я не знаю кто он после этого.
Тема повисит до завтра. Сможешь дополнить, и написать в ней что то полезное - велком, а иначе это просто использование одного единственного метода send_message и установка констант.
ps

$mlCQ->send_message('UIN_ADMIN',...); //wtf?! константа в кавычках? Или так задумано?

Раскрывай тему, статье и флуду в ней висеть до завтра.

MDxaker
30.04.2010, 15:23
Ошибка. Позже исправлю, не с компьютера)

MDxaker
30.04.2010, 15:28
Все что нужно - можно найти на сайте автора. Кто не поймет того, что описано там, или (о боже мой!11) в гугле - ну я не знаю кто он после этого.
Тема повисит до завтра. Сможешь дополнить, и написать в ней что то полезное - велком, а иначе это просто использование одного единственного метода send_message и установка констант.
ps

$mlCQ->send_message('UIN_ADMIN',...); //wtf?! константа в кавычках? Или так задумано?

Раскрывай тему, статье и флуду в ней висеть до завтра.
1) И все же есть благодарности
2) Зачем удалять? Она кому-то мешает или нарушает правила?
Вывод: Удалять не рационально
3) Кроме сенд_мессаге есть еще идеи?
4) Неужели проще парится и разбирать слова автора чем взять готовое?

Deathdreams
30.04.2010, 15:33
не

if(BOT_BIRTHDAY=='1') { $BD='BIRTHDAY'; } // Разбираемся с параметром Днюхи бота

а

if(BOT_BIRTHDAY=='1') { $BD=BIRTHDAY; } // Разбираемся с параметром Днюхи бота

m0Hze
30.04.2010, 15:34
1) "Пишем...", что ты тут пишешь, кроме как вызываешь методы? :/
2) Я уже объяснял, какая от статьи ценность.(=0)
Просто сделай статью, если взялся за такую тему, то парсь заголовки, напиши свой класс для работы с icq, это уже будет большой плюс. Или хотя бы раскрой все плюшки работы с уже готовым, а они там есть.
А писанина велосипедов не в почете. Ушло в флейм.