si comme moi vous possédez cette box, que celle-ci perd régulièrement la synchro et que les appels au 1023 ne servent à rien (sauf à vous énerver
Ce script peut s'appeler depuis domoticz à partir d'un switch, d'un autre script, etc etc bref je vous laisse déterminer le bon moment de l'appeler en fonction des autres scripts que vous trouverez sur ce forum.
Enfin je remercie ce site https://jp.palik.fr/redemarrer-une-box- ... -via-curl/ à partir duquel je me suis inspiré pour mon script mais que je n'ai pas pu utiliser en l'état car il ne gère malheureusement pas les ids de session.
Explication du script :
- on se connecte la page de login.html
- on récupère un id de session
- on envoie son login, son mot de passe et son id de session (comme vous le feriez depuis la page officielle)
- la box renvoie un nouvel id de session qu'on récupère
- on envoie la demande de reboot avec le nouvel id de session
Le tour est joué il n'y a plus qu'à attendre que la box redémarre et se resynchronise
Les pros du python trouveront certainement des améliorations à apporter à mon script car je précise que je ne suis pas du tout un développeur python mais j'accepte avec plaisir les remarques constructives.
Enjoy et que les pertes de synchro ne soient plus qu'un mauvais souvenir !
Mat
Code : Tout sélectionner
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# importing the requests, regular expressions and time libraries
import requests
import re
import time
ip_addr = "192.168.1.253" # IP address of the SFR box
login = "admin"
pswd = "yourpassword"
timeout = 3
try:
#########################################################################################################
# Connect to login page and get auth token
URL = "http://" + ip_addr + "/login.html"
print("Opening " + URL)
r = requests.get(url = URL, headers={'Connection':'keep-alive'}, timeout = timeout)
r.raise_for_status()
# The login page contains the Session Key declared as follows : var SessionKey = '273582092';
# --> get it with regular expression
SessionKey = "0"
items=re.findall("SessionKey =.*$",r.text,re.MULTILINE)
for x in items:
print(x)
m = re.match(r'SessionKey = \'(.*)\';', x)
SessionKey = m.group(1)
print(SessionKey)
if(SessionKey == "0"):
raise ValueError('SessionKey not found in ' + URL)
time.sleep(1)
#########################################################################################################
# Submit login, password and session key to the login page with a post like the user would do it
URL = "http://" + ip_addr + "/goform/login?sessionKey=" + SessionKey
# Data to be sent to api
data = {'loginUsername':login,
'loginPassword':pswd}
# Send post request and save response as response object
print("Opening " + URL)
r = requests.post(url = URL, data = data, headers={'Connection':'keep-alive'}, timeout = timeout)
r.raise_for_status()
# Extract the new Session Key provided by the admin page
SessionKey = "0"
items=re.findall("SessionKey =.*$",r.text,re.MULTILINE)
for x in items:
print(x)
m = re.match(r'SessionKey = \'(.*)\';', x)
SessionKey = m.group(1)
print(SessionKey)
if(SessionKey == "0"):
raise ValueError('SessionKey not found in ' + URL)
time.sleep(1)
#########################################################################################################
# Call reboot service
URL = "http://" + ip_addr + "/goform/WebUiOnlyReboot?sessionKey=" + SessionKey
data = {'sessionKey':SessionKey}
# sending post request and saving response as response object
print("Opening " + URL)
r = requests.post(url = URL, headers={'Connection':'keep-alive','Content-Type':'application/x-www-form-urlencoded','Referer':'http://' + ip_addr + '/config.html'}, timeout = timeout)
r.raise_for_status()
# DONE, waiting for the modem to reboot!
except requests.exceptions.Timeout as e:
print("TimeoutError! :" + str(e))
except requests.exceptions.TooManyRedirects as e:
print("Bad URL with too many redirection! :" + str(e))
except requests.exceptions.RequestException as e:
print("Request exception! :" + str(e))
except requests.exceptions.HTTPError as e:
print("HTTP error! :" + str(e))
except ValueError as e:
print(str(e))