簡易網易雲音樂接口開發


簡易網易雲音樂接口開發

前言

調用網易雲音樂官方的接口,用requests獲取音樂地址

准備

模塊 作用
flask 封裝api
requests 解析接口
vue
axios

開始

獲取音樂id

抓包獲取接口
http://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s={id}&type=1&offset={//翻頁}&total=true&limit=20
  1. id ==> 搜索信息
  2. type ==>
  3. offset ==> 翻頁,為limit的倍數
  4. limit ==> 請求一次返回的歌曲個數

請求返回信息

{
    "result":{
        "songs":[
            {
                "id":29723022,                           //歌曲id
                "name":"暗里着迷 (Live)",					//歌曲名稱
                "artists":[
                    {
                        "id":3691,
                        "name":"劉德華",
                        "picUrl":null,
                        "alias":[

                        ],
                        "albumSize":0,
                        "picId":0,
                        "img1v1Url":"http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg",
                        "img1v1":0,
                        "trans":null
                    }
                ],
                "album":{
                    "id":3066282,
                    "name":"Wonderful World 香港演唱會 2007",
                    "artist":{
                        "id":0,
                        "name":"",
                        "picUrl":null,
                        "alias":[

                        ],
                        "albumSize":0,
                        "picId":0,
                        "img1v1Url":"http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg",
                        "img1v1":0,
                        "trans":null
                    },
                    "publishTime":1201795200007,
                    "size":34,
                    "copyrightId":0,
                    "status":0,
                    "picId":109951165909154050,
                    "mark":0
                },
                "duration":226000,
                "copyrightId":0,
                "status":0,
                "alias":[

                ],
                "rtype":0,
                "ftype":0,
                "mvid":0,
                "fee":0,
                "rUrl":null,
                "mark":0
            },
            {
                "id":29723041,
                "name":"17歲 (Live)",
                "artists":[
                    {
                        "id":3691,
                        "name":"劉德華",
                        "picUrl":null,
                        "alias":[

                        ],
                        "albumSize":0,
                        "picId":0,
                        "img1v1Url":"http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg",
                        "img1v1":0,
                        "trans":null
                    }
                ],
                "album":{
                    "id":3066282,
                    "name":"Wonderful World 香港演唱會 2007",
                    "artist":{
                        "id":0,
                        "name":"",
                        "picUrl":null,
                        "alias":[

                        ],
                        "albumSize":0,
                        "picId":0,
                        "img1v1Url":"http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg",
                        "img1v1":0,
                        "trans":null
                    },
                    "publishTime":1201795200007,
                    "size":34,
                    "copyrightId":0,
                    "status":0,
                    "picId":109951165909154050,
                    "mark":0
                },
                "duration":303000,
                "copyrightId":0,
                "status":0,
                "alias":[

                ],
                "rtype":0,
                "ftype":0,
                "mvid":0,
                "fee":0,
                "rUrl":null,
                "mark":0
            }
        ],
        "songCount":2369
    },
    "code":200
}
根據返回信息獲取編寫代碼
import requests

        url = "http://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s={}&type=1&offset={}&total=true&limit=20".format(content,offset*10)

        HtmlTostr = requests.get(url,headers=headers).text

        HtmlToJson = json.loads(HtmlTostr)

        musicinfo = HtmlToJson["result"]["songs"]

        return musicinfo

此時返回的musicinfo 為搜索的的所有信息 包括歌曲id

然后根據id解析歌曲地址
def GetMusic(self,id):

    url = "http://music.163.com/song/media/outer/url?id={}.mp3".format(id)

    headers = requests.head(url, headers= self.headers).headers

    MusicSrc = headers['Location']

    return MusicSrc

MusicSrc就是歌曲解析出來的真實地址了

將以上兩段代碼寫成一個類供后續調用 wymusic.py

import requests
import json

class music():

    def __init__(self):

        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
        }


    def GetId(self,content,offset=0):


        """
        :return musicinfo 返回歌曲信息:
            -musicinfo["id"]  歌曲id
            -musicinfo["name"] 歌曲名稱
            -musicinfo["fee"]  歌曲是否付費

         :info  content:搜索內容

                offset :翻頁

        """

        url = "http://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s={}&type=1&offset={}&total=true&limit=20".format(content,offset*10)

        HtmlTostr = requests.get(url,headers=self.headers).text

        HtmlToJson = json.loads(HtmlTostr)

        musicinfo = HtmlToJson["result"]["songs"]

        return musicinfo

    def GetMusic(self,id):

        url = "http://music.163.com/song/media/outer/url?id={}.mp3".format(id)

        headers = requests.head(url, headers= self.headers).headers

        MusicSrc = headers['Location']

        return MusicSrc

編寫Flask主程序

from flask import Flask,render_template,request,redirect
import webview
from wymusic import music


app = Flask(__name__)


@app.route("/",methods=["GET","POST"])
def index():

    if request.method == "GET":

        return render_template("index.html")

    if request.method =="POST":

        music_message = request.form.get("search_music")

        musicsrc = music()

        musicdatas = musicsrc.GetId(music_message)

        return render_template("index.html",musicdatas = musicdatas)

@app.route("/start/<int:num>",methods=["GET","POST"])
def start(num):

    musics = music()

    song = musics.GetMusic(num)

    return song

if __name__ == '__main__':

    app.run()

    #
    # window = webview.create_window(
    #     title="cherry",
    #     url= app,
    #     width=960,
    #     height=600,
    #     resizable=False,
    #     text_select=False,
    #     confirm_close=True,
    # )
    # webview.start()

函數index,提供主頁面及邏輯處理,函數start為Vue+axios,提供接口

編寫界面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <link href="../static/css/index.css" rel="stylesheet">
</head>
<body>
<div id="app">
    <form action="/" method="POST">
        <input type="text" name="search_music">
        <input type="submit" value="提交">
    </form>
    <ul>
        {% for musicdata in musicdatas  %}
        <li class="startmusic" v-on:click="getmusic({{ musicdata.id }})">{{musicdata.name}}==>{{ musicdata.artists[0].name }}</li>
        {% endfor %}

    </ul>
    <audio autoplay loop controls v-bind:src="musicurl"></audio>

</div>
</body>
<script>
    var app = new Vue({
        el:"#app",
        data:{
           musicurl : ""
        },
        methods:{
            getmusic:function (p1) {
                console.log(p1)
                axios.get("http://127.0.0.1:5000/start/"+p1 ).then((res)=>{
                    this.musicurl = res.data
                },(err)=>{
                    console.log(err)
                })
            }
        }
    })
</script>
</html>

其中script中 getmusic函數為調用的start函數

實現結果

image-20210509104130443

總結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM