正在阅读:

喜马拉雅mp3批量下载工具PHP版

9,618

很早以前,为了练习Python写了个《喜马拉雅mp3批量下载工具》,本以为没多少人关注,后来发现使用的小伙伴还是挺多的。但是随着官方网站的更新,导致了脚本失效,最近抽时间重写了代码,Python版本的以前使用的lxml解析html,这次更新使用正则表达式处理,原生支持,这样减少了小伙伴们安装库的时间。。然而本次的重点不是Python。。。

自从学习了Python以后,PHP已经全忘了,以至于我在用PHP写这个批量下载工具的时候,都忘了PHP变量怎么使用了。^_^

为了练习PHP,方便代码审计,花了一整个下午的时间写了PHP版的小工具,唉。看来编程这玩意要常练呀。。

喜欢Python版本的,请移步至 [python]喜马拉雅mp3批量下载工具

程序说明:

1、使用类编写,简洁明了。

2、可下载单一MP3链接,也可以下载专辑。

3、调用外部工具多线程下载。

喜马拉雅mp3批量下载工具PHP版

<?php

/**
 * Created by 独自等待
 * Date: 2016/10/11
 * Time: 14:35
 * Name: ximalaya.php
 * 独自等待博客:http://www.waitalone.cn/
 */
print_r('
+---------------------------------------------------------------------+
                       喜马拉雅mp3批量下载工具
                     Site:http://www.waitalone.cn/
                        Exploit BY: 独自等待
                          Time:2016-10-11
+---------------------------------------------------------------------+
');
set_time_limit(0);
error_reporting(7);
if ($argc < 2) {
    print_r('
+---------------------------------------------------------------------+
Useage: php ' . $argv[0] . ' 喜马拉雅mp3专辑地址
Example: php ' . $argv[0] . ' http://www.ximalaya.com/1412917/album/239463
+---------------------------------------------------------------------+
    ');
    exit;
}

class ximalaya
{
    public $url;

    public function __construct($url)
    {
        $this->url = $url;
    }

    public function getpage()
    {
        $purl = array();
        $response = file_get_contents($this->url);
        if (preg_match_all('/class=\'pagingBar_page\'/', $response, $match)) {
            $pagelen = count($match[0]);
            for ($i = 1; $i <= $pagelen; $i++) {
                $purl[] = $this->url . '?page=' . $i;
            }
        } else {
            $purl[] = $this->url;
        }
        return $purl;
    }

    public function analyze($trackid)
    {
        $mp3_arr = array();
        $trackurl = 'http://www.ximalaya.com/tracks/' . $trackid . '.json';
        $response = file_get_contents($trackurl);
        $jsonobj = json_decode($response, true);
        $title = $jsonobj['title'];
        $mp3 = $jsonobj['play_path'];
        $mp3_arr['title'] = iconv('utf-8', 'gbk//IGNORE', $title);
        $mp3_arr['mp3'] = $mp3;
        return $mp3_arr;
    }

    public function getids($purl)
    {
        $ids = array();
        if (strpos($purl, 'sound')) {
            $ids[] = substr($purl, strrpos($purl, '/') + 1);
        } else {
            $response = file_get_contents($purl);
            preg_match('/sound_ids="(.+?)"/', $response, $match);
            $ids = explode(',', $match[1]);
        }
        return $ids;
    }

    public function down()
    {
        $todown = $this->getpage();
        foreach ($todown as $purl) {
            foreach ($this->getids($purl) as $ids) {
                $idsarr = $this->analyze($ids);
                $title = $idsarr['title'];
                $mp3_url = $idsarr['mp3'];
                $filename = $title . '.mp3';
                echo $filename . ' ' . $mp3_url . PHP_EOL;
                fwrite(fopen('mp3.txt', 'ab+'), $filename . ' | ' . $mp3_url . PHP_EOL);
                if (function_exists('system')) {
                    @ob_start();
                    $res = system('aria2c.exe -s 10 -j 10 ' . $mp3_url . ' --out=' . $filename);
                    @ob_get_contents();
                    @ob_end_clean();
                    if (strpos($res, 'OK')) {
                        echo $filename . ' 下载成功!' . PHP_EOL;
                    } else {
                        echo $filename . ' 下载失败!' . PHP_EOL;
                    }
                } else {
                    echo '请开启system函数以便多线程下载!tips: check disable_functions in php.ini' . PHP_EOL;
                }
            }
        }
    }
}

$ximalaya = new ximalaya($argv[1]);
$ximalaya->down();

程序执行方法:

php ximalaya.php http://www.ximalaya.com/52622741/album/4519297

喜马拉雅PHP1

喜马拉雅PHP2

目前有:4条访客评论,博主回复3

  1. 陌小雨博客

    这个win10环境变量怎么弄,发现一只弄不对,需要重启么

    • 独自等待
      2016-08-30 14:05

      我用的win7 不过应该也是一样的吧。你网上搜索一下看,实在不行你就在php目录里面使用php.exe来运行。

  2. hu
    2016-10-28 22:25

    只懂windows,实在不懂php,Python,站长能不能写个windows版的

  3. xoyeirdd
    2017-06-05 11:23

    这个可以通过网页来下载,不用那么麻烦http://www.minorcase.top/xmlyxz.html 喜马拉雅下载

  4. 胡歌网摘
    2017-10-03 12:32

    还有自己弄代码,挺麻烦的,介绍个一键下载的给你 http://www.onlinedown.net/soft/977603.htm 省去太多麻烦,速度快到爆。比上面那位说的用网页下载也简单了很多很多。

    • 独自等待
      2017-10-09 10:11

      多谢兄弟提供,之前没有找到。还有一点只是为了练习一下python和php而已。

留下脚印,证明你来过。

*

*

流汗坏笑撇嘴大兵流泪发呆抠鼻吓到偷笑得意呲牙亲亲疑问调皮可爱白眼难过愤怒惊讶鼓掌