In lytse efterdoar op Flask of hoe't jo in kompjûter kontrolearje op in lokaal netwurk

Hoi Habr!

Ik seach koartlyn in ynladen ferzje fan 'e programmearstream "Hoe kinne jo jo eigen webapplikaasje meitsje yn Flask." En ik besleat om myn kennis te konsolidearjen yn in projekt. Lange tiid wist ik net wat ik skriuwe moast en kaam it idee by my op: "Wêrom net in mini-efterdoar yn Flask meitsje?"

De earste opsjes foar ymplemintaasje en mooglikheden fan 'e efterdoar ferskynden fuortendaliks yn myn holle. Mar ik besleat om fuortendaliks in list te meitsjen mei efterdoarmooglikheden:

  1. Witte hoe't jo websiden iepenje
  2. Hawwe kommandorigel tagong
  3. Kin programma's, foto's, fideo's iepenje

Dat, it earste punt is ekstreem maklik te ymplementearjen mei de webbrowsermodule. Ik besleat it twadde punt út te fieren mei de os-module. En de tredde is ek fia de os module, mar ik sil brûke "keppelings" (mear oer dat letter).

It skriuwen fan in tsjinner

Dus, *drumroll* alle serverkoade:

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

Ik haw al dumpt alle koade, it is tiid om te ferklearjen de essinsje.

Alle koade rint op de lokale kompjûter op haven 5000. Om ynteraksje mei de tsjinner, wy moatte stjoere in JSON POST fersyk.

JSON-oanfraachstruktuer:

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

No, it makket sin dat 'kommando' it kommando is dat wy wolle útfiere. En 'gegevens' binne de kommando-arguminten.

Jo kinne JSON-fersiken skriuwe en stjoere om manuell te ynteraksje mei de tsjinner (fersiken sille jo helpe). Of jo kinne in konsole-kliïnt skriuwe.

It skriuwen fan in klant

Code:

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

Taljochtingen:

As earste wurdt de oanfraachmodule ymportearre (foar ynteraksje mei de tsjinner). Hjirûnder steane beskriuwingen fan de start- en testfunksjes. En dan de syklus wêryn de magy bart. Hawwe jo de koade lêzen? Sa begripe jo de betsjutting fan 'e magy dy't bart yn' e syklus. Fier it kommando yn - it wurdt útfierd. Shell - kommando's foar de kommandorigel (de logika is fan skaal ôf).

Test - kontrolearje oft de tsjinner rint (efterdoar)
Link - gebrûk fan in "fluchtoets"
Openweb - it iepenjen fan in webside
Ofslute - de klant ferlitte
Set - it ip fan jo kompjûter ynstelle op it lokale netwurk

En no mear oer link.

Der is in link.txt triem neist de tsjinner. It befettet keppelings (folslein paad) nei bestannen (fideo's, foto's, programma's).

De struktuer is sa:

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

It resultaat

Wy hawwe in efterdoarserver foar it kontrolearjen fan in kompjûter op in lokaal netwurk (binnen in wi-fi netwurk). Technysk kinne wy ​​​​de kliïnt útfiere fan elk apparaat dat in python-tolk hat.

PS Ik haw it set kommando tafoege sadat as in kompjûter op it lokale netwurk in oare IP wurdt tawiisd, kin it direkt yn 'e kliïnt feroare wurde.

Boarne: www.habr.com

Add a comment