Автоматизируем покупку предметов на торговой площадке Steam на чистом JavaScript
Invite pending

Здравствуй, Хабрахабр!
Думаю, что многие из Вас задумывались о автоматизации каких-либо процессов. Ведь заниматься «рутиной» работой мало кому интересно.
Я попробовал написать автоматическую покупку предметов на торговой площадке Steam на чистом JavaScript, и поделиться этим довольно интересным опытом с Хабрапользователями.
Исполнение пользовательского JavaScript.
Для исполнения пользовательского JavaScript я использовал расширение для браузера Mozilla Firefox под названием «Greasemonkey». Аналогичное расширение существует для браузера Google Chrome — «TamperMonkey», и, заметил Beta-версию для Opera.
После установки расширения, мы сможем исполнить JavaScript-код на страницах веб-сайтов.
Я видел довольно много статей на Хабре про «Greasemonkey», и, надеюсь, многие из Вас с ним знакомы. Поэтому, мы можем приступать.
Для начала, создадим новый скрипт, нажав на пункт «Создать скрипт...» и заполнив необходимые поля.
Мы сделаем полную эмуляцию поведения человека, дабы, в дальнейшем, избежать каких-либо проблем.
Напишем и разберем следующий код:
// ==UserScript==
// @author Evansive
// @name Steam market autobuy bot
// @namespace Evansive
// @description Покупает вещи в Steam-маркете
// @version 1
// @grant none
// ==/UserScript==
// Массив с предметами. item_id — название предмета, указанное в URL на торговой площадке, price: цена в разменных единицах, то есть, например, в копейках или центах.
var
items = [
{item_id: 'SSG%2008%20|%20Lichen%20Dashed%20(Field-Tested)', price: '210'},
{item_id: 'SG%20553%20|%20Tornado%20(Field-Tested)', price: '150'},
{item_id: 'Winter%20Offensive%20Weapon%20Case', price: '2700'},
{item_id: 'Operation%20Bravo%20Case', price: '100'},
{item_id: 'M4A4%20|%20Faded%20Zebra%20(Field-Tested)', price: '100'},
{item_id: 'CS:GO%20Weapon%20Case', price: '200'}
],
// Массив с возможными ошибками.
messages = {
logged: "AutoBuy: Вы не авторизованы на сайте."
}
;
// Проверяем, авторизован ли пользователь на сайте Steam.
if(!g_bLoggedIn) {
el = document.createElement("div");
el.setAttribute("style", "background-color: #fff;");
el.innerHTML = "<b><font color='#eb0000'>" + messages.logged + "</font><b>";
// После шапки выводим напоминание, что необходимо авторизоваться на сайте перед покупкой.
insertAfter(document.getElementById("global_header"), el);
}
// Получаем название предмета из ссылки, которую открыл пользователь.
regexp = new RegExp("listings\/[0-9]+\/(.*)");
var match = location.href.match(regexp);
if(match) { // В случае, если открыл ссылку на предмет из торговой площадки.
// В случае, если Steam вывел какую-либо ошибку в процессе загрузки цен на предметы, перезагрузим страницу.
if(document.getElementsByClassName('market_listing_table_message').length) {
console.log("Проблема с загрузкой предметов.");
location.reload();
return false;
}
var
market_price = document.getElementsByClassName('market_listing_price market_listing_price_with_fee')[0].innerHTML, // Получаем цену на предмет в строковом формате.
marketPrice = market_price.replace(/[A-Za-zА-Яа-я.]+/, market_price); // Убираем обозначение денежной единицы из цены.
;
marketPrice = parseFloat(marketPrice) * 100; // Преобразуем денежную единицу в разменную. (Копейка, цент и так далее)
for(var i = 0; i < items.length; i++) {
if(match[1] == items[i].item_id) { // В случае, если название предмета, который мы в данный момент смотрим, совпадает с предметом из массива.
if(marketPrice <= items[i].price) { // Если цена меньше той, что указана в массиве для данного предмета.
document.getElementsByClassName('item_market_action_button_green')[0].click(); // Нажимаем кнопку покупки.
document.getElementById('market_buynow_dialog_accept_ssa').checked = true; // Ставим галочку и принимаем условия пользовательского соглашения.
window.setInterval(function(){
document.getElementById('market_buynow_dialog_purchase').getElementsByTagName('span')[0].click(); // Покупаем предмет.
window.setInterval(function() {
window.location = window.location.href.substring(0, window.location.href.indexOf('#')); // Успех, перезагружаем страницу.
}, 5000);
}, 1000);
console.log("Отлично, покупаем предмет.");
break;
}
else {
window.setInterval(function() {
window.location = window.location.href.substring(0, window.location.href.indexOf('#'));
}, 3000);
console.log("Нет предметов для покупки.");
break;
}
}
}
}
function insertAfter(referenceNode, newNode) {
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}
Сразу скажу, что для работы скрипта, необходимо открыть вкладку с предметом из массива в браузере, после чего запустить расширение «Greasemonkey». Соответственно, таким образом, мы можем автоматизировать весь процесс работы Steam-аукциона, сделав, например, автоматическую продажу предметов по определенным ценам и требованиям.
Надеюсь, что вы сможете сделать что-то увлекательное и поделитесь своим опытом. До встречи!