Как стать автором
Обновить

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

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


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.  
  10. INSERT INTO `messages` (`id`, `q`, `a`, `from`) VALUES
  11. (1, 'default', 'В данный момент вы говорите с роботом.Если вы хотите говорить с моим хозяином, вам необходимо зарегистрироваться на одном из Jabber серверов, т.к. в ICQ он больше не появится.Чтобы узнать подробности о Jabber-е, введите 1.Чтобы узнать Jabber адрес хозяина, напишите, сколько будет 2плюспять.Чтобы узнать почтовый адрес хозяина, введите цифры от 1 до 7 без пробелов.', ''),
  12. (2, '1234567', 'My@mail.ri', ''),
  13. (3, '7', 'My@jabber.ru', ''),
  14. (4, '1', 'Один из популярных Jabber серверов - jabber.ruhttp://www.jabber.ru/node/247 - это адрес страницы с инструкцией по регистрации подключению к нему.Чтобы узнать Jabber адрес хозяина, напишите, сколько будет дваплюс5.', ''),
  15. (5, 'привет', 'Привет )', ''),
  16. (6, 'как дела', 'Нормально )', '');


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

Не буду что-то комментировать, т.к. все достаточно тривиально.
Отмечу лишь то, что не ставил задачу сделать что-то серьезное, а только отсылалку по адресу (хотя уже набрал достаточно диалогов и бот с некоторыми знакомыми уже говорил цепочками сообщений в 5-10 штук без вываливания дефолтного сообщения). Бот не работает с сообщениями в формате RTF, но в классе реализована эта возможность(можно доделать). Можно было конечно прикрутить и беседу с отдельными UIN в отдельные потоки. Но это дело другое. Главное идея )
Сие творение уже 4 дня в полете. Людей по 1-2 человека в день в jabber контактлисте прибавляется.
Вот такое вот чудо получилось.
Теги:
Хабы:
+6
Комментарии 13
Комментарии Комментарии 13

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн