findmy.reports.account

Module containing most of the code necessary to interact with an Apple account.

Classes

BaseAppleAccount

Base class for an Apple account.

AsyncAppleAccount

An async implementation of BaseAppleAccount.

AppleAccount

A sync implementation of BaseappleAccount.

Functions

require_login_state(→ Callable[[_F], _F])

Enforce a login state as precondition for a method.

Module Contents

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.closable.Closable, 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.

abstract export() dict

Export a representation of the current state of the account as a dictionary.

The output of this method is guaranteed to be JSON-serializable, and passing the return value of this function as an argument to BaseAppleAccount.restore will always result in an exact copy of the internal state as it was when exported.

This method is especially useful to avoid having to keep going through the login flow.

abstract restore(data: dict) None

Restore a previous export of the internal state of the account.

See BaseAppleAccount.export for more information.

abstract login(username: str, password: str) findmy.util.types.MaybeCoro[findmy.reports.state.LoginState]

Log in to an Apple account using a username and password.

abstract get_2fa_methods() findmy.util.types.MaybeCoro[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.

abstract 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.

abstract 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.

abstract td_2fa_request() findmy.util.types.MaybeCoro[None]

Request a 2FA code to be sent to a trusted device.

Consider using BaseSecondFactorMethod.request instead.

abstract 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.

abstract fetch_reports(keys: findmy.keys.HasHashedPublicKey, date_from: datetime.datetime, date_to: datetime.datetime | None) findmy.util.types.MaybeCoro[list[findmy.reports.reports.LocationReport]]
abstract fetch_reports(keys: Sequence[findmy.keys.HasHashedPublicKey], date_from: datetime.datetime, date_to: datetime.datetime | None) findmy.util.types.MaybeCoro[dict[findmy.keys.HasHashedPublicKey, list[findmy.reports.reports.LocationReport]]]
abstract fetch_reports(keys: findmy.accessory.RollingKeyPairSource, date_from: datetime.datetime, date_to: datetime.datetime | None) findmy.util.types.MaybeCoro[list[findmy.reports.reports.LocationReport]]

Fetch location reports for HasHashedPublicKey`s between `date_from and date_end.

Returns a dictionary mapping `HasHashedPublicKey`s to a list of their location reports.

abstract fetch_last_reports(keys: findmy.keys.HasHashedPublicKey, hours: int = 7 * 24) findmy.util.types.MaybeCoro[list[findmy.reports.reports.LocationReport]]
abstract fetch_last_reports(keys: Sequence[findmy.keys.HasHashedPublicKey], hours: int = 7 * 24) findmy.util.types.MaybeCoro[dict[findmy.keys.HasHashedPublicKey, list[findmy.reports.reports.LocationReport]]]
abstract fetch_last_reports(keys: findmy.accessory.RollingKeyPairSource, hours: int = 7 * 24) findmy.util.types.MaybeCoro[list[findmy.reports.reports.LocationReport]]

Fetch location reports for a sequence of HasHashedPublicKey`s for the last `hours hours.

Utility method as an alternative to using BaseAppleAccount.fetch_reports directly.

abstract 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 and device ID.

class findmy.reports.account.AsyncAppleAccount(anisette: findmy.reports.anisette.BaseAnisetteProvider, user_id: str | None = None, device_id: str | None = None)

Bases: BaseAppleAccount

An async implementation of BaseAppleAccount.

property login_state: findmy.reports.state.LoginState

See BaseAppleAccount.login_state.

property account_name: str | None

See BaseAppleAccount.account_name.

property first_name: str | None

See BaseAppleAccount.first_name.

property last_name: str | None

See BaseAppleAccount.last_name.

export() dict

See BaseAppleAccount.export.

restore(data: dict) None

See BaseAppleAccount.restore.

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

See BaseAppleAccount.login.

async get_2fa_methods() Sequence[findmy.reports.twofactor.AsyncSecondFactorMethod]

See BaseAppleAccount.get_2fa_methods.

async sms_2fa_request(phone_number_id: int) None

See BaseAppleAccount.sms_2fa_request.

async sms_2fa_submit(phone_number_id: int, code: str) findmy.reports.state.LoginState

See BaseAppleAccount.sms_2fa_submit.

async td_2fa_request() None

See BaseAppleAccount.td_2fa_request.

async td_2fa_submit(code: str) findmy.reports.state.LoginState

See BaseAppleAccount.td_2fa_submit.

async fetch_raw_reports(start: int, end: int, ids: 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: Sequence[findmy.keys.HasHashedPublicKey], date_from: datetime.datetime, date_to: datetime.datetime | None) dict[findmy.keys.HasHashedPublicKey, 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]

See BaseAppleAccount.fetch_reports.

async fetch_last_reports(keys: findmy.keys.HasHashedPublicKey, hours: int = 7 * 24) list[findmy.reports.reports.LocationReport]
async fetch_last_reports(keys: Sequence[findmy.keys.HasHashedPublicKey], hours: int = 7 * 24) dict[findmy.keys.HasHashedPublicKey, list[findmy.reports.reports.LocationReport]]
async fetch_last_reports(keys: findmy.accessory.RollingKeyPairSource, hours: int = 7 * 24) list[findmy.reports.reports.LocationReport]

See BaseAppleAccount.fetch_last_reports.

async get_anisette_headers(with_client_info: bool = False, serial: str = '0') dict[str, str]

See BaseAppleAccount.get_anisette_headers.

class findmy.reports.account.AppleAccount(anisette: findmy.reports.anisette.BaseAnisetteProvider, user_id: str | None = None, device_id: str | None = None)

Bases: BaseAppleAccount

A sync implementation of BaseappleAccount.

Uses AsyncappleAccount internally.

async close() None

See AsyncAppleAccount.close.

property login_state: findmy.reports.state.LoginState

See AsyncAppleAccount.login_state.

property account_name: str | None

See AsyncAppleAccount.login_state.

property first_name: str | None

See AsyncAppleAccount.first_name.

property last_name: str | None

See AsyncAppleAccount.last_name.

export() dict

See AsyncAppleAccount.export.

restore(data: dict) None

See AsyncAppleAccount.restore.

login(username: str, password: str) findmy.reports.state.LoginState

See AsyncAppleAccount.login.

get_2fa_methods() Sequence[findmy.reports.twofactor.SyncSecondFactorMethod]

See AsyncAppleAccount.get_2fa_methods.

sms_2fa_request(phone_number_id: int) None

See AsyncAppleAccount.sms_2fa_request.

sms_2fa_submit(phone_number_id: int, code: str) findmy.reports.state.LoginState

See AsyncAppleAccount.sms_2fa_submit.

td_2fa_request() None

See AsyncAppleAccount.td_2fa_request.

td_2fa_submit(code: str) findmy.reports.state.LoginState

See AsyncAppleAccount.td_2fa_submit.

fetch_reports(keys: findmy.keys.HasHashedPublicKey, date_from: datetime.datetime, date_to: datetime.datetime | None) list[findmy.reports.reports.LocationReport]
fetch_reports(keys: Sequence[findmy.keys.HasHashedPublicKey], date_from: datetime.datetime, date_to: datetime.datetime | None) dict[findmy.keys.HasHashedPublicKey, 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]

See AsyncAppleAccount.fetch_reports.

fetch_last_reports(keys: findmy.keys.HasHashedPublicKey, hours: int = 7 * 24) list[findmy.reports.reports.LocationReport]
fetch_last_reports(keys: Sequence[findmy.keys.HasHashedPublicKey], hours: int = 7 * 24) dict[findmy.keys.HasHashedPublicKey, list[findmy.reports.reports.LocationReport]]
fetch_last_reports(keys: findmy.accessory.RollingKeyPairSource, hours: int = 7 * 24) list[findmy.reports.reports.LocationReport]

See AsyncAppleAccount.fetch_last_reports.

get_anisette_headers(with_client_info: bool = False, serial: str = '0') dict[str, str]

See AsyncAppleAccount.get_anisette_headers.