Home > database >  Download iCloud file from shared link using bash
Download iCloud file from shared link using bash

Time:04-29

I want to download a file from iCloud. I can share a link to a file. However the file is not directly linked in the urls, but the "real" download url can be retrieved:

#!/bin/bash
# given "https://www.icloud.com/iclouddrive/<ID>#<Filename>
ID="...."
URL=$(curl 'https://ckdatabasews.icloud.com/database/1/com.apple.cloudkit/production/public/records/resolve' \
  --data-raw '{"shortGUIDs":[{"value":"$ID"}]}' --compressed \
  jq -r '.results[0].rootRecord.fields.fileContent.value.downloadURL')
curl "$URL" -o myfile.ext

Sorce: https://gist.github.com/jpillora/702ded79330043e38e8202b5c73835e5

        "fileContent" : {
          "value" : {
...
            "downloadURL" : "https://cvws.icloud-content.com/B/CYo..."
          },

This is, however not working:

rl: (6) Could not resolve host: jq
curl: (3) nested brace in URL position 17:
{
  "results" : [ {
    "shortGUID" : {
      "value" : "$ID",
      "shouldFetchRootRecord" : true
    },
    "reason" : "shortGUID cannot be null or empty",
    "serverErrorCode" : "BAD_REQUEST"
  } ]
}

Any ideas, what I can do to make this work?

CodePudding user response:

as @dan mentioned, jq is not a curl argument, its a separate command. hence you would need to | pipe it instead of \.

So the command would look something like this:

URL=$(curl 'https://ckdatabasews.icloud.com/database/1/com.apple.cloudkit/production/public/records/resolve' \ --data-raw '{"shortGUIDs":[{"value":"$ID"}]}' --compressed | jq -r '.results[0].rootRecord.fields.fileContent.value.downloadURL')

CodePudding user response:

I solved it by installing jq and adding the ID directly instead of using $id. Just installing jq was not sufficient.

brew install jq


#!/bin/bash
# given "https://www.icloud.com/iclouddrive/<ID>#<Filename>

URL=$(curl 'https://ckdatabasews.icloud.com/database/1/com.apple.cloudkit/production/public/records/resolve' \
  --data-raw '{"shortGUIDs":[{"value":"ID"}]}' --compressed | jq -r '.results[0].rootRecord.fields.fileContent.value.downloadURL')
Echo $url
curl "$URL" -o myfile.ext
  • Related