扒个表情包

209 阅读1分钟

node.js扒个表情包,聊天免尴尬

  • 依赖
// package.json
{
  "name": "batu",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "cheerio": "^1.0.0-rc.3"
  },
  "dependencies": {
    "axios": "^0.19.0"
  }
}

  • 拉取页面
// app.js
const https = require('https')
const cheerio = require('cheerio')
const request = require('./request')
const fs = require('fs')
const hostname = 'fabiaoqing.com'

async function getPageImage(path) {
  let pageContentBuffer = await request({
    hostname,
    path,
  })
  let pageContent = pageContentBuffer.toString('UTF-8')
  const pageDom = cheerio.load(pageContent)
  Array.from(pageDom('#bqblist > a')).forEach(async a => {
    let pageDetailPath = pageDom(a).attr('href')
    // 获取详情
    let pageDetailBuffer = await request({
      hostname,
      path: pageDetailPath
    })
    let pageDetailContent = pageDetailBuffer.toString('UTF-8')
    const detailDom = cheerio.load(pageDetailContent)
    let title = detailDom('#bqb > div:first-child > h1').text()
    let images = detailDom('#bqb > div:first-child .swiper-wrapper img')
    images.each(async (index, img) => {
      let imgUrl = img.attribs['data-original']
      let imgTitle = img.attribs.title
      let suffix = imgUrl.slice(imgUrl.lastIndexOf('.'))
      let folderPath = `../表情包/${title}`
      let imgContent = await request(imgUrl, 'http')
      fs.mkdirSync(folderPath, { recursive: true })
      console.log(`${folderPath}/${imgTitle}${suffix}`, imgUrl, imgContent)
      fs.writeFile(`${folderPath}/${imgTitle}${suffix}`, imgContent, err => {
        if (err) {
          console.log(err, 'write-err')
        }
      })
    })

  })
}

getPageImage('/bqb/lists/type/hot/page/1.html')

  • 请求配置
// request
const https = require('https')
const http = require('http')

module.exports = function request(params, protocol) {
  const fetchs = protocol ? http : https
  return new Promise((resolve, reject) => {
    debugger
    let data = params
    if (params instanceof Object) {
      let { hostname, path, method = 'GET' } = params
      data = {
        hostname,
        path,
        method,
      }
    }
    let req = fetchs.request(data, (res) => {
      let tempBuffers = []
      let size = 0
      res.on('data', buffer => {
        tempBuffers.push(buffer)
        size += buffer.length
      });
      res.on('end', () => {
        let buf = Buffer.concat(tempBuffers, size)
        resolve(buf)
      })
    })

    req.on('error', (err) => {
      console.error(err, 'requires-error');
      reject(err)
    });
    req.end();
  })
}