В современном мире мессенджеры стали неотъемлемой частью нашей жизни. Они помогают нам оставаться на связи с друзьями, коллегами и близкими. Один из самых популярных мессенджеров - Telegram. Он предлагает множество функций, включая возможность установки пользовательских статусов. В этом посте мы рассмотрим, как автоматизировать процесс смены статусов в Telegram, чтобы вы могли максимально эффективно использовать эту функцию.
Я пользуюсь телеграмом для общения с друзьями и коллегами. Часто бывает так, что я занят и не могу отвечать на сообщения, с недавних пор была в премиум подписку внедрена возможность установки статусов. Я решил автоматизировать процесс смены статусов, аналогично тому как работает фокусирование в iMessage.
Репозиторий с кодом доступен на GitHub.
Что нам понадобится
Для автоматизации процесса смены статусов в Telegram нам понадобится:
- Python 3
- iOS 12+
- Telegram Premium
В целом iphone не обязателен, но в моем случае я использую его, подвязав изменения статусов к автоматизации фокусирования во время работы.
Начнем
- Установите Python 3, если у вас его нет. Вы можете скачать его с официального сайта. В случае мака, он уже установлен и вам не нужно ничего делать.
- Установите библиотеку telethon и dotenv, которая позволит нам взаимодействовать с Telegram API. Для этого выполните команду:
pip install telethon
pip install python-dotenv
- Создайте новое приложение в Telegram API. Вам понадобится API_ID и API_HASH, которые вы получите при создании приложения.
- Создайте файл
.env
и добавьте в него следующие строки:
API_ID=your_api_id
API_HASH=your_api_hash
ACC_TOKEN=
- Создайте файл
creating_session.py
и добавьте в него следующий код:
import os
from dotenv import load_dotenv
from telethon.sync import TelegramClient
from telethon.sessions import StringSession
load_dotenv('.env')
api_id = os.environ.get('API_ID')
api_hash = os.environ.get('API_HASH')
with TelegramClient(StringSession(), api_id, api_hash) as client:
print(client.session.save())
- Запустите файл
creating_session.py
. Вам будет предложено ввести номер телефона и код подтверждения. После этого в консоли появится строка. Это наша сессия, по которой будет происходить авторизация. Скопируйте эту строку, и вставьте в файл.env
в переменнуюACC_TOKEN
.
Сейчас нам требуется определить какие именно эмодзи мы будем использовать в статусах. Сложность здесь заключается в том, что нам надо предварительно подготовить их ID. На текущий момент я не знаю где именно можно взять полный список эмодзи с их ID, но я знаю, что можно взять их текущего статуса. Вот пример как это можно сделать:
- Откройте телеграм и установите статус с эмодзи.
- Запустите файл
get_emojis.py
, который я написал для получения ID эмодзи:
import os
from dotenv import load_dotenv
from telethon.sync import TelegramClient
from telethon.sessions import StringSession
load_dotenv('.env')
api_id = os.environ.get('API_ID')
api_hash = os.environ.get('API_HASH')
acc_token = os.environ.get('ACC_TOKEN')
with TelegramClient(StringSession(acc_token), api_id, api_hash) as client:
print(client.get_me().emoji_status.document_id)
- Вам будет выведен ID эмодзи, который вы установили в статусе. Скопируйте его куда-нибудь, он нам понадобится. Далее можно повторить действия для всех эмодзи, которые вы хотите использовать.
Теперь у нас есть все необходимые данные для автоматизации смены статусов. В целом как именно деплоить это на сервере - это уже вопрос второстепенный, я предоставлю базовый пример как это можно сделать на Flask.
- Установите
pip install flask
иpip install nest_asyncio
. Создайте файлendpoint.py
и добавьте в него следующий код:
from flask import Flask, request
from dotenv import load_dotenv
import os
from telethon.sync import TelegramClient
from telethon.sessions import StringSession
from telethon import functions, types
import nest_asyncio
load_dotenv('.env')
app = Flask(__name__)
nest_asyncio.apply()
api_id = int(os.getenv('API_ID'))
api_hash = os.getenv('API_HASH')
acc_token = os.getenv('ACC_TOKEN')
statuses = {
"default": 5841403144604487992,
"work": 5246772116543512028,
"snooze": 5247100325059370738,
}
@app.route('/set_status', methods=['GET'])
def set_status():
try:
set_status = request.args.get('status', default="default")
if set_status not in statuses:
return {"error": "Invalid status"}, 400
with TelegramClient(StringSession(acc_token), api_id, api_hash) as client:
result = client(functions.account.UpdateEmojiStatusRequest(
emoji_status=types.EmojiStatus(
document_id=statuses[set_status]
)
))
return {"result": result and "ok" or "fail"}
except BaseException:
return {"error": "not handled"}, 500
if __name__ == "__main__":
app.run(debug=True)
- Запустите файл
endpoint.py
. После этого вы сможете отправлять GET запросы наhttp://127.0.0.1:5000/set_status?status=work
и ваш статус в телеграме изменится на статусwork
.
curl --request GET --url 'http://127.0.0.1:5000/set_status?status=work'
- Деплойте этот код на сервер, и вы сможете менять статусы в телеграме из любого места, где есть доступ к интернету.
- Также можно добавить авторизацию, чтобы не каждый мог менять статусы. Для этого стоит почитать про Flask-HTTPAuth или использовать обычную проверку токена в запросе.
Теперь перейдем к настройкам автоматизации фокусирования во время работы. В моем случае я использую iPhone, поэтому я буду рассматривать настройки для него.
- В первую очередь нужно создать команду. Моя база или скриншот ниже:
- Далее нужно создать автоматизацию, я буду создавать для режима “Не беспокоить”. В моем случае для скрипта это статус Work.
- Теперь достаточно будет переключить фокусирование во время работы на режим “Не беспокоить”, и статус в телеграме изменится на Work.
Деплой
Для деплоя можно использовать любой сервер, на котором можно запустить Flask. В случае того, что у вас нет возможности использовать сервер, можно использовать Heroku. Он предоставляет бесплатный тариф, который вполне подойдет для наших целей. Для деплоя на Heroku вам понадобится создать файл Procfile
и добавить в него следующую строку:
web: python endpoint.py
Также вам понадобится создать файл runtime.txt
и добавить в него версию Python:
python-3.8.6
После этого вам нужно зарегистрироваться на Heroku, создать новое приложение и деплоить ваш код на сервер. После этого вы сможете менять статусы в телеграме из любого места, запуская команду отдельно или дорабатывая автоматизацию под свои нужды.
Заключение
В этом посте мы рассмотрели, как автоматизировать смену статусов в Telegram. Мы создали сервер на Flask, который позволяет менять статусы в телеграме, отправляя GET запросы. Также мы настроили автоматизацию в iOS, чтобы менять статус в телеграме при включении режима “Не беспокоить”.
В качестве бонуса я оставлю скрипт для смены статуса на эмодзи игры с помощью плагина BetterDiscord:
export default class SyncTelegram {
url = new URL('http://127.0.0.1:5000/status')
constructor() {
const status = 'default'
this.url.searchParams.set('status', status)
}
async updateQuery(status = 'default') {
this.url.searchParams.set('status', status)
const response = await BdApi.Net.fetch(this.url.href, {
method: 'POST'
})
return response
}
async changeStatus(e) {
if (e.games.length > 0) {
const game = e.games[0]
if (game.name.includes('dota 2')) {
this.updateQuery('dota')
}
} else {
this.updateQuery()
}
}
async start() {
BdApi.findModuleByProps('subscribe', '_subscriptions').subscribe('RUNNING_GAMES_CHANGE', (e) => this.changeStatus(e))
}
stop() {
BdApi.findModuleByProps('subscribe', '_subscriptions').unsubscribe('RUNNING_GAMES_CHANGE', (e) => this.changeStatus(e))
}
}
Специфические случаи
- Вообще можно не использовать отдельный сервер на фласке, можно использовать AWS Lambda, Google Cloud Functions, Azure Functions, лично я использую именно AWS Lambda, но это уже совсем другая история.
- По поводу фокусирования “Сон” честно говоря не знаю как его использовать правильно. У данного фокусирования кажется сломана автоматизация, работает только в случае запуска режима сна, другие случаи не работают. Снимаю с себя ответственность за это, возможно это баг в iOS, но я не уверен.
- Для работы с плагином BetterDiscord вам понадобится установить его, а также установить Node.js и npm. Я не знаю как это работает на Windows, да и сам пост не ориентирован на Windows, но в целом должно работать. Возможно нужно будет поменять условия плагина.
- Весь код опубликовал в репозитории GitHub, там вы сможете найти более актуальную версию кода, а также примеры для AWS Lambda и Flask. Возможно будет обновляться, возможно не будет.