proxor
Version:
A Node.js utility to fetch and analyze user profiles from multiple coding platforms including LeetCode, GeeksForGeeks, Codechef and Codeforces.
64 lines (49 loc) • 2.57 kB
JavaScript
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
// Codeforce data handle
async function getCodeforcesData( username ) {
// Official API of Codeforces
const getUserdataUrl = `https://codeforces.com/api/user.info?handles=${username}`;
const userSubmissionHistoryUrl = `https://codeforces.com/api/user.status?handle=${username}&from=1`;
const userRatingListUrl = `https://codeforces.com/api/user.rating?handle=${username}`;
// Geting user data from official api of Codeforces
const userData = await fetch(getUserdataUrl).then(response => response.json()).then(data => data);
if(userData.status === 'FAILED') {
return {"message": "not found", "status": 404};
}
const userSubHistory = await fetch(userSubmissionHistoryUrl).then(response => response.json()).then(data => data);
const userRatingList = await fetch(userRatingListUrl).then(response => response.json()).then(data => data);
//create heatmap from submission history...................
// to make submission time into date formate
const formatDate = (timestamp) => {
const date = new Date(timestamp * 1000);
return date.toISOString().split('T')[0];
};
// Count submissions per date
const dateCounts = {};
userSubHistory.result.forEach(sub => {
const date = formatDate(sub.creationTimeSeconds);
dateCounts[date] = (dateCounts[date] || 0) + 1;
});
const uniqueDates = Object.keys(dateCounts).sort();
const heatMapData = uniqueDates.map((date) => ({
date: date,
value: dateCounts[date]
}));
const targetUrl = `https://codeforces.com/profile/${username}`;
const response = await fetch(targetUrl);
const d = await response.text();
const data = { data: d };
const dom = new JSDOM(data.data);
const document = dom.window.document;
const problemSolvedElement = document.querySelector('._UserActivityFrame_counterValue').innerHTML.split(" ")[0];
const problemSolved = parseInt(problemSolvedElement);
const userProfileData = {
userInfo: userData.result,
heatMap: heatMapData,
ratingData: userRatingList.result,
};
userProfileData.userInfo[0].problemSolved = problemSolved || 0
return userProfileData;
}
module.exports = getCodeforcesData;