Бот для чата mail.ru

Discussion in 'PHP' started by SMERSH, 4 Nov 2006.

  1. SMERSH

    SMERSH Member

    Joined:
    11 Oct 2006
    Messages:
    11
    Likes Received:
    11
    Reputations:
    1
    Выложил исходник бота для чата mail.ru. Кому интересно - сюда
     
    3 people like this.
  2. nc.STRIEM

    nc.STRIEM Members of Antichat

    Joined:
    5 Apr 2006
    Messages:
    1,036
    Likes Received:
    347
    Reputations:
    292
    Чет я там ничего не нашол! дай ссылку конкретно на файл!
     
  3. tclover

    tclover nobody

    Joined:
    13 Dec 2005
    Messages:
    741
    Likes Received:
    682
    Reputations:
    287
    Просто форум криво обрабатывает ссылки
    Code:
    http://www.bit-team.com/modules.php?name=Articles&file=view&articles_id=18
     
  4. SMERSH

    SMERSH Member

    Joined:
    11 Oct 2006
    Messages:
    11
    Likes Received:
    11
    Reputations:
    1
    http://www.bit-team.com/modules.php?name=Articles&file=view&articles_id=18
     
  5. SMERSH

    SMERSH Member

    Joined:
    11 Oct 2006
    Messages:
    11
    Likes Received:
    11
    Reputations:
    1
    Выложил еще один усовершенствованный исходник бота для чата mail.ru.

    http://bit-team.com/modules.php?name=Articles&file=view&articles_id=20
     
    1 person likes this.
  6. fucker"ok

    fucker"ok Elder - Старейшина

    Joined:
    21 Nov 2004
    Messages:
    580
    Likes Received:
    279
    Reputations:
    91
    Мде. Я своего бота боюсь в публик выкладывать, а ты так сразу... Щас народ понесется из него флудеры делать и всеких "мертвых" людей, для повышения рейтинга каналов. Накроется чат :)
    Но все-равно ++
     
  7. wffic

    wffic New Member

    Joined:
    10 Nov 2006
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Классно!
    Автору огромный респект.
    Но у мня есть пара глупых вопросов

    * Почему авторизация проходит в 5 запросов? Я догадываюсь, что это как-то связано со спецификой чата, но непонятно как. То есть я прошу объяснить эту самую спецификацию (всегда думал, что авторизация проходит только по одной схеме - отправка запроса > получение кук в ответе > возможность работы в чате посредством этих кук. Теперь оказывается, что первых кук недостаточно)

    Как авторизацию делает fucker"ok?

    * Есть ли возможность реагировать на события типа появления новых сообщений, захода новых юзеров и т.д. не обновляя окно каждый раз? Ведь браузер не обновляется.
     
  8. SMERSH

    SMERSH Member

    Joined:
    11 Oct 2006
    Messages:
    11
    Likes Received:
    11
    Reputations:
    1
    Привет wffic от подельника - <b>Hrumtik</b>'а! =))

    Как видно из исходника, сама авторизация проходит в 3 запроса:
    1. POST .../cgi-bin/auth (в ответ куки MailUser, Mpop и t +ссылка [http://my.chat.mail.ru/cgi-bin/checkcookie?id=...])
    2. GET [ссылка] (в ответ ссылка-2 [http://chat.mail.ru/?mra=&roomleft=&nick=...])
    3. GET [ссылка-2] (в ответ куки MRCU и TICKET +ссылка [.../cgi-xml/chat])
    Самые важные куки MRCU и TICKET получены, используя их можно общаться в чате и прочее...

    Четвертый запрос - это запрос на [.../cgi-xml/chat], т.е. на страничку с тремя фрэймами (чат, лидер чата и список чатлан), которая отображается при входе в чат через браузер.

    Пятый запрос - это запрос как раз на фрэйм чата [.../cgi-xml/irc] с этой страницы, т.к. для общения нужен только он... в процессе используется также фрэйм списка чатлан - это отдельная функция с запросом на [.../cgi-xml/list]... +функция с запрсом на список комнат [.../data-xml/header.html#] +фрэйм "лидер чата", ф-я с запросом на [.../home/smsleader.html].... и пр. (не включено в статью)

    Очевидно что четвертый запрос можно игнорировать перескачив сразу на фрэйм чата [.../cgi-xml/irc], но возиться с этим желания нет =), тем более что функция PostGet все упращает.

    Почему столько запросов, это уже фантазия майловцев.. захотят сделают и 10 запросов для авторизации... это ничего не меняет, возможно только перегрузка их сервера... хотя перегруз вряд ли им грозит =)

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

    Боту нет необходимости обновлять страницу, т.к. сервер не закрывает сокет а передает в него все вновь поступившие сообщения и разные события... поэтому повторю, проблем с чтением и реакцией быть не должно, просто надо дописать кое-что и кое-где... причем без использования многопоточности и ... но это я разговорился =))

    Хотел еще что-то понаписать.. да некогда...
    Все это безобразие написано и на Delphi и пр., ... и не только для чата и не только для Mail.Ru...=))... но для статьи хватит и Mail.Ru с PHP =)
     
    1 person likes this.
  9. Hrumtik

    Hrumtik New Member

    Joined:
    12 Nov 2006
    Messages:
    8
    Likes Received:
    2
    Reputations:
    0
    Вот такие вот дела, пока дождеси письма при регистрации на форуме.... мля... расхочешь вапще сюда заходить :)
     
    1 person likes this.
  10. wffic

    wffic New Member

    Joined:
    10 Nov 2006
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    @Hrumtik: Я вот дождался и спросил чего хотел =)

    @SMERSH: Спасибо, с запросами всё понятно =)
    Я посмотрел скрипт внимательно и увидел следущее: на пятом запросе режим сокета устанавливается в "неблокирующий" и вместо чтения ответа с сервера после запроса начинается бесконечный цикл. Я понимаю так: режим неблокирующий и сокет не закрыт => в него переходит поток данных с сервера, в котором и содержатся все события. Нужно только непрерывно его читать.

    Как же это сделать? =)

    К сожалению, не очень понимаю. Написать fget вместо sleep?

    (Я не слишком знаю пхп и сетевое программирование... Я только начинаю =))
     
  11. Hrumtik

    Hrumtik New Member

    Joined:
    12 Nov 2006
    Messages:
    8
    Likes Received:
    2
    Reputations:
    0
    Я усе выложил здесь (все что нуно заменить или добавить для того чтобы бот реагировал):

    форум Bit-Team
    http://forum.bit-team.com/index.php?act=ST&f=9&t=166&st=0

    Естесно открываем бесконечный цикл

    while (true == true){ // бесконечный цикл
    usleep(100000);
    $response = fgets($sock); // читать ответ
    ...
    }

    usleep - это задержка в микросекундах... тут 100 миллисек.... она нужна, чтобы винда не повесилась =))
    дальше читаем ответ (сервер построчно передает инфу)

    ... ну и все в этом духе
     
    #11 Hrumtik, 13 Nov 2006
    Last edited: 13 Nov 2006
  12. fucker"ok

    fucker"ok Elder - Старейшина

    Joined:
    21 Nov 2004
    Messages:
    580
    Likes Received:
    279
    Reputations:
    91
    Авторизацию делаю в 2 захода:
    • Авторизация на mail.ru (а не на чат, ). Выдераем кук
    • Заходу в комнату, с кукой от майла + выдерание куки от чата
    Ну и дальше собсвенно читаем сам чат. (подставляюю куку майла+чата)
    >(сервер построчно передает инфу)
    Я давно уже не смотрел, но в момент написание бота мной, сервер передавал все комманды без \n, сталобыть приходилось считывать посимвольно.
    А вот самое главное - парсер дейсвий (вырезка из моего кода)
    PHP:
    // Получение сообщения
    $parent1="#<script>ms\('(.+?)',(.+?),'',0,'(.+?)',(.+?),0,0\);</script>#ie";
       
    preg_replace($parent1,"\$this->message=array('nick'=>'\\1','nickcolor'=>'\\2','msg'=>'\\3','textcolor'=>'\\4')",$msg);
    //кто-то выходит с канала (запоминаем  тока ник аутсайдера)
    $parent2="#top.du\('(.+?)', [0-1], ''\);</script>#ie";
    preg_replace($parent2,"\$this->outsider='\\1'",$msg);
    //кто-то приходит на канал
    $parent3="#top.pu\('(.+?)',(.+?),(.+?),(.+?),(.+?),(.+?),'(.+?)',#ie";
    preg_replace($parent3,"\$this->insider=array('nick'=>'\\1','email'=>'\\7','moder'=>'\\5','color'=>'\\2')",$msg);
    //кого-то выкинули или забанили, зависит от цыфры type
    $parent4="#<script>top.du\('(.+?)', ([2-6]+), '(.+?)'\);</script>#ie";
       
    preg_replace($parent4,"\$this->kicked=array('kicked'=>'\\1','type'=>'\\2','kicker'=>'\\3')",$msg);
    //вам пишут в приват 
    $parent="#<script>ms\('(.+?)',(.+?),'(.+?)',(.+?),'(.+?)',(.+?)\);</script>#ie";
    preg_replace($parent,"\$this->private=array('from'=>'\\1',msg=>'\\5')",$msg);
    При написании функции выкида пользователей поэксперементируйте с передаваемыми данными т.к. есть один прикол, который нашёл ботописец OverClocker, что можно сделать такой финт ушами, когда все будут видить что пользователя просто кикнули, ну а на самом деле забанили :)

    Делитесь секретами, кто чего интересного нашёл :)
    Настройки бота (фильтры мата и тд)
    http://mailovka.ru/files/cmr/normalnoe/options.xml
    Не советую делать, обычный массив из матов и проверят т.к. реакция на слова: бляха, раслаблятся, застра*** и тд будет весьма обидна, для ваших юзеров ;)
    Кому интересно, мой бот работает в канале "Нормальное_общение", под никому Нормобик.
     
    #12 fucker"ok, 13 Nov 2006
    Last edited: 13 Nov 2006
  13. Hrumtik

    Hrumtik New Member

    Joined:
    12 Nov 2006
    Messages:
    8
    Likes Received:
    2
    Reputations:
    0
    fucker"ok

    Интересно....

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

    небось оптимизировал уже все по самое немагу ;)

    А как ты решал проблему ответов, не изобретать же ИИ :D... вот я пытался как-то составить базу вопросов и ответов на них... при получении мессаги соорудить вроде поиска в яндексе.. т.е. по количеству слов, по проценту встречаемости их и прочее... как -то максимально приблить заданный вопрос к вопросу в базе... но это оказалось трудновато.. точнее трудно реализовать не загрузив машину на смерть :confused:
     
    #13 Hrumtik, 13 Nov 2006
    Last edited: 13 Nov 2006
  14. SMERSH

    SMERSH Member

    Joined:
    11 Oct 2006
    Messages:
    11
    Likes Received:
    11
    Reputations:
    1
    А кто знает верный способ, штоб скрипт не отваливался по тайм-ауту??
     
  15. fucker"ok

    fucker"ok Elder - Старейшина

    Joined:
    21 Nov 2004
    Messages:
    580
    Likes Received:
    279
    Reputations:
    91
    А мой бот с народом не общается, я его как модератора делал. Разве что шутки игра в загадки, так базу загадок и шуток можно от eggdrop'а взять. Да и чтобы он реагировал на приветы и тд... хз... Зафлудят бота, он и помрет :)

    Чтобы не уходил в away /cgi-xml/away?away=0 или мессагу каждые 15 мин кидать хотя бы (я вот рекламу кидаю на сайт той комнаты) Удобно повесить сие на cron (чтобы каждый 15 мин запускался скрипт) В винде правда крона нет, но наверняка есть что-то похожее :)

    Чтобы скрипт не отрубался - set_time_limit(0);
     
  16. St__one

    St__one Elder - Старейшина

    Joined:
    5 Jul 2006
    Messages:
    24
    Likes Received:
    6
    Reputations:
    6
    Можно использовать exit или die для остановки...
    php.ru:
    Code:
    Примечание: эта функция не работает в системах Windows.
    
    )))
     
  17. Zadoxlik

    Zadoxlik рояль с сыром

    Joined:
    28 Feb 2005
    Messages:
    758
    Likes Received:
    216
    Reputations:
    257
    usleep для Windows

    function wusleep($microseconds) {
    @fsockopen("127.0.0.1", 22333, $errno, $errstr, $microseconds/1000000);
    }

    // 22333 - закрытый порт на вашем компутере
     
  18. Hrumtik

    Hrumtik New Member

    Joined:
    12 Nov 2006
    Messages:
    8
    Likes Received:
    2
    Reputations:
    0
    баги

    Коечно usleep не работает под Windows, просто у меня винда не в курсе. Там есть баги и я давно их у себя пофиксил и переписал всего бота.... неужели я не знаю как выходить из бесконечного цикла и прочую хню... в паблике пример... дорабатывайте сами, если нужно =)

    По крайней мере я скачал PHP 5.2.0 c IDE и никаких проблем с usleep у меня не было никогда ;)
     
    #18 Hrumtik, 18 Nov 2006
    Last edited: 14 Dec 2006
  19. Hrumtik

    Hrumtik New Member

    Joined:
    12 Nov 2006
    Messages:
    8
    Likes Received:
    2
    Reputations:
    0
    Да и патом причем тут винда, когда гоняться все это будет у хостера :confused:

    Кстати забыл сказать, что я то юзаю вот такую конструкцию:

    PHP:
    $cycle true;
    // прием данных от сервера
    while ($cycle){ 
      if (!
    is_resource($chat->socket) or feof($chat->socket)) 
        
    $cycle false// уходим
      
    $response fgets($chat->socket); 
      if (!
    $responsesleep(1); // задержка при отсутствии данных

    // ### ДЕЙСТВИЯ В ЧАТЕ ###
    }
    че вы там обсуждаете хз
     
    #19 Hrumtik, 14 Dec 2006
    Last edited: 14 Dec 2006
  20. ISkateL!

    ISkateL! Member

    Joined:
    5 Mar 2007
    Messages:
    15
    Likes Received:
    9
    Reputations:
    0
    А тут кто-то сказал что у него бот-модератор.. так вот, как добавить модерские опции, чтобы он там выкидывал блокировал и тп??
     
    #20 ISkateL!, 17 Mar 2007
    Last edited: 22 Aug 2011
    6 people like this.
Loading...
Similar Threads - чата mail
  1. GAiN
    Replies:
    3
    Views:
    7,265