#!/bin/bash set -e query() { page=$1 offset=$((page * 100)) # shellcheck disable=SC2016 curl -sSLf 'https://leetcode.com/graphql/' \ --compressed \ -H 'content-type: application/json' \ --data-raw '{ "query": "\n query problemsetQuestionListV2($filters: QuestionFilterInput, $limit: Int, $searchKeyword: String, $skip: Int, $sortBy: QuestionSortByInput, $categorySlug: String) {\n problemsetQuestionListV2(\n filters: $filters\n limit: $limit\n searchKeyword: $searchKeyword\n skip: $skip\n sortBy: $sortBy\n categorySlug: $categorySlug\n ) {\n questions {\n id\n titleSlug\n title\n translatedTitle\n questionFrontendId\n paidOnly\n difficulty\n topicTags {\n name\n slug\n nameTranslated\n }\n status\n isInMyFavorites\n frequency\n acRate\n contestPoint\n }\n totalLength\n finishedLength\n hasMore\n }\n}\n ", "variables": { "skip": '"$offset"', "limit": 100, "categorySlug": "all-code-essentials", "filters": {"filterCombineType":"ALL","statusFilter":{"questionStatuses":[],"operator":"IS"},"difficultyFilter":{"difficulties":[],"operator":"IS"},"languageFilter":{"languageSlugs":[],"operator":"IS"},"topicFilter":{"topicSlugs":[],"operator":"IS"},"acceptanceFilter":{},"frequencyFilter":{},"frontendIdFilter":{},"lastSubmittedFilter":{},"publishedFilter":{},"companyFilter":{"companySlugs":[],"operator":"IS"},"positionFilter":{"positionSlugs":[],"operator":"IS"},"positionLevelFilter":{"positionLevelSlugs":[],"operator":"IS"},"contestPointFilter":{"contestPoints":[],"operator":"IS"},"premiumFilter":{"premiumStatus":[],"operator":"IS"}}, "searchKeyword": "", "sortBy": {"sortField":"CUSTOM","sortOrder":"ASCENDING"}, "filtersV2": {"filterCombineType":"ALL","statusFilter":{"questionStatuses":[],"operator":"IS"},"difficultyFilter":{"difficulties":[],"operator":"IS"},"languageFilter":{"languageSlugs":[],"operator":"IS"},"topicFilter":{"topicSlugs":[],"operator":"IS"},"acceptanceFilter":{},"frequencyFilter":{},"frontendIdFilter":{},"lastSubmittedFilter":{},"publishedFilter":{},"companyFilter":{"companySlugs":[],"operator":"IS"},"positionFilter":{"positionSlugs":[],"operator":"IS"},"positionLevelFilter":{"positionLevelSlugs":[],"operator":"IS"},"contestPointFilter":{"contestPoints":[],"operator":"IS"},"premiumFilter":{"premiumStatus":[],"operator":"IS"}} }, "operationName": "problemsetQuestionListV2" }' | jq -c '.data.problemsetQuestionListV2.questions[] | { id, title, titleSlug, difficulty, paidOnly, tags: [ .topicTags[] | .slug ] }' } page=0 while true; do echo -ne " Querying page $((page + 1)) ...\r" >&2 content=$(query $page) lines=$(echo "$content" | wc -l) echo "$content" [ "$lines" -lt 100 ] && break page=$((page + 1)) done | jq -s -c 'sort_by(.id) | .[]' echo >&2