findmy.reports.account#
Module containing most of the code necessary to interact with an Apple account.
Attributes#
Classes#
JSON mapping representing state of an Apple account instance. |
|
Base class for an Apple account. |
|
An async implementation of |
|
A sync implementation of |
Functions#
|
Enforce a login state as precondition for a method. |
Module Contents#
- findmy.reports.account.logger#
- class findmy.reports.account.AccountStateMapping#
Bases:
TypedDict
JSON mapping representing state of an Apple account instance.
- type: Literal['account']#
- ids: _AccountStateMappingIds#
- account: _AccountStateMappingAccount#
- login: _AccountStateMappingLoginState#
- anisette: findmy.reports.anisette.AnisetteMapping#
- findmy.reports.account.require_login_state(*states: findmy.reports.state.LoginState) Callable[[_F], _F] #
Enforce a login state as precondition for a method.
- class findmy.reports.account.BaseAppleAccount(loop: asyncio.AbstractEventLoop | None = None)#
Bases:
findmy.util.abc.Closable
,findmy.util.abc.Serializable
[AccountStateMapping
],abc.ABC
Base class for an Apple account.
- property login_state: findmy.reports.state.LoginState#
- Abstractmethod:
The current login state of the account.
- property account_name: str | None#
- Abstractmethod:
The name of the account as reported by Apple.
This is usually an e-mail address. May be None in some cases, such as when not logged in.
- property first_name: str | None#
- Abstractmethod:
First name of the account holder as reported by Apple.
May be None in some cases, such as when not logged in.
- property last_name: str | None#
- Abstractmethod:
Last name of the account holder as reported by Apple.
May be None in some cases, such as when not logged in.
- abstractmethod login(username: str, password: str) findmy.util.types.MaybeCoro[findmy.reports.state.LoginState] #
Log in to an Apple account using a username and password.
- abstractmethod get_2fa_methods() findmy.util.types.MaybeCoro[collections.abc.Sequence[findmy.reports.twofactor.BaseSecondFactorMethod]] #
Get a list of 2FA methods that can be used as a secondary challenge.
Currently, only SMS-based 2FA methods are supported.
- abstractmethod sms_2fa_request(phone_number_id: int) findmy.util.types.MaybeCoro[None] #
Request a 2FA code to be sent to a specific phone number ID.
Consider using
BaseSecondFactorMethod.request()
instead.
- abstractmethod sms_2fa_submit(phone_number_id: int, code: str) findmy.util.types.MaybeCoro[findmy.reports.state.LoginState] #
Submit a 2FA code that was sent to a specific phone number ID.
Consider using
BaseSecondFactorMethod.submit()
instead.
- abstractmethod td_2fa_request() findmy.util.types.MaybeCoro[None] #
Request a 2FA code to be sent to a trusted device.
Consider using
BaseSecondFactorMethod.request()
instead.
- abstractmethod td_2fa_submit(code: str) findmy.util.types.MaybeCoro[findmy.reports.state.LoginState] #
Submit a 2FA code that was sent to a trusted device.
Consider using
BaseSecondFactorMethod.submit()
instead.
- abstractmethod fetch_reports(keys: findmy.keys.HasHashedPublicKey, date_from: datetime.datetime, date_to: datetime.datetime | None) findmy.util.types.MaybeCoro[list[findmy.reports.reports.LocationReport]] #
- abstractmethod fetch_reports(keys: findmy.accessory.RollingKeyPairSource, date_from: datetime.datetime, date_to: datetime.datetime | None) findmy.util.types.MaybeCoro[list[findmy.reports.reports.LocationReport]]
- abstractmethod fetch_reports(keys: collections.abc.Sequence[findmy.keys.HasHashedPublicKey | findmy.accessory.RollingKeyPairSource], date_from: datetime.datetime, date_to: datetime.datetime | None) findmy.util.types.MaybeCoro[dict[findmy.keys.HasHashedPublicKey | findmy.accessory.RollingKeyPairSource, list[findmy.reports.reports.LocationReport]]]
Fetch location reports for
HasHashedPublicKey`s between `date_from
and date_end.Returns a dictionary mapping :class:`HasHashedPublicKey`s to their location reports.
- abstractmethod fetch_last_reports(keys: findmy.keys.HasHashedPublicKey, hours: int = 7 * 24) findmy.util.types.MaybeCoro[list[findmy.reports.reports.LocationReport]] #
- abstractmethod fetch_last_reports(keys: findmy.accessory.RollingKeyPairSource, hours: int = 7 * 24) findmy.util.types.MaybeCoro[list[findmy.reports.reports.LocationReport]]
- abstractmethod fetch_last_reports(keys: collections.abc.Sequence[findmy.keys.HasHashedPublicKey | findmy.accessory.RollingKeyPairSource], hours: int = 7 * 24) findmy.util.types.MaybeCoro[dict[findmy.keys.HasHashedPublicKey | findmy.accessory.RollingKeyPairSource, list[findmy.reports.reports.LocationReport]]]
Fetch location reports for
HasHashedPublicKey`s for the last `hours
hours.Utility method as an alternative to using
BaseAppleAccount.fetch_reports()
directly.
- abstractmethod get_anisette_headers(with_client_info: bool = False, serial: str = '0') findmy.util.types.MaybeCoro[dict[str, str]] #
Retrieve a complete dictionary of Anisette headers.
Utility method for
AnisetteProvider.get_headers()
using this account’s user/device ID.
- class findmy.reports.account.AsyncAppleAccount(anisette: findmy.reports.anisette.BaseAnisetteProvider, *, state_info: AccountStateMapping | None = None)#
Bases:
BaseAppleAccount
An async implementation of
BaseAppleAccount()
.- property login_state: findmy.reports.state.LoginState#
- property account_name: str | None#
- property first_name: str | None#
- property last_name: str | None#
- to_json(path: str | pathlib.Path | None = None, /) AccountStateMapping #
Export the current state of the object as a JSON-serializable dictionary.
If an argument is provided, the output will also be written to that file.
The output of this method is guaranteed to be JSON-serializable, and passing the return value of this function as an argument to
Serializable.from_json()
will always result in an exact copy of the internal state as it was when exported.You are encouraged to save and load object states to and from disk whenever possible, to prevent unnecessary API calls or otherwise unexpected behavior.
- classmethod from_json(val: str | pathlib.Path | AccountStateMapping, /, *, anisette_libs_path: str | pathlib.Path | None = None) AsyncAppleAccount #
Restore state from a previous
Closable.to_json()
export.If given a str or Path, it must point to a json file from
Serializable.to_json()
. Otherwise, it should be the Mapping itself.See
Serializable.to_json()
for more information.
- async close() None #
Close any sessions or other resources in use by this object.
Should be called when the object will no longer be used.
- async login(username: str, password: str) findmy.reports.state.LoginState #
- async get_2fa_methods() collections.abc.Sequence[findmy.reports.twofactor.AsyncSecondFactorMethod] #
- async sms_2fa_request(phone_number_id: int) None #
- async sms_2fa_submit(phone_number_id: int, code: str) findmy.reports.state.LoginState #
- async td_2fa_request() None #
- async td_2fa_submit(code: str) findmy.reports.state.LoginState #
- async fetch_raw_reports(start: datetime.datetime, end: datetime.datetime, devices: list[list[str]]) dict[str, Any] #
Make a request for location reports, returning raw data.
- async fetch_reports(keys: findmy.keys.HasHashedPublicKey, date_from: datetime.datetime, date_to: datetime.datetime | None) list[findmy.reports.reports.LocationReport] #
- async fetch_reports(keys: findmy.accessory.RollingKeyPairSource, date_from: datetime.datetime, date_to: datetime.datetime | None) list[findmy.reports.reports.LocationReport]
- async fetch_reports(keys: collections.abc.Sequence[findmy.keys.HasHashedPublicKey | findmy.accessory.RollingKeyPairSource], date_from: datetime.datetime, date_to: datetime.datetime | None) dict[findmy.keys.HasHashedPublicKey | findmy.accessory.RollingKeyPairSource, list[findmy.reports.reports.LocationReport]]
- async fetch_last_reports(keys: findmy.keys.HasHashedPublicKey, hours: int = 7 * 24) list[findmy.reports.reports.LocationReport] #
- async fetch_last_reports(keys: findmy.accessory.RollingKeyPairSource, hours: int = 7 * 24) list[findmy.reports.reports.LocationReport]
- async fetch_last_reports(keys: collections.abc.Sequence[findmy.keys.HasHashedPublicKey | findmy.accessory.RollingKeyPairSource], hours: int = 7 * 24) dict[findmy.keys.HasHashedPublicKey | findmy.accessory.RollingKeyPairSource, list[findmy.reports.reports.LocationReport]]
- async get_anisette_headers(with_client_info: bool = False, serial: str = '0') dict[str, str] #
- class findmy.reports.account.AppleAccount(anisette: findmy.reports.anisette.BaseAnisetteProvider, *, state_info: AccountStateMapping | None = None)#
Bases:
BaseAppleAccount
A sync implementation of
BaseappleAccount()
.Uses
AsyncappleAccount()
internally.- async close() None #
- property login_state: findmy.reports.state.LoginState#
- property account_name: str | None#
- property first_name: str | None#
- property last_name: str | None#
- to_json(dst: str | pathlib.Path | None = None, /) AccountStateMapping #
Export the current state of the object as a JSON-serializable dictionary.
If an argument is provided, the output will also be written to that file.
The output of this method is guaranteed to be JSON-serializable, and passing the return value of this function as an argument to
Serializable.from_json()
will always result in an exact copy of the internal state as it was when exported.You are encouraged to save and load object states to and from disk whenever possible, to prevent unnecessary API calls or otherwise unexpected behavior.
- classmethod from_json(val: str | pathlib.Path | AccountStateMapping, /, *, anisette_libs_path: str | pathlib.Path | None = None) AppleAccount #
Restore state from a previous
Closable.to_json()
export.If given a str or Path, it must point to a json file from
Serializable.to_json()
. Otherwise, it should be the Mapping itself.See
Serializable.to_json()
for more information.
- login(username: str, password: str) findmy.reports.state.LoginState #
- get_2fa_methods() collections.abc.Sequence[findmy.reports.twofactor.SyncSecondFactorMethod] #
- sms_2fa_request(phone_number_id: int) None #
- sms_2fa_submit(phone_number_id: int, code: str) findmy.reports.state.LoginState #
- td_2fa_request() None #
- td_2fa_submit(code: str) findmy.reports.state.LoginState #
- fetch_reports(keys: findmy.keys.HasHashedPublicKey, date_from: datetime.datetime, date_to: datetime.datetime | None) list[findmy.reports.reports.LocationReport] #
- fetch_reports(keys: findmy.accessory.RollingKeyPairSource, date_from: datetime.datetime, date_to: datetime.datetime | None) list[findmy.reports.reports.LocationReport]
- fetch_reports(keys: collections.abc.Sequence[findmy.keys.HasHashedPublicKey | findmy.accessory.RollingKeyPairSource], date_from: datetime.datetime, date_to: datetime.datetime | None) dict[findmy.keys.HasHashedPublicKey | findmy.accessory.RollingKeyPairSource, list[findmy.reports.reports.LocationReport]]
- fetch_last_reports(keys: findmy.keys.HasHashedPublicKey, hours: int = 7 * 24) list[findmy.reports.reports.LocationReport] #
- fetch_last_reports(keys: findmy.accessory.RollingKeyPairSource, hours: int = 7 * 24) list[findmy.reports.reports.LocationReport]
- fetch_last_reports(keys: collections.abc.Sequence[findmy.keys.HasHashedPublicKey | findmy.accessory.RollingKeyPairSource], hours: int = 7 * 24) dict[findmy.keys.HasHashedPublicKey | findmy.accessory.RollingKeyPairSource, list[findmy.reports.reports.LocationReport]]
- get_anisette_headers(with_client_info: bool = False, serial: str = '0') dict[str, str] #