Есть вопрос?
Зайди на форум

Поиск:

Denix: русификация Ubuntu и кодеки :: RSS:: Скачать книги Колисниченко в PDF

Англо-русский словарь компьютерных терминов (Д. Колисниченко)

A  B  C  D  E  F  G  H  I  K  L  M  N  O  P  Q  R  S  T  V  W  X  Y  Z 

укрпочта отслеживание посылок перевод денег график отключения света в Кировограде график отключения счета в Киеве график отключения света в Одессе (zip)

Книга Д. Колисниченко IRC, IRC-каналы, IRC-боты: как пользоваться и как сделать самому. Избранные технологии Интернета

14.3. Adware - рекламный бот

Рекламный бот мы будем писать на PHP с использованием класса SmartIRC.

Идея данного бота очень проста. Формируется массив объявлений пользователей, например, "Продам ноутбук HP, недорого, ivan@ivanov.com". Периодически бот выводит произвольное объявление в канал, чтобы его могли прочитать все пользователи канала. В формировании массива объявлений будут участвовать все пользователи - для добавления объявления нужно ввести команду:

!add <текст объявления>

Предполагается, что один пользователь может добавить только одно объявление. Для просмотра объявления какого-нибудь пользователя можно ввести команду:

!show <ник>

На примере данного бота мы рассмотрим два очень полезных примера:

Мы постоянно создавали ботов, заточенных под наш канал. А что, если операторам других каналов понравятся ваши боты и они попросят их у вас? Ведь им тогда по всей программе придется заменять имя вашего канала именем их канала. Давайте облегчим им жизнь, тем более что нам это ничего не стоит. Просто объявите переменную $Channel, содержащую имя канала:

$Channel = '#Den';

Потом везде, где надо указать имя канал, вы указываете переменную $Channel. Чтобы переменная $Channel была доступна в подпрограммах (функциях и методах классов), ее нужно внутри подпрограммы объявить как глобальную:

global $Channel;

Объявления пользователей мы будем хранить в двух массивах $Texts и $Users. Первый массив является обычным списком. Его элементы - строки формата:

ник: текст объявления

То есть, когда пользователь добавляет новое объявление, мы заносим в массив новый элемент - строку, содержащую ник пользователя и текст объявления. Доступ к элементам списка осуществляется по номеру-индексу, например, чтобы получить доступ к 5-ому элементу, используется конструкция $Texts[4]. Почему 4, а не 5? Да потому что нумерация элементов начинается с 0, и вы должны помнить об этом.

Массив $Users - это ассоциативный массив. Доступ к элементам ассоциативного массива осуществляется не по номерам элементов, а по ключу. Ключом будет ник пользователя, значением элемента - текст объявления.

То есть при получении команды !add <текст> от пользователя User, мы заносим его объявления в массивы $Texts и $Users так:

$Texts[] = "ник: текст";

$Users["ник"] = "текст";

Зачем используется массив $Users вы уже, наверное, догадались. Да, для быстрого доступа к объявлению пользователя по его нику - так мы значительно упростим код команды !show, выводящей текст объявления по нику пользователя. Можно было бы обойтись и одним массивом $Texts, но тогда каждый раз нам надо было его пересматривать на наличие ника пользователя в начале элемента массива. А это нежелательно. Во-первых, это усложняет код бота, а во-вторых, замедляет его работу - представьте, что в массиве будет несколько сотен объявлений и нам нужно будет просмотреть каждое. Еще больше усугубляет ситуацию то, что несколько пользователей могут одновременно ввести команду !show. Представляете, что тогда будет? Доступ к элементам ассоциативного массива по ключу осуществляется практически мгновенно.

А когда же отображать объявления пользователей? Я предлагаю пойти по пути минимального сопротивления: "завести" счетчик сообщений. Как только от пользователей канала поступило 3 сообщения (вы можете увеличить это значения - 5, 10, 15) - все равно каких - команды боту или просто обычные сообщения, бот выводит случайное объявление. После этого счетчик обнуляется. Да, просто и сердито. Но согласитесь, зачем выводить сообщения, скажем, каждые 5 минут, если на канале никто не общается? Если на канал не поступают сообщения, значит, на канале никого нет или все пошли спать и забыли закрыть свои IRC-клиенты. Следовательно, объявления останутся не прочитанными.

Выводить случайно объявления предлагаю с максимальной оптимизацией. Сейчас поясню, что я имею в виду. Как вы себе представляете алгоритм вывода случайного элемента массива? В общем случае алгоритм такой:

Я предлагаю сделать так: инициализировать генератор случайных чисел и вызвать функцию shuffle, которая тщательно "перемешает" элементы массива, то есть случайным образом изменит их порядок. После этого нам нужно вывести первый элемент массива. Можно вывести и любой другой, но тогда мы можем вызвать ошибку выхода за диапазон - вдруг элемента с таким номером не будет в массиве?

Ясно, что наш бот будет реагировать только на новые сообщения - остальные события IRC-мира его не интересуют. Нам нужно реализовать три команды:

Вот реакция на команду !ad_help

if (strpos($data->message, "!ad_help")!==false)  {

 

 $irc->message(SMARTIRC_TYPE_CHANNEL, $Channel,

    "Для добавления объявления введите !add <текст>");

 $irc->message(SMARTIRC_TYPE_CHANNEL, $Channel,

    "Если хотите просмотреть объявление пользователя введите !show <nick>");

 $irc->message(SMARTIRC_TYPE_CHANNEL, $Channel,

    "Вы можете добавить только одно объявление!");

 

   }

 

Как видите, мы просто выводим три сообщения на канал, заданный переменной $Channel.  С командами !add и !show будет немного сложнее: ведь нам нужно выделить из сообщения текст объявления (для !add) и ник пользователя (для !show). Чтобы правильно выделить эту информацию, вы должны помнить, что нумерация символов строки начинается с 1, а не с 0. Также не нужно забывать о пробеле - зачем вносить лишний пробел в массив?

Для выделения подстроки из строки используется функция substr(). Ей нужно передать три параметра - саму строку, номер первого символа подстроки и номер последнего символа подстроки. В нашем случае третий параметр можно не указывать - функция в качестве последнего номера будет использовать длину строки.

Реализация команды !add будет выглядеть так:

if (strpos($data->message, "!add")!==false)

  {

  // отделяем текст объявления от команды "!add"

  $text = substr($data->message, 5);

  // заносим ник пользователя и сообщение в массив $Texts

  $Texts[] = "$data->nick: ".$text;

  // заносим сообщение в массив $Users

  $Users[$data->nick] = $text;

 

  // Сообщаем пользователю, что его объявление было добавлено в массив

  $irc->message(SMARTIRC_TYPE_CHANNEL, $data->nick,

       "Ваше объявление было добавлено ");

    }

Давайте договоримся, что ответы на запросы пользователя будет отправлять ему в приватном порядке, то есть, чтобы ответы видели не все пользователи, а только тот, который сделал запрос. Например, после добавления объявления нам нужно сообщить пользователю об этом. Лучше всего это сделать, отправив ему приватное сообщение - зачем выводить его на канал? Аналогично, если пользователь делает запрос !show, то мы ему также отправим приватное сообщение.

А вот, собственно, и обработка команды !show:

if (strpos($data->message, "!show")!==false)

  {

       // выделяем ник из сообщения

       $nick = substr($data->message, 6);

       // находим объявление по нику

       $m = $Users[$nick];

       if ($m==='') $m = "Пользователь $nick не оставлял объявлений";

           else $m=" Объявление пользователя $nick ".$m;

       // отправляем пользователю приватное сообщение с текстом

       // интересующего его объявления

       $irc->message(SMARTIRC_TYPE_CHANNEL, $data->nick, $m);

    }

Теперь нам нужно решить, когда мы будем выводить объявления. В тело обработчика сообщения нужно поместить оператор:

  $Counter++;

Благодаря ему, с получением каждого нового сообщения переменная $Counter будет увеличена на 1. Если она достигнет значения 3, мы выведем случайное сообщение из массива $Texts:

    if ($Counter===3) {

      $Counter=0;                  // обнуляем счетчик

      mt_srand(time()*100000);     // инициализируем генератор сл. чисел

      shuffle($Texts);             // "перемешиваем" массив

      // выводим случайное сообщение в канал

      $irc->message(SMARTIRC_TYPE_CHANNEL, $Channel, $Texts[1]);

    }

На этом можно считать, что разработка нашего бота завершена. Рассмотрим полный исходный код (файл adware.php):

<?

/* AdwareBot

   (c) 2006 Denis Kolisnichenko

*/

require 'SmartIRC.php';

$Channel = '#Den';

// объявление самого бота: самореклама - тоже реклама

$Channel = '#Den';

$Texts[]="Adware: периодический показ вашего объявления. Введите !ad_help";

$Users["Adware"]="периодический показ вашего объявления. Введите !ad_help";

 

$Counter = 0; /* счетчик сообщений */

 

 

// заполняем массив тестовыми сообщениями - просто для тестирования

// когда протестируете бот, удалите эти сообщения и перезапустите бот

$Texts[]="ivan: продам компьютер Athlon64 512/160/DVD/17 TFT";

$Users[ivan]="продам компьютер Athlon64 512/160/DVD/17 TFT";

$Texts[]="user: продам ThinkPad";

$Users[user]="продам ThinkPad";

$Texts[]="user2: куплю ноутбук. дешево";

$Users[user2]="куплю ноутбук. дешево";

class AdwareBot {

  function AdwareBot()

  {

  }

  function ping(&$irc, &$data)

  {

    $irc->message(SMARTIRC_TYPE_NOTICE, $data->nick, 'pong!');

  }

  function send(&$irc, &$data)

  {

 

  global $Channel, $Texts, $Users, $Counter;

 

  if (strpos($data->message, "!ad_help")!==false)  {

  $irc->message(SMARTIRC_TYPE_CHANNEL, $Channel,

    "Для добавления объявления введите !add <текст>");

  $irc->message(SMARTIRC_TYPE_CHANNEL, $Channel,

    "Если хотите просмотреть объявление пользователя введите !show <nick>");

   $irc->message(SMARTIRC_TYPE_CHANNEL, $Channel,

    "Вы можете добавить только одно объявление!");

   }

  if (strpos($data->message, "!add")!==false)

  {

  // отделяем текст объявления от команды "!add"

  $text = substr($data->message, 5);

  // заносим ник пользователя и сообщение в массив $Texts

  $Texts[] = "$data->nick: ".$text;

  // заносим сообщение в массив $Users

  $Users[$data->nick] = $text;

 

  // Сообщаем пользователю, что его объявление было добавлено в массив

  $irc->message(SMARTIRC_TYPE_CHANNEL, $data->nick,

       "Ваше объявление было добавлено ");

    }

 

    if (strpos($data->message, "!show")!==false)

     {

       // выделяем ник из сообщения

       $nick = substr($data->message, 6);

       // находим объявление по нику

       $m = $Users[$nick];

       if ($m==='') $m = "Пользователь $nick не оставлял объявлений";

           else $m=" Объявление пользователя $nick ".$m;

       // отправляем пользователю приватное сообщение с текстом

       // интересующего его объявления

       $irc->message(SMARTIRC_TYPE_CHANNEL, $data->nick, $m);

    }

 

    if ($Counter===3) {

      $Counter=0;                  // обнуляем счетчик

      mt_srand(time()*100000);     // инициализируем генератор сл. чисел

      shuffle($Texts);             // "перемешиваем" массив

      // выводим случайное сообщение в канал

      $irc->message(SMARTIRC_TYPE_CHANNEL, $Channel, $Texts[1]);

    }

   

    return;

  }

}

$Bot = new AdwareBot;

$irc = new Net_SmartIRC;

$irc->setUseSockets(false);

$irc->registerActionhandler(SMARTIRC_TYPE_CHANNEL|SMARTIRC_TYPE_QUERY,

      '^,ping$', $Bot, 'ping');

$irc->registerActionhandler(SMARTIRC_TYPE_CHANNEL, '', $Bot, 'send');

 

$irc->connect('localhost', 6667);

$irc->login('Adware', 'Denis', 0, 'Dens AdwareBot 2006');

 

$irc->join($Channel);

$irc->message(SMARTIRC_TYPE_CHANNEL, $Channel, 'AdwareBot started. For help type !ad_help ');

$irc->listen();

$irc->disconnect();

 

?>

Запускается бот как обычно:

php adware.php

Рис. 14.4. Adware в окне XChat

Рис. 14.5. Отправка приватных сообщений пользователю

Спрашивается, а что произойдет с объявлениями, когда вы закроете бот? Они "уйдут в никуда". Но не переживайте по этому поводу. Пользователей на канале обычно не очень много, поэтому на протяжении суток они увидят все объявления. Думаю, раз в сутки ваш компьютер перезагружается (не установите же вы бота на IRC-сервере!), при этом массив объявлений обнулится, что избавит вас от необходимости самостоятельно удалять из него устаревшие объявления. Конечно, если сильно хочется, можно добавить загрузку объявлений из файла и сохранение массивов в файл при завершении работы - это не очень сложно.

Также можно добавить в бот команду !show_all, показывающую все объявления. Но я не рекомендую этого делать. Сейчас вы тестируете бот на своем локальном сервере, где вы царь и Бог, но для реального IRC-сервера ваш бот - это обычный пользователь. Если ваш бот выведет сразу весь массив, скажем, из ста объявлений, сервер может посчитать это за флуд и забанить ваш бот. Оно вам надо?

На главную

Мне нравится!

Сегодня: 16/01

Именинники:  Андрюха aka host

Последние посты форума

Интересная картинка

Samsung Galaxy J2 Prime (SM-G532F)

дааа

Обучение PHP-программированию

Новый дизайн сайта

Возвращение на динамическую страницу сайта

С Новым Годом!

Бесплатный хостинг, SSL сертификат, не ограниченно

капец погода в ноябре у нас

Посоветуйте хостинг

флэшмобы

вот люди где живут... экстрим

авто-дилеры

Программы для Linux

книга Командная строка Linux и автоматизация рутинных задач

Совет:

Книги Д. Колисниченко:

Linux

FreeBSD. От новичка к профессионалу. 2-е издFreeBSD. От новичка к профессионалу. 2-е изд
Материал ориентирован на последние версии операционных систем FreeBSD, РУС-BSD, OpenBSD. С позиции типичного пользователя BSD показано, как самостоятельно настроить и оптимизировать эту операционную систему. Особое внимание уделяется повседневным зад                                                   

Администрирование Unix-сервера и Linux-станцийАдминистрирование Unix-сервера и Linux-станций
Книга описывает процесс развертывания и администрирования сети на основе Unix-сервера и Linux-рабочих станций.                                                                                                                                                                                               

Linux. Полное руководство, изд 1-2Linux. Полное руководство, изд 1-2
Все, что вы хотели знать о Linux: установка, настройка и программирование. Книга представляет собой великолепное руководство по Linux, позволяющее получить наиболее полное представление об этой ОС.                                                                                                        

PHP

PHP 5/6 и MySQL 6. Разработка Web-приложенийPHP 5/6 и MySQL 6. Разработка Web-приложений
На практических примерах описана разработка Web-приложений на языке PHP версий 5 и 6. Лучшая моя книга по PHP, ищите в продаже 3-е издание! Издательство БХВ- Петербург                                                                                                                                      

Самоучитель PHP 4/5Самоучитель PHP 4/5
Моя первая книга по PHP, на базе которой была написана книга Самоучитель PHP5 (НиТ). Давно распродана и не поддерживается                                                                                                                                                                                    

HTML 5 & CSS 3 - практическо програмиране за начинаещиHTML 5 & CSS 3 - практическо програмиране за начинаещи
Тази книга ще ви научи как да прилагате на практика HTML 5 и CSS 3 и да се възползвате от богатите възможности, предлагани в новите уеб стандарти. Изданието е предназначено за всеки, който е решил да се възползва от съвременните технологии за уеб диз                                                   

Интернет/CMS

Интернет: от Интернет: от "чайника" к пользователю. - 3-е изд
Книга предназначена для начинающего домашнего пользователя, поможет ему самостоятельно освоить основы Интернета и начать уверенную работу. Рассмотрены все аспекты работы в Интернете: выбор подключения, настройка подключения обычного, ADSL- и 3G-модем                                                   

Drupal 7. Руководство пользователяDrupal 7. Руководство пользователя
Эта книга — простое и эффективное учебное пособие по освоению и использованию системы управления контентом веб-сайта Drupal версии 7.0                                                                                                                                                                       

Интернет: от Интернет: от "чайника" к пользователю, 2 изд. (+Видеокурс на CD)
Книга предназначена для начинающего пользователя, поможет ему самостоятельно освоить основы Интернета и начать уверенную работу.                                                                                                                                                                            

Компьютер/Windows

Секреты реестра Windows XP/VistaСекреты реестра Windows XP/Vista
Описано устройство реестра операционных систем Windows XP/Vista. Реестр этих двух версий Windows похож, но не одинаков, поэтому в книге особо выделены функции, доступные только в XP и доступные только в Vista.                                                                                            

Самоучитель пользователя компьютером. Как самому устранить 90% неисправностей в компьютереСамоучитель пользователя компьютером. Как самому устранить 90% неисправностей в компьютере
Книга подойдет начинающим пользователям, поможет устранить простые неисправности (проблемы), возникающие при работе с ПК. Рассматривается переустановка Windows                                                                                                                                              

Самоучитель Microsoft Windows 8Самоучитель Microsoft Windows 8
Описаны основные нововведения в Windows 8, особое внимание уделено использованию системы на планшете. Рассмотрена установка системы как на физический компьютер (стационарный, ноутбук, нетбук, планшет), так и на виртуальный (VMware, Virtual Box).                                                        

Сети

Беспроводная сеть дома и в офисеБеспроводная сеть дома и в офисе
Книга поможет начинающему администратору домашней или офисной сети в кратчайшие сроки развернуть, настроить или модернизировать беспроводную сеть. Отличный выбор для построения сети SOHO                                                                                                                   

Сделай сам компьютерную сеть. Монтаж, настройка, обслуживание. Изд. 2.Сделай сам компьютерную сеть. Монтаж, настройка, обслуживание. Изд. 2.
Книга о настройке сети в Windows (98,NT,XP) и Linux. Является превосходным практическим руководством по созданию и обслуживанию компьютерных сетей.                                                                                                                                                          

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

Безопасность

Rootkits под Windows. Теория и практика программирования “шапок-невидимок“, позволяющих скрывать от системы данные, процессы, сетевые соединения.Rootkits под Windows. Теория и практика программирования “шапок-невидимок“, позволяющих скрывать от системы данные, процессы, сетевые соединения.
-                                                                                                                                                                                                                                                                                                            

Анонимность и безопасность в Интернете. От Анонимность и безопасность в Интернете. От "чайника" к пользователю
Простым и понятным языком рассказано, как скрыть свое местонахождение и IP-адрес, используя анонимные сети Tor и I2P, посетить заблокированные администратором сайты, защитить личную переписку от посторонних глаз                                                                                          

Автомобили

Новичок за рулем 2. Выбор автомобиля, дальняя поездка...Новичок за рулем 2. Выбор автомобиля, дальняя поездка...
Книга вторая. Желательно прочтение первой книги. Рекомендуется всем начинающим (и не только) водителям/ . Текст этой книги бесплатно доступен в моем блоге http://dkws.net                                                                                                                                   

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

Контраварийное вождение. Советы - Best. Советует и рекомендует президент клуба BMWКонтраварийное вождение. Советы - Best. Советует и рекомендует президент клуба BMW
Ценность этой книги в том, что впервые советы по контраварийному вождению вам будет давать проверенный профи...                                                                                                                                                                                              

Переводные книги

Переводные книгиПереводные книги
Данные книги были переведены мною на русский язык (с английского и чешского). Надеюсь качество перевода вам понравится!                                                                                                                                                                                      

Android

Планшет и смартфон на базе Android для ваших родителейПланшет и смартфон на базе Android для ваших родителей
Книга рассчитана на людей среднего и старшего возраста. Она поможет освоить современный «карманный компьютер» на базе Android, в котором все новое и "не так, как в Windows". Доступным языком описывается, как включить и выключить смартфон и т.д.                                                         

Безопасный Android: защищаем свои деньги и данные от кражиБезопасный Android: защищаем свои деньги и данные от кражи
Рассмотрены различные способы обеспечения безопасности Android-устройств: шифрование персональной информации, хранящейся на устройстве, шифрование передаваемых данных, VPN-соединения, анонимизация трафика                                                                                             

Планшет и смартфон на базе Android для ваших родителей, 2-е изд.Планшет и смартфон на базе Android для ваших родителей, 2-е изд.
Книга знакомит читателя с мобильными устройствами на базе Android. Она написана простым и понятным языком для людей среднего и старшего возраста                                                                                                                                                             

Статьи

Rambler's Top100