Pull to refresh

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

Надеюсь, что вы сможете сделать что-то увлекательное и поделитесь своим опытом. До встречи!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.