Skip to content

Instantly share code, notes, and snippets.

@dkuryakin
Created June 11, 2018 12:00
Show Gist options
  • Save dkuryakin/71e53756c7c204013c85776da4eaa5f3 to your computer and use it in GitHub Desktop.
Save dkuryakin/71e53756c7c204013c85776da4eaa5f3 to your computer and use it in GitHub Desktop.
Download from cloudmail
#!/usr/bin/env python3
import json
import os
import shutil
import subprocess
import sys
import urllib.parse
import urllib.request
CLOUD_URL = 'https://cloud.mail.ru/public'
LIST_DIR = 'https://cloud.mail.ru/api/v2/folder?weblink={}&offset={}&' \
'limit={}&api=2'
BAD_FILE = b'<!DOCTYPE html>'
def safe(url):
return urllib.parse.quote(url, safe="~@#$()*!=:;,.?/\\'")
def get_token():
with urllib.request.urlopen(
'https://cloud.mail.ru/api/v2/tokens/download'
) as f:
return f.read().decode().split('"')[5]
def download(url, target, token=get_token(), offset=0, limit=500):
if not os.path.exists(target):
os.makedirs(target)
surl = safe(url)
furl = CLOUD_URL + '/' + surl
base_url = None
with urllib.request.urlopen(furl) as f:
for l in f:
x = l.decode().split('"weblink_get":[{"count":1,"url":"')
if len(x) > 1:
base_url = x[1].split('"')[0]
break
if not base_url:
return
subprocess.check_call(['find', target, '-size', '0', '-delete'])
print('Downloading ' + base_url + ' shared dir to ' + target + '.')
oks = 0
while True:
ldurl = LIST_DIR.format(surl, offset, limit)
print(' * List dir: ' + ldurl)
with urllib.request.urlopen(ldurl) as f:
obj = json.loads(f.read().decode())['body']
count = obj['count']['folders'] + obj['count']['files']
items = obj['list']
if offset > count:
break
for item in items:
if not item['weblink'].endswith('/' + item['name']):
item['weblink'] += '/' + item['name']
filename = item['weblink']
sfilename = safe(filename)
if not filename.startswith(url):
continue
fileurl = base_url + '/' + sfilename + '?key=' + token
basename = os.path.basename(filename)
fname = os.path.join(target, basename)
if item['type'] == 'folder':
oks += download(
filename, fname, token=token, offset=0, limit=limit)
elif item['type'] == 'file':
if os.path.exists(fname) and os.path.isdir(fname):
shutil.rmtree(fname)
print(' ' + filename + ' - WAS DIR, NOT FILE. REMOVED.')
if os.path.exists(fname):
with open(fname, 'rb') as f:
if f.read(len(BAD_FILE)) == BAD_FILE:
urllib.request.urlretrieve(fileurl, fname)
print(' ' + filename + ' - OK (FIXED)')
oks += 1
else:
print(' ' + filename + ' - SKIP')
else:
urllib.request.urlretrieve(fileurl, fname)
print(' ' + filename + ' - OK')
oks += 1
offset += limit
return oks
if __name__ == '__main__':
share = sys.argv[1].strip('/')
target = os.path.join(sys.argv[2], share)
while download(share, target):
pass
@dkuryakin
Copy link
Author

dkuryakin commented Jun 11, 2018

Install:

$ sudo wget -O /usr/local/bin/cloudmail https://gist.githubusercontent.com/dkuryakin/71e53756c7c204013c85776da4eaa5f3/raw/5a9c7cc88e60a05790b0d97193b8260f7245abf6/cloudmail.py && sudo chmod +x /usr/local/bin/cloudmail

Use:

$ cloudmail /path/to_share target/dir

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment