Standard Vatican interactive js reverse network Yi Yun

Many people like Internet cloud suppression. First, there are songs and its comments. Some of the above comments are chicken soup and some are directed at the heart. Anyway, many give me a feeling of loss. I don't say much nonsense. Let's analyze a wave first.

The song I search here is the world. This is still those old operations. I won't say more. Here we can see its url in its headers

https://music.163.com/weapi/c...
At the same time, you will also find that you constantly refresh the encSecKey in its Form Data and

params is constantly changing and encrypted, so we have to find its encryption process

Here, we copy encSeckey. Of course, we can also choose params, but we will find that encSeckey is simpler.

Let's click Sources and right-click top for global search. Don't copy what I have here, copy what I have in the browser.

Let's order 92. You can also order 90. In fact, it's the same, but don't order vip In that file,

You can see that the files in the initiator are all core, So let's order core here We will see this in the file interface

We click the red bracket, and then we will see the following figure. Then we will crtl+f, and then copy the encSecKey to automatically search the characters we want

We can see that there are three characters. In 2 of 3, 3 represents how many characters there are, and 2 represents the second character. Here we can see two parameters: params and enseckey.

var bZj7c = window.asrsea(JSON.stringify(i0x), bkk9b(["shed tears", "strong"]), bkk9b(YR6L.md), bkk9b(["love", "girl", "terrified", "laugh"]));
e0x.data = j0x.cr1x({
    params: bZj7c.encText,
    encSecKey: bZj7c.encSecKey
})

}
We can see that it is encrypted by the parameters passed in by the following code. Let's continue to find it.

var bZj7c = window.asrsea(JSON.stringify(i0x), bkk9b(["tears", "strong"]), bkk9b(YR6L.md), bkk9b(["love", "girl", "panic", "laugh"));
Here we can find window Asrsea parameter, and then use the above crtl+f to find it.

You will find window asrsea = d

There are four parameters in function d, window Asrsea also has four parameters, which are corresponding. We can see that there are a (16), b (h.enctext, I), b (D, g) and C (I, e, f). Here, the b function is used twice

Let's look at these functions again. When we pull up, we can see that a, B and C3 functions have the corresponding number of parameters.

We can see that function a randomly obtains 16 bit values and will be used in functions b and c. function b is encrypted with CBC in AES. Bit d offset, e and c correspond to plaintext and secret key respectively, which will be described in detail below.

The corresponding c function is actually RSA encryption, which is relatively easy to analyze and explained in detail in the code

(JSON.stringify(i0x), bkk9b(["tears", "strong"]), bkk9b(YR6L.md)
, bkk9b(["love", "girl", "panic", "laugh"])
If we look at the four parameters of the d function, we will find that the last three parameters are fixed

The one in the red circle is the one below
`
YR6L.emj = {

    "colour": "00e0b",
    "influenza": "509f6",
    "here": "259df",
    "weak": "8642d",
    "Lips": "bc356",
    "dear": "62901",
    "happy": "477df",
    "open the mouth and show the teeth": "22677",
    "Silly smile": "ec152",
    "cat": "b5ff6",
    "Frown": "8ace6",
    "ghost": "15bb7",
    "Cake": "b7251",
    "Get angry": "52b3a",
    "Cry": "b17a8",
    "rabbit": "76aea",
    "stars": "8a5aa",
    "Love": "76d2e",
    "Hand in hand": "41762",
    "cock": "9ec4e",
    "love ": "e341f",
    "prohibit": "56135",
    "dog": "fccf6",
    "kiss": "95280",
    "fork": "104e0",
    "gift": "312ec",
    "halo": "bda92",
    "stay": "557c9",
    "fall ill": "38701",
    "Diamonds": "14af6",
    "Bye": "c9d05",
    "anger": "c4f7f",
    "Show love": "0c368",
    "sweat": "5b7a4",
    "chick": "6bee2",
    "pain": "55932",
    "Skimming": "575cc",
    "Fear": "e10b4",
    "Mask": "24d81",
    "Spit out": "3cfe4",
    "heart-broken": "875d3",
    "get angry": "e8204",
    "lovely": "7b97d",
    "Grimace": "def52",
    "dance": "741d5",
    "boy": "46b8e",
    "Smirk": "289dc",
    "pig": "6935b",
    "circle": "3ece0",
    "Poop": "462db",
    "Alien": "0a22b",
    "christmas": "8e7",
    "shed tears": "01000",
    "strong": "1",
    "love": "0CoJU",
    "girl": "m6Qyw",
    "terrified": "8W8ju",
    "laugh": "d"
};
YR6L.md = ["colour", "influenza", "here", "weak", "Lips", "dear", "happy", "open the mouth and show the teeth", "Silly smile", "cat", "Frown", "ghost", "Cake", "Get angry", "Cry", "rabbit", "stars", "Love", "Hand in hand", "cock", "love ", "prohibit", "dog", "kiss", "fork", "gift", "halo", "stay", "fall ill", "Diamonds", "Bye", "anger", "Show love", "sweat", "chick", "pain", "Skimming", "Fear", "Mask", "Spit out", "heart-broken", "get angry", "lovely", "Grimace", "dance", "boy", "Smirk", "pig", "circle", "Poop", "Alien", "christmas"]

}`
We found that bkk9b this function is used for the last three parameters. I found this function

var bkk9b = function(cJj7c) {

    var m0x = [];
    j0x.bf0x(cJj7c, function(cJi7b) {
        m0x.push(YR6L.emj[cJi7b])
    });
    return m0x.join("")
};

It's actually traversing and then stacking them together. Easy to implement

Code implementation:

Here, I only analyze the A, B, C and D functions, and some other user-defined functions used in them to see the whole code

Here we need to use the pycryptodomex library. Just use the following instructions

pip install pycryptodomex
The first is the a function, which is restored according to the js file. There is no difficulty
`
def a(slef, n=16):

  b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
  c = ""
  for i in range(n):
      e = random.random() * len(b)
      e = math.floor(e)
      c += b[e]
  return c

For function b, the plaintext here should be converted to 16 bytes, and the key and offset (iv) should be 16 digits. If you want to know more, you can baidu

def AES_encrypt(self, text, key, iv):

  # data needs to be converted to byte before filling, otherwise Chinese special characters will report errors
  pad = lambda data: data + (16 - len(data.encode('utf-8')) % 16) * chr(16 - len(data.encode('utf-8')) % 16)
  data = pad(text)
  encryptor = AES.new(key=self.to_16(key), mode=AES.MODE_CBC, iv=self.to_16(iv))
  encrypt_aes = encryptor.encrypt(data.encode('utf-8'))
  encrypt_text = base64.encodebytes(encrypt_aes)
  enctext = encrypt_text.decode('utf-8')
  return enctext

For the c function, there is nothing to say. Baidu will know at once. It uses RSA encryption.

def RSA_encrypt(self, text, pubKey, modulus):

  text = text[::-1]
  rs = int(codecs.encode(text.encode('utf-8'), 'hex_codec'), 16) ** int(pubKey, 16) % int(modulus, 16)
  return format(rs, 'x').zfill(256)

For c function

def d(self):

    data = {}
    iv = "0102030405060708"  # Offset
    g = self.fixed_parameter(["love", "girl", "terrified", "laugh"])  # key
    i = self.a()
    #h get params
    encText = str(self.dict)
    encText = self.AES_encrypt(encText, g, iv)
    params = self.AES_encrypt(encText, i, iv)
    data['params'] = params
    
    #Get encSecKey 
    b = self.fixed_parameter(["shed tears", "strong"])
    c = self.fixed_parameter(
        ["colour", "influenza", "here", "weak", "Lips", "dear", "happy", "open the mouth and show the teeth", "Silly smile", "cat", "Frown", "ghost", "Cake", "Get angry", "Cry", "rabbit", "stars", "Love",
         "Hand in hand", "cock", "love ", "prohibit", "dog", "kiss", "fork", "gift", "halo", "stay", "fall ill", "Diamonds", "Bye", "anger", "Show love", "sweat", "chick", "pain", "Skimming",
         "Fear", "Mask", "Spit out", "heart-broken", "get angry", "lovely", "Grimace", "dance", "boy", "Smirk", "pig", "circle", "Poop", "Alien", "christmas"])
    encSecKey = self.RSA_encrypt(i, b, c)
    data['encSecKey'] = encSecKey
    return data`

This is the encryption of encSecKey and params. In fact, the encSecKey here is always 256 bits, and the bits of params will be different because of different requests. We can use the python function we parsed to simulate encryption comparison and see the number of bits and form of output. I think it is very effective. I use pycharm. The number of bits that may be output is 4 to 8. That's because the newline character occupies a bit.

You will find that there is such a code in my d function

encText = str(self.dict)
This self What is dict? In fact, we can interrupt and debug it. Here is a video I made. You can see how to do it. Because there is no screen recording software on the computer, I recorded the video on my mobile phone.

csrf_token: ""
hlposttag: "</span>"
hlpretag: "<span class="s-fc7">"
limit: "30"
offset: "0"
s: "The world"
total: "true"
type: "1
After many times of searching, dict is it. Let me say here that dict is also found when looking for comments and lyrics. Slowly debug them, and they can be debugged. However, when crawling multiple pages of comments, I will find dict, but the print is repeated all the time. That's because offset also changes. We can use Fiddler for output and use the console in the browser. I don't have time to do this for the time being. What I want to know can be 100 degrees.

All codes:
`
import base64
import codecs
import math
import time
import wordcloud
import random
from Cryptodome.Cipher import AES
import requests

class GetArgs():

def __init__(self, dict):
    self.dict = dict

def fixed_parameter(self, list):
    dic = {
        "colour": "00e0b",
        "influenza": "509f6",
        "here": "259df",
        "weak": "8642d",
        "Lips": "bc356",
        "dear": "62901",
        "happy": "477df",
        "open the mouth and show the teeth": "22677",
        "Silly smile": "ec152",
        "cat": "b5ff6",
        "Frown": "8ace6",
        "ghost": "15bb7",
        "Cake": "b7251",
        "Get angry": "52b3a",
        "Cry": "b17a8",
        "rabbit": "76aea",
        "stars": "8a5aa",
        "Love": "76d2e",
        "Hand in hand": "41762",
        "cock": "9ec4e",
        "love ": "e341f",
        "prohibit": "56135",
        "dog": "fccf6",
        "kiss": "95280",
        "fork": "104e0",
        "gift": "312ec",
        "halo": "bda92",
        "stay": "557c9",
        "fall ill": "38701",
        "Diamonds": "14af6",
        "Bye": "c9d05",
        "anger": "c4f7f",
        "Show love": "0c368",
        "sweat": "5b7a4",
        "chick": "6bee2",
        "pain": "55932",
        "Skimming": "575cc",
        "Fear": "e10b4",
        "Mask": "24d81",
        "Spit out": "3cfe4",
        "heart-broken": "875d3",
        "get angry": "e8204",
        "lovely": "7b97d",
        "Grimace": "def52",
        "dance": "741d5",
        "boy": "46b8e",
        "Smirk": "289dc",
        "pig": "6935b",
        "circle": "3ece0",
        "Poop": "462db",
        "Alien": "0a22b",
        "christmas": "8e7",
        "shed tears": "01000",
        "strong": "1",
        "love": "0CoJU",
        "girl": "m6Qyw",
        "terrified": "8W8ju",
        "laugh": "d"
    }
    c = ""
    for key in list:
        c = c + dic[key]
    return c

# Convert to 16 digits
def to_16(self, key):
    while len(key) % 16 != 0:
        key += '\0'
    return key.encode('utf-8')

# Corresponding a function
def a(slef, n=16):
    b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    c = ""
    for i in range(n):
        e = random.random() * len(b)
        e = math.floor(e)
        c += b[e]
    return c

# b function corresponding to js function
def AES_encrypt(self, text, key, iv):
    # data needs to be converted to byte before filling, otherwise Chinese special characters will report errors
    pad = lambda data: data + (16 - len(data.encode('utf-8')) % 16) * chr(16 - len(data.encode('utf-8')) % 16)
    data = pad(text)
    encryptor = AES.new(key=self.to_16(key), mode=AES.MODE_CBC, iv=self.to_16(iv))
    encrypt_aes = encryptor.encrypt(data.encode('utf-8'))
    encrypt_text = base64.encodebytes(encrypt_aes)
    enctext = encrypt_text.decode('utf-8')
    return enctext

# Corresponding to c function in js function
def RSA_encrypt(self, text, pubKey, modulus):
    text = text[::-1]
    rs = int(codecs.encode(text.encode('utf-8'), 'hex_codec'), 16) ** int(pubKey, 16) % int(modulus, 16)
    return format(rs, 'x').zfill(256)

#d function
def d(self):
    data = {}
    iv = "0102030405060708"  # Offset
    g = self.fixed_parameter(["love", "girl", "terrified", "laugh"])  # key
    i = self.a()
    encText = str(self.dict)
    encText = self.AES_encrypt(encText, g, iv)
    params = self.AES_encrypt(encText, i, iv)
    data['params'] = params

    b = self.fixed_parameter(["shed tears", "strong"])
    c = self.fixed_parameter(
        ["colour", "influenza", "here", "weak", "Lips", "dear", "happy", "open the mouth and show the teeth", "Silly smile", "cat", "Frown", "ghost", "Cake", "Get angry", "Cry", "rabbit", "stars", "Love",
         "Hand in hand", "cock", "love ", "prohibit", "dog", "kiss", "fork", "gift", "halo", "stay", "fall ill", "Diamonds", "Bye", "anger", "Show love", "sweat", "chick", "pain", "Skimming",
         "Fear", "Mask", "Spit out", "heart-broken", "get angry", "lovely", "Grimace", "dance", "boy", "Smirk", "pig", "circle", "Poop", "Alien", "christmas"])
    encSecKey = self.RSA_encrypt(i, b, c)
    data['encSecKey'] = encSecKey
    return data

class Music():

def __init__(self):
    self.url = 'https://music.163.com/weapi/cloudsearch/get/web?csrf_token='
    self.headers = {
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36',
        'Accept': '*/*',
        'Referer': 'https://music.163.com/search/',
        'Connection': 'keep-alive',
        'cookie': '_iuqxldmzr_=32; _ntes_nnid=2c2050b762a20bec42d44b4ec9570db2,1596545803404; _ntes_nuid=2c2050b762a20bec42d44b4ec9570db2; WM_TID=P%2B9S%2BGxp32pBVAVRRQZqCt7Cgd%2BGver%2B; NMTID=00OeaJw_6w3Xsbamkk4mtz6A4aQ648AAAF0w8UCbA; WM_NI=uJgfo1tpOzmOzCi1zZbOYbXBDNPDlNewZXU3yQ3iumqfEggri%2BRhKdTEiIHOU2SXI3IuFjOG%2FKSi%2FAeBDlsY02AdcF3eDGC7oT5jbtTM7WD72FNddwZuZ8YelJFmI76NRXY%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6eeb6f0659a86fca5cc6093928fa6d14e968e9eaeb547898f8190d24686b7a0a7cb2af0fea7c3b92ab796a987ee3bb8b0819bf045ba9da7d2f952a2919783db4a8892a0a5ef46a7a996b9d839bb8ffd8af867b3ba8b88e67aabf59e89ca70989ba7aacb4597ee9db9cc398bab8a8bce4ded959d8aae4ba79e8c8df253f4ee8f85e24ef1bb8ca8c23dad8cfb8be1809893f9b8c73df29a8285e77d9aab96d9dc6fb0968a8ecc3df6929eb9dc37e2a3; JSESSIONID-WYYY=C1rSDXpSvPOpS%2FNHFyKe%5Cw3yY4%2F5bq5ntcfQ2QEqxSCJxkrD1%5CYeJdAGWIQmJpUIY5%5CtjA3S%2FrCedOHlKjFkPy5X4Eje7wt%2BHzgrcVRV%2BmXMRO8G%5CsxeUd9MBwwvqzIuEbuJkpv9mv6bCvQBzI9bI1qQl8WnFzFvy5Z0SqVeIAGYexqB%3A1601034012504'
    }


def search(self):
    song_name = input("Please enter a song name:")
    song_dict = {'csrf_token': "", 'hlposttag': '<span class="s-fc7">', 'limit': '30', 'offset': '0',
                 's': '{}'.format(song_name),
                 'total': 'true', 'type': '1'}
    d = GetArgs(song_dict)
    data = d.d()
    reponse = requests.post(url=self.url, headers=self.headers, data=data)
    dict = reponse.json()
    music_list = dict['result']['songs']
    self.select(music_list,song_name)

def select(self, music_list,song_name):
    i = 0
    for music in music_list:
        print(i, music['name'], music['ar'][0]['name'], end='\n')
        i += 1
    num = int(input('Please enter serial number:'))
    id = music_list[num]['id']
    ids = music_list[num]['privilege']['id']
    singer_name = music_list[num]['ar'][0]['name']
    self.get_lyric(id,singer_name,song_name)
    print('Crawling for comments')
    self.get_comments(id,singer_name,song_name)
    print('Comment crawl success')
    print('Downloading songs')
    self.download_song(ids,singer_name,song_name)
    print('All completed')

def download_song(self,ids,singer_name,song_name):
    url='https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token='
    dict = {'csrf_token': "", 'encodeType': "aac", 'ids': "[{}]".format(ids), 'level': "standard"}
    d = GetArgs(dict)
    data = d.d()
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36',
        'origin': 'https://music.163.com',
        'referer':'https://music.163.com/',
    }
    download_headers={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36',

}

    #Get download link
    response = requests.post(url=url,headers=headers,data=data)
    json = response.json()
    download_url = json['data'][0]['url']
    #Download songs
    download_response = requests.get(url=download_url,headers=download_headers)
    content = download_response.content
    name = song_name+'+'+singer_name+'.m4a'
    with open(name, 'wb') as f:
        f.write(content)
    print("Song download succeeded!")

def get_comments(self, id,singer_name,song_name):


    def save_png():
        name = song_name + ' ' + singer_name
        path = name+'.text'
        with open(path,'r',encoding='UTF-8') as f:
            c=f.read()
        w = wordcloud.WordCloud(width=1000,height=700,background_color='white',font_path='msyh.ttc')
        png_path = name+'.png'
        w.generate(c)
        w.to_file(png_path)

    def save_text(c):
        name = song_name + ' ' + singer_name
        text_path = name+'.text'
        with open(text_path,mode='a', encoding='UTF-8') as f:
            f.write(c)


    url = 'https://music.163.com/weapi/comment/resource/comments/get?csrf_token='
    headers = {
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36',
        'Accept': '*/*',
        'Referer': 'https://music.163.com/song?id={}'.format(id),
        'Connection': 'keep-alive',
        'cookie': '_iuqxldmzr_=32; _ntes_nnid=2c2050b762a20bec42d44b4ec9570db2,1596545803404; _ntes_nuid=2c2050b762a20bec42d44b4ec9570db2; WM_TID=P%2B9S%2BGxp32pBVAVRRQZqCt7Cgd%2BGver%2B; NMTID=00OeaJw_6w3Xsbamkk4mtz6A4aQ648AAAF0w8UCbA; WM_NI=uJgfo1tpOzmOzCi1zZbOYbXBDNPDlNewZXU3yQ3iumqfEggri%2BRhKdTEiIHOU2SXI3IuFjOG%2FKSi%2FAeBDlsY02AdcF3eDGC7oT5jbtTM7WD72FNddwZuZ8YelJFmI76NRXY%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6eeb6f0659a86fca5cc6093928fa6d14e968e9eaeb547898f8190d24686b7a0a7cb2af0fea7c3b92ab796a987ee3bb8b0819bf045ba9da7d2f952a2919783db4a8892a0a5ef46a7a996b9d839bb8ffd8af867b3ba8b88e67aabf59e89ca70989ba7aacb4597ee9db9cc398bab8a8bce4ded959d8aae4ba79e8c8df253f4ee8f85e24ef1bb8ca8c23dad8cfb8be1809893f9b8c73df29a8285e77d9aab96d9dc6fb0968a8ecc3df6929eb9dc37e2a3; JSESSIONID-WYYY=C1rSDXpSvPOpS%2FNHFyKe%5Cw3yY4%2F5bq5ntcfQ2QEqxSCJxkrD1%5CYeJdAGWIQmJpUIY5%5CtjA3S%2FrCedOHlKjFkPy5X4Eje7wt%2BHzgrcVRV%2BmXMRO8G%5CsxeUd9MBwwvqzIuEbuJkpv9mv6bCvQBzI9bI1qQl8WnFzFvy5Z0SqVeIAGYexqB%3A1601034012504'
    }
    dict = {'csrf_token': "", 'cursor': "-1", 'offset': "0", 'orderType': "1", 'pageNo': "1",
            'pageSize': "20", 'rid': "R_SO_4_{}".format(id), 'threadId': "R_SO_4_{}".format(id)}
    for page in range(1, 9):
        d = GetArgs(dict)
        data = d.d()
        c=''

        if page != 1:
            cursor = self.timestamp_13()   #13 Bit timestamp
            dict['cursor'] = cursor
            dict['offset'] = str((page - 1) * 20)
            dict['pageNo'] = str(page)
        response = requests.post(url=url, headers=headers, data=data)
        json = response.json()
        if page == 1:
            print('Crawling to comment 'on page {} format(page))
            try:
                comments_list = json['data']['hotComments']
                # print(comments_list)
                for i in comments_list:
                    c=i['content']
                    save_text(c)
                    print(i['content'])
            except:
                print('No comment
        else:
            print('Crawling to comment 'on page {} format(page))
            try:
                comments_list = json['data']['comments']
                # print(comments_list)
                for i in comments_list:
                    c=i['content']
                    save_text(c)
                    print(i['content'])
            except:
                print('No comment ')
    save_png()



def get_lyric(self, id,song_name,singer_name):

    def save_text(c):
        name = song_name + ' ' + singer_name
        text_path = name+'lyric.text'
        with open(text_path,mode='a', encoding='UTF-8') as f:
            f.write(c)

    url = 'https://music.163.com/weapi/song/lyric?csrf_token='
    headers = {
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36',
        'Accept': '*/*',
        'Referer': 'https://music.163.com/song?id={}'.format(id),
        'origin': 'https://music.163.com',
        'Connection': 'keep-alive',
        'cookie': '_iuqxldmzr_=32; _ntes_nnid=2c2050b762a20bec42d44b4ec9570db2,1596545803404; _ntes_nuid=2c2050b762a20bec42d44b4ec9570db2; WM_TID=P%2B9S%2BGxp32pBVAVRRQZqCt7Cgd%2BGver%2B; NMTID=00OeaJw_6w3Xsbamkk4mtz6A4aQ648AAAF0w8UCbA; WM_NI=uJgfo1tpOzmOzCi1zZbOYbXBDNPDlNewZXU3yQ3iumqfEggri%2BRhKdTEiIHOU2SXI3IuFjOG%2FKSi%2FAeBDlsY02AdcF3eDGC7oT5jbtTM7WD72FNddwZuZ8YelJFmI76NRXY%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6eeb6f0659a86fca5cc6093928fa6d14e968e9eaeb547898f8190d24686b7a0a7cb2af0fea7c3b92ab796a987ee3bb8b0819bf045ba9da7d2f952a2919783db4a8892a0a5ef46a7a996b9d839bb8ffd8af867b3ba8b88e67aabf59e89ca70989ba7aacb4597ee9db9cc398bab8a8bce4ded959d8aae4ba79e8c8df253f4ee8f85e24ef1bb8ca8c23dad8cfb8be1809893f9b8c73df29a8285e77d9aab96d9dc6fb0968a8ecc3df6929eb9dc37e2a3; JSESSIONID-WYYY=C1rSDXpSvPOpS%2FNHFyKe%5Cw3yY4%2F5bq5ntcfQ2QEqxSCJxkrD1%5CYeJdAGWIQmJpUIY5%5CtjA3S%2FrCedOHlKjFkPy5X4Eje7wt%2BHzgrcVRV%2BmXMRO8G%5CsxeUd9MBwwvqzIuEbuJkpv9mv6bCvQBzI9bI1qQl8WnFzFvy5Z0SqVeIAGYexqB%3A1601034012504'
    }
    dict = {"id": "{}".format(id), "lv": -1, "tv": -1, "csrf_token": ""}
    d = GetArgs(dict)
    data = d.d()
    response = requests.post(url=url, headers=headers, data=data)
    json = response.json()
    try:
        lrc = json['lrc']
        lyric = lrc['lyric']
        save_text(lyric)
        print(lyric)
    except:
        print('This song is pure music!')

def timestamp_13(self):
    timestamp_13 = round(time.time() * 1000)
    return str(timestamp_13)

music = Music()
music.search()`

Let me show you a song I crawled to - Green:

Word cloud picture:

Some comments:

Lyrics: let me say here that the bracket indicates the time corresponding to the lyrics. I want to build a player for Youku to display the corresponding lyrics to the time.
Source: Biaofun biaofun interaction( https://www.biaofun.com/)

Tags: Javascript

Posted by wrathyimp on Wed, 04 May 2022 08:30:20 +0300