@leetnotion/leetcode-api
Version:
Get user profiles, submissions, and problems on LeetCode.
162 lines (120 loc) • 4.14 kB
Markdown
# @leetnotion/leetcode-api
A TypeScript library for interacting with LeetCode's API. Supports both LeetCode.com and LeetCode.cn, with authenticated and unauthenticated access, rate limiting, caching, and custom GraphQL queries.
## Installation
```bash
npm install @leetnotion/leetcode-api
# or
pnpm add @leetnotion/leetcode-api
```
## Features
### Without Authentication
- Get public user profile
- Get user's recent submissions (max: 20)
- Get user contest records
- Get problem list with optional filters (difficulty, tags)
- Get problem detail by slug
- Get daily challenge
- Get problem types for all questions
- Get title slug to question number mapping
- Get topic tags for all questions
- Get company tags
### With Authentication
- Get all submissions of the authenticated user
- Get submission details (code, percentiles)
- Check in to collect a coin
- Get and collect easter eggs
- Get user's LeetCode lists and questions within a list
- Get company tags per question (premium)
### Advanced
- `LeetCodeAdvanced` class with detailed problem fetching, custom problem properties, and batch operations
- `LeetCodeCN` class for LeetCode.cn
- Customizable GraphQL query API
- Customizable rate limiter (default: 20 req / 10 sec)
- Customizable fetcher (e.g., use Playwright for browser-based requests)
- In-memory TTL cache (replaceable)
## Usage
### Get a User's Public Profile
```typescript
import { LeetCode } from '@leetnotion/leetcode-api';
const leetcode = new LeetCode();
const user = await leetcode.user('username');
```
### Get Daily Challenge
```typescript
import { LeetCode } from '@leetnotion/leetcode-api';
const leetcode = new LeetCode();
const daily = await leetcode.daily();
```
### Get Problem Detail
```typescript
import { LeetCode } from '@leetnotion/leetcode-api';
const leetcode = new LeetCode();
const problem = await leetcode.problem('two-sum');
```
### Get Problems with Filters
```typescript
import { LeetCode } from '@leetnotion/leetcode-api';
const leetcode = new LeetCode();
const problems = await leetcode.problems({
category: 'algorithms',
offset: 0,
limit: 50,
filters: { difficulty: 'MEDIUM' },
});
```
### Get All Submissions (Authenticated)
```typescript
import { LeetCode, Credential } from '@leetnotion/leetcode-api';
const credential = new Credential();
await credential.init('YOUR-LEETCODE-SESSION-COOKIE');
const leetcode = new LeetCode(credential);
const submissions = await leetcode.submissions({ limit: 100, offset: 0 });
```
### Get Problem Types
```typescript
import { LeetCodeAdvanced } from '@leetnotion/leetcode-api';
const leetcode = new LeetCodeAdvanced();
const problemTypes = await leetcode.getProblemTypes();
// { "1": "algorithms", "595": "database", ... }
```
### Get Title Slug to Question Number Mapping
```typescript
import { LeetCodeAdvanced } from '@leetnotion/leetcode-api';
const leetcode = new LeetCodeAdvanced();
const mapping = await leetcode.getTitleSlugQuestionNumberMapping();
// { "two-sum": "1", "add-two-numbers": "2", ... }
```
### Use Custom Fetcher
You can use your own fetcher, for example, fetch through a real browser.
```typescript
import { LeetCode, fetcher } from '@leetnotion/leetcode-api';
import { chromium } from 'playwright-extra';
import stealth from 'puppeteer-extra-plugin-stealth';
const _browser = chromium.use(stealth()).launch();
const _page = _browser
.then((browser) => browser.newPage())
.then(async (page) => {
await page.goto('https://leetcode.com');
return page;
});
fetcher.set(async (...args) => {
const page = await _page;
const res = await page.evaluate(async (args) => {
const res = await fetch(...args);
return {
body: await res.text(),
status: res.status,
statusText: res.statusText,
headers: Object.fromEntries(res.headers),
};
}, args);
return new Response(res.body, res);
});
const lc = new LeetCode();
const daily = await lc.daily();
console.log(daily);
await _browser.then((browser) => browser.close());
```
## Links
- NPM Package: <https://www.npmjs.com/package/@leetnotion/leetcode-api>
- GitHub Repository: <https://github.com/codewithsathya/leetcode-api>