Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * @postId STRING: id do elemento da publicação (opcional)
- * @expand BOOL: opção de expandir todos os comentários antes de raspar
- */
- var copyToClipboard = str => {
- const el = document.createElement('textarea')
- el.value = str
- document.body.appendChild(el)
- el.select()
- document.execCommand('copy')
- document.body.removeChild(el)
- }
- var copyResults = (str, len) => {
- if (str) {
- window.localStorage.setItem('fb-scrapper-results', str)
- const $el = `<div style="background-color: black; color: white; position: fixed; width: 100%; left: 0; bottom: 0; z-index: 10000; text-align: center; padding: 1em;" id="fb-scrapper-container">${len} comentários extraídos <button onClick="copyResults()">Copiar</button></div>`
- const node = new DOMParser().parseFromString($el, 'text/html').body.childNodes[0]
- document.body.appendChild(node)
- } else {
- const results = window.localStorage.getItem('fb-scrapper-results')
- copyToClipboard(results)
- alert('Comentários copiados')
- document.querySelector('#fb-scrapper-container').parentElement.removeChild(document.querySelector('#fb-scrapper-container'))
- }
- }
- function fetchComments(length) {
- let baseSelector = document.querySelector('#pagelet_timeline_main_column .permalinkPost')
- || document.querySelectorAll('.uiStreamStory')
- if (!baseSelector || (baseSelector instanceof window.NodeList && !baseSelector.length)) {
- baseSelector = document.querySelector('._wyj._20nr')
- } else {
- if (baseSelector.forEach) {
- baseSelector = baseSelector[baseSelector.length - 1]
- }
- }
- const allCommentsQuery = '[data-testid="UFI2Comment/root_depth_0"]'
- const getCommentsLength = () => baseSelector
- .querySelectorAll(allCommentsQuery).length
- const exportToCsv = (filename, rows) => {
- var processRow = function (row) {
- return row
- .map(col => {
- let innerValue = col === null ? '' : col.toString()
- if (col instanceof Date) innerValue = col.toLocaleString()
- return '"' + innerValue.replace(/"/g, '\"').replace(/\s+$/, '') + '"'
- })
- .join(';')
- }
- let csvFile = rows.map(processRow).join('\n')
- var blob = new Blob([csvFile], { type: 'text/csv;charset=utf-8;' })
- if (navigator.msSaveBlob) { // IE 10+
- navigator.msSaveBlob(blob, filename)
- } else {
- var link = document.createElement("a")
- if (link.download !== undefined) { // feature detection
- // Browsers that support HTML5 download attribute
- var url = URL.createObjectURL(blob)
- link.setAttribute("href", url)
- link.setAttribute("download", filename)
- link.style.visibility = 'hidden'
- document.body.appendChild(link)
- link.click()
- document.body.removeChild(link)
- }
- }
- }
- const scrapComments = () => {
- console.log('Raspando comentários...')
- const comments = []
- comments.push(['time', 'name', 'comment'])
- baseSelector
- .querySelectorAll(allCommentsQuery)
- .forEach((el) => {
- const $comment = el.querySelector('[data-testid="UFI2Comment/body"]')
- const $actions = el.querySelector('[data-testid="UFI2CommentActionLinks/root"]')
- if (!$comment) return
- const time = $actions.querySelector('abbr').getAttribute('title')
- const name = $comment.querySelector('a').innerText
- const textEl = $comment.querySelector('._3l3x')
- const text = textEl ? textEl.innerText
- .replace(/^[·:\d\s]+/, '')
- .replace(/\n+/g, ' ') : ''
- comments.push([time, name, text])
- })
- if (comments.length) {
- // const name = prompt('Digite o nome do arquivo CSV')
- // exportToCsv(name, comments)
- copyResults(comments.map(c => c.join('\t')).join('\n'), comments.length)
- } else {
- alert('Nenhum comentário encontrado')
- }
- }
- const expandComments = () => {
- const currentLength = getCommentsLength()
- if (currentLength >= length) {
- return Promise.resolve()
- }
- console.log(`Expandindo comentários ${(currentLength / length * 100).toFixed(2)}%`)
- baseSelector
- .querySelector('[data-testid="UFI2CommentsPagerRenderer/pager_depth_0"]')
- .click()
- return new Promise(function(resolve) {
- const interv = setInterval(() => {
- if (getCommentsLength() > currentLength) {
- clearInterval(interv)
- resolve(expandComments())
- }
- }, 100)
- })
- }
- // Initialize
- if (length) {
- return expandComments()
- .then(scrapComments)
- } else {
- return scrapComments()
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement