{ "info": { "author": "The PyiCloud Authors", "author_email": "", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3" ], "description": ".. image:: https://travis-ci.org/picklepete/pyicloud.svg?branch=master\n :alt: Check out our test status at https://travis-ci.org/picklepete/pyicloud\n :target: https://travis-ci.org/picklepete/pyicloud\n\n.. image:: https://badges.gitter.im/Join%20Chat.svg\n :alt: Join the chat at https://gitter.im/picklepete/pyicloud\n :target: https://gitter.im/picklepete/pyicloud?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge\n\n\nPyiCloud is a module which allows pythonistas to interact with iCloud webservices. It's powered by the fantastic `requests `_ HTTP library.\n\nAt its core, PyiCloud connects to iCloud using your username and password, then performs calendar and iPhone queries against their API.\n\n==============\nAuthentication\n==============\n\nAuthentication without using a saved password is as simple as passing your username and password to the ``PyiCloudService`` class:\n\n>>> from pyicloud import PyiCloudService\n>>> api = PyiCloudService('jappleseed@apple.com', 'password')\n\nIn the event that the username/password combination is invalid, a ``PyiCloudFailedLoginException`` exception is thrown.\n\nYou can also store your password in the system keyring using the command-line tool:\n\n>>> icloud --username=jappleseed@apple.com\nICloud Password for jappleseed@apple.com:\nSave password in keyring? (y/N)\n\nIf you have stored a password in the keyring, you will not be required to provide a password when interacting with the command-line tool or instantiating the ``PyiCloudService`` class for the username you stored the password for.\n\n>>> api = PyiCloudService('jappleseed@apple.com')\n\nIf you would like to delete a password stored in your system keyring, you can clear a stored password using the ``--delete-from-keyring`` command-line option:\n\n>>> icloud --username=jappleseed@apple.com --delete-from-keyring\n\n*******************************\nTwo-factor authentication (2FA)\n*******************************\n\nIf you have enabled two-factor authentication for the account you will have to do some extra work:\n\n.. code-block:: python\n\n\tif api.requires_2fa:\n\t print \"Two-factor authentication required. Your trusted devices are:\"\n\n\t devices = api.trusted_devices\n\t for i, device in enumerate(devices):\n\t print \" %s: %s\" % (i, device.get('deviceName',\n\t \"SMS to %s\" % device.get('phoneNumber')))\n\n\t device = click.prompt('Which device would you like to use?', default=0)\n\t device = devices[device]\n\t if not api.send_verification_code(device):\n\t print \"Failed to send verification code\"\n\t sys.exit(1)\n\n\t code = click.prompt('Please enter validation code')\n\t if not api.validate_verification_code(device, code):\n\t print \"Failed to verify verification code\"\n\t sys.exit(1)\n\nNote: Both regular login and two-factor authentication will expire after an interval set by Apple, at which point you will have to re-authenticate. This interval is currently two months.\n\n=======\nDevices\n=======\n\nYou can list which devices associated with your account by using the ``devices`` property:\n\n>>> api.devices\n{\nu'i9vbKRGIcLYqJnXMd1b257kUWnoyEBcEh6yM+IfmiMLh7BmOpALS+w==': ,\nu'reGYDh9XwqNWTGIhNBuEwP1ds0F/Lg5t/fxNbI4V939hhXawByErk+HYVNSUzmWV': \n}\n\nand you can access individual devices by either their index, or their ID:\n\n>>> api.devices[0]\n\n>>> api.devices['i9vbKRGIcLYqJnXMd1b257kUWnoyEBcEh6yM+IfmiMLh7BmOpALS+w==']\n\n\nor, as a shorthand if you have only one associated apple device, you can simply use the ``iphone`` property to access the first device associated with your account:\n\n>>> api.iphone\n\n\nNote: the first device associated with your account may not necessarily be your iPhone.\n\n==============\nFind My iPhone\n==============\n\nOnce you have successfully authenticated, you can start querying your data!\n\n********\nLocation\n********\n\nReturns the device's last known location. The Find My iPhone app must have been installed and initialized.\n\n>>> api.iphone.location()\n{u'timeStamp': 1357753796553, u'locationFinished': True, u'longitude': -0.14189, u'positionType': u'GPS', u'locationType': None, u'latitude': 51.501364, u'isOld': False, u'horizontalAccuracy': 5.0}\n\n******\nStatus\n******\n\nThe Find My iPhone response is quite bloated, so for simplicity's sake this method will return a subset of the properties.\n\n>>> api.iphone.status()\n{'deviceDisplayName': u'iPhone 5', 'deviceStatus': u'200', 'batteryLevel': 0.6166913, 'name': u\"Peter's iPhone\"}\n\nIf you wish to request further properties, you may do so by passing in a list of property names.\n\n**********\nPlay Sound\n**********\n\nSends a request to the device to play a sound, if you wish pass a custom message you can do so by changing the subject arg.\n\n>>> api.iphone.play_sound()\n\nA few moments later, the device will play a ringtone, display the default notification (\"Find My iPhone Alert\") and a confirmation email will be sent to you.\n\n*********\nLost Mode\n*********\n\nLost mode is slightly different to the \"Play Sound\" functionality in that it allows the person who picks up the phone to call a specific phone number *without having to enter the passcode*. Just like \"Play Sound\" you may pass a custom message which the device will display, if it's not overridden the custom message of \"This iPhone has been lost. Please call me.\" is used.\n\n>>> phone_number = '555-373-383'\n>>> message = 'Thief! Return my phone immediately.'\n>>> api.iphone.lost_device(phone_number, message)\n\n========\nCalendar\n========\n\nThe calendar webservice currently only supports fetching events.\n\n******\nEvents\n******\n\nReturns this month's events:\n\n>>> api.calendar.events()\n\nOr, between a specific date range:\n\n>>> from_dt = datetime(2012, 1, 1)\n>>> to_dt = datetime(2012, 1, 31)\n>>> api.calendar.events(from_dt, to_dt)\n\nAlternatively, you may fetch a single event's details, like so:\n\n>>> api.calendar.get_event_detail('CALENDAR', 'EVENT_ID')\n\n========\nContacts\n========\n\nYou can access your iCloud contacts/address book through the ``contacts`` property:\n\n>>> for c in api.contacts.all():\n>>> print c.get('firstName'), c.get('phones')\nJohn [{u'field': u'+1 555-55-5555-5', u'label': u'MOBILE'}]\n\nNote: These contacts do not include contacts federated from e.g. Facebook, only the ones stored in iCloud.\n\n=======================\nFile Storage (Ubiquity)\n=======================\n\nYou can access documents stored in your iCloud account by using the ``files`` property's ``dir`` method:\n\n>>> api.files.dir()\n[u'.do-not-delete',\n u'.localized',\n u'com~apple~Notes',\n u'com~apple~Preview',\n u'com~apple~mail',\n u'com~apple~shoebox',\n u'com~apple~system~spotlight'\n]\n\nYou can access children and their children's children using the filename as an index:\n\n>>> api.files['com~apple~Notes']\n\n>>> api.files['com~apple~Notes'].type\nu'folder'\n>>> api.files['com~apple~Notes'].dir()\n[u'Documents']\n>>> api.files['com~apple~Notes']['Documents'].dir()\n[u'Some Document']\n>>> api.files['com~apple~Notes']['Documents']['Some Document'].name\nu'Some Document'\n>>> api.files['com~apple~Notes']['Documents']['Some Document'].modified\ndatetime.datetime(2012, 9, 13, 2, 26, 17)\n>>> api.files['com~apple~Notes']['Documents']['Some Document'].size\n1308134\n>>> api.files['com~apple~Notes']['Documents']['Some Document'].type\nu'file'\n\nAnd when you have a file that you'd like to download, the ``open`` method will return a response object from which you can read the ``content``.\n\n>>> api.files['com~apple~Notes']['Documents']['Some Document'].open().content\n'Hello, these are the file contents'\n\nNote: the object returned from the above ``open`` method is a `response object `_ and the ``open`` method can accept any parameters you might normally use in a request using `requests `_.\n\nFor example, if you know that the file you're opening has JSON content:\n\n>>> api.files['com~apple~Notes']['Documents']['information.json'].open().json()\n{'How much we love you': 'lots'}\n>>> api.files['com~apple~Notes']['Documents']['information.json'].open().json()['How much we love you']\n'lots'\n\nOr, if you're downloading a particularly large file, you may want to use the ``stream`` keyword argument, and read directly from the raw response object:\n\n>>> download = api.files['com~apple~Notes']['Documents']['big_file.zip'].open(stream=True)\n>>> with open('downloaded_file.zip', 'wb') as opened_file:\n opened_file.write(download.raw.read())\n\n=======================\nPhoto Library\n=======================\n\nYou can access the iCloud Photo Library through the ``photos`` property.\n\n>>> api.photos.all\n\n\nIndividual albums are available through the ``albums`` property:\n\n>>> api.photos.albums['Selfies']\n\n\nWhich you can index or iterate to access the photo assets:\n\n>>> for photo in api.photos.albums['Selfies']:\n print photo, photo.filename\n IMG_6045.JPG\n\nMetadata about photos is fetched on demand as you access properties of the ``PhotoAsset`` object, and are also prefetched to improve performance.\n\nTo download a photo use the `download` method, which will return a `response object `_, initialized with ``stream`` set to ``True``, so you can read from the raw response object:\n\n>>> photo = api.photos.albums['Selfies'][0]\n>>> download = photo.download()\n>>> with open(photo.filename, 'wb') as opened_file:\n opened_file.write(download.raw.read())\n\nNote: Consider using ``shutil.copyfile`` or another buffered strategy for downloading the file so that the whole file isn't read into memory before writing.\n\nInformation about each version can be accessed through the ``versions`` property:\n\n>>> photo.versions.keys()\n[u'large', u'medium', u'original', u'thumb']\n\nTo download a specific version of the photo asset, pass the version to ``download()``:\n\n>>> download = photo.download('thumb')\n>>> with open(photo.versions['thumb'].filename, 'wb') as thumb_file:\n thumb_file.write(download.raw.read())\n", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/picklepete/pyicloud", "keywords": null, "license": "MIT", "maintainer": null, "maintainer_email": null, "name": "pyicloud", "package_url": "https://pypi.org/project/pyicloud/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/pyicloud/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/picklepete/pyicloud" }, "release_url": "https://pypi.org/project/pyicloud/0.9.1/", "requires_dist": null, "requires_python": null, "summary": "PyiCloud is a module which allows pythonistas to interact with iCloud webservices.", "version": "0.9.1" }, "last_serial": 2196378, "releases": { "0.2": [ { "comment_text": "", "digests": { "md5": "296031a2f875f9f9f01df3046ccb33d8", "sha256": "eda3ea04a72c512dee272cd1576bb16fdc91be4b584cf69af92d60c1ba5a0f37" }, "downloads": -1, "filename": "pyicloud-0.2.tar.gz", "has_sig": false, "md5_digest": "296031a2f875f9f9f01df3046ccb33d8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4834, "upload_time": "2013-05-24T15:01:46", "url": "https://files.pythonhosted.org/packages/96/0c/da415acfd4f653a7dbc5b23f15da766b4537a74552352f245525f0871b7e/pyicloud-0.2.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "c69562edcc114fb55f3024fa90b7eb86", "sha256": "46671ba2d29a6720b0448a0efd7f4d62e098678c52638cf7d08b4103813b7bfd" }, "downloads": -1, "filename": "pyicloud-0.3.0.tar.gz", "has_sig": false, "md5_digest": "c69562edcc114fb55f3024fa90b7eb86", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7353, "upload_time": "2013-10-28T10:48:03", "url": "https://files.pythonhosted.org/packages/c1/a8/3193b515497a5d212bce5a291c2394717194d7bc6ba90f2c4e234f96f2ec/pyicloud-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "e7b6134bbffd4a3c6bbab7831da9b2f8", "sha256": "7ab6083f9117746752b3e4e67aadefdc407937407a5c5b7689ffc58826783042" }, "downloads": -1, "filename": "pyicloud-0.4.0.tar.gz", "has_sig": false, "md5_digest": "e7b6134bbffd4a3c6bbab7831da9b2f8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9685, "upload_time": "2014-04-17T22:13:51", "url": "https://files.pythonhosted.org/packages/19/5c/3a8d83a64d082960e1c2cd74ae8cf7569d327198d401d1cd4f99f5ef78ca/pyicloud-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "1eec84193b31cae37c4a6c600b4db250", "sha256": "b63733f493f33f1e8cd55a166242742ea6e51a8798a477da1b4b45c83e63c5c0" }, "downloads": -1, "filename": "pyicloud-0.5.0.tar.gz", "has_sig": false, "md5_digest": "1eec84193b31cae37c4a6c600b4db250", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9998, "upload_time": "2014-08-24T23:58:44", "url": "https://files.pythonhosted.org/packages/53/98/05ef91295561d4ce458715e2c3330462ea0c4dfb18bcc42985f738342878/pyicloud-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "2eef88ad16e8263b85707723b0087272", "sha256": "68c53a95b1852f50b644c2529200daee8811b07de40bd1f4f27fa9b610af30fa" }, "downloads": -1, "filename": "pyicloud-0.5.1.tar.gz", "has_sig": false, "md5_digest": "2eef88ad16e8263b85707723b0087272", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10011, "upload_time": "2014-08-26T06:13:37", "url": "https://files.pythonhosted.org/packages/e9/00/3bd036f574bd06fa1fcc6d0336fc88f47d23224a4b129775df2879c1268b/pyicloud-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "ace1d7ff867ac6df49cd5ad9764a4311", "sha256": "cb549b44df2aee3b4951fa4011d26a3109173ccb7ea092b78d7d3f20dd2812cf" }, "downloads": -1, "filename": "pyicloud-0.5.2.tar.gz", "has_sig": false, "md5_digest": "ace1d7ff867ac6df49cd5ad9764a4311", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10012, "upload_time": "2014-08-27T06:53:06", "url": "https://files.pythonhosted.org/packages/26/dc/4952d52995e05b90735459914dcddd342eee516400340b3deb79b81e3d14/pyicloud-0.5.2.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "bb3e0cde9c4da5ebfb8201ffef54c082", "sha256": "912f8f7c8e293f27133776c66aa954034239248666434066b090071421c67664" }, "downloads": -1, "filename": "pyicloud-0.6.0.tar.gz", "has_sig": false, "md5_digest": "bb3e0cde9c4da5ebfb8201ffef54c082", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10539, "upload_time": "2014-10-26T03:37:39", "url": "https://files.pythonhosted.org/packages/db/6d/227583ac600ffd5582af65ac266d9dd575e573a65530b66177f103a5a324/pyicloud-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "f11664016e05f7765b42d1e897bb139a", "sha256": "33866f1476b65db9983491f48c0a5bee914e859b99295ed1270dff01d4e5b372" }, "downloads": -1, "filename": "pyicloud-0.6.1.tar.gz", "has_sig": false, "md5_digest": "f11664016e05f7765b42d1e897bb139a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10604, "upload_time": "2015-01-10T19:23:15", "url": "https://files.pythonhosted.org/packages/02/b1/527cfe7acbe28ef4b3bf485d3131b3098850f097704496709670999691f6/pyicloud-0.6.1.tar.gz" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "c6b6aff9865631cced3eeac72ccf364a", "sha256": "0231b2d5a3c4a36c55b1953499b6d4dd89206e34c2ee2f5ebf6829a247856fb7" }, "downloads": -1, "filename": "pyicloud-0.6.2.tar.gz", "has_sig": false, "md5_digest": "c6b6aff9865631cced3eeac72ccf364a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10680, "upload_time": "2015-03-26T04:18:27", "url": "https://files.pythonhosted.org/packages/aa/98/dacaad7389f9d15e4b3f12cb5b911ab9aee72be8cd8c620c527799c95eea/pyicloud-0.6.2.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "2a297ae159a02a9b6c66f3cc8c35759a", "sha256": "664810efab4f964a0494616ab73c92935c0767f3e9472945a648360480a0b645" }, "downloads": -1, "filename": "pyicloud-0.7.0.tar.gz", "has_sig": false, "md5_digest": "2a297ae159a02a9b6c66f3cc8c35759a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11306, "upload_time": "2015-05-18T06:17:13", "url": "https://files.pythonhosted.org/packages/b2/8e/80ee8bd3cf896451130b40b1c43f857132d64c8a2cd064afea4d7517e7a4/pyicloud-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "00d08138652abc562e952850c2c8f0f2", "sha256": "94a2f5dce7f33bd856477ebb1a9f91a47a9138d242ff79095becbacd438b2d39" }, "downloads": -1, "filename": "pyicloud-0.7.1.tar.gz", "has_sig": false, "md5_digest": "00d08138652abc562e952850c2c8f0f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11402, "upload_time": "2015-12-14T04:22:17", "url": "https://files.pythonhosted.org/packages/e4/28/3ff6b6235843356ac276065472167a5033d103aca8dde4b312649e84d0a3/pyicloud-0.7.1.tar.gz" } ], "0.7.2": [ { "comment_text": "", "digests": { "md5": "3f1fda97484ed5f51647efa506cbf3df", "sha256": "d01520dd34ad52351b8734b88661f951753a7b4c17084bebfd0a3a58c6abf1ef" }, "downloads": -1, "filename": "pyicloud-0.7.2.tar.gz", "has_sig": false, "md5_digest": "3f1fda97484ed5f51647efa506cbf3df", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11406, "upload_time": "2015-12-14T04:26:14", "url": "https://files.pythonhosted.org/packages/f1/4e/b961812feb2c46d28268f66b47ee1f7d67a4c1f5f9f5f2993316fdf10799/pyicloud-0.7.2.tar.gz" } ], "0.7.3": [ { "comment_text": "", "digests": { "md5": "d9d1df7cd644deb85678d756ee25544b", "sha256": "e1311dc9158cc6a57532b72590e1137a89e82ae6d41a7708ea49ca8f3b2a48de" }, "downloads": -1, "filename": "pyicloud-0.7.3.tar.gz", "has_sig": false, "md5_digest": "d9d1df7cd644deb85678d756ee25544b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11152, "upload_time": "2016-01-11T06:22:57", "url": "https://files.pythonhosted.org/packages/d1/07/a2ba470152183bf9a76684461d7cd6024148461e962fda49fdc64df12293/pyicloud-0.7.3.tar.gz" } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "8328640432ee426646048854ac7aecab", "sha256": "48fcf7e317cc0e850ad5edb7c54e68fc1ee3953990c9cc0579345336c3e8b4ad" }, "downloads": -1, "filename": "pyicloud-0.8.1.tar.gz", "has_sig": false, "md5_digest": "8328640432ee426646048854ac7aecab", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16564, "upload_time": "2016-03-15T14:20:09", "url": "https://files.pythonhosted.org/packages/34/d3/dd53d697101df2867d908e6f6a9570c030321e1e8f0ef6e331351bd68480/pyicloud-0.8.1.tar.gz" } ], "0.8.2": [ { "comment_text": "", "digests": { "md5": "0f443c659353c3536951c35e19341ddb", "sha256": "26e15689c9be12a053ed7f1e59fab7e4c019b2017e5d8c63ab548372971eb55b" }, "downloads": -1, "filename": "pyicloud-0.8.2.tar.gz", "has_sig": false, "md5_digest": "0f443c659353c3536951c35e19341ddb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16887, "upload_time": "2016-04-02T11:34:25", "url": "https://files.pythonhosted.org/packages/a3/30/02be16a78a328051144f5e5459ca6658ac75c46f435973900a7fab481626/pyicloud-0.8.2.tar.gz" } ], "0.8.3": [ { "comment_text": "", "digests": { "md5": "06e4bb8d24984a0ac29b0a5db4740498", "sha256": "63c22520ff239833d635704357750a8ee6c74488164201e188d09a927b33ab3d" }, "downloads": -1, "filename": "pyicloud-0.8.3.tar.gz", "has_sig": false, "md5_digest": "06e4bb8d24984a0ac29b0a5db4740498", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16921, "upload_time": "2016-04-11T14:44:44", "url": "https://files.pythonhosted.org/packages/06/4a/610e81ce5a566cecdc21017f2b4a54c93cd8cd6fd1ac04df249e0da7e5b2/pyicloud-0.8.3.tar.gz" } ], "0.9": [ { "comment_text": "", "digests": { "md5": "9c1aa91e76bbdc6fcf27924522b4243e", "sha256": "40bc0ea53a3b3d91ae7fa80ba3ecd56ec557e7c9022400815d5fc9def24a9f2b" }, "downloads": -1, "filename": "pyicloud-0.9.tar.gz", "has_sig": false, "md5_digest": "9c1aa91e76bbdc6fcf27924522b4243e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17463, "upload_time": "2016-06-21T03:42:13", "url": "https://files.pythonhosted.org/packages/23/4b/1b3a843415ef33d4c648c58786c6d2617e954868de1f2a148edde91eefa8/pyicloud-0.9.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "e64b2d7e56770fc527de8a59172ba358", "sha256": "580b52e95f67a41ed86c56a514aa2b362f53fbaf23f16c69fb24e0d19fd373ee" }, "downloads": -1, "filename": "pyicloud-0.9.1.tar.gz", "has_sig": false, "md5_digest": "e64b2d7e56770fc527de8a59172ba358", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17486, "upload_time": "2016-06-30T17:09:04", "url": "https://files.pythonhosted.org/packages/c0/a8/30e78cce525a3bc7045735dccefdc257fe583748330b44a4bcfde38af342/pyicloud-0.9.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e64b2d7e56770fc527de8a59172ba358", "sha256": "580b52e95f67a41ed86c56a514aa2b362f53fbaf23f16c69fb24e0d19fd373ee" }, "downloads": -1, "filename": "pyicloud-0.9.1.tar.gz", "has_sig": false, "md5_digest": "e64b2d7e56770fc527de8a59172ba358", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17486, "upload_time": "2016-06-30T17:09:04", "url": "https://files.pythonhosted.org/packages/c0/a8/30e78cce525a3bc7045735dccefdc257fe583748330b44a4bcfde38af342/pyicloud-0.9.1.tar.gz" } ] }