Flask дээрх жижиг арын хаалга эсвэл дотоод сүлжээн дэх компьютерийг хэрхэн удирдах талаар

Хөөе Хабр!

Би саяхан "Flask-д өөрийн вэб програмыг хэрхэн үүсгэх вэ" програмчлалын урсгалын татаж авсан хувилбарыг үзсэн. Тэгээд би ямар нэгэн төсөл дээр мэдлэгээ нэгтгэхээр шийдсэн. Удаан хугацааны турш би юу бичихээ мэдэхгүй байсан бөгөөд надад "Яагаад колбонд мини-арын хаалга хийж болохгүй гэж?"

Арын хаалганы хэрэгжилт, боломжуудын эхний сонголтууд миний толгойд тэр даруй гарч ирэв. Гэхдээ би тэр даруй арын хаалганы боломжуудын жагсаалтыг гаргахаар шийдсэн.

  1. Вэбсайтыг хэрхэн нээхийг мэддэг
  2. Командын мөрөнд хандах боломжтой
  3. Програм, зураг, видеог нээх чадвартай байх

Тиймээс эхний зүйл бол вэб хөтөчийн модулийг ашиглан хэрэгжүүлэхэд маш хялбар юм. Би os модулийг ашиглан хоёр дахь цэгийг хэрэгжүүлэхээр шийдсэн. Гурав дахь нь мөн үйлдлийн системээр дамждаг, гэхдээ би "холбоос" ашиглах болно (энэ талаар дараа нь).

Сервер бичиж байна

Тиймээс бүх серверийн кодыг *drumroll*:

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

Би бүх кодыг аль хэдийн хаясан, мөн чанарыг тайлбарлах цаг болжээ.

Бүх код нь 5000 порт дээрх дотоод компьютер дээр ажилладаг. Сервертэй харилцахын тулд бид JSON POST хүсэлт илгээх ёстой.

JSON хүсэлтийн бүтэц:

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

За, "тушаал" гэдэг нь бидний гүйцэтгэхийг хүсч буй тушаал гэдэг нь утга учиртай юм. Мөн 'өгөгдөл' нь тушаалын аргументууд юм.

Та сервертэй гараар харилцах JSON хүсэлтийг бичиж, илгээж болно (хүсэлт танд туслах болно). Эсвэл та консол клиент бичиж болно.

Үйлчлүүлэгч бичих

Кодыг:

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

Тайлбар:

Юуны өмнө хүсэлтийн модулийг импортлодог (сервертэй харилцахын тулд). Доорх нь эхлүүлэх болон туршилтын функцуудын тайлбар юм. Дараа нь ид шид тохиолддог мөчлөг. Та кодыг уншсан уу? Тиймээс та мөчлөгт тохиолддог ид шидийн утгыг ойлгодог. Тушаалыг оруулна уу - энэ нь гүйцэтгэгдэнэ. Shell - командын мөрөнд зориулсан командууд (логик нь масштабаас гадуур).

Туршилт - сервер ажиллаж байгаа эсэхийг шалгах (арын хаалга)
Холбоос - "товчлол" ашиглах
Openweb - вэбсайт нээх
Гарах - үйлчлүүлэгчээс гарах
Тохируулах - дотоод сүлжээнд компьютерийнхээ IP-г тохируулах

Тэгээд одоо холбоосын талаар дэлгэрэнгүй.

Серверийн хажууд link.txt файл байна. Энэ нь файлууд (видео, зураг, програм) руу холбоос (бүрэн зам) агуулдаг.

Бүтэц нь дараах байдалтай байна.

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

Үр дүн

Бид дотоод сүлжээнд (wi-fi сүлжээнд) компьютерийг удирдах арын сервертэй. Техникийн хувьд бид питон орчуулагчтай ямар ч төхөөрөмжөөс үйлчлүүлэгчийг ажиллуулж болно.

Жич Би set командыг нэмсэн бөгөөд ингэснээр дотоод сүлжээнд байгаа компьютерт өөр IP хаяг өгсөн бол түүнийг шууд клиент дотор өөрчлөх боломжтой.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх