Как стать автором
Обновить

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

image

Здравствуй, Хабрахабр!

Думаю, что многие из Вас задумывались о автоматизации каких-либо процессов. Ведь заниматься «рутиной» работой мало кому интересно.

Я попробовал написать автоматическую покупку предметов на торговой площадке 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-аукциона, сделав, например, автоматическую продажу предметов по определенным ценам и требованиям.

Надеюсь, что вы сможете сделать что-то увлекательное и поделитесь своим опытом. До встречи!
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.