[Brainstorm] Как считается "Рейтинг" dtf ?
Есть на нашем сайтеце такая вот занимательная страница с лучшими людьми города:
Список заполняется по запросу из
Где судя по имени поля рейтингом считается сумма "статистики" за 7 дней
Скрипт для визуализации таблицы с рейтингом
async function main() {
let blogs = null
const response = await fetch(`https://api.dtf.ru/v2.7/discovery/blogs`);
const response_json = await response.json();
if (response_json.result) {
blogs = response_json.result;
}
if (!blogs) return;
let results_text = `
<h1>Топ 50 блогов по количеству реакций на постах за 7 дней</h1>
<table>
<thead>
<tr>
<td>Место</td>
<td>Юзер</td>
<td>Реакций на постах за 7 дней</td>
</tr>
</thead>
<tbody>`;
for (let i=0; i<blogs.length; i++) {
const blog = blogs[i].data;
results_text += `
<tr>
<td>${i+1}</td>
<td>
<a href="https://dtf.ru/u/${blog.id}" >
<img style="width: 36px; height: 36px; float:left;" src="https://leonardo.osnova.io/${blog.avatar.data.uuid}/-/scale_crop/72x72/" />
<span style="line-height: 36px; margin: 0 0 0 10px;" >${blog.name}</span>
</a>
</td>
<td>${blog.count_stats_7d}</td>
</tr>`;
}
results_text += `
</tbody>
</table>`;
document.querySelector('.view').innerHTML = results_text;
}
main();
Я всегда думал что count_stats_7d это сумма реакций на постах за 7 дней. Пока не написал скрипт для его подчета.
Скрипт для подсчета реакций на постах за 7 дней
Замените user_id на нужный
async function main() {
const user_id = 2164790
let reactions_summ = 0;
const delay_time_ms = 200;
let last_sorting_value = 0;
let last_id = 0;
let cursor= '';
let must_break = false;
while (true) {
let url;
const base_url = 'https://api.dtf.ru/v2.10/timeline';
const params = {
markdown: 'false',
sorting: 'new',
subsitesIds: user_id
};
if (last_sorting_value) params.lastSortingValue = last_sorting_value;
if (last_id) params.lastId = last_id;
if (cursor) params.cursor = cursor;
const url_params = new URLSearchParams(params);
url = `${base_url}?${url_params.toString()}`;
let entity_response_json;
await delay(delay_time_ms);
const entry_response = await fetch(url);
entity_response_json = await entry_response.json();
if (!entity_response_json?.result?.items?.length) break;
last_sorting_value = entity_response_json.result.items[entity_response_json.result.items.length - 1].data.date;
last_id = entity_response_json.result.items[entity_response_json.result.items.length - 1].data.id;
cursor = entity_response_json.result.cursor;
for (let k = 0; k < entity_response_json.result.items.length; k++) {
if (entity_response_json.result.items[k].type !=="entry") continue;
if (entity_response_json.result.items[k].data.isPinned === true) continue; //пропускаем закреп
if ( (entity_response_json.result.items[k].data.date * 1000) < (Date.now() - 7 * 24 * 60 * 60 * 1000) ) {
console.log('break');
must_break = true;
break;
}
let counters = entity_response_json.result.items[k].data.reactions.counters;
for (let c = 0; c < counters.length; c++) {
reactions_summ += counters[c].count;
}
}
if (must_break || !last_id || !last_sorting_value) break;
}
console.log(reactions_summ);
document.querySelector('.view').innerHTML = `
<p>Сумма реакций на постах за 7 дней юзера id=${user_id} - ${reactions_summ}</p>
`;
}
//функция для паузы
function delay(milliseconds){
return new Promise(resolve => {
setTimeout(resolve, milliseconds);
});
}
main();
Сумма реакций на постах за неделю:
Бегиныч - 1295, 1669 - в рейтинге
Анапасик - 1120, 273 - в рейтинге
Внимание вопрос:
По какой формуле считается рейтинг?
В рейтинге кстати зашедоубанены шитпостеры делающие посты 24/7 типа Маминой Умницы и Гвиздона. Иначе они постоянно были бы в топе.
51 комментарий