๐Ÿ“ฆ songquanpeng / stats-cards

๐Ÿ“„ leetcode-cn.js ยท 72 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72const axios = require('axios');

async function getLeetCodeCnInfo(username) {
  let result = {
    name: username,
    easy_solved: 0,
    medium_solved: 0,
    hard_solved: 0,
    total_solved: 0,
    acceptance: '0%',
    star_rating: 0
  };
  
  let headers = {};
  
  try {
    let queryData = {
      query: `
        query userSessionProgress($userSlug: String!) {
          userProfileUserQuestionSubmitStats(userSlug: $userSlug) {
            acSubmissionNum {
              difficulty
              count
            }
            totalSubmissionNum {
              difficulty
              count
            }
          }
          userProfileUserQuestionProgress(userSlug: $userSlug) {
            numAcceptedQuestions {
              difficulty
              count
            }
            numFailedQuestions {
              difficulty
              count
            }
            numUntouchedQuestions {
              difficulty
              count
            }
          }
        }
      `,
      variables: { userSlug: `${username}` },
      operationName: 'userSessionProgress'
    };

    let response = await axios.post('https://leetcode.cn/graphql', queryData, { headers });

    const submitStats = response.data.data.userProfileUserQuestionSubmitStats;
    const progressStats = response.data.data.userProfileUserQuestionProgress;

    result.easy_solved = progressStats.numAcceptedQuestions.find(item => item.difficulty === 'EASY').count;
    result.medium_solved = progressStats.numAcceptedQuestions.find(item => item.difficulty === 'MEDIUM').count;
    result.hard_solved = progressStats.numAcceptedQuestions.find(item => item.difficulty === 'HARD').count;
    result.total_solved = result.easy_solved + result.medium_solved + result.hard_solved;

    let totalSubmitNum = submitStats.totalSubmissionNum.reduce((acc, item) => acc + item.count, 0);
    let acceptSubmitNum = submitStats.acSubmissionNum.reduce((acc, item) => acc + item.count, 0);
    
    result.acceptance = ((acceptSubmitNum / totalSubmitNum) * 100).toFixed(1) + '%';
    result.star_rating = 0;
  } catch (e) {
    console.error(e.message);
  }
  return result;
}

module.exports = getLeetCodeCnInfo;