Advertisement
Guest User

Untitled

a guest
Sep 15th, 2022
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.48 KB | None | 0 0
  1. import argparse
  2. from io import BytesIO
  3. import re
  4.  
  5. import requests
  6. import pandas as pd
  7.  
  8. ###
  9. # tarvii: python3 pandas openpyxl
  10. ##
  11. class OomiConfig:  # pylint: disable=too-few-public-methods
  12.     """URL's needed for downloading data."""
  13.  
  14.     OOMI_NO_AUTH_PAGE = "https://online.oomi.fi/eServices/Online/IndexNoAuth"
  15.     OOMI_LOGIN_URL = "https://online.oomi.fi/eServices/Online/Login"
  16.     OOMI_GENERATE_EXCEL_URL = "https://online.oomi.fi/Reporting/CustomerConsumption/GenerateExcelFile"
  17.     OOMI_DOWNLOAD_EXCEL_URL = "https://online.oomi.fi/Reporting/CustomerConsumption/DownloadExcelFile?identifier="
  18.     OOMI_VERIFICATION_TOKEN_REGEX = (
  19.         r'(?<=<input name="__RequestVerificationToken" type="hidden" value=")([\w-]+)(?=" />)'
  20.     )
  21.  
  22.  
  23. class OomiDownloader:
  24.     """Utility for downloading comsumption data."""
  25.  
  26.     def __init__(self, config: OomiConfig, username: str, password: str) -> None:
  27.         """Init downloader with given config and login data."""
  28.         self.config = config
  29.         self.username = username
  30.         self.password = password
  31.  
  32.     def get_consumption(self, start: str, end: str) -> pd.DataFrame:
  33.         """Get the consumption between start and end as pandas dataframe."""
  34.         with requests.Session() as session:
  35.             self.login_to_oomi(session)
  36.             response = session.post(
  37.                 self.config.OOMI_GENERATE_EXCEL_URL, data={"start": start, "end": end, "selectedTimeSpan": "hour"},
  38.             )
  39.             data = session.get(self.config.OOMI_DOWNLOAD_EXCEL_URL + response.json()["identifier"])
  40.         df = pd.read_excel(  # pylint: disable=invalid-name
  41.             BytesIO(data.content),
  42.             header=2,  # there is a text header, then an empty line, then table headers on third line (2)
  43.             parse_dates=[0],  # datetimes in first column
  44.             date_parser=lambda x: pd.to_datetime(x, format="%d.%m.%Y %H.%M"),
  45.             engine='openpyxl'
  46.         )
  47.         # parse column name that contains the address
  48.         df.columns = ["time", "consumption"]  # rename columns
  49.         return df
  50.  
  51.     def login_to_oomi(self, session: requests.Session) -> None:
  52.         """Log-in to Oomi inside the given session."""
  53.         response = session.get(self.config.OOMI_NO_AUTH_PAGE)
  54.         match = re.search(self.config.OOMI_VERIFICATION_TOKEN_REGEX, response.text)
  55.         if match is not None:
  56.             verification_token = match.group()
  57.         else:
  58.             raise ValueError("Request verification token not found!")
  59.         _ = session.post(
  60.             self.config.OOMI_LOGIN_URL,
  61.             data={
  62.                 "UserName": self.username,
  63.                 "Password": self.password,
  64.                 "__RequestVerificationToken": verification_token,
  65.             },
  66.         )
  67.  
  68.  
  69. def main():
  70.     """Simple main to test the downloader."""
  71.     parser = argparse.ArgumentParser(description="Download and print consumption data.")
  72.     parser.add_argument("--username", type=str, help="Oomi user name")
  73.     parser.add_argument("--password", type=str, help="Oomi user password")
  74.     parser.add_argument("--start", type=str, default="2021-01-01", help="Start date")
  75.     parser.add_argument("--end", type=str, default="2021-01-01", help="End date")
  76.     args = parser.parse_args()
  77.     downloader = OomiDownloader(OomiConfig(), username=args.username, password=args.password)
  78.     data_frame = downloader.get_consumption(args.start, args.end)
  79.    
  80.     print(data_frame)
  81.  
  82.  
  83. if __name__ == "__main__":
  84.     main()
  85.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement