Всех приветствую. Несколько дней назад я наткнулся на статью "Как превратить свою аватарку в Telegram в часы". Я попробовал реализовать эту программу сам, но столкнулся с некоторыми ограничениями, связанными с повышением количества спамеров в чатах. А если конкретно, то мне выдавали флуд-бан и я не мог менять свою аватарку ближайший 21 час.

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

Задумка

Задумка состоит в парсинге статуса моего аккаунта Steam. При смене статуса, будь то в игре, будь то не в сети, мой статус в Telegram будет меняться. Для этого нужен сервак и, конечно же, некоторые знания

Реализация

Будем использовать Python, для взаимодействия с Steam одноименную библиотеку, а для Telegram старый добрый telethon.

pip install Telethon
pip install steam

Импортируем все модули

from telethon import TelegramClient, sync
import time
import steam.webapi
from steam.steamid import SteamID
from telethon import TelegramClient, events
from telethon.tl.functions.account import UpdateProfileRequest

Потом поясню, что куда и где :D

Далее мы инициализируем классы и задаем параметры, которые будут использоваться

API_KEY = '' # Ваш API ключ Steam (получить можно здесь: https://steamcommunity.com/dev/apikey)
profile_url = "https://bit.ly/steam_com"  # steam профиль
max_symvols = 70 # Максимальное количество символов в профиле :D
steam_id = 123456  # steam id
client = TelegramClient("anon", api_id, "api_hash")
client.start()
steam_api = steam.webapi.WebAPI(API_KEY)

API_KEY - Ваш API ключ Steam (получить можно здесь).
profile_url - Ваш профиль в Steam. Почему нельзя взять сразу из апишки? Потому что его по-хорошему провести через сокращалку ссылку. Я использовал bitly.
max_symvols - Максимальное количество символов в статусе, которое допускает Telegram. Данный параметр способен меняться, поэтому я и отделил его от основного кода.
steam_id - Ваш id в steam.
client - Инициализация клиента telethon. Вы можете взять api_id и api_hash здесь.

Так. Напишем функцию для смены био

def change_bio(BIO_TEXT):
    try:
        client(UpdateProfileRequest(about=BIO_TEXT))
        return f"Био изменено на: {BIO_TEXT}"
    except Exception as e:
        return f"Ошибка при изменении био: {e}"

Функция вернет результат обновления био. Впрочем, нечего объяснять.

Напишем функцию получения статуса Steam

def get_account_status(steam_id):
    try:
        steamid64 = SteamID(steam_id).as_64
        
        response = steam_api.call('ISteamUser.GetPlayerSummaries', steamids=steamid64, format='json')
        
        if not response['response']['players']:
            return {"error": "Пользователь не найден"}
            
        player = response['response']['players'][0]

        profile_url = player["profileurl"]
        if 'gameextrainfo' in player:
            status = f"в игре: {player['gameextrainfo']}"
        elif player['personastate'] == 1:
            status = "в сети"
        elif player['personastate'] == 2:
            status = "занят"
        elif player['personastate'] == 3:
            status = "отсутствует"
        elif player['personastate'] == 4:
            status = ": не беспокоить"
        else:
            status = "не в сети"
            
        return   [status, player["personaname"]]
    except Exception as e:
        return {"error": str(e)}

Здесь уже интереснее. Сначала преобразуем в 64-битный SteamID, а потом получаем данные об аккаунте response = steam_api.call('ISteamUser.GetPlayerSummaries', steamids=steamid64, format='json')
Ну а потом просто сверяем данные и возвращаем массив, где на нулевом индексе статус, а на первом username пользователя.

Теперь напишем функцию main

def main():
    old_status = ""
    while True:
        profile = get_account_status(steam_id)
        if old_status != profile[0]:
            game_max = max_symvols - len(f"Игрок {profile[1]}  | url: {profile_url}") - 3
            if len(profile[0]) > game_max:
                gg = ""
                for x in range(game_max):
                    gg  += list(profile[0])[x]
                profile[0] = gg + "..."
            old_status = profile[0]
            new_status = f"Игрок {profile[1]} {profile[0]} | url: {profile_url}"
            result = change_bio(new_status)
            print(result)
        time.sleep(15) 

Здесь мы сравниваем предыдущие статусы каждые 15 секунд для обновления статуса. После сокращаем название игры, если оно оказывается слишком большим.

Полный код
from telethon import TelegramClient, sync
import time
import steam.webapi
from steam.steamid import SteamID
from telethon import TelegramClient, events
from telethon.tl.functions.account import UpdateProfileRequest

API_KEY = '' # Ваш API ключ Steam (получить можно здесь: https://steamcommunity.com/dev/apikey)
profile_url = "https://bit.ly/steam_com"  # steam профиль
max_symvols = 70 # Максимальное количество символов в профиле :D
steam_id = 123456  # steam id
client = TelegramClient("anon", api_id, "api_hash")
client.start()
steam_api = steam.webapi.WebAPI(API_KEY)

def change_bio(BIO_TEXT):
    try:
        client(UpdateProfileRequest(about=BIO_TEXT))
        return f"Био изменено на: {BIO_TEXT}"
    except Exception as e:
        return f"Ошибка при изменении био: {e}"
def get_account_status(steam_id):
    try:
        steamid64 = SteamID(steam_id).as_64
        
        response = steam_api.call('ISteamUser.GetPlayerSummaries', steamids=steamid64, format='json')
        
        if not response['response']['players']:
            return {"error": "Пользователь не найден"}
            
        player = response['response']['players'][0]

        profile_url = player["profileurl"]
        if 'gameextrainfo' in player:
            status = f"в игре: {player['gameextrainfo']}"
        elif player['personastate'] == 1:
            status = "в сети"
        elif player['personastate'] == 2:
            status = "занят"
        elif player['personastate'] == 3:
            status = "отсутствует"
        elif player['personastate'] == 4:
            status = ": не беспокоить"
        else:
            status = "не в сети"
            
        return   [status, player["personaname"]]
    except Exception as e:
        return {"error": str(e)}

def main():
    old_status = ""
    while True:
        profile = get_account_status(steam_id)
        if old_status != profile[0]:
            game_max = max_symvols - len(f"Игрок {profile[1]}  | url: {profile_url}") - 3
            if len(profile[0]) > game_max:
                gg = ""
                for x in range(game_max):
                    gg  += list(profile[0])[x]
                profile[0] = gg + "..."
            old_status = profile[0]
            new_status = f"Игрок {profile[1]} {profile[0]} | url: {profile_url}"
            result = change_bio(new_status)
            print(result)
        time.sleep(15) 

if __name__ == "__main__":
    main()

Самое интересное

Статус "В сети"
Статус "В сети"
С невидимкой
С невидимкой
Статус "Нет на месте"
Статус "Нет на месте"

А теперь зайдем в дотку

Dota 2
Dota 2

Итог

В прочем, можно и пойти дальше, развивать идею и т.д., но лично мне все нравится и так. Спасибо за прочтение :D

Комментарии (6)


  1. sic
    09.07.2025 01:21

    Зачем? И какой :D если ☠️


    1. MicroProger Автор
      09.07.2025 01:21

      а почему нет? это интересно и забавно


      1. sic
        09.07.2025 01:21

        Да мне не жалко, минусы не ставлю. Тут душные дяди сидят на три лагеря, кто-то такой, фигня если нет пользы, кто-то такой нет смысла, кто-то такой в основном статью написал ии. А я такой, ну омг мне это ии что ли не напишет в два запроса что ли?