Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Написание бота для скандинавского аукциона


Автор: Oleg_Ci 19.2.2009, 21:31
Здравствуйте.
Идея есть, написать бота для скандинавских аукционов.
Есть цель создать сайт на тематику этих аукционов, этого бота там выложу, может продать получиться.

Если кто-то ещё не в курсе что такое “скандинавский аукцион” делаю небольшое пояснение.
В интернете появились сайты на которых товары продаются следующим образом, выкладывается товар с нулевой стоимостью, есть таймер отсчитывающий секунды до нуля, есть кнопка с надписью “Сделать Ставку”, если кто-нибудь нажимает на эту кнопку (делает ставку), тогда таймер увеличивается на какое-то количество секунд, а стоимость этого товара повышается, на 25 копеек или на 10 коп. (стоимость ставки от 5 до 10 рублей), если уменьшающийся таймер достиг нуля, тогда сделавший последнюю ставку забирает товар по стоимости которая набежала за период “торгов”(обычно не более 10-20% от реальной стоимости).
Суть сего действия в том чтобы часами (днями) сидеть и нажимать кнопку ”сделать ставку”, и чтоб после тебя никто не нажал, тогда таймер достигнет нуля, и ты (последний нажавший) заберешь товар “по дешёвке” (Конечно не считая количества слитых денег на ставки). Проигравшим вроде отдают часть денег, помойму 75%(или 50%). Я в цифрах могу ошибаться.


Сейчас я имею следующие результаты:
Пишу бота на С++ MFC.
Создал проект с классом представления производным от CHtmlView, 
получил указатели на элементы (кнопку “сделать ставку”, строки с логином и суммой) такого вида
Код
CComQIPtr<IHTMLElement, &IID_IHTMLElement> m_pButton; // указатель на кнопку

Читаю(element->get_innerText(..)) логины, суммы, вычисляю время нажатия на кнопку, перемещаю указатель на кнопку для нажатия или фокус ввода на кнопку делаю для эмуляции нажатия клавиши Enter, “нажимаю” на кнопку при помощи api-функций
Код
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); // down + up
keybd_event(VK_RETURN,MapVirtualKeyA(VK_RETURN,0),0,0); //Enter


Бот работает (нажимает на кнопку делая ставки). 
В общем я пытался идти от javascript языка и таких конструкций:
Код
var idBut = document.getElementById("button_296"); // получаем элемент-кнопку
idBut.click(); // нажимаем на кнопку


Вопросы у меня такие: 
1) сервер аукциона думает что я подключаюсь через IExplorer ? 
2) главное, как могут моего бота обнаружить? Мне кажется, обнаружить, можно только через “язык JavaScript”, например написать функцию которая за поведением мыши наблюдать будет (перемещения указателя).

Интересно также ваше мнение о том, как правильно писать подобных ботов надо (чтоб необнаружили на сервере).

(И ещё один вопрос не в раздел С++ но может здесь кто знает - есть также бот написанный на JavaScript, как его засечь можно?)

Автор: MAKCim 20.2.2009, 09:29
Цитата(Oleg_Ci @  19.2.2009,  21:31 Найти цитируемый пост)
сервер аукциона думает что я подключаюсь через IExplorer ? 

смотря, какой MFC генерирует HTTP POST запрос  smile 


Цитата(Oleg_Ci @  19.2.2009,  21:31 Найти цитируемый пост)
Мне кажется, обнаружить, можно только через “язык JavaScript”, например написать функцию которая за поведением мыши наблюдать будет (перемещения указателя).

код JS выполняется на клиентской стороне
единственный способ его свзяи с сервером - генерация POST запросов
т. к код не закрыт, то его всегда можно "вскрыть" и дальше эмулировать нужные действия

Цитата(Oleg_Ci @  19.2.2009,  21:31 Найти цитируемый пост)
Интересно также ваше мнение о том, как правильно писать подобных ботов надо (чтоб необнаружили на сервере).

боты обычно палятся на IP при большой (нетипичной для юзера-человека) активности и "неправильным" (опять таки, нетипичным для обычного браузера) полям HTTP запроса

ps. я бы использовал cURL

Автор: Oleg_Ci 20.2.2009, 16:47
Проверил свои браузеры и бота, вот таким штуками
Код

alert(
    navigator.userAgent + "\n" + 
    navigator.appCodeName + "\n" + 
    navigator.appName + "\n" + 
    navigator.appVersion + "\n" + 
    navigator.language + "\n" + 
    navigator.mimeTypes + "\n" + 
    navigator.plugins);
Код

<?php
echo $_SERVER['HTTP_USER_AGENT'];
?>

ничего подозрительного, у бота и IExplorer всё одинаково показывает.
Как проверить HTTP POST запрос ненашол.

Цитата(MAKCim @  20.2.2009,  12:29 Найти цитируемый пост)
я бы использовал cURL 
К сожалению, я этот язык незнаю. smile 

Автор: MAKCim 20.2.2009, 17:50
Цитата(Oleg_Ci @  20.2.2009,  16:47 Найти цитируемый пост)
Как проверить HTTP POST запрос ненашол.

возьми какой-нибудь сниффер и посмотри исходящий пакет, который генерирует MFC


Цитата(Oleg_Ci @  20.2.2009,  16:47 Найти цитируемый пост)
К сожалению, я этот язык незнаю.

это не язык, а библиотека
google отменили?  smile 

Автор: Oleg_Ci 20.2.2009, 18:19
Цитата(MAKCim @  20.2.2009,  20:50 Найти цитируемый пост)
это не язык, а библиотека
google отменили?

Я бегом, не разбираясь посмотрел в интернете про cURl мне показалось что это язык такой.
Если это библиотека, тогда попробую разобраться.

Автор: Oleg_Ci 20.2.2009, 19:40
При помощи сниффера HttpAnalyzerStdV3 (методы - Get, Post) проверял Бота, Opera, IExrlorer подключившись к аукциону.
Бот и IExplorer везде одинаковые у них параметры, только 1 параметр - Cookie-PHPSessId разные.

Значит сервер считает моего бота браузером IExrlorer. smile 

Спасибки за подсказки.

Добавлено через 6 минут и 16 секунд
 smile Если кто хочет может ещё написать об этом:
Цитата
Интересно также ваше мнение о том, как правильно писать подобных ботов надо

Автор: jonie 21.2.2009, 16:42
тыкать на кнопки имхо далеко неправильный способ, на что вам уже указывали.

Автор: Comm 22.2.2009, 11:57
Господин jonie правильно написал что не лучший способ тыкать на кнопки 
ИМХО Лучше обрабатывать данные минуя браузер,скопировать запрос проанализированный снифером(за исключением кукиксов или сессий)и отослать на сервер,тем самым мы исключаем запуск проверочного кода Java на стороне клиента(код вычисление бот или не бот тыкнул на кнопку).

Автор: jonie 22.2.2009, 19:39
Comm бред написал. Начиная от слов "или сессий" до конца, исключая собственно слово "отослать".

Автор: Comm 22.2.2009, 21:31
jonie, у меня есть опыт программирования подобных ботов..если мы с вами разошлись во мнениях это не значит что я бред написал.. если у вас есть другой более хороший способ,опишите его а не цитируйте кто и на что кому то указывал. ИМХО.

Автор: jonie 23.2.2009, 14:20
1) java для подобных вещей используется крайней редко, используют всеже чаще JavaScript, и уж конечно java и javasctipt вооообще разные вещи, а те кто их "путает" мягко говоря некомпетентны;
2) определить кто нажал клавишу (при коде что выше) нельзя ну никак;
3) понятие сессия вам, вероятно, не очень знакомо. по обыкнокению она хранится на сервере и привязывается к клиенту по кукам;
4) куки слать надо - иначе ваша сессия будут потеряна.


Автор: Oleg_Ci 23.2.2009, 17:06
Я тут разбирался с cURL  и вот чего получилось (правда к vs C++  прикрутить несмог,  так-то на PHP).
Вот так программа может “нажать на кнопку” (простейший вариант):
Код

$header = array("Host:www.gagen.ru",
"User-Agent:Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.6) Gecko/2009011913 
Firefox/3.0.6 (.NET CLR 3.5.30729)",
"Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language:ru,en-us;q=0.7,en;q=0.3", "Accept-Encoding:gzip,deflate",
"Accept-Charset:windows-1251,utf-8;q=0.7,*;q=0.7", "Keep-Alive:300",
"Connection:keep-alive", "If-Modified-Since:Sat, 1 Jan 2000 00:00:00 GMT",
"Referer:http://www.gagen.ru/list/demo",
"Cookie:check=fd129f1c80bbbbb4e48b571ba01d4ca7; 
PHPSESSID=bc56f59a91f13abe95a8c7c37f36ce5d; ga_login=myLogin; ga_password=myPassword"
);

    $ch = curl_init("http://www.gagen.ru/bid.php?auction=183226&r=0.243950442822667&h=");

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);    
    $result = curl_exec($ch);
    curl_close($ch);

Аналогично читает данные посылаемые с сервера (Кто куда нажал). Проверял на gagen.ru
Непонял зачем программа добавляе к URL случайное значение
(javascript:Math.random())(“…htm?r=0.11509138081176307”).

Кстати можно “нажимать на кнопку” введя в браузере подобную строку:
"http://www.gagen.ru/bid.php?auction=183226&r=0.653980322524627&h="

Цитата(jonie @  23.2.2009,  17:20 Найти цитируемый пост)
1) java для подобных вещей используется крайней редко, используют всеже чаще JavaScript,
У меня есть на JavaScript бот один, сам написал, работает на IExplorer + IE7Pro. Только я незнаю могутли его запалить как-нибудь.Правда он тоже на кнопки тыкает.

Автор: Comm 23.2.2009, 17:52
Под словом "Куки" я понимаю информацию оставленную сервером на клиентском компьютере.
Под словом "Сессия" я понимаю некоторый промежуток времени в котором Авторизация не нужна.

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

Автор: jonie 24.2.2009, 00:41
Comm а давайте будем разговаривать, когда вы узнаете отличия Java от JavaScript и будете применять полученные знания? с помощью javascript вы мои ip адреса не узнаете.

Автор: Comm 24.2.2009, 11:13
Цитата

с помощью javascript вы мои ip адреса не узнаете. 

Как вариант,прочитать ключ найстройки из реестра.

Автор: jonie 24.2.2009, 11:56
код в студию как вы это сделаете.
усложнение (задание 2): у меня freeeBSD вообще, удачи!

Автор: Artemon 24.2.2009, 12:04
Цитата

с помощью javascript вы мои ip адреса не узнаете.


С чего это вдруг ?
Вот пожалуйста:

Код

<script>
var ip = new java.net.InetAddress.getLocalHost();
var ipStr = new java.lang.String(ip);
document.writeln(ipStr.substring(ipStr.indexOf("/")+1));
</SCRIPT>


Цитата

Как вариант,прочитать ключ найстройки из реестра.


Вы что думаете JavaScript может работать с реестром, вы ошибаетесь!

Если используется анонимный прокси сервер + ваше собственное приложение (не браузер), то сервер никогда не определит идет запрос с браузера или из программы бота.

Автор: jonie 24.2.2009, 13:10
вот у меня чего пишет мой FF3 :
Цитата

Ошибка: java is not defined
Источник: file:///11.html
Строка: 2


Цитата


Вы что думаете JavaScript может работать с реестром, вы ошибаетесь!
ну ну ну) давайте расскажите мне про реестр в freeBSD ... угу, ждемс.

Автор: Comm 24.2.2009, 13:16
Цитата

Вы что думаете JavaScript может работать с реестром, вы ошибаетесь!

Ну я просто предположил =)
Цитата

Если используется анонимный прокси сервер + ваше собственное приложение (не браузер), то сервер никогда не определит идет запрос с браузера или из программы бота.

Полностью с вами согласен(Если собственное приложение не обрабатывает ни ActiveX ни каких бы то небыло сценариев)
P.S. Я ещё где то читал  про черный список прокси серверов,и то что перед использованием прокси нужно обязательно посмотреть в этом списке про используемый прокси сервер.(Не знаю в тему это или нет)

Автор: Artemon 24.2.2009, 20:13
Про JavaScript инфу нашел здесь: http://forums.asp.net/p/1276422/2432905.aspx#2432905

Попробовал последний пример из приведенной ссылки - в IE действительно показывает IP локальной 
машины, а тот пример что приведен мной выше - это Java, а не JavaScript (сначала я его принял за JS).

Цитата

ну ну ну) давайте расскажите мне про реестр в freeBSD ... угу, ждемс.


К чему это вы вообще, ведь понятно, что речь шла про винду, но даже там к реестру из JS не обратиться, поэтому тема реестра сразу отсеивается.

Цитата

Я ещё где то читал  про черный список прокси серверов,и то что перед использованием прокси нужно обязательно посмотреть в этом списке про используемый прокси сервер.(Не знаю в тему это или нет)


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

Автор: jonie 24.2.2009, 21:09
вот мой результат в IE7 (win xp + все обновления (сами качаются с ms update)):
Код

---------------------------
Ошибка
---------------------------
A Runtime Error has occurred.
Do you wish to Debug?

Line: 1
Error: 'java' - определение отсутствует
---------------------------
Да   Нет   
---------------------------
 (JRE 1.6 стоит -  в общем java аплеты работают).

Artemon я всеже не соглашусь что это java. это помесь "непойми чего непойми с чем", и работать это будет у может быть 1-5% юзеров и только в осле и только если у них уровень безопасности искуственно понижен и только если юзер разрешит. Кроме того, это не даст вам мой ip (лично на моей машине 3-и сетевых карты и 4-е VPN интерфейса, дак еще все NAT-тится...).. попробуй "угадай" называется.
в общем это не метод.

Автор: Artemon 25.2.2009, 07:19
Попробуй вот этот код в IE:

Код

<script type="text/javascript" language="javascript"> 
<!-- 
function GetLocalIPAddress() 

    var obj = null; 
    var rslt = ""; 
    try 
    { 
        obj = new ActiveXObject("rcbdyctl.Setting"); 
        rslt = obj.GetIPAddress; 
        obj = null; 
    } 
    catch(e) 
    { 
        // 
    } 
     
    return rslt; 


document.write("IP is:" + GetLocalIPAddress()); 
//--> 
</script>

Автор: jonie 25.2.2009, 09:21
никогда не нажимаю кнопки вроде "разрешить активное содержимое? оно может повредить вашему компьютеру" )). Опять же это JScript, а не JavaScript. Я прекрасно знаю про activex в jscript, собственно вчера только игрался с IS2009....
однако, хватит спорить. вернемся к истокам:
Цитата

Именно с помощью скриптов Java можно вычислить реальный ай пи адрес конечного пользователя вне зависимости от того подключен ли он через прокси. Поэтому я и предположил что с помощью Java можно узнать ,искусственно или нет была нажата та или иная кнопка.
лично я не понимаю как знание ip адреса вроде 192.168.0.1 поможет в обнаружении кто щелкнул на кнопке.

Автор: nerezus 25.2.2009, 12:38
Цитата

Как вариант,прочитать ключ найстройки из реестра
 И это будет работать на минимальной доле браузеров, а конкретно только на криво настроенных IE. Т.е. куда шаловливые ручки в настройки влезли и "настроили".

Автор: Comm 25.2.2009, 13:33
Цитата

лично я не понимаю как знание ip адреса вроде 192.168.0.1 поможет в обнаружении кто щелкнул на кнопке. 


Про ай пи адрес это просто пример для обозначения возможностей.


Я думаю что с помощью Java/JavaScript можно написать проверочный скрипт (Кто или что нажало кнопку) ИМХО

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)