Last active
September 25, 2017 17:25
-
-
Save pedropapa/fa2fc88c5bbde357bf707139a5bbd54c to your computer and use it in GitHub Desktop.
PT/BR SA-MP forums board contributors extrator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* ATENÇÃO: NÃO EXECUTE O SCRIPT LOGADO EM SUA CONTA DO FÓRUM, E NÃO EXECUTE SE TIVER IP FIXO. A QUANTIDADE DE REQUISIÇÕES QUE SÃO FEITAS DURANTE A EXECUÇÃO DO SCRIPT PODE FAZER COM QUE SEU IP SEJA BANIDO. | |
* | |
* Como executar: | |
* | |
* 1. Abra o Google Chrome. | |
* 2. Navegue até o início da board pt/br do fórum (http://forum.sa-mp.com/forumdisplay.php?f=56) | |
* 3. Abra o console do navegador (Windows: ctrl + shift + K, MacOS: command + shift + K). | |
* 4. Copie e cole este script no navegador | |
* 5. Aperte enter para executar | |
* 6. Aguarde a execução até um alerta (Acabou!) aparecer na tela | |
* 7. Veja no console do navegador a lista de membros retornada | |
* | |
* Último ranking extraído: https://gist.github.com/pedropapa/90de1dfdf53fbbdf514c45cfc140a9ad | |
*/ | |
var rgxp = /\n[\s]+(\n.*){2}\n*?\[*?>(.*?)<.*?\].*\n.*?showthread.*?>(.*?)<.*[\s\S]*?smallfont.>.*\n.*\n.*\n\s+(.*?span.*?>(.*?)<\/span|(.*?)\s+)[\s\S]*?replies.{2}(\d+).+views.{2}([\d+,\,]+)/mig; | |
var rkRgxp = new RegExp(rgxp.source, 'mi'); | |
var totalPages = parseInt(document.body.innerHTML.match(/page.(\d+).+last.page/i)[1]); | |
var pageLink = "/forumdisplay.php?f=56&order=desc&page=%page%"; | |
var Ranking = []; | |
var i = 0; | |
var pagesRan = 0; | |
alert("Aguarde até que o alerta de término seja apresentado, isso pode levar alguns minutos."); | |
while(++i <= totalPages) { | |
callRankPageDelayed(i); | |
} | |
function callRankPageDelayed(page) { | |
setTimeout(function() {rankPage(page)}, Math.round(Math.random() * 5000)); | |
} | |
function rankPage(page) { | |
var pageUrl = pageLink.replace('%page%', page); | |
var requestBody = ajaxRequest('get', false, pageUrl); | |
document.body.innerHTML = requestBody; | |
var pageRanking = document.body.innerHTML.match(rgxp); | |
for(var current in pageRanking) { | |
var record = rkRgxp.exec(pageRanking[current]); | |
[_, _, topicType, topicTitle, _, member1, member2, replies, views] = record; | |
(typeof member1 == 'undefined')?(member = member2):(member = member1); | |
if(!Ranking[member]) { | |
Ranking[member] = { | |
contributor: member, | |
contributions: 0, | |
replies: 0, | |
views: 0, | |
types: { | |
Tutorial: [], | |
FilterScript: [], | |
"Tool/Web/Other": [], | |
Include: [], | |
Plugin: [], | |
Map: [], | |
GameMode: [] | |
} | |
}; | |
} | |
Ranking[member].replies += parseInt(replies.replace(',', '')); | |
Ranking[member].views += parseInt(views.replace(',', '')); | |
Ranking[member].types[topicType].push({ | |
topicTitle: topicTitle, | |
views: parseInt(views.replace(',', '')), | |
replies: parseInt(replies.replace(',', '')) | |
}); | |
Ranking[member].types[topicType].sort(function(b,c){return c.replies - b.replies}); | |
++Ranking[member].contributions; | |
} | |
++pagesRan; | |
if(pagesRan == totalPages) { | |
alert('Veja o resultado no console do seu navegador.'); | |
// O fórum do sa-mp executa um código que sobreescreve as funções de console, como o console.log. O snippet abaixo restaura o comportamento padrão desse objeto. | |
var i = document.createElement('iframe'); | |
i.style.display = 'none'; | |
document.body.appendChild(i); | |
window.console = i.contentWindow.console; | |
var sorted = startFromZero(Ranking).sort(function(b,c){return c.replies - b.replies}) | |
for(var x in sorted) { | |
console.log(parseInt(x) + 1 + "º: " + sorted[x].contributor + " | Contribuições: "+ sorted[x].contributions +" | Visualizações " + sorted[x].views + " | Respostas " + sorted[x].replies); | |
console.log(" Contribuições:"); | |
for(var y in sorted[x].types) { | |
if(sorted[x].types[y].length) { | |
console.log(" " + y + ":"); | |
for (var z in sorted[x].types[y]) { | |
console.log( | |
" " + sorted[x].types[y][z].topicTitle + " | Respostas: " + sorted[x].types[y][z].replies + " | Visualizações: " + sorted[x].types[y][z].views); | |
} | |
} | |
} | |
} | |
} | |
} | |
function ajaxRequest(method, option, url, sendData, headers) { | |
$ = new XMLHttpRequest; | |
t = null; | |
with($) { | |
open(method, url, option); | |
if(method == "POST") | |
if(headers.length > 0) | |
for(y in headers) | |
setRequestHeader(headers[y][0], headers[y][1]); | |
send(sendData); | |
t = responseText; | |
} | |
return t; | |
} | |
function startFromZero(arr) { | |
var newArr = []; | |
var count = 0; | |
for (var i in arr) { | |
newArr[count++] = arr[i]; | |
} | |
return newArr; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment