Skip to content

Instantly share code, notes, and snippets.

@zyxar
Created February 19, 2013 11:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save zyxar/4984939 to your computer and use it in GitHub Desktop.
Save zyxar/4984939 to your computer and use it in GitHub Desktop.
Download Helper for Kuaipan
#!/usr/bin/env python
import urllib2
from os.path import exists, getsize
from urllib import unquote
import sys
def status(percent):
bar_size = 40
percent = int(percent*100)
if percent > 100:
percent = 100
dots = bar_size * percent / 100
plus = ''
if dots < 38:
plus = '>'
bar = '=' * dots+plus
bar = '{0:>3}%[{1:<40}]'.format(percent, bar)
sys.stdout.write('\r'+bar)
sys.stdout.flush()
class Klient():
"""Klient: Download Helper for Kuaipan"""
def __init__(self, url=None):
if url is not None:
self.url = url
self.conn = None
self.cont = None
self.payload = None
def seturl(self, url):
self.url = url
def connect(self):
if self.url is not None:
try:
self.conn = urllib2.urlopen(self.url, timeout = 5)
except:
self.conn = None
return self.conn
def meta(self):
if self.conn is not None:
self.info = self.conn.info()
return self.info
def parse(self):
if self.cont is None:
if self.conn is None:
r = self.connect()
if r is None:
return None
self.cont = self.conn.read()
idx = self.cont.find('var url = encodeURIComponent')+30
self.payload = self.cont[idx:]
idx = self.payload.find(');')-1
self.payload = self.payload[:idx]
return self.payload
def download(self):
if self.payload is not None:
uu = urllib2.urlopen(self.payload, timeout=5)
meta = uu.info()
filename = unquote(meta.getheader('content-disposition')[28:])
filename = filename.decode('utf-8')
dld = 0
size = int(meta.getheader('content-length'))
if exists(filename) and getsize(filename) == size:
print "File %s already exists." % filename
else:
print "Downloading: %s. Bytes: %d" % (filename, size)
ff = open(filename, 'wb')
while True:
buffer = uu.read(8192)
if not buffer:
break
dld += len(buffer)
ff.write(buffer)
status(dld*1./size)
ff.close()
if __name__ == '__main__':
client = Klient()
client.seturl('http://www.kuaipan.cn/file/id_18920726803259181.htm')
url = client.parse()
client.download()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment