Skip to content
4 changes: 3 additions & 1 deletion .github/workflows/run-cron.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,11 @@ jobs:
architecture: 'x64'
- run: |
python -m pip install --upgrade pip
pip install requests
pip install requests python-leetcode
- run: |
python cron/update_questions.py
env:
LEETCODE_SESSION_TOKEN: ${{ secrets.LEETCODE_SESSION_TOKEN }}
- uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: Update questions via run-cron GitHub Action
65 changes: 49 additions & 16 deletions cron/update_questions.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
import os
import json
import requests
import leetcode
import leetcode.auth
from datetime import datetime

query = '''query questionData($titleSlug: String!) {
question(titleSlug: $titleSlug) {
difficulty
}
}
'''
LEETCODE_SESSION_TOKEN = os.environ.get("LEETCODE_SESSION_TOKEN")

questions_file = os.getcwd() + "/src/data/questions.json"

Expand All @@ -25,19 +21,56 @@

startTime = datetime.now()

for question in questions["data"]:
variables = {"titleSlug": question["url"]}
csrf_token = leetcode.auth.get_csrf_cookie(LEETCODE_SESSION_TOKEN)

configuration = leetcode.Configuration()

configuration.api_key["x-csrftoken"] = csrf_token
configuration.api_key["csrftoken"] = csrf_token
configuration.api_key["LEETCODE_SESSION"] = LEETCODE_SESSION_TOKEN
configuration.api_key["Referer"] = "https://leetcode.com"
configuration.debug = False

response = requests.post("https://leetcode.com/graphql",
json={"query": query, "variables": variables}
api_instance = leetcode.DefaultApi(leetcode.ApiClient(configuration))

for question in questions["data"]:
graphql_request = leetcode.GraphqlQuery(
query='''query questionData($titleSlug: String!) {
question(titleSlug: $titleSlug) {
title
difficulty
companyTagStats
isPaidOnly
}
}
''',
variables=leetcode.GraphqlQueryGetQuestionDetailVariables(
title_slug=question["slug"])
)

our_difficulty = question["difficulty"]
leetcode_difficulty = response.json()["data"]["question"]["difficulty"]
response = api_instance.graphql_post(body=graphql_request).to_dict()

leetcode_title = response["data"]["question"]["title"]
leetcode_difficulty = response["data"]["question"]["difficulty"]
leetcode_companies = json.loads(
response["data"]["question"]["company_tag_stats"])["1"]
leetcode_premium = response["data"]["question"]["is_paid_only"]

companies = []

for leetcode_company in leetcode_companies:
company = {
"name": leetcode_company["name"],
"slug": leetcode_company["slug"],
"frequency": leetcode_company["timesEncountered"]
}

companies.append(company)

if leetcode_difficulty != our_difficulty:
print(f'{question["name"]}: {our_difficulty} -> {leetcode_difficulty}')
question["difficulty"] = leetcode_difficulty
question["title"] = leetcode_title
question["difficulty"] = leetcode_difficulty
question["companies"] = companies
question["premium"] = leetcode_premium

print("=== Finished checking all questions ===")

Expand Down
34 changes: 22 additions & 12 deletions src/components/Table/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import {
} from './filters';
import { Event } from '../Shared/Tracking';

import questions from '../../data';
import questions, { updated } from '../../data';

import 'react-toggle/style.css';
import './styles.scss';
Expand Down Expand Up @@ -239,12 +239,12 @@ const Table = () => {
return (
<NavLink
target="_blank"
href={`https://leetcode.com/problems/${cellInfo.row.original.url}/`}
href={`https://leetcode.com/problems/${cellInfo.row.original.slug}/`}
onClick={() => {
Event(
'Table',
'Clicked question url',
`${cellInfo.row.original.name} question url`,
'Clicked question title',
`${cellInfo.row.original.title} question title`,
);
}}
>
Expand All @@ -255,7 +255,7 @@ const Table = () => {
) : (
''
)}
{cellInfo.row.original.name}
{cellInfo.row.original.title}
</NavLink>
);
},
Expand All @@ -266,7 +266,7 @@ const Table = () => {
accessor: 'solutions',
disableSortBy: true,
Cell: cellInfo => {
const url = `https://leetcode.com/problems/${cellInfo.row.original.url}/`;
const url = `https://leetcode.com/problems/${cellInfo.row.original.slug}/`;
return (
<NavLink
target="_blank"
Expand All @@ -275,7 +275,7 @@ const Table = () => {
Event(
'Table',
'Clicked solution',
`${cellInfo.row.original.name} solution`,
`${cellInfo.row.original.slug} solution`,
);
}}
>
Expand Down Expand Up @@ -353,13 +353,21 @@ const Table = () => {
},
{
Header: () => {
const date = new Date(updated);
const month = date.toLocaleString('default', {
month: 'long',
});
const day = date.getDay();
const year = date.getFullYear();
return (
<>
<div
style={{ whiteSpace: 'nowrap', display: 'inline-block' }}
>
Companies{' '}
<span data-tip="Companies retrieved from Leetcode Premium (January 2022)">
<span
data-tip={`Companies retrieved from Leetcode Premium on ${month} ${day}, ${year} - thanks to @leo-step!`}
>
<FaQuestionCircle />
</span>
</div>
Expand All @@ -376,13 +384,15 @@ const Table = () => {
: -1;
},
Cell: cellInfo => {
const questionSlug = cellInfo.row.original.slug;
const companies = cellInfo.row.original.companies.map(company => {
const tooltipText = `Asked by ${company.name} ${company.frequency} times`;
return (
<img
key={company}
src={`${iconPath}${company}.png`}
alt={company}
data-tip={company}
key={`${questionSlug}-${company.name}`}
src={`${iconPath}${company.slug}.png`}
alt={company.name}
data-tip={tooltipText}
/>
);
});
Expand Down
6 changes: 3 additions & 3 deletions src/data/index.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import questions from './questions.json';

const sortBy = { Easy: 0, Medium: 1, Hard: 2 };
const { updated, data } = questions;

export default questions.data.sort(
(a, b) => sortBy[a.difficulty] - sortBy[b.difficulty],
);
export { updated };
export default data.sort((a, b) => sortBy[a.difficulty] - sortBy[b.difficulty]);
Loading