184 lines
7.7 KiB
Python
184 lines
7.7 KiB
Python
import json,os,time,random,shutil
|
|
from utils.ComicUtils import comicUtils
|
|
from utils.NetUtils import netUtils
|
|
from utils.HtmlUtils import htmlUtils
|
|
from utils.ImageUtils import imageUtils
|
|
from utils.comic.ComicInfo import comicInfo
|
|
from utils.CBZUtils import CBZUtils
|
|
from utils.downloader import download_images
|
|
class comicEntity:
|
|
|
|
@classmethod
|
|
def downladsComcis(cls,url):
|
|
#漫画名
|
|
data = htmlUtils.xpathData('//script[@id="__NEXT_DATA__"]/text()',url=url)
|
|
# #
|
|
data = json.loads(data[0])
|
|
data = data.get("props")
|
|
x = data.get("pageProps")
|
|
books = x.get("books")
|
|
len_books = len(books)
|
|
baseUrl = comicInfo.getBaseUrl(url)
|
|
for x in range(0, len_books):
|
|
book = books[x]
|
|
#https://rm01.xyz/books/052426c3-ec7d-4035-b614-3c9290ee625b
|
|
book_id = book.get("id")
|
|
book_name = book.get("name")
|
|
comicHref = baseUrl+"/books/"+book_id
|
|
random_int = random.uniform(5,20)
|
|
wait = print(f"{random_int}秒后开始下载 漫画:{book_name}")
|
|
time.sleep(random_int)
|
|
cls.oneComic(comicHref, random.uniform(0,3))
|
|
|
|
print(books)
|
|
#for comicHref in comicsHref:
|
|
# cls.oneComic(comicHref,random.uniform(10,20))
|
|
|
|
@classmethod
|
|
def oneComic(cls,c_url,sleep=None):
|
|
#漫画名
|
|
title = htmlUtils.xpathData('//div[@class="col"]/h5/text()',url=c_url,num=0)
|
|
#别名
|
|
alias = htmlUtils.xpathData('//span[contains(@class,"bookid_alias")]/text()',num=1)
|
|
icon = htmlUtils.xpathData('//img[@class="img-thumbnail"]/@src',num=0)
|
|
|
|
author = htmlUtils.xpathData('//div[contains(@class,"bookid_bookInfo")]/p[1]/text()',num=1)
|
|
tags = htmlUtils.xpathData('//div[contains(@class,"bookid_bookInfo")]/p[3]/b/text()',num=0)
|
|
action = htmlUtils.xpathData('//div[contains(@class,"bookid_bookInfo")]/p[2]/text()',num=1)
|
|
dep = htmlUtils.xpathData('//div[contains(@class,"bookid_bookInfo")]/p[4]/text()',num=1)
|
|
update_date = htmlUtils.xpathData('//div[contains(@class,"bookid_bookInfo")]/p[5]/small/text()',num=1)
|
|
chapters = htmlUtils.xpathData('//div[contains(@class,"bookid_chapterBox")]//div[contains(@class,"bookid_chapter")]/a/text()')
|
|
chapter_href = htmlUtils.xpathData('//div[contains(@class,"bookid_chapterBox")]//div[contains(@class,"bookid_chapter")]/a/@href')
|
|
|
|
author = str(author).replace("&",",").replace(" ",",")
|
|
comicInfo.setHomePage(c_url)
|
|
comicInfo.setComicName(str(title))
|
|
comicInfo.setComicNames(title+","+alias)
|
|
comicInfo.setAuthor(author)
|
|
comicInfo.setIcon(icon)
|
|
comicInfo.setTag(tags)
|
|
comicInfo.setTags(tags)
|
|
comicInfo.setDep(dep)
|
|
comicInfo.setCBS("韩漫")
|
|
comicInfo.setLang("zh")
|
|
comicInfo.setComicNames(title+","+alias)
|
|
|
|
#comicUtils.setComic(title,alias,icon,author,tags,action,dep,update_date,chapters,chapter_href)
|
|
count_chapter = 0
|
|
for href in chapter_href:
|
|
chapter = chapters[count_chapter]
|
|
comicInfo.setChapterName(chapter)
|
|
if not comicInfo.nextExistsGetPath("done_"):
|
|
comicEntity.comicChapter(href,scramble=True,sleep=random.uniform(15,25))
|
|
count_chapter += 1
|
|
#一本漫画下载后等待
|
|
#清空文件夹
|
|
pathDirComic = comicInfo.getDirComic()
|
|
if os.path.exists(pathDirComic):
|
|
shutil.rmtree(pathDirComic)
|
|
if not sleep == None:
|
|
time.sleep(sleep)
|
|
|
|
'''
|
|
|
|
读取某章节下所有图片
|
|
'''
|
|
@classmethod
|
|
def comicChapter(cls,chapter_url,scramble=None,sleep=None):
|
|
cls.Onechapter(chapter_url,scramble)
|
|
#进入下个阶段
|
|
if comicInfo.nextExistsGetPath("down_"):
|
|
#章节图片全部下载后,调用下载封面
|
|
netUtils.downloadComicIcon()
|
|
#下个阶段
|
|
if comicInfo.nextExistsGetPath("cbz_"):
|
|
time.sleep(1)
|
|
#下载后自动打包
|
|
CBZUtils.packAutoComicChapterCBZ()
|
|
#完成删除原文件
|
|
remove_path = comicInfo.getDirComicChapter()
|
|
shutil.rmtree(remove_path)
|
|
print(f"文件已删除: {remove_path}")
|
|
if not sleep == None:
|
|
print(f"{sleep} 秒后开始下载下一个章节")
|
|
time.sleep(sleep)
|
|
|
|
@classmethod
|
|
def Onechapter(cls,chapter_url,scramble=None):
|
|
if not str(chapter_url).startswith("http"):
|
|
chapter_url = comicInfo.getBaseUrl() + chapter_url
|
|
cls.comicChapterDownload(chapter_url)
|
|
comicInfo.nextInfoToImgChapter()
|
|
#下载完成后, 开始解密图片
|
|
if scramble:
|
|
#获取章节图片路径
|
|
chapter_dir = comicInfo.getDirComicChapter()
|
|
dirs = os.listdir(chapter_dir)
|
|
for img in dirs:
|
|
isScramble = str(img).startswith("scramble=")
|
|
if isScramble:
|
|
c_path = os.path.join(chapter_dir, img)
|
|
imageUtils.getScrambleImage(c_path)
|
|
#进入下一阶段
|
|
comicInfo.nextImgToDownloadChapter()
|
|
|
|
|
|
@classmethod
|
|
def comicChapterDownload(cls,chapter_url):
|
|
#漫画名
|
|
data = htmlUtils.xpathData('//script[@id="__NEXT_DATA__"]/text()',url=chapter_url)
|
|
# #
|
|
data = json.loads(data[0])
|
|
data = data.get("props")
|
|
x = data.get("pageProps")
|
|
bookName = x.get("bookName")
|
|
chapterName = x.get("chapterName")
|
|
#fileUtils.saveConfComicChapterInfo(chapterName,x,bookName)
|
|
#if comicInfo.nextExistsGetPath("info_"):
|
|
# print(f"{bookName} {chapterName} info文件已存在跳过")
|
|
comicInfo.nextSaveInfoChapter(chapterName,x)
|
|
alias = x.get("alias")
|
|
description = x.get("description")
|
|
images = x.get("images")
|
|
chapterAPIPath = x.get("chapterAPIPath")
|
|
comicInfo.setComicName(bookName)
|
|
comicInfo.setChapterName(chapterName)
|
|
comicInfo.setDep(description)
|
|
pathComicInfo = comicInfo.getPathComicInfoXML()
|
|
if not os.path.exists(pathComicInfo):
|
|
print("不存在ComicInfo.xml 生成中...")
|
|
comicInfo.writeComicInfoXML(chapterName)
|
|
|
|
if not chapterAPIPath == None:
|
|
base_url = comicUtils.getBaseUrl(chapter_url)
|
|
chapterAPIUrl = base_url+chapterAPIPath
|
|
data = htmlUtils.getJSON(chapterAPIUrl)
|
|
data = data.get("chapter")
|
|
chapterName = data.get("name")
|
|
images = data.get("images")
|
|
if images == None:
|
|
print(f"未获取到章节图像 comic_name={bookName} chapter={chapterName}")
|
|
totalChapter = x.get("totalChapter")
|
|
tags = x.get("tags")
|
|
x = tags
|
|
print(x)
|
|
count = 1
|
|
list_img = []
|
|
list_scramble = []
|
|
list_fileName = []
|
|
for image in images:
|
|
image_src = image.get("src")
|
|
scramble = image.get("scramble")
|
|
count_image = "{:0>3d}".format(count)
|
|
list_img.append(image_src)
|
|
image_src_prefix = "."+str(image_src).split(".")[-1]
|
|
if scramble:
|
|
su = "."+str(image_src).split(".")[-1]
|
|
de_str = str(image_src).split("/")[-1].replace(su,"==")
|
|
blocks = imageUtils.encodeImage(de_str)
|
|
count_image = "scramble="+str(blocks)+"_"+count_image
|
|
list_fileName.append(count_image+image_src_prefix)
|
|
count+=1
|
|
print("count_all_img=", count)
|
|
#netUtils.downloadComicChapterImages(list_img,scrambles=list_scramble)
|
|
return download_images(list_img,comicInfo.getDirComicChapter(), filesName=list_fileName) |