From ffd72424bf2d40aaca047601aaf5ef53ebaf769a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Sat, 29 Apr 2017 15:58:33 +0200 Subject: [PATCH] [kissmanga] another attempt at getting the AES key --- gallery_dl/extractor/kissmanga.py | 57 ++++++++++++++++++++++++++----- 1 file changed, 49 insertions(+), 8 deletions(-) diff --git a/gallery_dl/extractor/kissmanga.py b/gallery_dl/extractor/kissmanga.py index 96dc9061..3711bbb0 100644 --- a/gallery_dl/extractor/kissmanga.py +++ b/gallery_dl/extractor/kissmanga.py @@ -104,22 +104,65 @@ class KissmangaChapterExtractor(KissmangaExtractor): def get_image_urls(self, page): """Extract list of all image-urls for a manga chapter""" try: - key = self.build_aes_key() + key = self.build_aes_key(page) return [ aes.aes_cbc_decrypt_text(data, key, IV) for data in text.extract_iter( page, 'lstImages.push(wrapKA("', '"' ) ] - except (ValueError, IndexError): - self.log.error("Failed to get AES key") except UnicodeDecodeError: self.log.error("Failed to decrypt image URls") + except (ValueError, IndexError) as e: + self.log.error("Failed to get AES key") return [] + def build_aes_key(self, page): + chko = "" + for script in self._scripts(page): + for part in [p.strip() for p in script.split(";")]: + + if part.startswith("var _"): + name, _, value = part[4:].partition(" = ") + name += "[0]" + value = ast.literal_eval(value)[0] + + elif part.startswith("chko = "): + part = part[7:] + if part == name: + chko = value + elif part == "chko + " + name: + if not chko: + chko = self._chko_from_external_script() + chko = chko + value + elif part == name + " + chko": + if not chko: + chko = self._chko_from_external_script() + chko = value + chko + else: + self.log.warning("unrecognized expression: '%s'", part) + + elif part.startswith("key = "): + pass + + else: + self.log.warning("unrecognized statement: '%s'", part) + + return list(hashlib.sha256(chko.encode("ascii")).digest()) + + @staticmethod + def _scripts(page): + end = 0 + while True: + pos = page.find("key = ", end) + if pos == -1: + return + beg = page.rindex('', pos) + yield page[beg:end] + @cache(maxage=3600) - def build_aes_key(self): - """Get and parse the AES key""" + def _chko_from_external_script(self): script = self.request(self.root + "/Scripts/lo.js").text pos = script.index("var chko") @@ -128,6 +171,4 @@ class KissmangaChapterExtractor(KissmangaExtractor): pos = script.index(var) lst = text.extract(script, "=", ";", pos)[0] - key = ast.literal_eval(lst.strip())[int(idx)] - - return list(hashlib.sha256(key.encode("ascii")).digest()) + return ast.literal_eval(lst.strip())[int(idx)]