def __init__(self, host, port, username, password, phonebook_id=0, prefixes=None): """Initialize the class.""" self.host = host self.username = username self.password = password self.port = port self.phonebook_id = phonebook_id self.phonebook_dict = None self.number_dict = None self.prefixes = prefixes or [] # Establish a connection to the FRITZ!Box. self.fph = FritzPhonebook(address=self.host, user=self.username, password=self.password) if self.phonebook_id not in self.fph.list_phonebooks: raise ValueError("Phonebook with this ID not found.") self.update_phonebook()
def init_phonebook(self): """Establish a connection to the FRITZ!Box and check if phonebook_id is valid.""" self.fph = FritzPhonebook( address=self.host, user=self.username, password=self.password, ) self.update_phonebook()
def get_known_phonebook_numbers(config): fp = FritzPhonebook(address=config["fritz"]["address"], password=config["fritz"]["password"]) number_set = set() for phonebook_id in fp.phonebook_ids: contacts = fp.get_all_names(phonebook_id) for name, numbers in contacts.items(): for number in numbers: number_set.add( phonenumber.normalize(number, config["phone-default-region"])) return number_set
class FritzBoxPhonebook: """This connects to a FritzBox router and downloads its phone book.""" def __init__(self, host, username, password, phonebook_id, prefixes): """Initialize the class.""" self.host = host self.username = username self.password = password self.phonebook_id = phonebook_id self.phonebook_dict = None self.number_dict = None self.prefixes = prefixes self.fph = None def init_phonebook(self): """Establish a connection to the FRITZ!Box and check if phonebook_id is valid.""" self.fph = FritzPhonebook( address=self.host, user=self.username, password=self.password, ) self.update_phonebook() @Throttle(MIN_TIME_PHONEBOOK_UPDATE) def update_phonebook(self): """Update the phone book dictionary.""" if self.phonebook_id is None: return self.phonebook_dict = self.fph.get_all_names(self.phonebook_id) self.number_dict = { re.sub(REGEX_NUMBER, "", nr): name for name, nrs in self.phonebook_dict.items() for nr in nrs } _LOGGER.info("Fritz!Box phone book successfully updated") def get_phonebook_ids(self): """Return list of phonebook ids.""" return self.fph.phonebook_ids def get_name(self, number): """Return a name for a given phone number.""" number = re.sub(REGEX_NUMBER, "", str(number)) if self.number_dict is None: return UNKOWN_NAME if number in self.number_dict: return self.number_dict[number] if not self.prefixes: return UNKOWN_NAME for prefix in self.prefixes: try: return self.number_dict[prefix + number] except KeyError: pass try: return self.number_dict[prefix + number.lstrip("0")] except KeyError: pass
class FritzBoxPhonebook: """This connects to a FritzBox router and downloads its phone book.""" def __init__(self, host, port, username, password, phonebook_id=0, prefixes=None): """Initialize the class.""" self.host = host self.username = username self.password = password self.port = port self.phonebook_id = phonebook_id self.phonebook_dict = None self.number_dict = None self.prefixes = prefixes or [] # Establish a connection to the FRITZ!Box. self.fph = FritzPhonebook(address=self.host, user=self.username, password=self.password) if self.phonebook_id not in self.fph.list_phonebooks: raise ValueError("Phonebook with this ID not found.") self.update_phonebook() @Throttle(MIN_TIME_PHONEBOOK_UPDATE) def update_phonebook(self): """Update the phone book dictionary.""" self.phonebook_dict = self.fph.get_all_names(self.phonebook_id) self.number_dict = { re.sub(r"[^\d\+]", "", nr): name for name, nrs in self.phonebook_dict.items() for nr in nrs } _LOGGER.info("Fritz!Box phone book successfully updated") def get_name(self, number): """Return a name for a given phone number.""" number = re.sub(r"[^\d\+]", "", str(number)) if self.number_dict is None: return "unknown" try: return self.number_dict[number] except KeyError: pass if self.prefixes: for prefix in self.prefixes: try: return self.number_dict[prefix + number] except KeyError: pass try: return self.number_dict[prefix + number.lstrip("0")] except KeyError: pass return "unknown"
event, values = window(timeout=display_duration_in_ms) window.close() if __name__ == '__main__': title = "FritzCall Monitor starting up..." message = "Have fun" display_notification(title, message, img_success, 1000, use_fade_in=True) # connect to the FritzBox s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((TCP_IP, TCP_PORT)) # get Adress data of the Fritzbox if available fp = FritzPhonebook(address=TCP_IP, password=PASS) for phonebook_id in fp.phonebook_ids: contacts = fp.get_all_numbers(phonebook_id) while True: data = s.recv(BUFFER_SIZE) # Split the string to an array to handle number and case separately calldata = data.decode().split(';') # was this a call? Or something else (then ignore) if 'CALL' in calldata[1] or 'RING' in calldata[1]: # do we have a number? if 'CALL' in calldata[1]: number = calldata[5]
class FritzBoxPhonebook: """This connects to a FritzBox router and downloads its phone book.""" fph: FritzPhonebook phonebook_dict: dict[str, list[str]] number_dict: dict[str, str] def __init__( self, host: str, username: str, password: str, phonebook_id: int | None = None, prefixes: list[str] | None = None, ) -> None: """Initialize the class.""" self.host = host self.username = username self.password = password self.phonebook_id = phonebook_id self.prefixes = prefixes def init_phonebook(self) -> None: """Establish a connection to the FRITZ!Box and check if phonebook_id is valid.""" self.fph = FritzPhonebook( address=self.host, user=self.username, password=self.password, ) self.update_phonebook() @Throttle(MIN_TIME_PHONEBOOK_UPDATE) def update_phonebook(self) -> None: """Update the phone book dictionary.""" if self.phonebook_id is None: return self.phonebook_dict = self.fph.get_all_names(self.phonebook_id) self.number_dict = { re.sub(REGEX_NUMBER, "", nr): name for name, nrs in self.phonebook_dict.items() for nr in nrs } _LOGGER.info("Fritz!Box phone book successfully updated") def get_phonebook_ids(self) -> list[int]: """Return list of phonebook ids.""" return self.fph.phonebook_ids # type: ignore[no-any-return] def get_name(self, number: str) -> str: """Return a name for a given phone number.""" number = re.sub(REGEX_NUMBER, "", str(number)) with suppress(KeyError): return self.number_dict[number] if not self.prefixes: return UNKNOWN_NAME for prefix in self.prefixes: with suppress(KeyError): return self.number_dict[prefix + number] with suppress(KeyError): return self.number_dict[prefix + number.lstrip("0")] return UNKNOWN_NAME