Http.server Modülü İle Telefondan Bilgisayarı Kontrol Etmek

Herkese merhaba. Bir kaç gündür telefondan bilgisayarı kontrol etmek ile ilgili çalışmalar yapıyorum. Şimdilik istediğim prototipi oluşturdum fakat programın ne kadar sağlıklı olduğu hakkında hiç bir fikrim yok. Çünkü kodlarda da gördüğünüz gibi her işlem if-elif ile yapılıyor. Aklıma başka bir yöntem gelmediği için böyle basit bir yol seçtim.

Server kodları:

import http.server
import socketserver
import socket
import sys

HOST = socket.gethostbyname(socket.gethostname())
PORT = 8000
Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("Local IP:", HOST)
    print("Port:", PORT)
    plus1 = 1
    sys.stderr = open('log.txt', 'w', plus1)
    httpd.serve_forever()

Telefondan gelen komutlara cevap vermek için yazdığım script:

import os
import webbrowser

f = open('log.txt', 'r')
lines = f.read().splitlines()
last_line = lines[-1]

while 1:
    f = open('log.txt', 'r')

    lines = f.read().splitlines()
    last_line = lines[-1]

    for i in last_line.split():
        if i == '/index.html?command=shutdown':
            print(last_line)
            os.system('shutdown -s')
            f = open('log.txt', 'w')
            f.write('192.168.1.134 - - [13/Nov/2018 02:50:58] "GET /index.html?command= HTTP/1.1" 200 -')

        elif i == '/index.html?command=shutdown+cancel':
            print(last_line)
            os.system('shutdown -a')
            f = open('log.txt', 'w')
            f.write('192.168.1.134 - - [13/Nov/2018 02:50:58] "GET /index.html?command= HTTP/1.1" 200 -')

        elif i == '/index.html?command=open+browser':
            print(last_line)
            webbrowser.open('http://google.com')
            f = open('log.txt', 'w')
            f.write('192.168.1.134 - - [13/Nov/2018 02:50:58] "GET /index.html?command= HTTP/1.1" 200 -')

index.html

<!DOCTYPE html>
<html>
<body>
	<h2>Command</h2>

	<form action="index.html">
		> <input type="text" name="command">
		<br><br>
		> <input type="submit" value="OK">
	</form>
</body>
</html>

Kodlar kısa ve basit ama ben yine de açıklayayım. Server.py dosyasını çaltıştırdıktan sonra konsol ekranına yazılan local ip ile port’u telefonun tarayıcısına yazıyoruz. Örnek 192.168.1.134:8000

Burada bizi index.html dosyası karşılıyor. Şimdi ikinci scripti çalıştırabiliriz. İkinci scripti de çalıştırdıktan sonra örnek olması açısından yazdığım komutları telefondaki input’a girip enter’a bastığımızda if kodlarının altındaki komutlar devreye giriyor. Böylece telefondan girdiğimiz komut ile bilgisayara işlemler yaptırabiliyoruz.

Not: Tüm dosyaların aynı klasörde olması gerekiyor.

Bir şeyleri açıklamak konusunda pek iyi değilim. Muhtemelen yazıyı okuyunca anlamışsınızdır bunu. Sorularınıza elimden geldiğince cevap vermeye çalışacağım.

2 Beğeni

if-elif bloklarını fonksiyon+sözlükler kullanarak kısaltmanız ve yapılandırmanız mümkün. Şöyle ki, blokların içindekileri fonksiyon yapın, daha sonra bir sözlük oluşturup bu sözlüğün anahtarlarını if-elif bloklarındaki koşullar, değerlerini de fonksiyonlar yapın ve fonksiyonlara bu sözlük aracılığıyla erişip bunları çalıştırın. İleride programın karmaşıklaşmasını önlersiniz böylece.

1 Beğeni

Aslında, bunu yapabilmek için bir kütüphane kullanabilirdiniz(bottle framework gibi). Ancak kendiniz yapmanız da çok güzel. Ben de bir zamanlar böyle bir şey yazmıştım. Bulabilirsem atarım.

Bu işlemi bir sınıf içerisine yazıp, daha modüler bir program haline getirebilirsiniz. Bu şekilde işi uzatmak,yukarıda @ismailarilik beyin dediği gibi, program ilerlediğinde karışıklığa yol açabilir.

Şu sayfadaki örnekleri inceleyin. Çok yardımı olacaktır.

https://docs.python.org/3/library/socketserver.html#socketserver-tcpserver-example

2 Beğeni

Teşekkürler önerileriniz için. Nesne tabanlı yapmak aklıma gelmemişti. Dediğiniz gibi öyle yaparsam daha iyi olur. Vizeler başladığı için pek ilgilenemeyeceğim ama bir hafta sonra güncelleyeceğim dediğiniz şekilde.

Bu arada her if-elif kullanımında karşılaştırma yaparken tek tek if i == /index.html?command=shutdown’ … yazmak yerine tüm komutları bir array’a toplayıp oradan çağırsam daha uygun olur İsmail beyin dediği gibi.