Skip to content

Instantly share code, notes, and snippets.

@cyyyu
Last active December 27, 2020 16:23
Show Gist options
  • Save cyyyu/3d41fe49083ce88c5aa339db42fdc0ec to your computer and use it in GitHub Desktop.
Save cyyyu/3d41fe49083ce88c5aa339db42fdc0ec to your computer and use it in GitHub Desktop.
update your leetcode prorgess to a gist
LEETCODE_USER=leetcode username
GITHUB_TOKEN=github token
GIST_ID=gist id
GIST_FILE=progress.txt

leetcode progress gist

this script writes your leetcode progess to a gist

see https://github.com/cyyyu

usage

retrive a github token

create a gist and retrive the id

update .env file

npm install then node update.js

{
"name": "leetcode-progress-gist",
"version": "0.1.0",
"description": "update my leetcode progress to gist",
"main": "update.js",
"keywords": [
"leetcode"
],
"author": "Chuang Yu",
"license": "MIT",
"dependencies": {
"axios": "^0.19.2",
"cheerio": "^1.0.0-rc.3",
"dotenv": "^8.2.0"
}
}
"use strict";
require("dotenv").config();
const axios = require("axios");
const cheerio = require("cheerio");
const USER_PAGE = `https://leetcode.com/${process.env.LEETCODE_USER}/`;
const TOKEN = process.env.GITHUB_TOKEN;
const GIST_ID = process.env.GIST_ID;
const GIST_FILE = process.env.GIST_FILE;
const API = `https://api.github.com/gists/${GIST_ID}`;
const HEADERS = { Authorization: `token ${TOKEN}` };
const MAX_LEN = 56;
main();
async function main() {
const pageRes = await axios.get(USER_PAGE);
const html = pageRes.data;
const $ = cheerio.load(html);
// extract info
const panels = $("body .panel.panel-default");
const progressPanel = panels[2];
const mostRecentSubmissionsPanel = panels[7];
const listGroup = $("ul.list-group", progressPanel);
const badges = $("li.list-group-item .badge", listGroup);
const solvedQuestions = $(badges[0])
.text()
.split("/");
const mostRecentSubmissionNode = $("ul a b", mostRecentSubmissionsPanel)[0];
const mostRecentSubmission = $(mostRecentSubmissionNode).text();
const info = {
solved: solvedQuestions[0].trim(),
total: solvedQuestions[1].trim(),
latest: mostRecentSubmission
};
const gistContent = [];
const solved = info.solved + "/" + info.total;
gistContent.push(
"progress : ",
genProgressBar(info.solved, info.total, MAX_LEN - 13),
"\r\n"
);
gistContent.push("solved : ", solved.padStart(MAX_LEN - 13), "\r\n");
gistContent.push("last solved: ", info.latest.padStart(MAX_LEN - 13));
// update gist
const newGist = { files: {} };
newGist.files[GIST_FILE] = { content: gistContent.join("") };
const updateRes = await axios.patch(API, newGist, { headers: HEADERS });
if (updateRes.status === 200) console.log("Updated");
function genProgressBar(done, total, len = MAX_LEN) {
const empty = "-";
const filled = "▇";
const numOfFilled = Math.floor(len * (done / total));
return (
new Array(numOfFilled).fill(filled).join("") +
new Array(len - numOfFilled).fill(empty).join("")
);
}
}
@seognil
Copy link

seognil commented Apr 16, 2020

Cool stuff!
Any idea to make it automatic? like this https://github.com/matchai/waka-box
Or maybe an npm package as a commit hook for local leetcode coding.

@cyyyu
Copy link
Author

cyyyu commented Apr 17, 2020

@seognil waka-box is using crontab but i don't think having one more configuration file for this is necessary.
if you want to schedule the update you can for example do 30 3 * * * node update.js (update at 3:30am everyday)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment