<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Kirill Krasin</title><generator>teletype.in</generator><description><![CDATA[Kirill Krasin]]></description><image><url>https://img4.teletype.in/files/b2/08/b2086e57-e542-4926-b789-988cbd138208.png</url><title>Kirill Krasin</title><link>https://teletype.in/@kirillkrasin</link></image><link>https://teletype.in/@kirillkrasin?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=kirillkrasin</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/kirillkrasin?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/kirillkrasin?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Sun, 24 May 2026 21:31:43 GMT</pubDate><lastBuildDate>Sun, 24 May 2026 21:31:43 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@kirillkrasin/steam-web-api-python-bot</guid><link>https://teletype.in/@kirillkrasin/steam-web-api-python-bot?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=kirillkrasin</link><comments>https://teletype.in/@kirillkrasin/steam-web-api-python-bot?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=kirillkrasin#comments</comments><dc:creator>kirillkrasin</dc:creator><title>Как получать количество игроков онлайн в Steam?</title><pubDate>Thu, 17 Jul 2025 10:10:16 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/c5/0b/c50b7b04-0511-4d87-bc36-06c20eddb325.png"></media:content><tt:hashtag>steam</tt:hashtag><tt:hashtag>python</tt:hashtag><tt:hashtag>mysql</tt:hashtag><tt:hashtag>webapi</tt:hashtag><description><![CDATA[<img src="https://img4.teletype.in/files/39/48/3948b7aa-c12e-4a3d-a743-ad383b358b60.png"></img>Настраиваем автоматический сбор статистики игроков онлайн в Steam по указанному AppID с сохранением в базу данных MySQL с помощью небольшого Python бота - Steam Player Monitoring Bot.]]></description><content:encoded><![CDATA[
  <figure id="aw9f" class="m_original">
    <img src="https://img4.teletype.in/files/39/48/3948b7aa-c12e-4a3d-a743-ad383b358b60.png" width="1280" />
    <figcaption>Пример реализации: <a href="https://apex-hub.ru/steam-stats" target="_blank">График игроков онлайн в Steam для игры Apex Legends</a></figcaption>
  </figure>
  <p id="dVTw">Настраиваем автоматический сбор статистики игроков онлайн в <strong>Steam</strong> по указанному <strong>AppID</strong> с сохранением в базу данных <strong>MySQL</strong> с помощью небольшого Python бота - <a href="https://github.com/apexhubnet/steam-bot" target="_blank">Steam Player Monitoring Bot</a>.</p>
  <h2 id="3pRr">📋 Предварительные требования</h2>
  <ol id="jRJ3">
    <li id="YSGY"><strong>Python</strong> 3.7+</li>
    <li id="jFvo">База данных <strong>MySQL </strong>(локально или удалённо)</li>
    <li id="8VgE">Steam Web <strong>API Key</strong> (<a href="https://steamcommunity.com/dev/apikey" target="_blank">получить здесь</a>)</li>
    <li id="Crfs">Docker</li>
  </ol>
  <h2 id="YSiA">⚙️ Настройка проекта</h2>
  <p id="pucG">Создайте файл <code>.env</code> в папке с ботом (шаблон из <code>.env.example</code>):</p>
  <pre id="leaz"># Steam API Settings
STEAM_API_KEY=api_key
APP_ID=app_id
INTERVAL_MINUTES=30
# MySQL Settings
DB_HOST=host
DB_NAME=db_name
DB_USER=u_name
DB_PASSWORD=u_pass</pre>
  <p id="QklV">Создайте таблицу в <strong>MySQL</strong>:</p>
  <pre id="EzbQ">CREATE TABLE steam_stats (
  id INT AUTO_INCREMENT PRIMARY KEY,
  timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  appid INT NOT NULL,
  player_count INT NULL,
  error_message VARCHAR(255) NULL
);</pre>
  <h2 id="PYty">🖥️ Запуск бота</h2>
  <p id="Jhnp">Весь необходимый код в репозитории <a href="https://github.com/apexhubnet/steam-bot" target="_blank">apexhubnet/steam-bot</a> - клонируйте, перейдите в директорию в которой расположен <strong>docker-compose.yml</strong>, затем:</p>
  <p id="EDWB">Запуск через Docker:</p>
  <pre id="QpwX">docker compose up -d --build</pre>
  <h2 id="roti">📊 Как это работает</h2>
  <p id="sXmF">Бот периодически опрашивает <strong>Steam API</strong> (интервал задаётся в .env).</p>
  <p id="vgSn">Лог успешного ответа:</p>
  <pre id="TBMY">2025-07-17 11:31:58,805 - INFO - Fetching player count...
2025-07-17 11:31:59,075 - INFO - Current players: 85822
2025-07-17 11:31:59,110 - INFO - Data saved to DB
2025-07-17 11:31:59,112 - INFO - Sleeping for 1800 seconds
2025-07-17 12:01:59,212 - INFO - Fetching player count...
2025-07-17 12:01:59,508 - INFO - Current players: 84818
2025-07-17 12:01:59,546 - INFO - Data saved to DB
2025-07-17 12:01:59,548 - INFO - Sleeping for 1800 seconds</pre>
  <p id="gUaD">Лог при ошибке (например, недоступность API):</p>
  <pre id="BawD">2025-07-17 14:35:00 - ERROR - API error: Request failed
2025-07-17 14:35:00 - INFO - Error saved to DB</pre>
  <p id="oC8e">Двойная система восстановления:</p>
  <ul id="3sKL">
    <li id="tcqP">При сбоях внутреннего цикла – перезапуск через <strong>60</strong> секунд.</li>
    <li id="Oc3w">При критических ошибках – <strong>полный перезапуск</strong> приложения.</li>
  </ul>
  <h2 id="YwhK">🔍 Анализ данных</h2>
  <p id="a0Jb">Пример SQL-запроса для получения статистики по <strong>Apex Legends</strong> (AppID=<strong>1172470</strong>):</p>
  <pre id="btXT">SELECT 
  DATE(timestamp) AS day, 
  HOUR(timestamp) AS hour,
  AVG(player_count) AS avg_players
FROM steam_stats 
WHERE appid=1172470 AND error_message IS NULL
GROUP BY day, hour;</pre>
  <p id="XPGt">Получаем максимальное значение за неделю:</p>
  <pre id="WBUq">SELECT MAX(player_count) AS max 
       FROM &#x60;steam_stats&#x60; 
       WHERE timestamp &gt;= NOW() - INTERVAL 7 DAY
       AND error_message IS NULL</pre>
  <p id="Gun8">Получаем среднее количество игроков за месяц:</p>
  <pre id="JVUg">SELECT AVG(player_count) AS average 
       FROM &#x60;steam_stats&#x60; 
       WHERE timestamp &gt;= NOW() - INTERVAL 30 DAY
       AND error_message IS NULL</pre>
  <p id="BscH">Получаем данные за конкретный месяц:</p>
  <pre id="es8c">SELECT MAX(player_count) AS max
       FROM &#x60;steam_stats&#x60;
       WHERE MONTH(&#x60;timestamp&#x60;) = 03
       AND YEAR(&#x60;timestamp&#x60;) = 2025</pre>
  <tt-tags id="Ymio">
    <tt-tag name="steam">#steam</tt-tag>
    <tt-tag name="python">#python</tt-tag>
    <tt-tag name="mysql">#mysql</tt-tag>
    <tt-tag name="webapi">#webapi</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@kirillkrasin/deploy-rswt-vue-docker</guid><link>https://teletype.in/@kirillkrasin/deploy-rswt-vue-docker?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=kirillkrasin</link><comments>https://teletype.in/@kirillkrasin/deploy-rswt-vue-docker?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=kirillkrasin#comments</comments><dc:creator>kirillkrasin</dc:creator><title>Как развернуть сайт вашего сервера Rust используя RSWT</title><pubDate>Sun, 01 Sep 2024 09:33:16 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/67/de/67de3258-e9a6-4a6d-b69b-651525e87800.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/bf/c4/bfc464f5-3779-4a38-a63c-b1e2bcfc5c5c.png"></img>RSWT (Rust-Server-Website-Template) — это простой, одностраничный шаблон для быстрого развёртывания сайта вашего игрового сервера Rust.]]></description><content:encoded><![CDATA[
  <figure id="kyaX" class="m_original">
    <img src="https://img4.teletype.in/files/bf/c4/bfc464f5-3779-4a38-a63c-b1e2bcfc5c5c.png" width="1280" />
    <figcaption>RSWT - Rust-Server-WEebsite-Template</figcaption>
  </figure>
  <h2 id="M2LP">Что такое RSWT?</h2>
  <p id="tEEZ"><strong>RSWT</strong> (<a href="https://github.com/Mo45/Rust-Server-Website-Template" target="_blank">Rust-Server-Website-Template</a>) — это простой, одностраничный шаблон для быстрого развёртывания сайта вашего игрового сервера Rust.</p>
  <p id="VXm0">Собран на <strong>Vue</strong>, вёрстка Bootstrap. Использует API <strong>Rust-Servers.Net</strong> и <strong>Discord Widget</strong>. Помимо статических шаблонов, будет динамически подгружать данные с вышеуказанных API и обновлять данные на странице:</p>
  <ul id="DOCV">
    <li id="28MR">Статус сервера Онлайн/Оффлайн</li>
    <li id="xuZd">Количество игроков на сервере Rust</li>
    <li id="0zS3">Количество участников на сервере Discord</li>
  </ul>
  <h2 id="91Tp">Что нужно для развёртывания?</h2>
  <p id="fLy4">Для того, чтобы запустить (развернуть) RSWT будет достаточно самого простого <strong>VPS</strong> с предустановленным <strong>Docker</strong>. </p>
  <h2 id="6Cuv">Где арендовать VPS?</h2>
  <p id="HjUS">Вы можете выбирать любой, в качестве рекомендации могу предложить следующие.</p>
  <h3 id="k7bn">Облако Рег.ру</h3>
  <p id="VjCz">Начать можно с тарифа <strong><a href="https://www.reg.ru/cloud/vps/?rlink=reflink-10779005" target="_blank">Std C1-M1-D10</a></strong> за <strong>390</strong> ₽/мес. Полноценный VPS с SSH доступом. Характеристики: 1 ядро 2.2Ghz / 1 GB RAM / 10 GB SSD</p>
  <figure id="KKoK" class="m_original">
    <img src="https://img1.teletype.in/files/8a/c5/8ac5da11-e9cf-4e6d-b4f2-b26c2fd14e4f.png" width="1480" />
  </figure>
  <p id="mBwP">Арендовать облачный сервер на Рег.ру можно по <a href="https://www.reg.ru/cloud/vps/?rlink=reflink-10779005" target="_blank">моей ссылке</a>, а можно и без неё =)</p>
  <h3 id="NUfW">timeweb.cloud</h3>
  <p id="HXrJ">На момент написания статьи самый дешевый тариф доступен в регионе <strong><a href="https://timeweb.cloud/r/mo45" target="_blank">SPB-2</a></strong> за <strong>530</strong> ₽/мес. Полноценный VPS с SSH доступом. Характеристики: 1 ядро 2.8Ghz / 1 GB RAM / 10 GB SSD</p>
  <figure id="Ew3N" class="m_original">
    <img src="https://img4.teletype.in/files/71/a1/71a1fcc9-ea68-4b22-aa9e-141f75f7fbf0.png" width="963" />
  </figure>
  <p id="0u9n">В <strong>timeweb</strong> помимо аренды VPS можно сделать деплой приложения сразу из GitHub с помощью <a href="https://timeweb.cloud/docs/apps/deploying-with-dockerfile" target="_blank">Dockerfile</a> или <a href="https://timeweb.cloud/docs/apps/deploying-frontend-apps/vue" target="_blank">Node.js+Vue</a>.</p>
  <p id="n0gC">В первом случае стоимость будет составлять <strong>188</strong> ₽/мес. Характеристики: 1 ядро 3.3 GHz / 1 GB RAM / 15 GB NVMe. Без доступа по SSH и возможности редактировать файлы.</p>
  <p id="MGKc">Во втором случае стоимость будет зависеть от лимитов:</p>
  <ul id="x9hn">
    <li id="kB3s">50 тыс/мес 50 Мб <strong>1</strong> ₽/мес</li>
    <li id="uAqN">200 тыс/мес 1 Гб <strong>99</strong> ₽/мес</li>
  </ul>
  <p id="LxVR">Доступа по SSH так-же не будет, как и возможности редактировать файлы. Второй вариант супер дешевый, однако редактировать шаблон можно будет только создав форк ГитХаб репозитория <strong>RSWT</strong>, и ре-деплой приложения после изменения файлов в нём.</p>
  <p id="GQVd">Арендовать облачный сервер на timeweb можно по <a href="https://timeweb.cloud/r/mo45" target="_blank">моей ссылке</a> (+300 ₽ на счет)</p>
  <figure id="QQmv" class="m_original">
    <img src="https://img4.teletype.in/files/38/2f/382fdfea-fba1-44b8-ad65-e659f8f5220e.png" width="1007" />
  </figure>
  <h2 id="9Rto">Деплой RSWT</h2>
  <p id="t3ip">Далее немного подробнее о процессе развёртывания (деплоя) RSWT.</p>
  <h3 id="Qyd5">VPS, Docker, SSH</h3>
  <p id="MBH2">Если вы арендовали полноценный VPS и хотите запустить сайт на нём. Отталкиваемся от того, что вы арендовали VPS с предустановленным Docker (Ubuntu 24.04 + Docker).</p>
  <p id="MUP3">Заходим через SSH, далее подготовим окружение и клонируем репозиторий:</p>
  <pre id="jAGr">apt update</pre>
  <pre id="3THb">git clone --branch rswt-vue https://github.com/Mo45/Rust-Server-Website-Template.git rswt</pre>
  <pre id="rtFa">apt install npm -y</pre>
  <p id="qmGp">Установим приложение, соберём образ Docker и запустим его:</p>
  <pre id="Pwd5">cd rswt</pre>
  <pre id="OQ7o">npm install</pre>
  <pre id="3HG0">docker build -t rswt-vue .</pre>
  <pre id="4XXG">docker run -p 80:80 rswt-vue</pre>
  <p id="4Cyw">Последняя команда запустит образ который мы клонировали с ГитХаба и собрали локально, и пробросит 80 порт из контейнера на 80 порт вашего VPS.</p>
  <p id="KTgy">Теперь вы можете зайти и проверить всё-ли работает <strong>http://IP_вашего_VPS:80</strong></p>
  <p id="PWOu">Всё работает? Отлично, остановим контейнер <strong>ctrl+c</strong></p>
  <p id="ftqY">Теперь можно персонализировать сайт, для этого нужно отредактировать файлы шаблона. В первую очередь <strong>src\config.json</strong>:</p>
  <pre id="bk3c">{
  &quot;TITLE_SHORT&quot;: &quot;RSWT Vue App&quot;, &lt;-- Короткий заголовок, используется в качестве заголовка страницы
  &quot;TITLE_FULL&quot;: &quot;Mega Awesome Servers&quot;, &lt;-- Основной заголовок, используется в h1 и футере
  &quot;PRJ_SLOGAN&quot;: &quot;Most Amazing Rust Servers&quot;, &lt;-- Подзаголовок, или слоган h2
  &quot;DISCORD_ID&quot;: &quot;XXXXXXXXXXXXXXXXXX&quot;, &lt;-- ID вашего сервера Discord

  &quot;S1_API_KEY&quot;: &quot;YOUR_API_KEY&quot;, &lt;-- API ключ Rust-Servers.Net для первого сервера
  &quot;S1_BANNER&quot;: &quot;mosharust.png&quot;, &lt;-- Баннер для первого сервера
  &quot;S1_DESC&quot;: &quot;The original experience&quot;, &lt;-- Краткое описание первого сервера

  &quot;S2_API_KEY&quot;: &quot;YOUR_API_KEY&quot;, &lt;-- API ключ Rust-Servers.Net для второго сервера
  &quot;S2_BANNER&quot;: &quot;mosharust.png&quot;, &lt;-- Баннер для второго сервера
  &quot;S2_DESC&quot;: &quot;Another cool description&quot;, &lt;-- Краткое описание второго сервера

  &quot;S3_API_KEY&quot;: &quot;YOUR_API_KEY&quot;,
  &quot;S3_BANNER&quot;: &quot;mosharust.png&quot;,
  &quot;S3_DESC&quot;: &quot;Another cool description&quot;,

  &quot;S4_API_KEY&quot;: &quot;YOUR_API_KEY&quot;,
  &quot;S4_BANNER&quot;: &quot;mosharust.png&quot;,
  &quot;S4_DESC&quot;: &quot;Another cool description&quot;
}</pre>
  <p id="ezhn">Теперь приступим к редактированию разделов FAQ, Staff, Rules и т.д.</p>
  <p id="90cI">Для каждого из разделов редактируем</p>
  <pre id="USrb">components\faqSection.vue</pre>
  <pre id="Ttt2">components\rulesSection.vue</pre>
  <pre id="m5C4">components\staffSection.vue</pre>
  <pre id="Lkh1">components\storeSection.vue</pre>
  <p id="n6AL">Следуем комментариям в коде. Всё должно быть понятно, это базовый HTML.</p>
  <p id="scJ8">Теперь можно запустить контейнер и проверить:</p>
  <pre id="HoOd">docker compose up -d --build</pre>
  <p id="jlUr">Эта команда запустит контейнер в свёрнутом виде.</p>
  <p id="KvA2">Если контейнер необходимо запустить на другом порту (не <strong>80</strong>), измените его в файле <strong>.env</strong> в корневой директории:</p>
  <pre id="PMiL">#!/usr/bin/env bash

APP_NAME=rswt-vue
APP_PORT=80 &lt;-- изменить на необходимый порт
APP_VER=0.0.2</pre>
  <h3 id="rXRB">Деплой приложения Vue в timeweb</h3>
  <p id="oy94">Полная пошаговая инструкция доступна на сайте <a href="https://timeweb.cloud/docs/apps/deploying-frontend-apps/vue" target="_blank">timeweb</a>.</p>
  <p id="Hjuh">Если кратко:</p>
  <ol id="IKJV">
    <li id="E1W1">Выбираем Frontend -&gt; Vue</li>
    <li id="1BmX">Жмём Подключите git-репозиторий по URL</li>
    <li id="OlDg">Вставляем URL репозитория: <a href="https://github.com/Mo45/Rust-Server-Website-Template.git" target="_blank">https://github.com/Mo45/Rust-Server-Website-Template.git</a> (или на свой форк)</li>
    <li id="w7rm">Выбираем ветку <strong>rswt-vue</strong> и самый актуальный (верхний) коммит</li>
    <li id="KMCn">Остальное не меняем, жмём <strong>Запустить деплой — 1 ₽/мес</strong></li>
  </ol>

]]></content:encoded></item></channel></rss>