Skip to content

Instantly share code, notes, and snippets.

@tkan
Last active August 29, 2018 08:25
Show Gist options
  • Save tkan/9ed02fc0338b8d2562ae5af752384f7c to your computer and use it in GitHub Desktop.
Save tkan/9ed02fc0338b8d2562ae5af752384f7c to your computer and use it in GitHub Desktop.
Get all files of humble book bundles via python
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import urllib, json, time
'''
Download your order from Humble Bundle.
* Usage:
python get_humble_order.py [your_order_key] [desired formats seperated by a space]
* Example:
python get_humble_order.py k____________XvN epub pdf
* Limitations:
- be aware of the directory you're using; usually the files will be downloaded to where you call the script from
- all existing files with the same name will be overwritten
'''
args = []
args.append(sys.argv)
if len(args[0]) < 3:
print "Too few arguments."
sys.exit()
# reporthook taken from https://blog.shichao.io/2012/10/04/progress_speed_indicator_for_urlretrieve_in_python.html
def reporthook(count, block_size, total_size):
global start_time
if count == 0:
start_time = time.time()
return
duration = time.time() - start_time
progress_size = int(count * block_size)
speed = int(progress_size / (1024 * duration))
percent = min(int(count * block_size * 100 / total_size), 100)
sys.stdout.write("\r...%d%%, %d MB, %d KB/s, %d seconds passed" %
(percent, progress_size / (1024 * 1024), speed, duration))
sys.stdout.flush()
url = "https://hr-humblebundle.appspot.com/api/v1/order/{0}".format(args[0][1])
print url
response = urllib.urlopen(url)
data = json.loads(response.read())
products_count = len(data["subproducts"])
i = 0
while i < products_count:
try:
human_name = data["subproducts"][i]["human_name"]
download_options = len(data["subproducts"][i]["downloads"][0]["download_struct"])
except:
print "\n Non-file item. Skipping. \n"
#j += 1
i += 1
continue
j = 0
while j < download_options:
dl_type = (data["subproducts"][i]["downloads"][0]["download_struct"][j]["name"]).lower()
try:
arg_iter = 2
while arg_iter < len(args[0]):
if ((args[0][arg_iter]).lower() in dl_type):
dl_url = data["subproducts"][i]["downloads"][0]["download_struct"][j]["url"]["web"]
dl_file = urllib.URLopener()
print "\n" + human_name + " ({0})".format(dl_type.upper())
dl_file.retrieve(dl_url, "{0}.{1}".format(human_name,dl_type), reporthook)
arg_iter += 1
except Exception as e:
print e
break
j += 1
i += 1
print "\n"
@bauinformatiker
Copy link

I called the script with:
python2 get_humble_order.py <my-16-digits-order-key> PDF

Unfortunally I get this error message:

Traceback (most recent call last): File "get_humble_order.py", line 47, in <module> response = urllib.urlopen(url) File "c:\Python27\lib\urllib.py", line 87, in urlopen return opener.open(url) File "c:\Python27\lib\urllib.py", line 213, in open return getattr(self, name)(url) File "c:\Python27\lib\urllib.py", line 457, in open_https return self.http_error(url, fp, errcode, errmsg, headers) File "c:\Python27\lib\urllib.py", line 377, in http_error result = method(url, fp, errcode, errmsg, headers) File "c:\Python27\lib\urllib.py", line 691, in http_error_401 errcode, errmsg, headers) File "c:\Python27\lib\urllib.py", line 386, in http_error_default raise IOError, ('http error', errcode, errmsg, headers) IOError: ('http error', 401, 'Unauthorized', <httplib.HTTPMessage instance at 0x0000000002BFDA48>)
Do I have to Change the URL?
https://hr-humblebundle.appspot.com/api/v1/order/

@jmonsted
Copy link

jmonsted commented Jan 3, 2018

I'm pretty sure that's because the API requires you to log in before downloading anything.

@tkan
Copy link
Author

tkan commented Jan 10, 2018

@bauinformatiker
The URL looks fine to me; downloaded some books via this URL a few minutes ago. Can you access https://hr-humblebundle.appspot.com/api/v1/order/<my-16-digits-order-key> with your browser? (Some JSON should pop up...)

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