Всех приветствую. Несколько дней назад я наткнулся на статью "Как превратить свою аватарку в 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()
Самое интересное



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

Итог
В прочем, можно и пойти дальше, развивать идею и т.д., но лично мне все нравится и так. Спасибо за прочтение :D
sic
Зачем? И какой :D если ☠️
MicroProger Автор
а почему нет? это интересно и забавно
sic
Да мне не жалко, минусы не ставлю. Тут душные дяди сидят на три лагеря, кто-то такой, фигня если нет пользы, кто-то такой нет смысла, кто-то такой в основном статью написал ии. А я такой, ну омг мне это ии что ли не напишет в два запроса что ли?