Li ser Flask derîyek piçûk an meriv çawa komputerek li ser torgilokek herêmî kontrol dike

Hey Habr!

Min vê dawiyê li guhertoyek dakêşandî ya bernameya bernamekirinê temaşe kir "Hawa meriv serîlêdana xweya webê di Flask de biafirîne." Û min biryar da ku ez zanîna xwe di hin projeyekê de yek bikim. Demek dirêj min nizanibû ez çi binivîsim û fikir ji min re hat: "Çima di Flask de deriyek piçûk çênakim?"

Vebijarkên yekem ji bo pêkanîn û kapasîteyên paşîn tavilê di serê min de xuya bûn. Lê min biryar da ku tavilê navnîşek kapasîteyên paşverû çêkim:

  1. Dizanin meriv çawa malperan veke
  2. Gihîştina rêza fermanê hebe
  3. Dikarin bername, wêne, vîdyoyan vekin

Ji ber vê yekê, xala yekem pir hêsan e ku bi karanîna modula webbrowser ve were sepandin. Min biryar da ku xala duyemîn bi karanîna modula os-ê bicîh bikim. Û ya sêyemîn jî bi navgîniya modula os-ê ye, lê ez ê "girêdan" bikar bînim (li ser wê paşê).

Nivîsandina serverek

Ji ber vê yekê, *drumroll* hemî koda serverê:

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

Min berê hemî kod avêtiye, wextê ravekirina esasê ye.

Hemî kod li ser komputera herêmî ya li porta 5000-ê dimeşîne. Ji bo ku bi serverê re têkilî daynin, divê em daxwaznameyek JSON POST bişînin.

Struktura daxwaza JSON:

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

Welê, têgihîştî ye ku 'ferman' fermana ku em dixwazin bicîh bînin e. Û 'dane' argumanên fermanê ne.

Hûn dikarin daxwazên JSON binivîsin û bişînin da ku bi serverê re bi destan re têkilî daynin (daxwaz dê ji we re bibin alîkar). An jî hûn dikarin xerîdarek konsolê binivîsin.

Nivîsandina muwekîlê

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

Ravekirin:

Berî her tiştî, modula daxwazan tê import kirin (ji bo danûstendina bi serverê re). Li jêr danasînên fonksiyonên destpêk û ceribandinê hene. Û paşê çerxa ku sêrbaz diqewime. Ma we kod xwendiye? Ji ber vê yekê hûn wateya sêrbaziya ku di çerxê de diqewime fêm dikin. Ferman binivîse - ew tête darve kirin. Shell - fermanên ji bo rêzika fermanê (mantiq ji pîvanê dûr e).

Test - kontrol bikin ka server dimeşe (derî paşde)
Girêdan - karanîna "kurterek"
Openweb - vekirina malperek
Derketin - ji xerîdar derkeve
Set - danîna ip-ya komputera xwe li ser tora herêmî

Û niha bêtir li ser girêdanê.

Li kêleka serverê pelek link.txt heye. Ew girêdan (rêya tevahî) bi pelan (vîdyo, wêne, bername) vedihewîne.

Struktura wiha ye:

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

Encam

Ji bo kontrolkirina komputerek li ser tora herêmî (di nav tora wi-fi de) serverek paşverû ya me heye. Ji hêla teknîkî ve, em dikarin xerîdar ji her amûrek ku wergêrek python heye bimeşînin.

PS Min fermana set lê zêde kir da ku heke komputerek li ser tora herêmî IP-yek cûda were veqetandin, ew rasterast di xerîdar de were guheztin.

Source: www.habr.com

Add a comment