这一篇我们来尝尝免费的面包,至少目前是这样的。

QQ音乐相信大家或多或少都使用过,里面的音乐资源非常多。

这个时候你可能就明白了,没错,我们要在游戏中使用QQ音乐的资源当背景音乐~~~~~哦耶~!

咳咳,不过呢,由于QQ音乐在线接口是加密的,所以我们需要一系列工作来解密并调用。可要做好准备哟!

先放一张预览图:

过程其实很简单。

第一步:申请QQ音乐服务器访问权限。

第二步:获取不同的音乐列表(根据你的选择获取到)。

第三步:根据不同列表进行分析。

第四步:获取音乐信息。

第五步:从音乐信息中分析数据。

第六步:播放音乐。

  1. /*
  2. QQ音乐插件
  3. */
  4. void function (w) {
  5. // QQ音乐对象
  6. var QQMusic = {};
  7. setInterval(function getJurisdiction() {
  8. /// <summary>申请QQ音乐服务器访问权限</summary>
  9. injectScript("http://qzone-music.qq.com/fcg-bin/fcg_set_musiccookie.fcg?fromtag=31");
  10. return getJurisdiction;
  11. }(), 3 * 60 * 1000);
  12. function injectScript(url) {
  13. /// <summary>引用脚本</summary>
  14. /// <param name="url" type="String">地址</param>
  15. var oScript = document.createElement("script");
  16. oScript.src = url;
  17. oScript.charset = 'gb2312';
  18. document.body.appendChild(oScript);
  19. document.body.removeChild(oScript);
  20. }
  21. function getAlbumPicture(albumId) {
  22. /// <summary>获取专辑图片</summary>
  23. /// <param name="albumId" type="Number">专辑编号</param>
  24. /// <returns type="String">专辑图片地址</returns>
  25. return "http://imgcache.qq.com/music/photo/album/" + parseInt(albumId) % 100 + "/albumpic_" + albumId + "_0.jpg";
  26. }
  27. function getSingerPicture(singerId) {
  28. /// <summary>获取歌手图片</summary>
  29. /// <param name="singerId" type="Number">歌手编号</param>
  30. /// <returns type="String">歌手图片地址</returns>
  31. return "http://imgcache.qq.com/music/photo/singer/" + parseInt(singerId) % 100 + "/singerpic_" + singerId + "_0.jpg";
  32. }
  33. // 回调函数
  34. var cb = null;
  35. QQMusic.getGuessYouLike = function (callback) {
  36. /// <summary>获取猜你喜欢列表</summary>
  37. /// <param name="callback" type="Function">回调函数</param>
  38. var lableId = [];
  39. for (var i = 118; i < 142; i++) {
  40. lableId.push(i);
  41. }
  42. lableId.push(150, 160);
  43. window.JsonCallBack = window.SongRecCallback = listAnalysis;
  44. cb = callback;
  45. injectScript("http://radio.cloud.music.qq.com/fcgi-bin/qm_guessyoulike.fcg?labelid=" + lableId[(lableId.length * Math.random()) | 0] + "&start=0&num=20&rnd=" + new Date().getTime());
  46. };
  47. QQMusic.searchSongs = function (key, callback) {
  48. /// <summary>搜索歌曲</summary>
  49. /// <param name="key" type="String">关键字</param>
  50. /// <param name="callback" type="Function">回调函数</param>
  51. cb = callback;
  52. key = encodeURI(key);
  53. window.MusicJsonCallBack = searchAnalysis;
  54. injectScript("http://s.plcloud.music.qq.com/fcgi-bin/smartbox.fcg?o_utf8=1&utf8=1&key=" + key + "&inCharset=GB2312&outCharset=utf-8");
  55. };
  56. QQMusic.getSongInfo = function (song, callback) {
  57. /// <summary>获取歌曲信息</summary>
  58. /// <param name="key" type="Object">歌曲对象</param>
  59. /// <param name="callback" type="Function">回调函数</param>
  60. cb = function (info) {
  61. info.name = song.name;
  62. info.singer = song.singer;
  63. info.imgUrl = getAlbumPicture(song.albumId);
  64. callback(info);
  65. };
  66. window.JsonCallback = musicAnalysis;
  67. injectScript("http://qzone-music.qq.com/fcg-bin/fcg_mv_getinfo_bysongid.fcg?mids=" + song.mid + "&uin=10000&loginUin=0&hostUin=0&outCharset=utf-8");
  68. };
  69. function listAnalysis(data) {
  70. /// <summary>随机音乐列表解析</summary>
  71. /// <param name="data" type="Array">随机列表数据</param>
  72. var playList = [];
  73. var regexp = new RegExp('(upload|stream)(\\d+)\\.(music\\.qzone\\.soso\\.com|qqmusic\\.qq\\.com)\\/(\\d+)\\.wma');
  74. var replacement = function (word, x, a, y, b) {
  75. return 'stream' + (10 + Number(a)) + '.qqmusic.qq.com/' + (18000000 + Number(b)) + '.mp3';
  76. };
  77. var songs = data.songs;
  78. for (var i = 0; i < songs.length; ++i) {
  79. var song = songs[i];
  80. var args = decodeURIComponent(song.data).replace(/\+/g, ' ').split('|');
  81. var singerId = args[2];
  82. var albumId = args[4];
  83. var name = args[1];
  84. var singer = args[3];
  85. playList.push({
  86. name: name,
  87. singer: singer,
  88. url: decodeURIComponent(song.url).replace(regexp, replacement),
  89. imgUrl: getAlbumPicture(albumId),
  90. singerImgUrl: getSingerPicture(singerId)
  91. });
  92. }
  93. cb && cb(playList);
  94. };
  95. function searchAnalysis(data) {
  96. /// </summary>搜索列表解析</summary>
  97. /// <param name="data" type="Array">搜索列表数据</param>
  98. var songs = data.tips.song;
  99. var albums = data.tips.album;
  100. for (var i = songs.length; i--;) {
  101. songs[i] = {
  102. id: songs[i].id,
  103. mid: songs[i].mid,
  104. name: songs[i].name,
  105. singer: songs[i].singer_name,
  106. albumId: function () {
  107. for (var n = 0; n < albums.length; n++) {
  108. if (albums[n].singer_name == songs[i].singer_name) {
  109. return albums[n].id;
  110. }
  111. }
  112. }()
  113. };
  114. }
  115. cb && cb(songs);
  116. };
  117. function musicAnalysis(data) {
  118. /// <summary>单曲音乐解析</summary>
  119. /// <param name="data" type="Object">单曲音乐源数据</param>
  120. cb && cb({
  121. url: 'http://stream' + (10 + Number(data.num)) + '.qqmusic.qq.com/' + (30000000 + Number(data.mvlist[0].songid)) + '.mp3'
  122. });
  123. };
  124. w.QQMusic = QQMusic;
  125. }(window);

OK!~写好后我们怎么样才能获得数据并播放呢?

好,下面请看~

假设我们要获取到随机歌曲列表,那么只需要调用

  1. QQMusic.getGuessYouLike(function(list){
  2. loadNewMusic(list[0]);
  3. });

然后~我们再写一个loadNewMusic函数来播放它就可以了~

  1. function loadNewMusic(musicInfo){
  2. /// <summary>加载新音乐</summary>
  3. /// <param name="musicInfo" type="Object">音乐信息</param>
  4. var audio = new Audio();
  5. audio.autoplay=true;
  6. audio.src=musicInfo.url;
  7. audio.load();
  8. }

Ok!运行一下吧!?

Html5游戏开发攻略(免费的音乐面包篇)的更多相关文章

  1. Davinci DM6446开发攻略——u-boot-1.3.4移植(1)

    UBOOT的版本更新速度比较快,截止今天,稳定正式的版本是u-boot-2009.11-rc2,而TI最新的EVM开发包里的UBOOT是1.2.0版本,国内很多公司还一直使用u-boot-1.1.4和 ...

  2. Phaser是一款专门用于桌面及移动HTML5 2D游戏开发的开源免费框架

    Phaser是一款专门用于桌面及移动HTML5 2D游戏开发的开源免费框架,提供JavaScript和TypeScript双重支持,内置游戏对象的物理属性,采用Pixi.js引擎以加快Canvas和W ...

  3. HTML5游戏开发引擎,初识CreateJS

    CreateJS为CreateJS库,可以说是一款为HTML5游戏开发的引擎.打造 HTML5 游戏,构建新游戏,提供构建最新 HTML5 的技术.你可以通过这个网站学习如何构建跨平台和跨终端游戏.这 ...

  4. HTML5游戏开发进阶指南(亚马逊5星畅销书,教你用HTML5和JavaScript构建游戏!)

    HTML5游戏开发进阶指南(亚马逊星畅销书,教你用HTML5和JavaScript构建游戏!) [印]香卡(Shankar,A.R.)著 谢光磊译 ISBN 978-7-121-21226-0 201 ...

  5. HTML5游戏开发技术基础整理

    随着HTML5标准终于敲定.HTML5将有望成为游戏开发领域的的热门平台. HTML5游戏能够执行于包含iPhone系列和iPad系列在内的计算机.智能手机以及平板电脑上,是眼下跨平台应用开发的最佳实 ...

  6. Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写

      很长一段时间没有更新博客了,是因为要推出新开发方案和做好客户服务工作,忙得不易乐乎.有关DAVINCI U-BOOT的移植,以前写过一篇u-boot-1.3.4(2008年的),其实和这个u-bo ...

  7. html5游戏开发-零基础开发《圣诞老人送礼物》小游戏

    开言: 以前lufy前辈写过叫“ HTML5游戏开发-零基础开发RPG游戏”的系列文章,在那里面我学习了他的引擎以及了解了游戏脚本.自从看了那几篇文章,我便对游戏开发有了基本的认识.今天我也以零基础为 ...

  8. HTML5游戏开发系列教程5(译)

    原文地址:http://www.script-tutorials.com/html5-game-development-lesson-5/ 最终我决定准备下一篇游戏开发系列的文章,我们将继续使用can ...

  9. 微信小程序——【百景游戏小攻略】

    微信小程序--[百景游戏小攻略] 本次课程小项目中的图片以及文章还未获得授权!请勿商用!未经授权,请勿转载! 博客班级 https://edu.cnblogs.com/campus/zjcsxy/SE ...

随机推荐

  1. mongodb 跟踪SQL语句及慢查询收集

    有个需求:跟踪mongodb的SQL语句及慢查询收集 第一步:通过mongodb自带函数可以查看在一段时间内DML语句的运行次数. 在bin目录下面运行  ./mongostat -port 端口号  ...

  2. Linux基础命令【记录】

    后台运行详情:https://www.cnblogs.com/little-ant/p/3952424.html 查看端口.查找等命令 根据关键字查找文件信息: cat <文件名> | g ...

  3. HDU 5985 概率

    n种硬币各有cnt[i]枚,每轮下其有p[i]概率保留,问各种硬币只有它存活到最后一轮的概率. 设k轮后i硬币存活概率$a[i][k]=(1-p^k_i)^{cnt[i]}$ 则最后只有第i种硬币存活 ...

  4. js事件的捕获和冒泡阶段

    讨论的主要是两个事件模型:IE事件模型与DOM事件模型 IE内核浏览器的事件模型是冒泡型事件(没有捕获事件过程),事件句柄的触发顺序是从ChildNode到ParentNode. <div id ...

  5. nginx client ip配置

    server { listen 80; server_name localhost; location /{ root html; index index.html index.htm; proxy_ ...

  6. Java序员的成长之路

    对于Java程序猿学习的建议 第一阶段——Java基础 第二阶段——Web开发 这些内容主要是Web开发相关的内容,包括HTML/CSS/JS(前端页面).Servlet/JSP(J2EE)以及MyS ...

  7. 介绍一个基于jQuery的Cookie操作插件

    在网页客户端,我们经常会遇到读取或者设置cookie的情况,如果用纯生的js我们可能会遇到一些兼容性带来的麻烦,这里给大家介绍一个比较实用jquery操作cookie的插件,插件的源代码如下: jQu ...

  8. PV操作2011

  9. 安装pywin32模块

    1.先下载pywin32对于的版本 下载地址:python for windows extensions 2.选择自己对应的版本,我的是python3.5版本 注意注意注意:此处一定要看清楚自己的py ...

  10. 练习题 --- 写出5种css定位语法

    写出至少5种css语法(每种语法不一样)