Una petita porta del darrere a Flask o com controlar un ordinador en una xarxa local

Hola Habr!

Recentment he vist una versió baixada del flux de programació "Com crear la teva pròpia aplicació web a Flask". I vaig decidir consolidar els meus coneixements en algun projecte. Durant molt de temps no sabia què escriure i em va venir la idea: "Per què no fer una mini-porta del darrere a Flask?"

Les primeres opcions per a implementacions i capacitats de la porta del darrere van aparèixer immediatament al meu cap. Però vaig decidir fer immediatament una llista de les capacitats de la porta posterior:

  1. Saber com obrir llocs web
  2. Tenir accés a la línia d'ordres
  3. Ser capaç d'obrir programes, fotos, vídeos

Per tant, el primer punt és extremadament fàcil d'implementar mitjançant el mòdul del navegador web. Vaig decidir implementar el segon punt mitjançant el mòdul os. I el tercer també és a través del mòdul del sistema operatiu, però faré servir "enllaços" (més sobre això més endavant).

Escriure un servidor

Per tant, *drumroll* tot el codi del servidor:

from flask import Flask, request
import webbrowser
import os
import re

app = Flask(__name__)
@app.route('/mycomp', methods=['POST'])
def hell():
    json_string = request.json
    if json_string['command'] == 'test':
        return 'The server is running and waiting for commands...'
    if json_string['command'] == 'openweb':
        webbrowser.open(url='https://www.'+json_string['data'], new=0)
        return 'Site opening ' + json_string['data'] + '...'
    if json_string['command'] == 'shell':
        os.system(json_string['data'])
        return 'Command execution ' + json_string['data'] + '...'
    if json_string['command'] == 'link':
        links = open('links.txt', 'r')
        for i in range(int(json_string['data'])):
            link = links.readline()
        os.system(link.split('>')[0])
        return 'Launch ' + link.split('>')[1]
if __name__ == '__main__':
    app.run(host='0.0.0.0')

Ja he llençat tot el codi, és hora d'explicar-ne l'essència.

Tot el codi s'executa a l'ordinador local al port 5000. Per interactuar amb el servidor, hem d'enviar una sol·licitud JSON POST.

Estructura de sol·licituds JSON:

{‘command’:  ‘comecommand’, ‘data’: ‘somedata’}

Bé, té sentit que "ordre" sigui l'ordre que volem executar. I "dades" són els arguments de l'ordre.

Podeu escriure i enviar sol·licituds JSON per interactuar amb el servidor manualment (les sol·licituds us ajudaran). O podeu escriure un client de consola.

Escriure un client

Codi:

import requests

logo = ['nn',
        '******      ********',
        '*******     *********',
        '**    **    **     **',
        '**    **    **     **      Written on Python',
        '*******     **     **',
        '********    **     **',
        '**     **   **     **      Author: ROBOTD4',
        '**     **   **     **',
        '**     **   **     **',
        '********    *********',
        '*******     ********',
        'nn']

p = ''
iport = '192.168.1.2:5000'
host = 'http://' + iport + '/mycomp'

def test():
    dict = {'command': 'test', 'data': 0}
    r = requests.post(host, json=dict)
    if r.status_code == 200:
        print (r.content.decode('utf-8'))

def start():
    for i in logo:
        print(i)

start()
test()

while True:
    command = input('>')
    if command == '':
        continue
    a = command.split()
    if command == 'test':
        dict = {'command': 'test', 'data': 0}
        r = requests.post(host, json=dict)
        if r.status_code == 200:
            print (r.content.decode('utf-8'))
    if a[0] == 'shell':
        for i in range(1, len(a)):
            p = p + a[i] + ' '
        dict = {'command': 'shell', 'data': p}
        r = requests.post(host, json=dict)
        if r.status_code == 200:
            print (r.content.decode('utf-8'))
        p = ''
    if a[0] == 'link':
        if len(a) > 1:
            dict = {'command': 'link', 'data': int(a[1])}
            r = requests.post(host, json=dict)
            if r.status_code == 200:
                print (r.content.decode('utf-8'))
        else:
            print('Комманда не содержит аргументов!')
    if a[0] == 'openweb':
            if len(a) > 1:
                dict = {'command': 'openweb', 'data': a[1]}
                r = requests.post(host, json=dict)
                if r.status_code == 200:
                    print (r.content.decode('utf-8'))
            else:
                print('Комманда не содержит аргументов!')
    if a[0] == 'set':
        if a[1] == 'host':
            ip = a[2] + ':5000'
    if command == 'quit':
        break

Explicacions:

En primer lloc, s'importa el mòdul de peticions (per interactuar amb el servidor). A continuació es mostren descripcions de les funcions d'inici i de prova. I després el cicle en què passa la màgia. Has llegit el codi? Així que entens el significat de la màgia que passa en el cicle. Introduïu l'ordre: s'executa. Shell: ordres per a la línia d'ordres (la lògica està fora d'escala).

Prova: comproveu si el servidor s'està executant (porta posterior)
Enllaç: ús d'una "drecera"
Openweb: obrir un lloc web
Surt: surt del client
Configurar: configurar la ip del vostre ordinador a la xarxa local

I ara més sobre l'enllaç.

Hi ha un fitxer link.txt al costat del servidor. Conté enllaços (camí complet) a fitxers (vídeos, fotos, programes).

L'estructura és així:

полный_путь>описание
полный_путь>описание

Total

Disposem d'un servidor de porta posterior per controlar un ordinador en una xarxa local (dins d'una xarxa wi-fi). Tècnicament, podem executar el client des de qualsevol dispositiu que tingui un intèrpret Python.

PS He afegit l'ordre set perquè si a un ordinador de la xarxa local se li assigna una IP diferent, es pot canviar directament al client.

Font: www.habr.com

Afegeix comentari