Научу, как использовать Node для реализации переадресации API (средний уровень узла) (музыка)

Node.js

Преимущества API переадресации узлов (средний уровень узла)

  • Данные java|php могут быть преобразованы в формат, более удобный для внешнего интерфейса на среднем уровне.
  • Это может решить междоменную проблему внешнего интерфейса, потому что запрос на стороне сервера не включает междоменный запрос, а междоменный вызов вызван политикой браузера с одним и тем же источником.
  • Несколько запросов могут быть объединены через средний уровень, чтобы уменьшить количество внешних запросов.
  • API forwarding: небольшие проекты, написанные вами, вы можете использовать некоторые реальные данные от других людей, чтобы сделать это😂😂😂
  • ......

узел, экспресс

Node.jsЭто среда выполнения JavaScript, основанная на движке Chrome V8. Node.js использует управляемую событиями неблокирующую модель ввода-вывода, что делает ее легкой и эффективной.
ExpressОснован на платформе Node.js — быстрой, открытой и минималистичной среде веб-разработки.
nodemonПакет подключаемых модулей, который может реализовать горячее обновление узла.

Начать быстро

Каталог документов

├── dist
├── node_modules
├── public
│   └── index.html
├── src
│   └── apiList
│       ├── index.js
│       └── client_play_list_tag.js
│       └── ...
│   └── utils
│       └── request.js
│       └── userAgent.js
│   ├── index.js
├── package.json

package.json

{
 "name": "testnodeapi",
 "version": "1.0.0",
 "description": "",
 "main": "index.js",
 "scripts": {
   "test": "echo \"Error: no test specified\" && exit 1",
   "dev": "nodemon src/index.js"
 },
 "author": "alkun",
 "license": "ISC",
 "dependencies": {
   "axios": "^0.19.0",
   "express": "^4.17.1"
 },
 "devDependencies": {
   "nodemon": "^1.19.2"
 }
}

Шаг 1: Настройте файл ввода index.ts

  1. Во-первых, вам нужно импортировать скачанный установочный пакет и попробовать запустить службу
    const express = require('express')
    const app = express()
    const port = 3001
    app.use((req, res) => {
        res.send('hahhaha')
    })
    app.listen(port, ()=>{
        console.log(`Example app listening on http://127.0.0.1:${port}`)
    })
    

Шаг 2: Установите axios и реализуйте простую переадресацию

    ...
    const axios = require('axios')
   
    app.use(async (req, res) => {
        let resp = await axios({
            baseURL: 'http://m.music.migu.cn/migu/remoting/',
            method: 'get',
            url: '/client_play_list_tag',
        })
        res.send(resp.data)
    })
    
    app.listen(port, () => {
        console.log(`Example app listening on http://127.0.0.1:${port]`)
    })

Шаг 3: Нам нужны простые пакеты для Axio

// 在utils文件夹中创建 request.js文件,用来处理axios
const axios = require('axios')
const userAgent = require('./userAgent')
const request = (paramInfo) => {
    function getDataFn(obj) {
        let getData = {
            url: obj.url,
            method: obj.method ||'get',
            baseURL: 'http://m.music.migu.cn/migu/remoting/',
            headers: {
                'User-Agent': userAgent(),
            }
        }
        if (getData.method == 'get'){
            getData.params = obj.data
        } else {
            getData.data = obj.data
        }
        return getData
    }
    
    if(!Array.isArray(paramInfo)){
        return axios(getDataFn(paramInfo))
    } else {
        let fetchArray = paramInfo.map(v => {
            return axios(getDataFn(v))
        })
        return new Promise((resolve, reject) => {
            axios.all(fetchArray)
            .then(axios.spread(function (...arg) {
                // 多个请求现在都执行完成
                resolve(arg)
            })).catch(err => {
                console.log(err)
            })
        })

    }
}

module.exports = request

Шаг 4: Создайте случайный User-Agent

// 返回一个随机的请求头 headers的UA
const user_agent_list = [
    // 各种PC端
    // Safari
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2",
    // chrome
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",
    // 360
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36",
    "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko",
    // QQ浏览器
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
    // sogou浏览器
    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)",
    // 各种移动端
    // IPhone
    "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    // IPod
    "Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    // IPAD
    "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
    "Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    // Android
    "Mozilla/5.0 (Linux; U; Android 2.2.1; zh-cn; HTC_Wildfire_A3333 Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    "Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    // QQ浏览器 Android版本
    "MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    // Android Opera Mobile
    "Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10",
    // Android Pad Moto Xoom
    "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
    // BlackBerry
    "Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+",
    // WebOS HP Touchpad
    "Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0",
    // Nokia N97
    "Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124",
    // Windows Phone Mango
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)",
    // UC浏览器
    "UCWEB7.0.2.37/28/999",
    "NOKIA5700/ UCWEB7.0.2.37/28/999",
    // UCOpenwave
    "Openwave/ UCWEB7.0.2.37/28/999",
    // UC Opera
    "Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999",
    // 一部分 PC端的
    "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]

module.exports = () =>{
    let index = Math.floor(Math.random() * user_agent_list.length)
    return user_agent_list[index]
}

Шаг 5: Инкапсуляция apiList

// 在apiList文件夹下面穿件client_play_list_tag.js文件
/**
 * @todo 推荐歌单首页推荐模块
 * @api /client_play_list_tag
 * @param {}
 */
module.exports = (app) => {
    app.get('/client_play_list_tag', async (req, res) => {
        try {
            let result = await app.request({
                url: "client_play_list_tag",
                data: {
                    ...req.query
                }
            })
            res.send(result.data)
        } catch (err) {
            res.send({ code: -500, msg: err.message })
        }
    })
}

Шаг шестой: ./apiList/index.js необходимо создать файл записи в текущей папке

const fs = require('fs')
const path = require('path')

const request = require('../utils/request')

// 查找出当前文件夹所有的api文件名
const routes = fs.readdirSync(__dirname).filter(item => item.indexOf('index') != 0)
module.exports = (router) => {
    // 将请求放到每个实例中
    router.request = request
    routes.forEach((item) => {
        let routeFn = require(path.resolve(__dirname, item))
        routeFn(router)
    })
    return router
}

Наконец: обновите наш полный файл index.js.

const express = require('express')
const Router = express.Router()

const app = express()

const apiList  = require('./apiList')
const port = 3001
app.use((req, res, next) => {
    res.set('Access-Control-Allow-Origin', '*')
    next()
})

// 挂载路由
app.use(apiList(Router))

app.listen(port, () => {
    console.log(`Example app listening on http://127.0.0.1:${port}`)
})


Написано здесь, в этой статье в основном реализована эта функция переадресации музыкального апи, и есть некоторые другие интерфейсы, вам нужно перейти к ним самостоятельно.

Примечание:

Код, использованный в этой статье, по-прежнему очень прост, и более продвинутые функции нужно использовать самостоятельно.
Вот полная версия кода,TS + Node + ExpressДобро пожаловать ЗВЕЗДА ЗВЕЗДА ЗВЕЗДАПортал >>