|
#! python3 |
|
|
|
from selenium import webdriver |
|
from selenium.webdriver.common.by import By |
|
from selenium.webdriver.support.ui import WebDriverWait |
|
from selenium.webdriver.support import expected_conditions as EC |
|
from selenium.webdriver.chrome.options import Options |
|
from selenium.webdriver.common.keys import Keys |
|
import datetime |
|
import time |
|
from dateutil.relativedelta import relativedelta |
|
import re |
|
import json |
|
|
|
# Là où est stocké le profil Chrome. Chemin complet |
|
cheminProfile = "/var/www/enedis/python/profile/" |
|
|
|
# Mot de passe de votre compte Enedis |
|
motDePasse = '1qcS2RJUaoTs5l05UUnY=' |
|
|
|
# Valeurs récupérées de l'URL |
|
personnes = 'KRT22PUD' |
|
prms = '06205681943608' |
|
|
|
# Chemin complet du fichier JSON de php-LinkyAPI |
|
cheminJSON = '/var/www/enedis/php-LinkyAPI-master/linkyLog.json' |
|
|
|
|
|
# Nettoie la valeur des mois pour suivre le "format" de php-LinkyAPI |
|
def replaceMonth(string): |
|
replaced = string.replace("Janvier", "Jan") |
|
replaced = replaced.replace("Février", "Feb") |
|
replaced = replaced.replace("Mars", "Mar") |
|
replaced = replaced.replace("Avril", "Apr") |
|
replaced = replaced.replace("Mai", "May") |
|
replaced = replaced.replace("Juin", "Jun") |
|
replaced = replaced.replace("Juillet", "Jul") |
|
replaced = replaced.replace("Août", "Aug") |
|
replaced = replaced.replace("Septembre", "Sep") |
|
replaced = replaced.replace("Octobre", "Oct") |
|
replaced = replaced.replace("Novembre", "Nov") |
|
replaced = replaced.replace("Décembre", "Dec") |
|
return replaced |
|
|
|
# Transforme une date JJ/MM/AA en JJ/MM/AAAA, pour suivre php-LinkyAPI |
|
def replaceYear(string): |
|
return re.sub('([0-9]{2}/[0-9]{2})/([0-9]{2})', r'\1/20\2', string) |
|
|
|
|
|
chrome_options = Options() |
|
chrome_options.add_argument("user-data-dir="+cheminProfile) |
|
browser = webdriver.Chrome('chromedriver',options=chrome_options) |
|
# Cette ligne met juste le navigateur dans un coin. Si vous voulez garder la fenêtre devant vous, hésitez pas à la commenter |
|
browser.set_window_position(-5000, -5000) |
|
|
|
|
|
# Charge la page de login |
|
browser.get('https://mon-compte.enedis.fr/auth/XUI/#login/&realm=/enedis&forward=true&spEntityID=SP-ODW-PROD&goto=/SSOPOST/metaAlias/enedis/providerIDP?ReqID%3Da491c3a31c12ea083f9338aic58454h%26index%3Dnull%26acsURL%3Dhttps://apps.lincs.enedis.fr/saml/SSO%26spEntityID%3DSP-ODW-PROD%26binding%3Durn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST&AMAuthCookie=') |
|
|
|
# Attend que la page soit chargée avant de rentrer le mdp et de presser "entrer" |
|
idElement2 = WebDriverWait(browser, 10).until(EC.visibility_of_element_located((By.ID, "idToken2"))) |
|
idElement2.send_keys(motDePasse) |
|
idElement2.send_keys(Keys.RETURN); |
|
|
|
# Temps nécessaire au chargement complet de la page de compte Enedis. C'est important que la page soit totalement chargée, donc n'hésitez pas à l'adapter à votre cas. |
|
time.sleep(5) |
|
|
|
today = datetime.date.today() |
|
twoMago = today - relativedelta(months=26) |
|
# dd/mm/YY |
|
d0 = twoMago.strftime("%d-%m-%Y") |
|
d1 = today.strftime("%d-%m-%Y") |
|
|
|
# Téléchargement et nettoyage du JSON |
|
browser.get('about:blank') |
|
browser.get('https://apps.lincs.enedis.fr/mes-mesures/api/private/v1/personnes/'+personnes+'/prms/'+prms+'/donnees-energie?dateDebut='+d0+'&dateFin='+d1+'&mesuretypecode=CONS') |
|
source = browser.page_source |
|
source = re.sub('<[^(){}]*>', '', source) |
|
source = re.sub("\'", '\"', source) |
|
jsoned = json.loads(source) |
|
|
|
# Afficher les trois derniers jours de valeurs. Permet de tester sans modifier de fichier (si vous commentez la suite du code, évidemment) |
|
#print('"' + jsoned['1']["CONS"]["aggregats"]["JOUR"]["labels"][-3].split()[1] + '": "' + str(jsoned['1']["CONS"]["aggregats"]["JOUR"]["datas"][-3]) + 'kWh",') |
|
#print('"' + jsoned['1']["CONS"]["aggregats"]["JOUR"]["labels"][-2].split()[1] + '": "' + str(jsoned['1']["CONS"]["aggregats"]["JOUR"]["datas"][-2]) + 'kWh",') |
|
#print('"' + jsoned['1']["CONS"]["aggregats"]["JOUR"]["labels"][-1].split()[1] + '": "' + str(jsoned['1']["CONS"]["aggregats"]["JOUR"]["datas"][-1]) + 'kWh"') |
|
|
|
browser.close() |
|
|
|
# Charge le fichier JSON de php-LinkyAPI |
|
with open(cheminJSON, 'r') as log: |
|
logData = json.load(log) |
|
|
|
# Remplis les 3 derniers jours |
|
logData["days"][replaceYear(jsoned['1']["CONS"]["aggregats"]["JOUR"]["labels"][-3].split()[1])] = str(jsoned['1']["CONS"]["aggregats"]["JOUR"]["datas"][-3]) + 'kWh' |
|
logData["days"][replaceYear(jsoned['1']["CONS"]["aggregats"]["JOUR"]["labels"][-2].split()[1])] = str(jsoned['1']["CONS"]["aggregats"]["JOUR"]["datas"][-2]) + 'kWh' |
|
logData["days"][replaceYear(jsoned['1']["CONS"]["aggregats"]["JOUR"]["labels"][-1].split()[1])] = str(jsoned['1']["CONS"]["aggregats"]["JOUR"]["datas"][-1]) + 'kWh' |
|
|
|
# Remplis les 2 derniers mois |
|
logData["months"][replaceMonth(jsoned['1']["CONS"]["aggregats"]["MOIS"]["labels"][-2])] = str(jsoned['1']["CONS"]["aggregats"]["MOIS"]["datas"][-2]) + 'kWh' |
|
logData["months"][replaceMonth(jsoned['1']["CONS"]["aggregats"]["MOIS"]["labels"][-1])] = str(jsoned['1']["CONS"]["aggregats"]["MOIS"]["datas"][-1]) + 'kWh' |
|
|
|
# Remplis les 2 dernières années |
|
logData["years"][jsoned['1']["CONS"]["aggregats"]["ANNEE"]["labels"][-2]] = str(jsoned['1']["CONS"]["aggregats"]["ANNEE"]["datas"][-2]) + 'kWh' |
|
logData["years"][jsoned['1']["CONS"]["aggregats"]["ANNEE"]["labels"][-1]] = str(jsoned['1']["CONS"]["aggregats"]["ANNEE"]["datas"][-1]) + 'kWh' |
|
|
|
# Met à jour la date de mise à jour |
|
now = datetime.datetime.now() |
|
logData["Update"] = now.strftime("%d/%m/%Y %H:%M:%S") |
|
|
|
# Enregistre le nouveau fichier JSON |
|
with open(cheminJSON, 'w') as log: |
|
json.dump(logData, log, indent=4) |
Je viens de tester le script, et j'obtiens une erreur SSL dans le navigateur Chrome qui se lance :
https://zupimages.net/up/20/31/tmd4.png
une idée ?