Вступление


Привет, Хабр!

Недавно хотел установить себе приложение для управления мышью на компьютере, но у меня возникли проблемы при подключении телефона и у меня появилась идея сделать что-то подобное самому, но как? Перебрав несколько вариантов я вспомнил о телеграм ботах которые могут вполне подойти для того чтобы сделать что подобное в текстовом варианте, например ты пишешь боту "/open chrome" и у тебя на компьютере открывается Chrome.

Что нам понадобится?


Писать бота я буду на Python и использовать я буду такие библиотеки: flask, pyngrok, requests, win32com.client, os, subprocess. Далее в статье я расскажу зачем какая библиотека нам понадобится. Еще нам нужен Telegram на телефоне, планшете или даже на другом компьютере. И еще нам понадобится телеграм бот которому мы будет писать, как его создавать можете поискать сами потому что таких статей на Хабре уже хватает!

Как это все будет работать?


Когда мы будем писать нашему боту то он будет отправлять post-запрос с данными о сообщении и о пользователе который его отправил на наш url адрес, после чего наш python скрипт в зависимости от текста будет выполнять определенные действия такие как запуск приложений, ввод текста или даже выключение компьютера.

Реализация


Для начала создадим наш python файл который я назову main.py импортируем все нужные нам библиотеки(но сначала их нужно установить через pip):

from flask import Flask, request
from pyngrok import ngrok
import requests
import subprocess
import os
import win32com.client

Теперь для получения запросов от бота нам нужно запустить Flask и после чего запустим Pyngrok для доступа к нашему сайту не только по локальной сети:

app = Flask(__name__) #запуск flask
ngrok_url = ngrok.connect(port=5000).replace('http','https') #запуск ngrok

Теперь сделаем настройку бота — сделаем чтобы запросы приходили на наш сервер:

token = 'token вашего бота который вы получите от BotFather' #token бота
URL = 'https://api.telegram.org/bot'+token+'/'
requests.get(URL+'setWebhook?url='+ngrok_url) #устанавливаем url для webhook на новый
shell = win32com.client.Dispatch("WScript.Shell") #эта переменная нужна для команды которая будет вводить текст

Создадим функцию чтобы бот мог отвечать на наши сообщения:

def sendMessage(chat_id,text):
	url = URL+"sendMessage?chat_id="+str(chat_id)+"&text="+str(text)
	requests.get(url)

Теперь переходим к функции которая будет обрабатывать сообщения от бота и выполнять команды:

@app.route('/', methods=['POST','GET']) #если придет запрос на наш сервер то будет выполнятся функция index
def index():
	if request.method=='POST': #если пришел именно post запрос
		r = request.get_json() #получаем json
		chat_id = r["message"]["chat"]["id"] #получаем из запроса id чата из которого отправлено сообщение
		username = r["message"]["from"]["username"] # username пользователя который отправил сообщение
		text = r["message"]["text"] #получаем текст сообщения
		msg = text.split() #разбиваем текст на массив с отдельными словами
		cmd = msg[0] #первое слово это команда
		l = len(msg) #длина массива
		if username=='ваш username': #если сообщение отправили именно вы
			if cmd=='/cmd' and l>1: #если команда /cmd
				proc = subprocess.Popen(text[5:], shell=True, stdout=subprocess.PIPE).communicate() #выполняем в командной строке текст после /cmd 
				sendMessage(chat_id, proc[0].decode('cp866')) #отправляем ответ командной строки в Telegram
			elif cmd=='/ntp': #если команда /ntp
				os.system('notepad.exe') #запускаем блокнот
			elif cmd=='/off': #если команда /off
				os.system('shutdown -p') #выключаем компьютер
			elif cmd=='/p': #если команда /p
				shell.SendKeys(text[3:]) #печатается текст который написан после команды
	return 'Hello World!' #если кто-то перейдет по ngrok_url то увидит этот текст

И еще нужно добавить несколько строк для того чтобы Flask начал работать:

if __name__=='__main__':
	app.run()

Еще несколько слов от автора


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

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


  1. zmejserow
    05.05.2019 11:35

    А зачем здесь Flask? Разве что у вас бот крутится не на той машине, которой вы хотите управлять.
    github.com/nickoala/telepot


    1. Artur3175 Автор
      05.05.2019 11:37

      Я просто раньше пробовал делать на нем ботов и знаю как с ним работать


      1. maxp
        06.05.2019 08:47

        Уважаемый! Стремление сделать что-то новое очень похвально, но лучше чуть больше времени уделять чтению документации. Например, телеграм бота проще всего подключить вообще безо всякого ngrok и прочих flask'ов. Про polling режим подробно расписано в доке.


  1. GennPen
    05.05.2019 12:15

    На сколько понял, любой кто отправит сообщение боту сможет выключить компьютер или запустить что угодно в консоли?


    1. Artur3175 Автор
      05.05.2019 12:24

      Можно добавить проверку от кого пришло сообщение и тогда это все сможете делать только вы, если нужно могу подсказать как это сделать


      1. GennPen
        05.05.2019 12:26

        Лучше бы сразу в статью это добавить и объяснить как работает.
        Т.к. открытый бот с практически неограниченным доступом к системе — это очень плохо.


        1. Artur3175 Автор
          05.05.2019 12:27

          Сейчас отредактирую)


        1. Artur3175 Автор
          05.05.2019 12:39

          Теперь есть проверка от кого пришло сообщение. Так лучше?


    1. stdenis
      05.05.2019 18:21

      Любой может не отправлять сообщение боту, а отправить post запрос на комп, на котором крутится бот, при этом подставить любой юзернейм, проверки на то, откуда пришел запрос нет.


  1. stdenis
    05.05.2019 17:51

    Бот работает через Webhook? Тогда какой вообще смысл прикручивать сюда телегу? Если управляемый комп виден в интернете и до него может достучаться сервак телеграмма, то с таким же успехом мы можем до него достучаться по ssh. Это будет удобнее т.к. имеем полноценную командную строку, т.е. можно делать cd, потом ls, а не изолированные друг от друга команды; плюс добивка команды табом (не помню как эта фича правильно называется), и передача файлов по scp.

    Такая затея еще имела бы смысл, если бы комп не имел внешнего белого ip и до него нельзя было достучаться по сети напрямую.


    1. darkwoolf10
      06.05.2019 17:58

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


    1. maxp
      07.05.2019 06:30

      Ну там типа не напрямую достукивается, а через ngrok. То есть «белого ип» не надо, но смысл тот же.


  1. stdenis
    05.05.2019 18:17

    Вопрос по этому участку:

    def sendMessage(chat_id,text):
    	url = URL+"sendMessage?chat_id="+str(chat_id)+"&text="+str(text)
    	requests.get(url)


    sendMessage(chat_id, proc[0].decode('cp866')) #отправляем ответ командной строки в Telegram


    Если выполняю команду cat text.txt, а в файле text.txt будут служебные url символы например: & /? Всё поломается или где-то есть обработка строки и я её упустил?