"Легкий" спаммер вконтакте на Human Emulator

Тема в разделе "PHP", создана пользователем LLlaMaH, 13 ноя 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. LLlaMaH

    LLlaMaH Вот он я

    Регистр.:
    1 апр 2009
    Сообщения:
    250
    Симпатии:
    359
    Нужна помощь.
    Опишу ситуацию, т.к. ТЗ писать не умею :)
    Есть 4 аккаунта Вконтакте.
    На данный момент я от каждого аккаунта отправляю сообщения вручную. Происходит это следующим образом. Отбираю людей по критериям, проверяю, писал ли я от конкретного аккаунта ему сообщение или нет, если нет - вставляю заготовленный шаблон, только имя меняю. При отправке сообщений капчу ввожу руками (если она появляется).
    Хочу автоматизировать следующим образом.
    1) Создание файла со списком ID, которым я отправлял сообщение со всех 4-х аккаунтов.
    2) Отбор ID и имен по заданным критериям (сохранение в файл) и проверка на отсутствие в файле 1.
    2а) Не программно - изменяю имена пользователей в файле, т.к. есть пользователи, которые пишут "Светик", а я обращаюсь "Светлана". Если имя определить невозможно, то просто удаляем "текущее" имя.
    3) Автоматическая вставка заготовленного текста из файла + подстановка имени пользователя из файла 2а в нужное место в сообщении.
    4) Отправка сообщения и распознавание капчи антигейтом. И так 20 раз (по-моему, такое ограничение на количество сообщений)
    Пожалуй, все :)

    В этой теме прошу помощи с вопросами, с которыми буду сталкиваться.
    Собственно, первый вопрос. Каким образом организовать парсинг ID тех, кому уже отправлено сообщение?
    1) Залогинился, зашел в сообщения, зашел в отправленные.
    2) Вот тут мои знания заканчиваются. Опишите, хотя бы принцип парсинга.
    Всем заранее спасибо за помощь.
     
  2. DeaDSandro

    DeaDSandro Создатель

    Регистр.:
    30 апр 2010
    Сообщения:
    49
    Симпатии:
    16
    Не претендую на лучший ответ, но предположу, что после "зашел отправленные" выдираем из страницы регэкспом все айдишки ( vkontakte.ru/idXXXXXXXX ), помещаем их в массив, переходим на 2 страницу личных сообщений, если таковая имеется, опять выдираем, помещаем в массив итд...
    Затем из полученного массива убираем повторы, остаются айди контактов, которым уже посылались сообщения
     
    LLlaMaH нравится это.
  3. LLlaMaH

    LLlaMaH Вот он я

    Регистр.:
    1 апр 2009
    Сообщения:
    250
    Симпатии:
    359
    С регулярками не очень дружу (скорее, совсем не дружу). В поисках хоть какого-то понимания или облегчения написания натолкнулся на проги RegexBuddy и RegexMagic. Только это не сильно помогло.
    Посмотрел код страницы отправленных сообщений - надо составить выражение, которое искало бы "/id123456789". Причем, количество цифр может изменяться. Кто в этом силен, уверен, большого труда не составит.
     
  4. DeaDSandro

    DeaDSandro Создатель

    Регистр.:
    30 апр 2010
    Сообщения:
    49
    Симпатии:
    16
    нарисую на питоне, ибо с пхп дружу также, как вы с регулярками.

    PHP:
    id re.findall("\/id\d{6,9}"html)
    чтобы было легче написать это на пхп:
    findall вытягивает все совпадения регулярного выражения из переменной html, в которой будет храниться страница с сообщениями, и возвращает их в массив id
     
  5. LLlaMaH

    LLlaMaH Вот он я

    Регистр.:
    1 апр 2009
    Сообщения:
    250
    Симпатии:
    359
    PHP:
    if (preg_match_all('/(\/id\d{6,9})/',$sentmesspage,$matches)) 
    {
    for (
    $i=0;$i<count($matches);$i++)
    {
    print (
    $matches[$i]);
    }
    }
    Составил регулярку. $sentmesspage - html-код страницы отправленных сообщений.
    print ($matches[$i]) - результат отработки этой функции - пишет "ArrayArray" и все :( (вместо элементов массива, которые хотелось бы видеть).
    Кто может подсказать, в чем вопрос?
     
  6. Google.com

    Google.com Читатель

    Заблокирован
    Регистр.:
    16 фев 2010
    Сообщения:
    250
    Симпатии:
    295
    PHP:
    if (preg_match_all('/(\/id\d{6,9})/',$sentmesspage,$matches)) 
    {
    for (
    $i=0;$i<count($matches);$i++)
    {
    print (
    $matches[1][$i]);
    }
    }  
     
    LLlaMaH нравится это.
  7. LLlaMaH

    LLlaMaH Вот он я

    Регистр.:
    1 апр 2009
    Сообщения:
    250
    Симпатии:
    359
    Почему-то печатается только два элемента, причем только с моим id шником (никак не тех, кому я отправлял).
    У кого-нибудь есть идеи на этот счет?
    Код страницы сохраняется и читается верно - перепроверял). Пример кода странциы не буду выкладывать - думаю, доступ к вк есть - открыть страницу отправленных сообщений и посмотреть исходный код проблем не составит.
    И еще вопрос. Как отловить страницы, у которых ссылка не "id123456789" а "qwerty"?
    _______________
    Нашел причину того, что 2 id-шника только выводило. Надо было и в цикле ставить "$matches[1]".
    PHP:
    <?php

    $xhe_host 
    ="127.0.0.1:7010";

    // The following code is required to properly run XWeb Human Emulator
    require("../Templates/xweb_human_emulator.php");

    $browser->navigate('http://vkontakte.ru');
    $browser->wait_for(60,1);
    $anchor->click_by_inner_text('Ìîè Ñîîáùåíèÿ',true);
    $browser->wait_for(60,1);
    $element->click_on_element_by_inner_text('Îòïðàâëåííûå');
    $browser->wait_for(60,1);
    $sentmesspage=$webpage->get_document_body($as_html=true);
    $textfile->write_file('d:\\vk.txt',$sentmesspage,60);
    $contents $textfile->read_file('d:\\vk.txt',60);
    if (
    preg_match_all('/(\/id\d{6,9})/',$contents,$matches) ) {
    for (
    $i=0;$i<count($matches[1]);$i++)
    {
    $id=$matches[1][$i];
    $textfile->add_string_to_file('d:\\id.txt',"$id"."\r\n",60);
    }
    }
    for (
    $j=2;$j<100;$j++)
    {
    $anchor->click_by_inner_text($j,true);
    $browser->wait_for(60,1);
    $sentmesspage=$webpage->get_document_body($as_html=true);
    $textfile->write_file('d:\\vk.txt',$sentmesspage,60);
    $contents $textfile->read_file('d:\\vk.txt',60);
    if (
    preg_match_all('/(\/id\d{6,9})/',$contents,$matches) ) {
    for (
    $i=0;$i<count($matches[1]);$i++)
    {
    $id=$matches[1][$i];
    $textfile->add_string_to_file('d:\\id.txt',"$id"."\r\n",60);
    }
    }
    }

    // Quit
    $app->quit();
    ?>
    Может кому пригодится. Скрипт записывает в файл все id, что он найдет на страницах отправленных сообщений вконтакте.

    Единственный вопрос - как отобрать ссылки вида "/qwerty" - этот скрипт такого не обрабатывает.
    ____________

    Приступаю к написанию "спаммера"
     
  8. LLlaMaH

    LLlaMaH Вот он я

    Регистр.:
    1 апр 2009
    Сообщения:
    250
    Симпатии:
    359
    Столкнулся с проблемой - через XHE нельзя задать условия поиска для вк - например, нельзя поставить галочку "онлайн". Пока обошел копированием адресной строки с критериями из фф.
    Может кто подскажет, как работать непосредственно через XHE? Или только так, как я и делаю?
     
  9. ZCFD

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    ну так в XHE есть режим записи макроса - посмотри через него

    + быть не может что бы кседант не давал поставить галочку
     
  10. LLlaMaH

    LLlaMaH Вот он я

    Регистр.:
    1 апр 2009
    Сообщения:
    250
    Симпатии:
    359
    В том-то и дело, что без записи скрипта ставит галочку, а вот при записи - никак. Поэтому не могу сообразить, к какому элементу обращаться. В принципе, и со вставкой строки поиска неплохо получается.
    _________________________________
    Встала задача с капчей. Как ее можно отловить? Если она иногда появляется, а иногда нет. И появляется она не сразу на странице, на которой кнопка "отправить сообщение", а после нажатия на эту кнопку "поверх" страницы. См. скрин.
    captch.gif
    ____________

    Если я правильно понял, нужно использовать "$anchor->is_exist_by_atribute_in_frame($atr_name,$atr_value,$frame,$exactly=true);" (Проверяет существование элемента с заданным значением, заданного атрибута в заданном фрейме). Вопрос - как узнать "заданный фрейм" (Что писать в переменную "$frame")?
     
Статус темы:
Закрыта.