vue + webpack如何绕过QQ音乐接口对host的验证详解


Posted in Javascript onJuly 01, 2018

前言

最近在使用vue2.5+webpack3.6撸一个移动端音乐项目, 获取全部歌单json数据时遇到了接口对host和referer的限制 ,故不能直接在前端使用jsonp对接口数据的读取。 

一、 先实现使用jsonp读取的方式安装jsonp模块并, 封装请求方法

1. $ npm install -S jsonp

2. 封装import originJSONP from 'jsonp'

function jsonp(url, data, options) {
 // 如果存在?则直接加params(data), 否则先加?再加 params(data)
 url += (url.indexOf('?') < 0 ? '?' : '') + params(data)
 // 结果返回一个Promise对象
 return new Promise((resolve, reject) => {
 originJSONP(url, options, (err, data) => {
  if (!err) {
  resolve(data)
  } else {
  reject(err)
  }
 })
 })
}

function params(data) {
 let params = ''
 for (var k in data) {
 let value = data[k] != undefined ? data[k] : ''
 // url += '&' + k + '=' + encodeURIComponent(value) ES5
 params += `&${k}=${encodeURIComponent(value)}` // ES6
 }
 // 去掉首个参数的&, 因为jsonp方法中参数自带&
 return params ? params.substring(1) : ''
}

3. 请求数据

vue + webpack如何绕过QQ音乐接口对host的验证详解

# 代码
 const commonParams = {
 g_tk: 5381,
 inCharset: 'utf-8',
 outCharset: 'utf-8',
 notice: 0,
 format: 'jsonp'
}
const options = {
 param: 'jsonpCallback'
}

getRecommend() {
 const url = 'https://c.y.qq.com/musichall/fcgi-bin/fcg_yqqhomepagerecommend.fcg'
 const data = Object.assign({}, commonParams, {
 platform: 'h5',
 uin: 0,
 needNewCode: 1
 })
 return jsonp(url, data, options)
}

4. 组件内调用getRecommend()方法, 获取数据

methods: {
 _getRecommend() {
 getRecommend().then((res) => {
  // ERR_OK = 0是自定义的语义化参数, 对应返回json对象的code
  if (res.code === ERR_OK) {
  console.log(res.data)
  const data = res.data
  this.slider = data.slider
  }
 })
 }
},
created() {
 this._getRecommend()
}

console.log(res.data)可打印出json数据

vue + webpack如何绕过QQ音乐接口对host的验证详解

以上是使用jsonp的方式请求数据, 但对于被host和referer限制的json, 需要绕过host验证,先让服务端请求接口,前端页面再通过服务端请求数据。而不能像jsonp那样直接前端请求json对象。报错如下

vue + webpack如何绕过QQ音乐接口对host的验证详解

二、后端axios(ajax)请求接口数据

1.  定义后端代理请求 build/webpack.dev.config.js

const axios = require('axios')
devServer: {
 before(app) {
 app.get('/api/getDiscList', function (req, res) {
  var url = 'https://c.y.qq.com/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg'
  axios.get(url, {
  headers: {
   referer: 'https://c.y.qq.com/',
   host: 'c.y.qq.com'
  },
  params: req.query
  }).then((response) => {
  res.json(response.data)
  }).catch((e) => {
  console.log(e)
  })
 })
 },
 # ...其他原来的代码
}

2.  前端请求后端已获取的远程数据

import axios from 'axios'function getDiscList() {
 // const url = 'https://c.y.qq.com/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg'
 const url = '/api/getDiscList'
 const data = Object.assign({}, commonParams, {
 // 以下参数自行参考源json文件的Query String Parameters
 platform: 'yqq',
 uin: 0,
 needNewCode: 0,
 hostUin: 0,
 sin: 0,
 ein: 29,
 sortId: 5,
 rnd: Math.random(),
 categoryId: 10000000,
 format: 'json'
 })
 return axios.get(url, {
 params: data
 }).then((res) => {
 return Promise.resolve(res.data)
 })
}

vue + webpack如何绕过QQ音乐接口对host的验证详解

3. 组件内调用getDiscList()方法, 可输出json数据

methods: {
 _getRecommend() {
 getRecommend().then((res) => {
  if (res.code === ERR_OK) {
  // console.log(res.data)
  const data = res.data
  this.slider = data.slider
  }
 })
 },
 _getDiscList() {
 getDiscList().then((res) => {
  console.log(res.data)
 })
 }
},
created() {
 this._getRecommend()
 this._getDiscList()
}

总结, vue+webpack项目中,如需请求获取远程json数据时, 一般由两种情况:

1. 未受host和referer限制的前端组件可以直接使用jsonp插件请求json对象

2. 受host和referer限制需要验证的, 通过后端代理方式,使用axios请求, 前端再请求后端json对象

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jQuery select控制插件
Aug 17 Javascript
简短几句 通俗解释javascript的闭包
Jan 17 Javascript
使用jquery选择器如何获取父级元素、同级元素、子元素
May 14 Javascript
在JavaScript中使用开平方根的sqrt()方法
Jun 15 Javascript
使用AngularJS实现可伸缩的页面切换的方法
Jun 19 Javascript
JS判断form内所有表单是否为空的简单实例
Sep 09 Javascript
JavaScript实现通过select标签跳转网页的方法
Sep 29 Javascript
纯js实现倒计时功能
Jan 06 Javascript
JS实现带导航城市列表以及输入搜索功能
Jan 04 Javascript
微信小程序商品详情页的底部弹出框效果
Nov 16 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
Nov 29 Javascript
Vue项目打包编译优化方案
Sep 16 Javascript
关于Vue组件库开发详析
Jul 01 #Javascript
D3.js实现拓扑图的示例代码
Jun 30 #Javascript
详解angular如何调用HTML字符串的方法
Jun 30 #Javascript
angular6.0使用教程之父组件通过url传递id给子组件的方法
Jun 30 #Javascript
基于webpack4搭建的react项目框架的方法
Jun 30 #Javascript
AngularJs分页插件使用详解
Jun 30 #Javascript
ionic grid(栅格)九宫格制作详解
Jun 30 #Javascript
You might like
总集篇&特番节目先行播出!《SAO Alicization War of Underworld》第2季度TV动画4月25日放送!
2020/03/06 日漫
选择PHP作为网站开发语言的原因分享
2012/01/03 PHP
基于php验证码函数的使用示例
2013/05/03 PHP
PHP文件操作方法汇总
2015/07/01 PHP
PHP实现随机发放扑克牌
2020/04/21 PHP
JS 统计时间
2021/03/09 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
2015/10/25 Javascript
JS实现slide文字框缩放伸展效果代码
2015/11/05 Javascript
JavaScript实现多种排序算法
2016/02/24 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
Centos7 中 Node.js安装简单方法
2016/11/02 Javascript
JavaScript+HTML5实现的日期比较功能示例
2017/07/12 Javascript
bootstrap table服务端实现分页效果
2017/08/10 Javascript
浅谈Node Inspector 代理实现
2017/10/19 Javascript
jquery学习笔记之无new构建详解
2017/12/07 jQuery
jquery validate 实现动态增加/删除验证规则操作示例
2019/10/28 jQuery
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
python网络编程之文件下载实例分析
2015/05/20 Python
Python中动态检测编码chardet的使用教程
2017/07/06 Python
Python调用微信公众平台接口操作示例
2017/07/08 Python
Python实现自动发送邮件功能
2021/03/02 Python
python机器学习之神经网络(三)
2017/12/20 Python
PyCharm的设置方法和第一个Python程序的建立
2019/01/16 Python
Python 中 -m 的典型用法、原理解析与发展演变
2019/11/11 Python
在PyTorch中使用标签平滑正则化的问题
2020/04/03 Python
python:解析requests返回的response(json格式)说明
2020/04/30 Python
大学校务公开实施方案
2014/03/31 职场文书
小学毕业演讲稿
2014/04/25 职场文书
干部考核评语
2014/04/29 职场文书
支教个人总结
2015/03/04 职场文书
离开雷锋的日子观后感
2015/06/09 职场文书
2016领导干部廉洁自律心得体会
2016/01/13 职场文书
浅谈Python数学建模之数据导入
2021/06/23 Python
奥特曼十大神器:奥特手镯在榜,第一是贝利亚的神器
2022/03/18 日漫
tomcat下部署jenkins的方法
2022/05/06 Servers