Väike tagauks Flaskis või kuidas arvutit kohalikus võrgus juhtida

Tere Habr!

Vaatasin hiljuti allalaaditud versiooni programmeerimisvoost "Kuidas luua Flaskis oma veebirakendust". Ja otsustasin oma teadmisi mõnes projektis kinnistada. Pikka aega ei teadnud ma, mida kirjutada ja mulle tuli mõte: "Miks mitte teha Flaskis mini-tagauks?"

Kohe tekkisid pähe esimesed tagaukse teostuste ja võimaluste võimalused. Kuid otsustasin kohe teha nimekirja tagaukse võimalustest:

  1. Tea, kuidas veebisaite avada
  2. Omada käsurea juurdepääsu
  3. Oskab avada programme, fotosid, videoid

Seega on esimest punkti veebibrauseri mooduli abil äärmiselt lihtne rakendada. Otsustasin teise punkti rakendada os-mooduli abil. Ja kolmas on samuti läbi os-i mooduli, aga ma kasutan "linke" (sellest lähemalt hiljem).

Serveri kirjutamine

Niisiis, *trummelroll* kogu serveri kood:

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')

Olen kogu koodi juba välja jätnud, on aeg sisuliselt lahti seletada.

Kogu kood töötab kohalikus arvutis pordis 5000. Serveriga suhtlemiseks peame saatma JSON POST-i päringu.

JSON-i päringu struktuur:

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

On mõistlik, et käsk on käsk, mida tahame täita. Ja "andmed" on käsu argumendid.

Saate kirjutada ja saata JSON-i päringuid serveriga suhtlemiseks käsitsi (päringud aitavad teid). Või võite kirjutada konsoolikliendi.

Kliendi kirjutamine

Kood:

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

Selgitused:

Kõigepealt imporditakse päringute moodul (serveriga suhtlemiseks). Allpool on käivitus- ja testimisfunktsioonide kirjeldused. Ja siis tsükkel, milles maagia juhtub. Kas olete koodi lugenud? Nii saate aru tsüklis toimuva maagia tähendusest. Sisestage käsk - see täidetakse. Shell – käsurea käsud (loogika on mastaabist väljas).

Test – kontrolli, kas server töötab (tagauks)
Link – otsetee kasutamine
Openweb – veebisaidi avamine
Välju – välju kliendist
Määra – arvuti IP seadistamine kohtvõrku

Ja nüüd rohkem linki kohta.

Serveri kõrval on fail link.txt. See sisaldab linke (täielik tee) failidele (videod, fotod, programmid).

Struktuur on selline:

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

Summaarne

Meil on tagaukseserver arvuti juhtimiseks kohtvõrgus (wi-fi võrgu sees). Tehniliselt saame klienti käivitada mis tahes seadmest, millel on pythoni tõlk.

PS Lisasin set käsu, et kui kohtvõrgus olevale arvutile on määratud teine ​​IP, saab seda otse kliendis muuta.

Allikas: www.habr.com

Lisa kommentaar