#!/bin/bash ################################################################## # LICENCE PUBLIQUE RIEN À BRANLER # Version 1, mars 2009 # #Copyright (C) 2009 Sam Hocevar #14 rue de Plaisance, 75014 Paris, France # #La copie et la distribution de copies exactes de cette licence sont #autorisées, et toute modification est permise à condition de changer #le nom de la licence. # # CONDITIONS DE COPIE, DISTRIBUTON ET MODIFICATION # DE LA LICENCE PUBLIQUE RIEN À BRANLER # # 0. Faites ce que vous voulez, j’en ai RIEN À BRANLER. ################################################################## #Version #WebToonDl-1.1 #Utilisation #Pour les windowsiens, faut avoir installer wsl sur son ordi pour avoir linux... #Quand vous avez installé ce qu'il faut, ouvrez un terminal dans le dossier où est mis le fichier WebToonDl.sh #Pour cela, cliquez-droit dans le dossier qui le contient en maintenant CTRL+Shift appuyez et ouvre un terminal ici #Puis commande #./WebToonDl.sh -option URL-CHAPTER #Options disponibles #last : pour prendre le dernier chapitre #all : pour prendre tous les chapitres d'une série #Example #./WebToonDl.sh -last https://www.webtoons.com/fr/fantasy/unordinary/list?title_no=1847 #Peut être bien long sur des longues séries, y'a beaucoup d'images #Logs #1.1 Ajout du dl de la partie canvas #On défini les dossiers tempo='./tempo' dossierDL='./seriesDL' # On prend l'argument quoidl="$1" URL="$2" #On crée un dossier temporaire pour récup les trucs mkdir -p ${tempo} if [[ $quoidl == '-last' ]] then echo '--------------' echo 'On veux dl juste le dernier chapitre' echo '--------------' #Regex sur l'url d'un titre regexPage="https://www.webtoons.com/(.*)/(.*)/(.*)/list\?title_no=([0-9]*)" #On va récupérer les infos qui nous interesse if [[ $URL =~ $regexPage ]] then # On télécharge la page pour récupérer l url du dernier chapitre echo '--------------' echo 'On télécharge la page pour récupérer l url du dernier chapitre' echo '--------------' curl --connect-timeout 5 \ --max-time 10 \ --retry 5 \ --retry-delay 0 \ --retry-max-time 40 \ "$URL" > ${tempo}/page.html # On récupère les infos pour créer les dossiers de dls lang="${BASH_REMATCH[1]}" genre="${BASH_REMATCH[2]}" title="${BASH_REMATCH[3]}" nbTitle="${BASH_REMATCH[4]}" else #Si la regex correspond pas on dit que le lien est pas bon et on quitte echo '--------------' echo "Lien non valide" echo '--------------' exit 0 fi #On récupère l'url de la page du dernier chapitre matchLastChap=$(grep -o -a -m 1 -h https://www\.webtoons\.com/.*/.*/.*/.*[0-9]*/viewer\?title_no=[0-9]*\&episode_no=[0-9]* ${tempo}/page.html | head -1) #Regex sur l'url du dernier chapitre #Utilisé pour subtitle à la fin aussi regexUrlChapter="https://www\.webtoons\.com/(.*)/(.*)/(.*)/(.*)/viewer\?title_no=([0-9]*)\&episode_no=([0-9]*)" #On va récupérer les infos qui nous interesse if [[ $matchLastChap =~ $regexUrlChapter ]] then echo '--------------' echo 'On télécharge la page du dernier chapitre' echo '--------------' # On récupère le sous nom du titre subtitle="${BASH_REMATCH[4]}" nbChap="${BASH_REMATCH[6]}" #On dl les fichiers URL_Referer='https://www.webtoons.com/'"$lang"'/'"$genre"'/'"$title"'/list?title_no='"$nbTitle" curl --connect-timeout 5 \ --max-time 10 \ --retry 5 \ --retry-delay 0 \ --retry-max-time 40 \ "${matchLastChap}" \ -H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0' \ -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' \ -H 'Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3' \ --compressed -H 'Referer: '"${URL_Referer}" \ -H 'DNT: 1' \ -H 'Connection: keep-alive' \ -H 'Upgrade-Insecure-Requests: 1' \ -H 'Sec-GPC: 1' \ -H 'Pragma: no-cache' \ -H 'Cache-Control: no-cache' > ${tempo}/chapter"$nbChap".html #On va créé le fichiers des urls des images pour mettre l'url du chapitre, utile plus tard touch "${tempo}"/chapturl"${nbChap}".txt #Juste avant de mettre cette url, on décode pour avoir les caractères accentués urlChapterUtf8=$(echo -e "${matchLastChap//%/\\x}") #Puis on remplace tout ces caractères accentués car c'est touours source de soucis urlChapterOK=$(echo "$urlChapterUtf8" | sed 'y/àçéèëêïîöôùüûÀÇÉÈËÊÏÎÖÔÙÜÛ/aceeeeiioouuuACEEEEIIOOUUU/') echo "${urlChapterOK}" > "${tempo}"/chapturl"${nbChap}".txt #Dans la partie Canvas, il y a des images avant celle qu'on veut récup #Le contenu est dans une div _imageList #On va donc virer tout le contenu avant ça sed -i '1,/_imageList/d' ${tempo}/chapter"$nbChap".html #Dans la page faut chopper les urls des images grep -o 'https:\/\/webtoon-phinf\.pstatic\.net\/.*\/.*_JPEG\/.*\.jpg?type=q90' "${tempo}"/chapter"${nbChap}".html >> "${tempo}"/chapturl"${nbChap}".txt maxImages=$(wc -l < "${tempo}"/chapturl"${nbChap}".txt) totalImages=$((${maxImages}-1)) #On prend la ligne une pour avoir le nom du chapitre urlSubtitle=$(head -1 ${tempo}/chapturl${nbChap}.txt) #On va récupérer les infos qui nous interesse if [[ $urlSubtitle =~ $regexUrlChapter ]] then # On récupère les infos pour dl les chapitres subtitle="${BASH_REMATCH[4]}" else #Si la regex correspond pas on dit que ba dommage pas trouvé d'url de chapitre echo '--------------' echo "Dommage pas d'url de chapitre trouvée pour création dossier" echo '--------------' exit 0 fi #On commence donc à 2 pour les urls des images for (( j = 2; j <= $maxImages; j++ )) do #On choppe les urls urlImages=$(head -${j} ${tempo}/chapturl${nbChap}.txt | tail -1) #On dl les images et on range en même temps regexUrlImage="https://webtoon-phinf\.pstatic\.net/(.*)/(.*)_JPEG/(.*).jpg\?type=q90" #On va récupérer les infos qui nous interesse if [[ $urlImages =~ $regexUrlImage ]] then #On range mkdir -p ${dossierDL} mkdir -p ${dossierDL}/${title} mkdir -p ${dossierDL}/${title}/${nbChap}-${subtitle} #On va mettre les images sur 3 chiffres pour avoir 001 #On enlève 1 pour la première ligne d'url nombre=$((j-1)) if (( ${nombre} < 10 )) then imgName=00"${nombre}" elif (( ${nombre} >= 10 )) && (( ${nombre} < 100 )) then imgName=0"${nombre}" else imgName="${nombre}" fi #Dl images echo '--------------' echo 'On télécharge les images du chapitre : '"${nbChap}"'-'"${subtitle}"' img num '"${imgName}"' sur '"${totalImages}" echo '--------------' referer='https://www.webtoons.com/'"${lang}"'/'"${genre}"'/'"${title}"'/'"${subtitle}"'/viewer?title_no='"${nbTitle}"'&episode_no='"${nbChap}" curl --connect-timeout 5 \ --max-time 10 \ --retry 5 \ --retry-delay 0 \ --retry-max-time 40 \ --referer ${referer} ${urlImages} > ${dossierDL}/${title}/${nbChap}-${subtitle}/${imgName}.jpg else #Si la regex correspond pas on dit que ba dommage pas d'images echo '--------------' echo "Dommage pas d'images pour le chapitre ${nbChap}" echo '--------------' exit 0 fi done else #Si la regex correspond pas on dit que ba dommage pas trouvé d'url de chapitre echo '--------------' echo "Dommage pas d'url de chapitre trouvée" echo '--------------' exit 0 fi echo '--------------' echo "Tout bon, yeah !" echo '--------------' elif [[ $quoidl == '-all' ]] then echo '--------------' echo 'On veux dl tous les chapitres' echo '--------------' #Regex sur l'url d'un titre regexPage="https://www.webtoons.com/(.*)/(.*)/(.*)/list\?title_no=([0-9]*)" #On va récupérer les infos qui nous interesse if [[ $URL =~ $regexPage ]] then # On télécharge la page pour récupérer le nombre de chapitres echo '--------------' echo 'On télécharge la page pour récupérer le nombre de chapitres' echo '--------------' curl --connect-timeout 5 \ --max-time 10 \ --retry 5 \ --retry-delay 0 \ --retry-max-time 40 \ "$URL" > ${tempo}/page.html # On récupère les infos pour créer les dossiers de dls lang="${BASH_REMATCH[1]}" genre="${BASH_REMATCH[2]}" title="${BASH_REMATCH[3]}" nbTitle="${BASH_REMATCH[4]}" else #Si la regex correspond pas on dit que le lien est pas bon et on quitte echo '--------------' echo "Lien non valide" echo '--------------' exit 0 fi #On récupère le nombre de chapitres dans la page matchLastChap=$(grep -o -a -m 1 -h https://www\.webtoons\.com/.*/.*/.*/.*[0-9]*/viewer\?title_no=[0-9]*\&episode_no=[0-9]* ${tempo}/page.html | head -1) #Regex sur l'url du dernier chapitre #Utilisé pour subtitle à la fin aussi regexUrlChapter="https://www\.webtoons\.com/(.*)/(.*)/(.*)/(.*)/viewer\?title_no=([0-9]*)\&episode_no=([0-9]*)" #On va récupérer les infos qui nous interesse if [[ $matchLastChap =~ $regexUrlChapter ]] then # On récupère les infos pour dl les chapitres nbChapter="${BASH_REMATCH[6]}" else #Si la regex correspond pas on dit que ba dommage pas trouvé d'url de chapitre echo '--------------' echo "Dommage pas d'url de chapitre trouvée" echo '--------------' exit 0 fi # On choppe maintenant toutes les urls des pages de chapitres # Pour ça faut parcourir les pages # Et attention, y'a des intermèdes des fois # Exemple : https://www.webtoons.com/fr/fantasy/unordinary/list?title_no=1847&page=2 # Le nombre de page à parcourir est fonction du nombre de chapitres # 10 chapitres par pages base=$((${nbChapter}/10)) modulo=$((${nbChapter}%10)) if [ "$modulo" -gt 0 ] then maxPage=$((${base}+1)) else maxPage=${base} fi # On va dl chaque page listant des chapitres i=1 for (( i = 1; i <= $maxPage; i++ )) do echo '--------------' echo 'On télécharge chaque page listant des chapitres : page '"$i" echo '--------------' URL_Page='https://www.webtoons.com/'"$lang"'/'"$genre"'/'"$title"'/list?title_no='"$nbTitle"'&page='"$i" curl --connect-timeout 5 \ --max-time 10 \ --retry 5 \ --retry-delay 0 \ --retry-max-time 40 \ "$URL_Page" > ${tempo}/pageChaps"$i".html done # On va chopper dans toutes ces pages les urls des pages des chapitres et les dls touch ${tempo}/listchap.txt for (( i = 1; i <= $maxPage; i++ )) do # On parcourt chaque fichier pour match les urls grep -o -a -h https://www\.webtoons\.com/.*/.*/.*/.*[0-9]*/viewer\?title_no=[0-9]*\&episode_no=[0-9]* ${tempo}/pageChaps${i}.html >> ${tempo}/listchap.txt # Faut virer à chaque fois la dernière url qui est un lien vers le 1er chap ("prologue") sed -i '$ d' ${tempo}/listchap.txt done #On va dl les pages de chaques chapitres pour avoir les urls des images maxUrl=$(wc -l < "${tempo}"/listchap.txt) for (( i = 1; i <= $maxUrl; i++ )) do echo '--------------' echo 'On télécharge chaque page de chapitre : chapitre '"$i"' sur '"$maxUrl" echo '--------------' #On choppe les urls urlChapter=$(head -${i} ${tempo}/listchap.txt | tail -1) #On dl les fichiers URL_Referer='https://www.webtoons.com/'"$lang"'/'"$genre"'/'"$title"'/list?title_no='"$nbTitle" #Dl page chapter #Choppé avec le mode développeur de firefox, copier la requete curl --connect-timeout 5 \ --max-time 10 \ --retry 5 \ --retry-delay 0 \ --retry-max-time 40 \ "${urlChapter}" \ -H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0' \ -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' \ -H 'Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3' \ --compressed -H 'Referer: '"${URL_Referer}" \ -H 'DNT: 1' \ -H 'Connection: keep-alive' \ -H 'Upgrade-Insecure-Requests: 1' \ -H 'Sec-GPC: 1' \ -H 'Pragma: no-cache' \ -H 'Cache-Control: no-cache' > ${tempo}/chapter"$i".html #On va créé le fichiers des urls des images pour mettre l'url du chapitre, utile plus tard touch "${tempo}"/chapturl"${i}".txt #Juste avant de mettre cette url, on décode pour avoir les caractères accentués urlChapterUtf8=$(echo -e "${urlChapter//%/\\x}") #Puis on remplace tout ces caractères accentués car c'est touours source de soucis urlChapterOK=$(echo "$urlChapterUtf8" | sed 'y/àçéèëêïîöôùüûÀÇÉÈËÊÏÎÖÔÙÜÛ/aceeeeiioouuuACEEEEIIOOUUU/') echo "${urlChapterOK}" > "${tempo}"/chapturl"${i}".txt #Dans la partie Canvas, il y a des images avant celle qu'on veut récup #Le contenu est dans une div _imageList #On va donc virer tout le contenu avant ça sed -i '1,/_imageList/d' ${tempo}/chapter"$i".html done #Dans chaque page faut chopper les urls des images for (( i = 1; i <= $maxUrl; i++ )) do #Match url grep -o 'https:\/\/webtoon-phinf\.pstatic\.net\/.*\/.*_JPEG\/.*\.jpg?type=q90' "${tempo}"/chapter"${i}".html >> "${tempo}"/chapturl"${i}".txt done #On télécharge les images de tous les chapitres for (( i = 1; i <= $maxUrl; i++ )) do maxImages=$(wc -l < "${tempo}"/chapturl"${i}".txt) totalImages=$((${maxImages}-1)) #On prends chaque ligne pour avoir les urls des images #On prend la ligne une pour avoir le nom du chapitre urlSubtitle=$(head -1 ${tempo}/chapturl${i}.txt) #On va récupérer les infos qui nous interesse if [[ $urlSubtitle =~ $regexUrlChapter ]] then # On récupère les infos pour dl les chapitres subtitle="${BASH_REMATCH[4]}" nbChapter="${BASH_REMATCH[6]}" else #Si la regex correspond pas on dit que ba dommage pas trouvé d'url de chapitre echo '--------------' echo "Dommage pas d'url de chapitre trouvée pour création dossier" echo '--------------' exit 0 fi #On commence donc à 2 pour les urls des images for (( j = 2; j <= $maxImages; j++ )) do #On choppe les urls urlImages=$(head -${j} ${tempo}/chapturl${i}.txt | tail -1) #On dl les images et on range en même temps regexUrlImage="https://webtoon-phinf\.pstatic\.net/(.*)/(.*)_JPEG/(.*).jpg\?type=q90" #On va récupérer les infos qui nous interesse if [[ $urlImages =~ $regexUrlImage ]] then #On range mkdir -p ${dossierDL} mkdir -p ${dossierDL}/${title} mkdir -p ${dossierDL}/${title}/${nbChapter}-${subtitle} #On va mettre les images sur 3 chiffres pour avoir 001 #On enlève 1 pour la première ligne d'url nombre=$((j-1)) if (( ${nombre} < 10 )) then imgName=00"${nombre}" elif (( ${nombre} >= 10 )) && (( ${nombre} < 100 )) then imgName=0"${nombre}" else imgName="${nombre}" fi #Dl images echo '--------------' echo 'On télécharge les images de chaque chapitre : '"${nbChapter}"'-'"${subtitle}"' sur '"${maxUrl}"' et img num '"${imgName}"' sur '"${totalImages}" echo '--------------' referer='https://www.webtoons.com/'"${lang}"'/'"${genre}"'/'"${title}"'/'"${subtitle}"'/viewer?title_no='"${nbTitle}"'&episode_no='"${nbChapter}" curl --connect-timeout 5 \ --max-time 10 \ --retry 5 \ --retry-delay 0 \ --retry-max-time 40 \ --referer ${referer} ${urlImages} > ${dossierDL}/${title}/${nbChapter}-${subtitle}/${imgName}.jpg else #Si la regex correspond pas on dit que ba dommage pas d'images echo '--------------' echo "Dommage pas d'images pour le chapitre ${nbChapter}" echo '--------------' exit 0 fi done done echo '--------------' echo "Tout bon, yeah !" echo '--------------' else echo '--------------' echo "Option mal renseignée" echo '--------------' fi #On supprime le dossier tempo et son contenu rm -rf ${tempo} exit 0