Pull to refresh

Еще пара слов о переходе на Jabber или ICQ бот

Software
Сам, как приверженец свободных технологий, я давненько завел себе jabber аккаунт, но он долго пустовал, т.к. никто из асечного контактлиста не поддавался на уговоры перейти на jabber.Тут, в свете недавних проблем с AOL и нескольких хабратопиков о XMPP клиентах и способах переманивания людей на них, меня постигла идея поставить на мой UIN бота. Пускай он умеет немного говорить и отсылать всех разговорчивых в нужном направлении.Поискав на тему предмета разговора в интернете, ничего стоящего не удалось найти. Зато наткнулся на страницу с набором классов на PHP, реализующих минимальную функциональность ICQ протокола.
Недолго думая, скачал и попробовал на деле. Работает!!!
и спустя 30 минут написал следующее:

icqbot.php
Copy Source | Copy HTML
  1. #!/usr/bin/php
  2. <?php
  3. include('icq.php');
  4. //подключение zendloader
  5. require 'Zend/Loader.php';
  6. Zend_Loader::registerAutoload();
  7. //чтение конфига
  8. $config = new Zend_Config_Xml('config.xml',NULL,true);
  9. //подключение к БД
  10. $db = Zend_Db::factory($config->dbadapter,$config->db->toarray());
  11. $db->query('SET CHARACTER SET "'.$config->dbcharset.'"');
  12. //аськоклиент
  13. $icq = new WebIcqLite();
  14. log_write("ICQ Bot started");
  15. //коннектимся
  16. if (!$icq->connect($config->icq->login,$config->icq->password))
  17. {
  18. log_write($icq->error);
  19. exit();
  20. }
  21. log_write("Connected ok");
  22. while($icq->is_connected())
  23. {
  24. //читаем входящее сообщение
  25. $msg = $icq->read_message();
  26. if($msg)
  27. {
  28. //список админских комманд
  29. if ($msg['message']=="icqbotoff")
  30. {
  31. $icq->disconnect();
  32. log_write("Exit by admin's command.");
  33. exit();
  34. }
  35. log_write(" Message '".$msg['message']."' from ".$msg['from']);
  36. //режем все лишние символы
  37. $msg['message'] = str_replace(array('(',')','/',':','.',',','?','!','@','#','$','%','^','&','*','-','_','=','+','~','`',';','|','\\','\'','"'),'',$msg['message']);
  38. //ищем ответ
  39. $ans = $db->select()->from('messages')->where('q LIKE ?',trim($msg['message']))->where('LENGTH(a)>0')->order('RAND()')->query()->fetch();
  40. if ($ans)
  41. {
  42. //точное совпадение
  43. log_write(" Message '".$ans['a']."' sent to ".$msg['from']);
  44. }
  45. else
  46. {
  47. //нет совпадений. ищем полнотекстово.
  48. $db->insert('messages',array('q'=>$msg['message'],'a'=>'','from'=>$msg['from']));
  49. $query = "SELECT *, MATCH q AGAINST ('".$msg['message']."') as relev FROM messages WHERE LENGTH(a)>0 ORDER BY relev DESC LIMIT 1";
  50. $ans = $db->query($query)->fetch();
  51. if ($ans['relev']>0)
  52. {
  53. //нашли ответ
  54. log_write("Message (fulltext search) '".$ans['a']."' sent to ".$msg['from']);
  55. }
  56. else
  57. {
  58. //нет совпадений. выдаем сообщение по умолчанию.
  59. $ans = $db->select()->from('messages')->where('q LIKE ?','default')->query()->fetch();
  60. log_write("Message 'DEFAULT' sent to ".$msg['from']);
  61. }
  62. }
  63. $icq->send_message($msg['from'], $ans['a']);//собственно отправка сообщения получателю
  64. }
  65. //спим секунду
  66. flush();
  67. sleep(1);
  68. }
  69. //уходим
  70. log_write("Disconnected by unknown reason.");
  71. $icq->disconnect();
  72. //----------------------------------------------------------------------------------------//
  73. //вспомогательные функции//
  74. function log_write($str)
  75. {
  76. echo date('Y.m.d H.i.s',time())." ".$str."\n";
  77. }


config.xml
Copy Source | Copy HTML
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configdata>
  3. <debug>0</debug>
  4. <db>
  5. <host>localhost</host>
  6. <username>root</username>
  7. <password>dbpass</password>
  8. <dbname>icqbot</dbname></db>
  9. <dbcharset>CP1251</dbcharset>
  10. <dbadapter>Pdo_Mysql</dbadapter>
  11. <icq>
  12. <login>UIN</login>
  13. <password>PASSWORD</password>
  14. </icq>


dump.sql
Copy Source | Copy HTML
  1. CREATE TABLE IF NOT EXISTS `messages` (
  2. `id` int(11) NOT NULL auto_increment,
  3. `q` text NOT NULL,
  4. `a` text NOT NULL,
  5. `from` varchar(16) NOT NULL,
  6. PRIMARY KEY (`id`),
  7. FULLTEXT KEY `q` (`q`)
  8. ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=43 ;
  9. INSERT INTO `messages` (`id`, `q`, `a`, `from`) VALUES
  10. (1, 'default', 'В данный момент вы говорите с роботом.Если вы хотите говорить с моим хозяином, вам необходимо зарегистрироваться на одном из Jabber серверов, т.к. в ICQ он больше не появится.Чтобы узнать подробности о Jabber-е, введите 1.Чтобы узнать Jabber адрес хозяина, напишите, сколько будет 2плюспять.Чтобы узнать почтовый адрес хозяина, введите цифры от 1 до 7 без пробелов.', ''),
  11. (2, '1234567', 'My@mail.ri', ''),
  12. (3, '7', 'My@jabber.ru', ''),
  13. (4, '1', 'Один из популярных Jabber серверов - jabber.ruhttp://www.jabber.ru/node/247 - это адрес страницы с инструкцией по регистрации подключению к нему.Чтобы узнать Jabber адрес хозяина, напишите, сколько будет дваплюс5.', ''),
  14. (5, 'привет', 'Привет )', ''),
  15. (6, 'как дела', 'Нормально )', '');


И не забыть положить в папочку с ботом ZendFramework

Не буду что-то комментировать, т.к. все достаточно тривиально.
Отмечу лишь то, что не ставил задачу сделать что-то серьезное, а только отсылалку по адресу (хотя уже набрал достаточно диалогов и бот с некоторыми знакомыми уже говорил цепочками сообщений в 5-10 штук без вываливания дефолтного сообщения). Бот не работает с сообщениями в формате RTF, но в классе реализована эта возможность(можно доделать). Можно было конечно прикрутить и беседу с отдельными UIN в отдельные потоки. Но это дело другое. Главное идея )
Сие творение уже 4 дня в полете. Людей по 1-2 человека в день в jabber контактлисте прибавляется.
Вот такое вот чудо получилось.
Tags:jabbericqaolbotботыаськотрясение
Hubs: Software
Total votes 22: ↑14 and ↓8 +6
Views511

Comments 13

Only those users with full accounts are able to leave comments. Log in, please.

Popular right now

Software Development engineer
from 4,000 to 5,000 $DataDirect Networks Inc. (DDN)Remote job
Software Engineer - Golang, Remote
from 2,500 to 3,500 $MyagiRemote job
Junior PHP Software Engineer
to 100,000 ₽Aviakassa.ruСевастопольRemote job
Software Engineer - Python, Remote
from 2,000 to 3,000 $MyagiRemote job
RD Software Tester
from 1,200 to 1,200 $Cyntegrity Germany GmbHТомскRemote job