11import { load } from 'cheerio' ;
22import got from '@/utils/got' ;
33import ofetch from '@/utils/ofetch' ;
4+ import puppeteer from '@/utils/puppeteer' ;
45import { config } from '@/config' ;
56import { parseDate } from '@/utils/parse-date' ;
67import { art } from '@/utils/render' ;
@@ -65,16 +66,23 @@ const getCookie = async (username, password, cache) => {
6566 return userTokenCookie ;
6667} ;
6768
68- const oFetch = ( url , ... options ) =>
69- ofetch ( url , {
70- ... options ,
71- headers : {
72- host : 'nhentai.net' ,
73- } ,
69+ const puppeteerGet = async ( url ) => {
70+ const browser = await puppeteer ( ) ;
71+ const page = await browser . newPage ( ) ;
72+ await page . setRequestInterception ( true ) ;
73+ page . on ( 'request' , ( request ) => {
74+ request . resourceType ( ) === 'document' ? request . continue ( ) : request . abort ( ) ;
7475 } ) ;
76+ await page . goto ( url , {
77+ waitUntil : 'domcontentloaded' ,
78+ } ) ;
79+ const html = await page . evaluate ( ( ) => document . documentElement . innerHTML ) ;
80+ await browser . close ( ) ;
81+ return html ;
82+ } ;
7583
7684const getSimple = async ( url ) => {
77- const data = await oFetch ( url ) ;
85+ const data = await puppeteerGet ( url ) ;
7886 const $ = load ( data ) ;
7987
8088 return $ ( '.gallery a.cover' )
@@ -103,6 +111,7 @@ const parseSimpleDetail = ($ele) => {
103111 const highResoThumbSrc = thumbSrc
104112 . replace ( 'thumb' , '1' )
105113 . replace ( / t ( \d + ) \. n h e n t a i \. n e t / , 'i$1.nhentai.net' )
114+ . replace ( / \. ( j p g | p n g | g i f ) \. w e b p $ / , '.$1' )
106115 . replace ( '.webp.webp' , '.webp' ) ;
107116 return {
108117 title : $ele . children ( '.caption' ) . text ( ) ,
@@ -113,17 +122,25 @@ const parseSimpleDetail = ($ele) => {
113122
114123const getTorrent = async ( simple , cookie ) => {
115124 const { link } = simple ;
116- const response = await oFetch ( link + 'download' , { followRedirect : false , responseType : 'buffer' , headers : { Cookie : cookie } } ) ;
125+ const browser = await puppeteer ( ) ;
126+ const page = await browser . newPage ( ) ;
127+ await page . setCookie ( ...cookie . split ( ';' ) . map ( c => {
128+ const [ name , value ] = c . trim ( ) . split ( '=' ) ;
129+ return { name, value, domain : 'nhentai.net' } ;
130+ } ) ) ;
131+ const response = await page . goto ( link + 'download' , { waitUntil : 'networkidle2' } ) ;
132+ const buffer = await response . buffer ( ) ;
133+ await browser . close ( ) ;
117134 return {
118135 ...simple ,
119- enclosure_url : response ,
136+ enclosure_url : buffer ,
120137 enclosure_type : 'application/x-bittorrent' ,
121138 } ;
122139} ;
123140
124141const getDetail = async ( simple ) => {
125142 const { link } = simple ;
126- const data = await oFetch ( link ) ;
143+ const data = await puppeteerGet ( link ) ;
127144 const $ = load ( data ) ;
128145
129146 const galleryImgs = $ ( '.gallerythumb img' )
0 commit comments