Skip to content

Instantly share code, notes, and snippets.

@pedropapa
Last active September 25, 2017 17:25
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pedropapa/fa2fc88c5bbde357bf707139a5bbd54c to your computer and use it in GitHub Desktop.
Save pedropapa/fa2fc88c5bbde357bf707139a5bbd54c to your computer and use it in GitHub Desktop.
PT/BR SA-MP forums board contributors extrator
/**
* 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