• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przeniesienie funkcji z JavaScript do Pythona

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
68 wizyt
pytanie zadane 2 dni temu w Python przez komar54 Użytkownik (750 p.)

Witam,

próbuje skomunikować się z urządzeniem, które konfiguruje się przez stronę www generowaną przez ono samo. Większość opcji już sobie ogarnąłem ale w jednym miejscu utknąłem. Próbuję zasymulować przez skrypt pythona wysyłanie nazwy pliku do aktualizacji oprogramowania urządzenia i niestety bez sukcesu. Funkcja w javascript wygląda następująco:

function doUpgrade() {
	var form = new FormData();
	var xhr = createXHR();
	var f=document.getElementById("file").files[0];
	if (typeof f=='undefined') {
		document.getElementById("remark").innerHTML="Can't read file!";
		return
	}
	form.append("upfile", f);
	xhr.open("POST", "upload.cgi");
	xhr.onreadystatechange=function() {
		if (xhr.readyState==4 && xhr.status>=200 && xhr.status<300) {
			setProgress(1);
			var data= eval("(" + xhr.responseText + ")");
			if(data.status=="ok" && data.ret==1){
				document.getElementById("remark").innerHTML="Info:Gateway upgrade success,it will reboot now";
			}
			else if(data.status=="fail" && data.ret==2){
				document.getElementById("remark").innerHTML="Info:Gateway upgrade fail,the firmware not matched";
			}
			else if(data.status=="ok" && data.ret==3){
				document.getElementById("remark").innerHTML="Info:Inverter firmware upload success,please wait it to upgrade";
			}
			else if(data.status=="fail" && data.ret==4){
				document.getElementById("remark").innerHTML="Info:Inverter firmware upgrade fail,not found any inverter";
			}
			else{
				document.getElementById("remark").innerHTML="Info:Unknown error";
			}
		}
	}
	if (typeof xhr.upload.onprogress != 'undefined') {
		xhr.upload.onprogress=function(e) {
			setProgress(e.loaded / e.total);
		}
	}
	document.getElementById("remark").innerHTML="Uploading...";
	xhr.send(form);
	return false;

Jest możliwość, żeby przenieść to do Pythona?

2 odpowiedzi

0 głosów
odpowiedź 2 dni temu przez adrian17 Ekspert (327,560 p.)

Innymi słowy, pytasz jak zrobić zapytanie POST z załączonym plikiem i przeczytać odpowiedź z JSONem (zakładam że to JSON, nie mam pojęcia czemu użyłeś eval())?

Brzmi jak dość podstawowe użycie requests, napisane na sucho i na oko:

file = open("...")
response = requests.post("http://(...)/upload.cgi", files={"upfile": file})
json = response.json()

if data["status"] == "ok" and data["ret"] == 1:
    print(...)
print(...)

Jeśli chcesz żeby to było asynchroniczne, możesz zamiast requests użyć bardzo podobny (tylko właśnie asynchroniczny) aiohttp.

komentarz 2 dni temu przez komar54 Użytkownik (750 p.)

Dzięki za pomoc, coś tam się ruszyło. Urządzenie odpowiada, ale nie chce zaktualizować oprogramowania

import requests

file = open('magpie.bin', 'rb')
response = requests.post('http://10.10.10.1/upload.cgi', files={"upfile": file})

json = response.json()
print(response)
print(json)

Dostaję odpowiedź:

<Response [200]>
{'status': 'fail'}

komentarz 2 dni temu przez adrian17 Ekspert (327,560 p.)
Hmm, na oko to nie wiem. Może najlepiej jakbyś zajrzał do devtoolsów i zobaczył z zakładce Network jak dokładnie wygląda surowe zapytanie robione przez JS, wtedy możesz je porównać z tym robionym przez Pythona.
komentarz 2 dni temu przez komar54 Użytkownik (750 p.)
Ok, jutro będę próbował dalej. Dzięki
0 głosów
odpowiedź 1 dzień temu przez reaktywny Nałogowiec (30,230 p.)

bin_data = open("myfile.dll", "rb", buffering=0)
files = {'file': bin_data}
r = requests.post(url, files=files)

...spróbuj tak.

1
komentarz 1 dzień temu przez komar54 Użytkownik (750 p.)
Wszystko działa, był jakiś błąd w samym urządzeniu. Dziś po resecie wszystko ruszyło. Dzięki za pomoc!

Podobne pytania

0 głosów
0 odpowiedzi 64 wizyt
0 głosów
3 odpowiedzi 274 wizyt
0 głosów
1 odpowiedź 94 wizyt
pytanie zadane 25 grudnia 2018 w JavaScript przez Kijoszi Początkujący (330 p.)

90,298 zapytań

138,894 odpowiedzi

311,080 komentarzy

60,012 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...