一键获取前端面试题宝典题目

222 阅读4分钟

最近在前端面试题宝典刷面试题,顺便用ai写一下答案,再发个文章,但是从网页上一个一个复制题目太麻烦了,写文章的时候还不好排版,越写越烦。于是我就去看了一下前端面试题宝典的获取面试题首页的网络接口api,写了一个一键获取所有题目的js文件

import axios from 'axios'
import fs from 'fs'
import path from 'path'
import { fileURLToPath } from 'url'
const __dirname = path.dirname(fileURLToPath(import.meta.url))
let res = await axios.get(
  'https://fe.ecool.fun/api/exercise/list?vid=9&tagId=&exerciseCate=0&pageNum=1&pageSize=10000&ignoreMaster=1&difficulty=&orderBy=default&order=desc'
)
let a = res.data.data.list
let total = res.data.data.totalCount
console.log(total)
//获取所有的title
let titleList = res.data.data.list.map((item) => item.title)
console.log(titleList)
const titleall = titleList.map((item, index) => {
  return ` *${index + 1}. ${item}*\n`
})
// 将titleall写入titlelist.md中
fs.writeFileSync(path.join(__dirname, 'titlelist.md'), titleall.join(''))

结果是这样

屏幕截图 2024-09-26 144240.png 又看了一下他们获取答案的api,顺便把答案也搞出来。

屏幕截图 2024-09-26 144603.png 代码

import axios from 'axios'
import fs from 'fs'
import path from 'path'
import { fileURLToPath } from 'url'
const __dirname = path.dirname(fileURLToPath(import.meta.url))
//获取所有问题列表
let res = await axios.get(
  'https://fe.ecool.fun/api/exercise/list?vid=9&tagId=&exerciseCate=0&pageNum=1&pageSize=10000&ignoreMaster=1&difficulty=&orderBy=default&order=desc'
)
//面试题列表
let a = res.data.data.list
//总数
let total = res.data.data.totalCount
console.log(total)
//获取所有的title
let titleList = res.data.data.list.map((item) => item.title)
console.log(titleList)
const titleall = titleList.map((item, index) => {
  return ` *${index + 1}. ${item}*\n`
})
// 将titleall写入titlelist.md中
fs.writeFileSync(path.join(__dirname, 'titlelist.md'), titleall.join(''))

//获取所有exerciseKey
let exerciseKeys = []
exerciseKeys = a.map((item) => item.exerciseKey)

//封装请求方法 https://fe.ecool.fun/api/exercise/practice/detail?vid=9&difficulty=&exerciseCate=2&ignoreMaster=1&order=desc&orderBy=default&tagId=0&exerciseKey=84265789-cf7a-4d95-b724-665234c6eb10
async function getExerciseDetail(exerciseKey) {
  const res = await axios.get(
    `https://fe.ecool.fun/api/exercise/practice/detail?vid=9&difficulty=&exerciseCate=2&ignoreMaster=1&order=desc&orderBy=default&tagId=0&exerciseKey=${exerciseKey}`
  )

  return res.data
}
//通过axois获取所有题目 用for循环将结果res中的title、desc、options、explanation提取出来,对option做一下处理
let exerciseData = []
for (let i = 0; i < exerciseKeys.length; i++) {
  const exerciseKey = exerciseKeys[i]
  const res = await getExerciseDetail(exerciseKey)
  const exercise = res.data
  console.log(i)
  exerciseData.push({
    title: exercise.title,
    desc: exercise.desc,
    options: exercise.options
      ? '选项:\n' +
        JSON.parse(exercise.options)
          .options.map((item, index) => `${index}.  ${item}\n`)
          .join('') +
        `answer:  ${JSON.parse(exercise.options).answer}`
      : '',
    explanation: exercise.explanation
  })
}
// 目标文件
const filePath0 = path.join(__dirname, 'test0.md')
const filePath1 = path.join(__dirname, 'test1.md')
const filePath2 = path.join(__dirname, 'test2.md')
const filePath3 = path.join(__dirname, 'test3.md')
const filePath4 = path.join(__dirname, 'test4.md')
const filePath5 = path.join(__dirname, 'test5.md')
const filePath6 = path.join(__dirname, 'test6.md')
const filePath7 = path.join(__dirname, 'test7.md')
// 将exerciseData转成1.xxx 2.xxx 的形式
const content = exerciseData.map((item, index) => {
  console.log(index)

  return `# *${index + 1}. ${item.title}*\n\n${item.desc || ''}\n\n${item.options || ''}\n\n${item.explanation}`
})
// 将content的每200项写入一个文件,1482条太多了typora会不加载

fs.writeFileSync(filePath0, content.slice(0, 200).join('\n\n---\n\n'))
console.log('1.写入成功')
fs.writeFileSync(filePath1, content.slice(200, 400).join('\n\n---\n\n'))
console.log('2.写入成功')
fs.writeFileSync(filePath2, content.slice(400, 600).join('\n\n---\n\n'))
console.log('3.写入成功')
fs.writeFileSync(filePath3, content.slice(600, 800).join('\n\n---\n\n'))
console.log('4.写入成功')
fs.writeFileSync(filePath4, content.slice(800, 1000).join('\n\n---\n\n'))
console.log('5.写入成功')
fs.writeFileSync(filePath5, content.slice(1000, 1200).join('\n\n---\n\n'))
console.log('6.写入成功')
fs.writeFileSync(filePath6, content.slice(1200, 1400).join('\n\n---\n\n'))
console.log('7.写入成功')
fs.writeFileSync(filePath7, content.slice(1400, 1600).join('\n\n---\n\n'))
console.log('8.写入成功')

ok,暂时就这样吧。

新更改 每十条进行一次写入

import axios from 'axios'
import fs from 'fs'
import path from 'path'
import { fileURLToPath } from 'url'
const __dirname = path.dirname(fileURLToPath(import.meta.url))
let res = await axios.get(
  'https://fe.ecool.fun/api/exercise/list?vid=9&tagId=&exerciseCate=0&pageNum=1&pageSize=10000&ignoreMaster=1&difficulty=&orderBy=default&order=desc'
)
let a = res.data.data.list
let total = res.data.data.totalCount
console.log(total)
//获取所有的title
let titleList = res.data.data.list.map((item) => item.title)
console.log(titleList)
const titleall = titleList.map((item, index) => {
  return ` ${index + 1}. ${item}\n`
})
// 将titleall写入titlelist.md中
fs.writeFileSync(path.join(__dirname, 'titlelist.md'), titleall.join(''))
//获取所有exerciseKey
let exerciseKeys = []
exerciseKeys = a.map((item) => item.exerciseKey)
console.log(exerciseKeys)

// https://fe.ecool.fun/api/exercise/practice/detail?vid=9&difficulty=&exerciseCate=2&ignoreMaster=1&order=desc&orderBy=default&tagId=0&exerciseKey=84265789-cf7a-4d95-b724-665234c6eb10
// const exerciseKey = '84265789-cf7a-4d95-b724-665234c6eb10'
//使用axios

//封装请求方法 https://fe.ecool.fun/api/exercise/practice/detail?vid=9&difficulty=&exerciseCate=2&ignoreMaster=1&order=desc&orderBy=default&tagId=0&exerciseKey=84265789-cf7a-4d95-b724-665234c6eb10
async function getExerciseDetail(exerciseKey) {
  const res = await axios.get(
    `https://fe.ecool.fun/api/exercise/practice/detail?vid=9&difficulty=&exerciseCate=2&ignoreMaster=1&order=desc&orderBy=default&tagId=0&exerciseKey=${exerciseKey}`
  )

  return res.data
}
//通过axois获取所有题目 用for循环将结果res中的title、desc、options、explanation提取出来
let exerciseData = []
for (let i = 0; i < exerciseKeys.length; i++) {
  const exerciseKey = exerciseKeys[i]
  const res = await getExerciseDetail(exerciseKey)
  const exercise = res.data
  console.log(i)
  exerciseData.push({
    title: exercise.title,
    desc: exercise.desc,
    options: exercise.options
      ? '选项:\n' +
        JSON.parse(exercise.options)
          .options.map((item, index) => `${index}.  ${item}\n`)
          .join('') +
        `answer:  ${JSON.parse(exercise.options).answer}`
      : '',
    explanation: exercise.explanation
  })
}

// const filePath0 = path.join(__dirname, 'test0.md')
// const filePath1 = path.join(__dirname, 'test1.md')
// const filePath2 = path.join(__dirname, 'test2.md')
// const filePath3 = path.join(__dirname, 'test3.md')
// const filePath4 = path.join(__dirname, 'test4.md')
// const filePath5 = path.join(__dirname, 'test5.md')
// const filePath6 = path.join(__dirname, 'test6.md')
// const filePath7 = path.join(__dirname, 'test7.md')
// 将exerciseData以1.xxx 2.xxx 的形式写入test.md
const content = exerciseData.map((item, index) => {
  console.log(index)

  return `# *${index + 1}. ${item.title}*\n\n${item.desc || ''}\n\n${item.options || ''}\n\n${item.explanation}`
})
// 循环打印content每十项
// 定义一个函数来分组数据并写入文件
function writeGroupedExercisesToFile(content, groupNamePrefix) {
  // 每组包含的题目数量
  const itemsPerGroup = 10
  // 分组
  for (let groupIndex = 0; groupIndex < content.length; groupIndex += itemsPerGroup) {
    const end = Math.min(groupIndex + itemsPerGroup, content.length)
    const groupContent = content.slice(groupIndex, end).join('\n')
    // 构建文件路径
    const filePath = path.join(
      __dirname,
      `${groupNamePrefix}_${Math.floor(groupIndex / itemsPerGroup)}.md`
    )
    // 写入文件
    fs.writeFileSync(filePath, groupContent)
  }
}

// 调用函数将数据分组并写入文件
writeGroupedExercisesToFile(content, 'test')

console.log('所有题目已按组写入文件。')

// fs.writeFileSync(filePath0, content.slice(0, 200).join('\n\n---\n\n'))
// console.log('1.写入成功')
// fs.writeFileSync(filePath1, content.slice(200, 400).join('\n\n---\n\n'))
// console.log('2.写入成功')
// fs.writeFileSync(filePath2, content.slice(400, 600).join('\n\n---\n\n'))
// console.log('3.写入成功')
// fs.writeFileSync(filePath3, content.slice(600, 800).join('\n\n---\n\n'))
// console.log('4.写入成功')
// fs.writeFileSync(filePath4, content.slice(800, 1000).join('\n\n---\n\n'))
// console.log('5.写入成功')
// fs.writeFileSync(filePath5, content.slice(1000, 1200).join('\n\n---\n\n'))
// console.log('6.写入成功')
// fs.writeFileSync(filePath6, content.slice(1200, 1400).join('\n\n---\n\n'))
// console.log('7.写入成功')
// fs.writeFileSync(filePath7, content.slice(1400, 1600).join('\n\n---\n\n'))
// console.log('8.写入成功')

新更改 倒序写入

import axios from 'axios'
import fs from 'fs'
import path from 'path'
import { fileURLToPath } from 'url'
const __dirname = path.dirname(fileURLToPath(import.meta.url))
let res = await axios.get(
  'https://fe.ecool.fun/api/exercise/list?vid=9&tagId=&exerciseCate=0&pageNum=1&pageSize=10000&ignoreMaster=1&difficulty=&orderBy=default&order=desc'
)
let a = res.data.data.list
let total = res.data.data.totalCount
console.log(total)
//获取所有的title
let titleList = res.data.data.list.map((item) => item.title)
console.log(titleList)
const titleall = titleList.map((item, index) => {
  return ` ${index + 1}. ${item}\n`
})
// 将titleall写入titlelist.md中
fs.writeFileSync(path.join(__dirname, 'titlelist.md'), titleall.join(''))
//获取所有exerciseKey
let exerciseKeys = []
exerciseKeys = a.map((item) => item.exerciseKey)
console.log(exerciseKeys)

// https://fe.ecool.fun/api/exercise/practice/detail?vid=9&difficulty=&exerciseCate=2&ignoreMaster=1&order=desc&orderBy=default&tagId=0&exerciseKey=84265789-cf7a-4d95-b724-665234c6eb10
// const exerciseKey = '84265789-cf7a-4d95-b724-665234c6eb10'
//使用axios

//封装请求方法 https://fe.ecool.fun/api/exercise/practice/detail?vid=9&difficulty=&exerciseCate=2&ignoreMaster=1&order=desc&orderBy=default&tagId=0&exerciseKey=84265789-cf7a-4d95-b724-665234c6eb10
async function getExerciseDetail(exerciseKey) {
  const res = await axios.get(
    `https://fe.ecool.fun/api/exercise/practice/detail?vid=9&difficulty=&exerciseCate=2&ignoreMaster=1&order=desc&orderBy=default&tagId=0&exerciseKey=${exerciseKey}`
  )

  return res.data
}
//通过axois获取所有题目 用for循环将结果res中的title、desc、options、explanation提取出来
let exerciseData = []
for (let i = 0; i < exerciseKeys.length; i++) {
  const exerciseKey = exerciseKeys[i]
  const res = await getExerciseDetail(exerciseKey)
  const exercise = res.data
  console.log(`${i}/${total}`)
  exerciseData.push({
    title: exercise.title,
    desc: exercise.desc,
    options: exercise.options
      ? '选项:\n' +
        JSON.parse(exercise.options)
          .options.map((item, index) => `${index}.  ${item}\n`)
          .join('') +
        `answer:  ${JSON.parse(exercise.options).answer}`
      : '',
    explanation: exercise.explanation
  })
}

// const filePath0 = path.join(__dirname, 'test0.md')
// const filePath1 = path.join(__dirname, 'test1.md')
// const filePath2 = path.join(__dirname, 'test2.md')
// const filePath3 = path.join(__dirname, 'test3.md')
// const filePath4 = path.join(__dirname, 'test4.md')
// const filePath5 = path.join(__dirname, 'test5.md')
// const filePath6 = path.join(__dirname, 'test6.md')
// const filePath7 = path.join(__dirname, 'test7.md')
// 将exerciseData以1.xxx 2.xxx 的形式写入test.md
const content = exerciseData.map((item, index) => {
  console.log(index)

  return `# *${index + 1}. ${item.title}*\n\n${item.desc || ''}\n\n${item.options || ''}\n\n${item.explanation}`
})
// 将exerciseData以1.xxx 2.xxx 的形式翻转写入contentfz
const contentfz = exerciseData.map((item, index) => {
  return `# *${total - index}. ${item.title}*\n\n${item.desc || ''}\n\n${item.options || ''}\n\n${item.explanation}`
})
// 循环打印content每十项
// 定义一个函数来分组数据并写入文件
function writeGroupedExercisesToFile(content, groupNamePrefix) {
  // 每组包含的题目数量
  const itemsPerGroup = 10
  // 分组
  for (let groupIndex = 0; groupIndex < content.length; groupIndex += itemsPerGroup) {
    const end = Math.min(groupIndex + itemsPerGroup, content.length)
    const groupContent = content.slice(groupIndex, end).join('\n')
    // 构建文件路径
    const filePath = path.join(
      __dirname,
      `${groupNamePrefix}_${Math.floor(groupIndex / itemsPerGroup)}.md`
    )
    // 写入文件
    fs.writeFileSync(filePath, groupContent)
  }
}
function writeGroupedExercisesToFilefz(content, groupNamePrefix) {
  // 每组包含的题目数量
  const itemsPerGroup = 10

  // 先反转整个内容数组
  content.reverse()
  console.log(content)

  // 分组
  for (let groupIndex = 0; groupIndex < content.length; groupIndex += itemsPerGroup) {
    const end = Math.min(groupIndex + itemsPerGroup, content.length)
    const groupContent = content.slice(groupIndex, end).join('\n')

    // 构建文件路径
    const filePath = path.join(
      __dirname,
      `${groupNamePrefix}_${Math.floor(groupIndex / itemsPerGroup)}.md`
    )

    // 写入文件
    fs.writeFileSync(filePath, groupContent)
  }
}
// 调用函数将数据分组并写入文件
writeGroupedExercisesToFile(content, 'test')
writeGroupedExercisesToFilefz(contentfz, 'testfz')
console.log('所有题目已按组写入文件。')

// fs.writeFileSync(filePath0, content.slice(0, 200).join('\n\n---\n\n'))
// console.log('1.写入成功')
// fs.writeFileSync(filePath1, content.slice(200, 400).join('\n\n---\n\n'))
// console.log('2.写入成功')
// fs.writeFileSync(filePath2, content.slice(400, 600).join('\n\n---\n\n'))
// console.log('3.写入成功')
// fs.writeFileSync(filePath3, content.slice(600, 800).join('\n\n---\n\n'))
// console.log('4.写入成功')
// fs.writeFileSync(filePath4, content.slice(800, 1000).join('\n\n---\n\n'))
// console.log('5.写入成功')
// fs.writeFileSync(filePath5, content.slice(1000, 1200).join('\n\n---\n\n'))
// console.log('6.写入成功')
// fs.writeFileSync(filePath6, content.slice(1200, 1400).join('\n\n---\n\n'))
// console.log('7.写入成功')
// fs.writeFileSync(filePath7, content.slice(1400, 1600).join('\n\n---\n\n'))
// console.log('8.写入成功')