我就是那个鸽了快一个月的新人博主:轻云。我最近做音乐网,结果很来气,人家能获取MV,我却不能??所以,我就例行Baidu一下,结果很出乎我的意料,居然没找到?好吧,那我就写一个。

思路

先用网易云的一个API:http://music.163.com/api/mv/detail?id=MV的ID&type=mp4
(抓包抓的)
然后本来打算正则,但是奈何 没那个技术 所以,就用一个很笨的办法,先file_get_contents一下,然后substr+stripos来一个获取,最后str_replace一下,替换无用的内容。我发誓,好好学正则 下次不立Flag了 好的,看看这次的知识点

知识点

学习本文,你需要掌握这些知识点:

  • file_get_contents抓取网页内容
  • substr截取字符串内容
  • str_replace文本替换
  • function自定义一个函数
  • if...else...语句
  • switch...case...语句
  • 基本的JSON格式

代码

<?php
function get_mv($id,$q) {
    $mv_data = file_get_contents('http://music.163.com/api/mv/detail?id='.$id.'&type=mp4'); // file_get_contents方法Get到网易云返回的mv信息
    if (empty($q)) { // 当$q值空的时候就默认获取1080P的结果
        $first_1080 = substr($mv_data,(stripos($mv_data,'"1080":"')+8)); // 1080获取第一步,substr截取到 "1080":" 这段字符串后的,顺便把这段字符窜给消除掉,所以有+8
        $second_1080 = substr($first_1080,(stripos($first_1080,'"},'))); // 1080获取第二步,substr截取到 "}, 这段字符串后的无用字符串,这里不用+3,因为要一起给替换到空值的
        $finish_1080 = str_replace($second_1080,'',$first_1080); // 1080获取最后一步,str_replace第二步获得的值,然后全部给替换为空,也就是删掉
        return $finish_1080; // 返回最终的值
    } else {
        switch ($q) { // 一个switch判断,可以减少服务器负担,我也不知道为什么,反正就是比if...elseif...else...要好用
            case 240: // 如果$q为240
                $first_240 = substr($mv_data,(stripos($mv_data,'"240":"')+7)); // 240获取第一步,substr截取到 "240":" 这段字符串后的,顺便把这段字符窜给消除掉,所以有+7
                $second_240 = substr($first_240,(stripos($first_240,'",'))); // 240获取第二步,substr截取到 ", 这段字符串后的无用字符串,这里不用+2,因为要一起给替换到空值的
                $finish_240 = str_replace($second_240,'',$first_240); // 240获取最后一步,str_replace第二步获得的值,然后全部给替换为空,也就是删掉
                return $finish_240; // 返回最终的值
                break; // 循环过后别忘了break;一下,跳出来
            case 480: // 如果$q为480
                $first_480 = substr($mv_data,(stripos($mv_data,'"480":"')+7)); // 480获取第一步,substr截取到 "480":" 这段字符串后的,顺便把这段字符窜给消除掉,所以有+7
                $second_480 = substr($first_480,(stripos($first_480,'",'))); // 480获取第二步,substr截取到 ", 这段字符串后的无用字符串,这里不用+2,因为要一起给替换到空值的
                $finish_480 = str_replace($second_480,'',$first_480); // 480获取最后一步,str_replace第二步获得的值,然后全部给替换为空,也就是删掉
                return $finish_480; // 返回最终的值
                break; // 循环过后别忘了break;一下,跳出来
            case 1080: // 如果$q为1080
                $first_1080 = substr($mv_data,(stripos($mv_data,'"1080":"')+8)); // 1080获取第一步,substr截取到 "1080":" 这段字符串后的,顺便把这段字符窜给消除掉,所以有+8
                $second_1080 = substr($first_1080,(stripos($first_1080,'"},'))); // 1080获取第二步,substr截取到 "}, 这段字符串后的无用字符串,这里不用+3,因为要一起给替换到空值的
                $finish_1080 = str_replace($second_1080,'',$first_1080); // 1080获取最后一步,str_replace第二步获得的值,然后全部给替换为空,也就是删掉
                return $finish_1080; // 返回最终的值
                break; // 循环过后别忘了break;一下,跳出来
            default: // 如果以上结果都不匹配...
                return "error"; // 返回一个error
        }
    }
}
// 这是简单的用法,做成API

$id = $_GET['id']; // 把GET方法过来的id给赋值到id变量,方便一些,你也可以不用
$q = $_GET['q']; // 同上一步赋值,你也能不用它
if (get_mv($id,$q) == "error") { // 如果返回了error...
    echo '{"code":-1,"link":"error"}'; // 那就输出一个很假的JSON
} else { // 那就是没有error错误...
    echo '{"code":200,"link":"'.get_mv($id,$q).'"}'; // 那就输出又一个(我为什么要说又)很假的JSON,link的值就写获取到的链接
}

用法

基本的用法已经写在代码里了,基本上每一行代码都有注释,自己悠着点看就好了
转载务必声明!
算了,还是讲一下函数的用法吧,认真听啊:

get_mv(mv的id,清晰度);

清晰度可以写240、480、1080,以P为单位,默认获取1080的
我们下期见。另外某些人不要说我水文章,我代码写了1个小时左右,后来补注释写了10分钟,然后又来整理知识点,发全网首发的文章,试问哪个博主做得到我这么细致?还是那句话,代码是核心,在互联网的博客上,不要指望看到多少中文。就这样吧,睡觉去了。

Last modification:August 15th, 2020 at 02:40 pm
如果这篇文章帮到了你,就打赏一下吧(只支持QQ)