iCloudにスクリプトから画像をアップロードする

はじめに

AppleTVにはスクリーンセーバーにアルバムの写真を流す機能がある
今回は複数人でこのアルバムに写真を追加してAppleTVのスクリーンセーバーに流したくない?という話になったけどアルバムに追加するにはWeb経由(iCloud)からかApple端末のアルバムの共有機能を使って写真を追加するしかない
そこでスクリプトから写真をアップロードできるようにできたらSlackやらで専用チャンネルを用意しそこに写真をあげてもらうことで簡単に写真の追加が出来るんじゃないかな?と思ったのでトライしたメモ

余談ですがpngの画像のアップロードはまた事情が異なるみたいです
また、肝心のアルバムへの追加はできていません

iCloud

写真の追加、アルバムの編集等の操作はWebから行うことができる
https://www.icloud.com/

今回はこれを利用してみることにしたがAPIなどは非公開のようなので適当にちょろめのDeveloperToolを使って解析した内容を元にスクリプトを書いてみた

余談ですがこちらのライブラリ使うとiCloudの他の情報が欲しい場合は便利です
写真のダウンロードしか出来なかったので今回は使用しませんでした
https://github.com/picklepete/pyicloud

ログイン

必要なヘッダを用意してIDとパスワードをなげるとAPIの一覧が入ったjsonが返ってくる

 1import json
 2import requests
 3
 4s = requests.Session()
 5
 6data = s.post(
 7    "https://setup.icloud.com/setup/ws/1/login",
 8    headers={
 9        "Origin": "https://www.icloud.com"
10    },
11    data=json.dumps({
12        "apple_id": "めーるあどれす",
13        "password": "ぱすわーど"
14    })
15).json()

写真のアップロード

アップロード先のAPIはjsonの中に入っているのでまずURLを抽出します

1url = data["webservices"]["uploadimagews"]["url"]

必要な各種パラメータを用意します

1params = {
2	"lastModDate": 1397975488598,
3	"timezoneOffset": -540,
4	"filename": "test.jpg",
5	"dsid": data["dsInfo"]["dsid"]
6}

最後に用意したデータでAPIを叩きます

1p = s.post(url + "/upload",
2    params=params,
3    headers={
4        "Origin": "https://www.icloud.com"
5    },
6    data=open("test.jpg", "rb").read()
7)
8
9print(p.text)

アルバムに写真を追加する

ここでコケました
良い感じに解決出来た方がいたら教えてください