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

Статус
В этой теме нельзя размещать новые ответы.

LLlaMaH

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

В этой теме прошу помощи с вопросами, с которыми буду сталкиваться.
Собственно, первый вопрос. Каким образом организовать парсинг ID тех, кому уже отправлено сообщение?
1) Залогинился, зашел в сообщения, зашел в отправленные.
2) Вот тут мои знания заканчиваются. Опишите, хотя бы принцип парсинга.
Всем заранее спасибо за помощь.
 
Не претендую на лучший ответ, но предположу, что после "зашел отправленные" выдираем из страницы регэкспом все айдишки ( vkontakte.ru/idXXXXXXXX ), помещаем их в массив, переходим на 2 страницу личных сообщений, если таковая имеется, опять выдираем, помещаем в массив итд...
Затем из полученного массива убираем повторы, остаются айди контактов, которым уже посылались сообщения
 
С регулярками не очень дружу (скорее, совсем не дружу). В поисках хоть какого-то понимания или облегчения написания натолкнулся на проги RegexBuddy и RegexMagic. Только это не сильно помогло.
Посмотрел код страницы отправленных сообщений - надо составить выражение, которое искало бы "/id123456789". Причем, количество цифр может изменяться. Кто в этом силен, уверен, большого труда не составит.
 
нарисую на питоне, ибо с пхп дружу также, как вы с регулярками.

PHP:
id = re.findall("\/id\d{6,9}", html)
чтобы было легче написать это на пхп:
findall вытягивает все совпадения регулярного выражения из переменной html, в которой будет храниться страница с сообщениями, и возвращает их в массив id
 
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
PHP:
if (preg_match_all('/(\/id\d{6,9})/',$sentmesspage,$matches)) 
{
for ($i=0;$i<count($matches);$i++)
{
print ($matches[1][$i]);
}
}
 
Почему-то печатается только два элемента, причем только с моим 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" - этот скрипт такого не обрабатывает.
____________

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

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

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