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

Более подробно про карточки и значки Steam можно прочитать здесь.
Способов для идлинга карточек Steam не мало. Каждый из способов имеет свои плюсы и минусы. Однако почти все из них нуждаются в постоянном включенном клиенте Steam, что дает нам некоторые неудобства в вопросе аптайма. Также некоторые из способов идла нуждаются во вмешательстве пользователя для переключения игр, в которых выпадают карточки. Здесь же мы будем рассматривать полностью автоматизированный способ, не требующий большие вычислительные мощности и который бы работал 24\7, пока не выпадут все карточки. Для этого нам отлично подходит Raspberry Pi! К тому же это еще одна причина стряхнуть пыль со своего мини-компьютера и дать ему возможность поработать на нас.
Немного о преимуществах и возможностях данного способа:
Предполагается, что у вас уже установлена и настроена ОС в Raspberry Pi, а также все необходимое для работы с ним. На хабре уже достаточно статей, где описана подробная подготовка к работе Raspberry Pi, поэтому здесь мы разбирать это не будем.
Некоторые из статей которые помогут вам настроить Raspberry Pi:
Для работы нашей «Steam Idle Machine» необходим node.js и некоторые модули для него, такие как node-steam, request, forever. Но обо всем по порядку.
Для начала нам необходимо скомпилировать и установить последнюю версию node.js:
Компиляция займет некоторое время. На мощностях Raspberry Pi 2 без разгона компиляция заняла примерно 4-5 часов.
Далее проверяем, все ли у нас хорошо получилось:

Далее установим нужные нам модули node.js:
Ура! Теперь node.js готов к работе.
Создадим папку для нашего проекта и поместим туда символичную ссылку и сам скрипт:
И вставляем туда:
Обратите внимание на последние строчки кода. Сюда мы должны будем вписать данные аккаунта Steam. Для начала необходимо ввести только логин и пароль. Затем сохраните файл и запустите его:
Программа попытается авторизоваться, но безуспешно, т.к из-за SteamGuard нам необходим authCode. При попытке авторизации без authCode Steam вышлет его на ваш почтовый ящик. Найдите у себя на почте письмо с кодом и запишите код в скрипт. Раскомментируйте запятую и строчку ниже, сохраните файл и снова запустите скрипт.

Если вы сделали все правильно, то увидите примерно тоже самое, что на изображении выше. Поздравляю! «Steam Idle Machine» функционирует как надо. Теперь откройте снова файл со скриптом и закомментируйте как было, запятую и строку authCode. Они нам больше не понадобятся при следующем запуске. Данные аккаунта сохранены в папке с нашим проектом в файле sentryfile
Кстати, для запуска скрипта, лучше всего использовать модуль forever.
К сожалению, в скрипте есть баг и исправить мне его не удалось. После нескольких часов идла скрипт вдруг перестает переключать игры. Чем это вызвано — я не понял. Я придумал весьма варварское решение этой проблемы. Поставил в cron перезапуск скрипта каждые 2 часа.
Вписать туда строку:
Напоследок хотел бы сказать, что данный способ безопасен, как и любой другой. Конечно, глупо будет отрицать о возможных рисках, но, тем не менее, не был зафиксирован ни один случай блокировки аккаунта по причине идла. Буду очень рад ценным дополнениям к моей статье, а также указаниям на мои ошибки, если они есть.
Благодарю за внимание!

Для чего все это нужно?
- На продажу. Каждая коллекционная карточка стоит денег. Ценник у карточки варьируется в пределах от 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:
- Выжать все соки или используем Raspberry pi на всю катушку
- Raspberry Pi: подробная настройка с нуля до TorrentBox
Установка 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:
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
Заключение
Напоследок хотел бы сказать, что данный способ безопасен, как и любой другой. Конечно, глупо будет отрицать о возможных рисках, но, тем не менее, не был зафиксирован ни один случай блокировки аккаунта по причине идла. Буду очень рад ценным дополнениям к моей статье, а также указаниям на мои ошибки, если они есть.
Благодарю за внимание!