2020-03-21 14:49:32 +01:00
# Code samples
## From [@Quentame](https://github.com/Quentame)
pyicloud version: 0.9.6
### Configuration: 2SA + store cookie
https://github.com/home-assistant/core/blob/dev/homeassistant/components/icloud/config_flow.py
### Utilization: fetches
https://github.com/home-assistant/core/blob/dev/homeassistant/components/icloud/account.py
## From [@toothrobber](https://github.com/toothrobber)
pyicloud version: 0.9.1
```python
import os
import click
import datetime
from pyicloud import PyiCloudService
2020-08-13 13:46:55 +02:00
print("Setup Time Zone")
time.strftime("%X %x %Z")
os.environ["TZ"] = "America/New_York"
2020-03-21 14:49:32 +01:00
2020-08-13 13:46:55 +02:00
print("Py iCloud Services")
api = PyiCloudService("your@me.com", "password")
2020-03-21 14:49:32 +01:00
if api.requires_2fa:
2020-08-13 13:46:55 +02:00
print("Two-factor authentication required. Your trusted devices are:")
2020-03-21 14:49:32 +01:00
devices = api.trusted_devices
for i, device in enumerate(devices):
2020-08-13 13:46:55 +02:00
print(
" %s: %s"
% (i, device.get("deviceName", "SMS to %s" % device.get("phoneNumber")))
)
2020-03-21 14:49:32 +01:00
2020-08-13 13:46:55 +02:00
device = click.prompt("Which device would you like to use?", default=0)
2020-03-21 14:49:32 +01:00
device = devices[device]
if not api.send_verification_code(device):
2020-08-13 13:46:55 +02:00
print("Failed to send verification code")
2020-03-21 14:49:32 +01:00
sys.exit(1)
2020-08-13 13:46:55 +02:00
code = click.prompt("Please enter validation code")
2020-03-21 14:49:32 +01:00
if not api.validate_verification_code(device, code):
2020-08-13 13:46:55 +02:00
print("Failed to verify verification code")
2020-03-21 14:49:32 +01:00
sys.exit(1)
2020-08-13 13:46:55 +02:00
2020-03-21 14:49:32 +01:00
#
# Devices
#
2020-08-13 13:46:55 +02:00
print("Devices")
2020-03-21 14:49:32 +01:00
print(api.devices)
print(api.devices[0])
print(api.iphone)
#
# Location
#
2020-08-13 13:46:55 +02:00
print("Location")
2020-03-21 14:49:32 +01:00
print(api.iphone.location())
#
# Status
#
2020-08-13 13:46:55 +02:00
print("Status")
2020-03-21 14:49:32 +01:00
print(api.iphone.status())
#
# Play Sound
#
# api.iphone.play_sound()
#
# Events
#
2020-08-13 13:46:55 +02:00
print("Events")
2020-03-21 14:49:32 +01:00
print(api.calendar.events())
from_dt = datetime.date(2018, 1, 1)
to_dt = datetime.date(2018, 1, 31)
print(api.calendar.events(from_dt, to_dt))
# ========
# Contacts
# ========
2020-08-13 13:46:55 +02:00
print("Contacts")
2020-03-21 14:49:32 +01:00
for c in api.contacts.all():
2020-08-13 13:46:55 +02:00
print(c.get("firstName"), c.get("phones"))
2020-03-21 14:49:32 +01:00
# =======================
# File Storage (Ubiquity)
# =======================
2020-08-13 13:46:55 +02:00
# You can access documents stored in your iCloud account by using the
2020-03-21 14:49:32 +01:00
# ``files`` property's ``dir`` method:
2020-08-13 13:46:55 +02:00
print("File Storage")
2020-03-21 14:49:32 +01:00
print(api.files.dir())
```
2020-08-13 13:46:55 +02:00
## From [@ixs](https://github.com/ixs)
### Debug build of pyicloud
This example allows to use tools like mitmproxy, fiddler, charles or similiar
things to debug the data sent on the wire.
In addition, the underlying requests module and the http.client are asked, to
output all data sent and received to stdout.
This uses code taken from [How do I disable the security certificate check in Python requests ](https://stackoverflow.com/questions/15445981/how-do-i-disable-the-security-certificate-check-in-python-requests )
and [Log all requests from the python-requests module ](https://stackoverflow.com/questions/16337511/log-all-requests-from-the-python-requests-module )
```python
#!/usr/bin/env python3
import contextlib
import http.client
import logging
import requests
import warnings
from pprint import pprint
from pyicloud import PyiCloudService
from urllib3.exceptions import InsecureRequestWarning
# Handle certificate warnings by ignoring them
old_merge_environment_settings = requests.Session.merge_environment_settings
@contextlib .contextmanager
def no_ssl_verification():
opened_adapters = set()
def merge_environment_settings(self, url, proxies, stream, verify, cert):
# Verification happens only once per connection so we need to close
# all the opened adapters once we're done. Otherwise, the effects of
# verify=False persist beyond the end of this context manager.
opened_adapters.add(self.get_adapter(url))
settings = old_merge_environment_settings(
self, url, proxies, stream, verify, cert
)
settings["verify"] = False
return settings
requests.Session.merge_environment_settings = merge_environment_settings
try:
with warnings.catch_warnings():
warnings.simplefilter("ignore", InsecureRequestWarning)
yield
finally:
requests.Session.merge_environment_settings = old_merge_environment_settings
for adapter in opened_adapters:
try:
adapter.close()
except:
pass
# Monkeypatch the http client for full debugging output
httpclient_logger = logging.getLogger("http.client")
def httpclient_logging_patch(level=logging.DEBUG):
"""Enable HTTPConnection debug logging to the logging framework"""
def httpclient_log(*args):
httpclient_logger.log(level, " ".join(args))
# mask the print() built-in in the http.client module to use
# logging instead
http.client.print = httpclient_log
# enable debugging
http.client.HTTPConnection.debuglevel = 1
# Enable general debug logging
logging.basicConfig(level=logging.DEBUG)
httpclient_logging_patch()
api = PyiCloudService(username, password)
if api.requires_2sa:
print("Two-factor authentication required. Your trusted devices are:")
devices = api.trusted_devices
for i, device in enumerate(devices):
print(
" %s: %s"
% (i, device.get("deviceName", "SMS to %s") % device.get("phoneNumber"))
)
device = click.prompt("Which device would you like to use?", default=0)
device = devices[device]
if not api.send_verification_code(device):
print("Failed to send verification code")
sys.exit(1)
code = click.prompt("Please enter validation code")
if not api.validate_verification_code(device, code):
print("Failed to verify verification code")
sys.exit(1)
# This request will not fail, even if using intercepting proxies.
with no_ssl_verification():
pprint(api.account)
```