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

Raspberry Pi как Steam Idle Machine

Разработка на Raspberry Pi
Из песочницы
Наверняка у многих из хабрачитателей и владельцев Raspberry Pi имеется в наличии аккаунт в Steam, чья библиотека наполнена немалым количеством игр, купленных на распродажах в этом самом Steam. Но порой бывает так, что ни времени, ни желания играть в эти самые игры нет, а хотелось бы получить от них хоть какую-нибудь пользу кроме как наличия красивой иконки игры в списке игр.



Для чего все это нужно?


  • На продажу. Каждая коллекционная карточка стоит денег. Ценник у карточки варьируется в пределах от 1 руб. до 15 руб за обычные, и 10-50 руб. за металлические (редкие) карточки. Карточки можно продать другим пользователям Steam через торговую площадку, тем самым заработав на другие игры, или контент для игр.
  • В коллекцию. Многие пользователи Steam собирают игровые значки из этих карточек, для повышения уровня Steam, ну или для эстетического удовольствия от значков.

Более подробно про карточки и значки Steam можно прочитать здесь.

Причем здесь Raspberry Pi?


Способов для идлинга карточек Steam не мало. Каждый из способов имеет свои плюсы и минусы. Однако почти все из них нуждаются в постоянном включенном клиенте Steam, что дает нам некоторые неудобства в вопросе аптайма. Также некоторые из способов идла нуждаются во вмешательстве пользователя для переключения игр, в которых выпадают карточки. Здесь же мы будем рассматривать полностью автоматизированный способ, не требующий большие вычислительные мощности и который бы работал 24\7, пока не выпадут все карточки. Для этого нам отлично подходит Raspberry Pi! К тому же это еще одна причина стряхнуть пыль со своего мини-компьютера и дать ему возможность поработать на нас.

Немного о преимуществах и возможностях данного способа:
  • Не требует клиента Steam
  • Автоматическое переключение игр. Если все карты той или иной игры выпали, то включается следующая игра.
  • Steam не ставит статус «В игре». Никто из друзей в Steam не увидит процесса идла
  • Стабилен. Можно включить и забыть про скрипт, пока не выпадут все карточки.


Подготовка


Предполагается, что у вас уже установлена и настроена ОС в Raspberry Pi, а также все необходимое для работы с ним. На хабре уже достаточно статей, где описана подробная подготовка к работе Raspberry Pi, поэтому здесь мы разбирать это не будем.

Некоторые из статей которые помогут вам настроить Raspberry Pi:


Установка node.js и его компонентов


Для работы нашей «Steam Idle Machine» необходим node.js и некоторые модули для него, такие как node-steam, request, forever. Но обо всем по порядку.

Для начала нам необходимо скомпилировать и установить последнюю версию node.js:

wget http://nodejs.org/dist/v0.12.5/node-v0.12.5.tar.gz
tar xvf node-v0.12.5.tar.gz
cd node-v0.12.5
./configure
make
sudo make install

Компиляция займет некоторое время. На мощностях Raspberry Pi 2 без разгона компиляция заняла примерно 4-5 часов.
Далее проверяем, все ли у нас хорошо получилось:

node -v
npm -v

проверка успешной установки node.js

Далее установим нужные нам модули node.js:

sudo npm install steam@0.6.8 -g
sudo npm install request -g
sudo npm install forever -g

Ура! Теперь node.js готов к работе.

Установка и запуск скрипта


Создадим папку для нашего проекта и поместим туда символичную ссылку и сам скрипт:

cd ~
sudo mkdir steamidle
cd steamidle
sudo ln -s /usr/local/lib/node_modules ~/steamidle
sudo nano steamidle.js

И вставляем туда:

var args = process.argv.slice(2);
var fs = require('fs');
var steam = require('steam');
var request = require('request');
var sentryFile = 'sentryfile';
var sentry = undefined;
 
if (fs.existsSync(sentryFile)) {
    sentry = fs.readFileSync(sentryFile);
}
function updateSentry (buffer) {
    console.log(buffer);
    fs.writeFile(sentryFile, buffer);
}
function createIdler(userinfo, timer){
    var bot = new steam.SteamClient();
    userinfo.bot = bot;
    bot.on('loggedOn', function() {
        canTrade = false;
        console.log('Logged in ' + userinfo.username);
    });
    bot.on('sentry', updateSentry);
    bot.on('error', function(e) {
        console.log(userinfo);
        console.log(e);
    });
    function startIdle(){
        var req = request.defaults({jar: userinfo.jar});
        req.get('http://steamcommunity.com/my/badges/', function (error, response, body) {
			if (body) {
				var b = body.match(/<a class="btn_green_white_innerfade btn_small_thin" href="steam:\/\/run\/(\d+)">/);
				if (b) {
					console.log(userinfo.username);
					console.log("Idling game " + b[1]);
					bot.gamesPlayed([b[1]]);
				}
			}
			var now = new Date();                
			console.log(now.getHours()+':'+now.getMinutes()+':'+now.getSeconds());
		});
	}
    bot.on('webSessionID', function (sessionID) {
        userinfo.jar = request.jar(),
        userinfo.sessionID = sessionID;
        bot.webLogOn(function(cookies) {
            cookies.forEach(function(cookie) {
                userinfo.jar.setCookie(request.cookie(cookie), 'http://steamcommunity.com');
                userinfo.jar.setCookie(request.cookie(cookie), 'http://store.steampowered.com');
                userinfo.jar.setCookie(request.cookie(cookie), 'https://store.steampowered.com');
            });
            userinfo.jar.setCookie(request.cookie("Steam_Language=english"), 'http://steamcommunity.com');
 
            startIdle();
            setInterval(function(){startIdle();}, timer);
        });
    });
    bot.logOn({
        accountName: userinfo.username,
        password: userinfo.password,
        authCode: userinfo.authCode,
        shaSentryfile: sentry
    });
}
createIdler({
    username: ' ',           //логин
    password: ' '//,          //пароль
    //authCode: ' '           //код авторизации
}, (10*60*1000));

Обратите внимание на последние строчки кода. Сюда мы должны будем вписать данные аккаунта Steam. Для начала необходимо ввести только логин и пароль. Затем сохраните файл и запустите его:

node steamidle.js

Программа попытается авторизоваться, но безуспешно, т.к из-за SteamGuard нам необходим authCode. При попытке авторизации без authCode Steam вышлет его на ваш почтовый ящик. Найдите у себя на почте письмо с кодом и запишите код в скрипт. Раскомментируйте запятую и строчку ниже, сохраните файл и снова запустите скрипт.

Результат успешного выполнения работы скрипта

Если вы сделали все правильно, то увидите примерно тоже самое, что на изображении выше. Поздравляю! «Steam Idle Machine» функционирует как надо. Теперь откройте снова файл со скриптом и закомментируйте как было, запятую и строку authCode. Они нам больше не понадобятся при следующем запуске. Данные аккаунта сохранены в папке с нашим проектом в файле sentryfile

Кстати, для запуска скрипта, лучше всего использовать модуль forever.
forever start steamidle.js


Есть еще кое-что...


К сожалению, в скрипте есть баг и исправить мне его не удалось. После нескольких часов идла скрипт вдруг перестает переключать игры. Чем это вызвано — я не понял. Я придумал весьма варварское решение этой проблемы. Поставил в cron перезапуск скрипта каждые 2 часа.

crontab -e

Вписать туда строку:

0 */2 * * * /usr/local/bin/node /usr/local/bin/forever restart ~/steamidle/steamidle.js

Заключение


Напоследок хотел бы сказать, что данный способ безопасен, как и любой другой. Конечно, глупо будет отрицать о возможных рисках, но, тем не менее, не был зафиксирован ни один случай блокировки аккаунта по причине идла. Буду очень рад ценным дополнениям к моей статье, а также указаниям на мои ошибки, если они есть.

Благодарю за внимание!
Теги:raspberry pisteamnode.jsidlesteam trading cards
Хабы: Разработка на Raspberry Pi
Всего голосов 12: ↑10 и ↓2 +8
Просмотры39.7K

Комментарии 16

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Похожие публикации

Python Backend Developer
от 150 000 до 250 000 ₽ДекастМосква
Fullstack Developer (Node.js)
от 3 000 до 4 500 $IntentoМожно удаленно
Разработчик Fullstack (node.js; vue)
от 70 000 до 140 000 ₽ФИНЭКТОР ГРУППМоскваМожно удаленно
UE4 Technical Generalist
от 100 000 до 150 000 ₽Joy WayМосква

Лучшие публикации за сутки