13/12/2022, 4:02:01 pm
// ==UserScript==
// @name hotleak.vip,thotporn.tv,leakedzone.com image scraper
// @namespace Violentmonkey Scripts
// @match https://hotleak.vip/*
// @match https://thotporn.tv/*
// @match https://leakedzone.com/*
// @version 1.8
// @author -
// @license MIT
// @description 13/12/2022, 4:02:01 pm
// @grant GM_registerMenuCommand
// @grant GM_setClipboard
// ==/UserScript==
const linksContainerStyle = `
position:absolute;
z-index:99999999;
top:20px;
left:20px;
width:800px;
height:600px;
background-color:white;
padding:10px;
color:black;
display:flex;
flex-direction:column;
overflow:scroll;
`
const createHTMLPageToCopy = (html) =>
`<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
<style type="text/css">
body{
display: flex;
flex-direction: column;
}
a {
display: block;
margin-bottom: 5px;
width: fit-content;
}
</style>
</head>
<body>
<h1>From: ${window.location.href} </h1>
${html}
</body>
</html>`
let idx = 0
function createLinksContainer(){
const linksContainer = document.createElement('div')
linksContainer.setAttribute('style', linksContainerStyle)
linksContainer.setAttribute('id', 'getLinksTextarea')
const info = document.createElement('div')
info.setAttribute('style', 'margin-bottom:5px;')
info.setAttribute('class', 'links-info')
linksContainer.appendChild(info)
document.body.appendChild(linksContainer)
const closeButton = document.createElement('button')
closeButton.textContent = 'Close'
closeButton.setAttribute('id','closeButton')
closeButton.setAttribute('style', `
position:absolute;
top:20px;
left: 845px;
z-index:999999991;
`)
closeButton.addEventListener('mouseup', () => {
document.querySelector('#getLinksTextarea').remove()
document.querySelector('#closeButton').remove()
document.querySelector('#copyToClipboardButton').remove()
idx = 0
})
document.body.appendChild(closeButton)
const copyToClipboardButton = document.createElement('button')
copyToClipboardButton.textContent = 'Copy To Clipboard'
copyToClipboardButton.setAttribute('id','copyToClipboardButton')
copyToClipboardButton.setAttribute('style', `
position:absolute;
top:60px;
left: 845px;
z-index:999999991;
`)
copyToClipboardButton.addEventListener('mouseup', () => {
GM_setClipboard(createHTMLPageToCopy(linksContainer.innerHTML))
})
document.body.appendChild(copyToClipboardButton)
return [linksContainer, info]
}
const userName = window.location.pathname.split('/')[1]
function findLinksOnPage(){
return Array.from(document.querySelectorAll(`a[href*="${userName}/photo/"]`))
}
// Couldnt get auto downloading to work with GM_download. Dunno why.
// let images = []
// const createFilename = fileUrl => {
// var u = new URL(fileUrl)
// return u.pathname.slice(u.pathname.lastIndexOf('/')+1)
// }
// const downloadFile = fileUrl => new Promise((resolve, reject) => {
// // alert(`name: ${createFilename(fileUrl)}`)
// GM_download({url:fileUrl, name:createFilename(fileUrl), onload:() => {
// // alert('finished download')
// resolve()
// }, onerror:(e) => {
// alert(`error downloading ${e.toString()}`)
// // reject()
// }})
// })
const createLink = (url) => {
const newLink = document.createElement('a')
newLink.setAttribute('href', url)
newLink.setAttribute('class', 'gm-links')
newLink.setAttribute('title', 'gm-links')
newLink.setAttribute('style', 'color:black;')
newLink.textContent = url
return newLink
}
const getImage = (link, imageLinks, infoElem, linksContainer, retry) => fetch(link).then(resp => resp.text()).then(resp => {
const parser = new DOMParser();
const htmlDoc = parser.parseFromString(resp, 'text/html')
const newImage = htmlDoc.querySelector('.light-gallery-item').getAttribute('data-src')
idx = idx + 1
infoElem.textContent = `Done ${idx} of ${imageLinks.length} (use DownThemAll to download)`
linksContainer.appendChild(createLink(newImage))
})
async function getLinks(){
const [linksContainer, infoElem] = createLinksContainer()
const imageLinks = findLinksOnPage()
window.scrollTo(0, 0)
for (const link of imageLinks) {
await getImage(link, imageLinks, infoElem, linksContainer)
.catch(err => {
// This actually seems to pause the promise!
let confirmDialog = window.confirm(`An error occured.\nYou may need to refresh the page in another tab to pass the js test.\nClick Ok when done. \n\n Error: ${err.toString()}`)
// Retry if they do the thing
return confirmDialog ? getImage(link, imageLinks, infoElem, linksContainer).catch(err => console.error(err)) : Promise.reject('cancelled')
})
}
}
GM_registerMenuCommand('get links ', () => {
getLinks().catch(err => console.error(err).then(() => {
idx = 0
}))
})