Code getlink zingmp3 đơn giản

Cập nhật: Lượt xem: 1839 [ PHP ]

Hướng dẫn code get link nhạc mp3 từ mp3.zing.vn bằng php đơn giản, nhanh chóng nhất bằng hai thư viện tốt, sử dụng composer

Code getlink zingmp3 đơn giản

Theo thống kê, thì có khá nhiều bạn muốn biết code getlink nhạc zing mp3. Nhưng trong hướng dẫn lần trước của mình thì lại khá phức tạp với nhiều bạn, vì vậy hôm nay mình sẽ hướng dẫn các bạn cách getlink nhạc tại mp3.zing.vn một cách đơn giản nhất. Trong bài này mình cũng sẽ bỏ qua luôn các phân tích phức tạp mà chỉ giữ lại những nội dung quan trọng nhất mà thôi.

Yêu cầu

Nhưng cái gì cũng có minimum của nó, yêu cầu là bạn phải có composer và PHP 5.3 trở lên, composer thực sự là một công cụ vô cùng hữu ích cho developer, một công cụ mà bạn nhất định phải có, rất nhiều hướng dẫn bà project của mình đều cần hỗ trợ của công cụ này, click vào link bên dưới để xem hướng dẫn cài đặt.

Ý tưởng

ý tưởng để hiện thực project này là ta sẽ parse code html của trang mp3.zing để lấy ra url của file xml chứ thông tin bài hát, sau đó đọc nội dung của file này để lấy ra url của file mp3 cần lấy.

Download code

Dưới đây là code sample của bài viết này, mình cung cấp hai phiên bản, một bản là dành cho bạn chưa cài composer, bản này mình đóng gói luôn code của các thư viện, bạn chỉ việc download về là có thể chạy được. Bản thứ hai dành cho bạn nào đã cài composer rồi, file tải rất nhẹ, tải về bạn cần phải chạy “composer install” để composer cài đặt các thư viện :

 

Tạo project composer và require thư viện

Các thư viện mà chúng ta sử dụng trong project này là :

  1. Guzzle : Thư viện giúp lấy nội dung của trang web.
  2. DomCrawler của symfony : Giúp phân tích code của trang web.

Để require các thư viện này vào project, bạn mở command line ở thư mục project và dùng lệnh sau đây:

composer require symfony/dom-crawler

composer require guzzlehttp/guzzle

Hai lệnh trên sẽ giúp bạn lấy code mới nhất của hai thư viện này vào project, code sẽ được tải vào thư mục vendor. File autoload cũng được tạo sẵng. Giờ bạn tạp file index.php, chúng ta sẽ viết code getlink trong file này, dưới đây là nội dung của nó :

<?php
/**
 * Getlink mp3.zing
 * This code help you to getlink mp3 from mp3.zing.vn for easy
 *
 * @author nguyenvanduocit
 */
require_once __DIR__.'/vendor/autoload.php';

Phân loại các kiểu nhạc trên zing

Trên zing có các kiểu nhạc cơ bản và cấu trúc URL của nó như sau :

Kiểu Cấu trúc url
Bài nhạc đơn http://mp3.zing.vn/bai-hat/*
Album http://mp3.zing.vn/album/*
Video http://mp3.zing.vn/video-clip/*
playlist http://mp3.zing.vn/playlist/*

Ở mỗi kiểu khác nhau, thì cấu trúc html của file khác nhau, nên cách lấy url của file xml cũng khác nhau, nên trước hết, ta cần phải dựa vào url để phân biệt xem url hiện tại là của kiểu nhạc nào. Chúng ta sẽ sử dụng regex như sau :

function getLinkType($url){
    $regex = "/http:\\/\\/mp3\\.zing\\.vn\\/(bai-hat|album|video-clip|playlist)\\/(?:.*)/";
    preg_match($regex, $url, $matches);
    if(count($matches)===2){
        return $matches[1];
    }
    else{
        return FALSE;
    }
}

Lấy code của trang

Dù cho get link của kiểu nhạc nào, thì bạn cũng phải get code của trang đó. Trong project này mình sử dụng guzzle. đây là một thư viện rất thông dụng để làm việc này, dưới đây code :

function getPageContent($url)
{
    global $client;
    if(!$client) {
        $client = new GuzzleHttp\Client();
    }
    $res = $client->get($url);
    if($res->getStatusCode() === 200){
        return $res->getBody()->getContents();
    }
    else{
        return null;
    }
}

Trong đoạn code trên, ta tạo một instance cho class Client của Guzzle. đồng thời dùng từ khóa global để khai báo biến này ở global, mục đích là để sử dụng lại instance này nếu như gọi hàm này nhiều lần.

Zing luôn  có một file xml để chưa thông tin của các bài hát, playlist, dùng cho player của họ, vì vậy nếu muốn lấy link nhạc, ta cần phải lấy được nội dung của file xml này, mà trước hết là lấy link của nó :

function getXMLLink($content){
    $regex = "/xmlURL=(http:\\/\\/mp3\\.zing\\.vn\\/xml\\/[song|video|album]+-xml\\/[a-zA-Z]+)&amp;/";
    preg_match($regex, $content, $matches);
    if(count($matches)===2){
        return $matches[1];
    }
    else{
        return FALSE;
    }
}

Lấy nội dung file xml

Giờ ta sẽ lấy nội dung file xml này, đồng thời nạp nó vào DomCrawler để có thể lấy giá trị của các tag trong file html dễ dàng hơn, mình chọn DomCrawler thay vì các thư viện xml mặc định của WordPress vì DomCrawler thông mình và ít xảy ra lỗi hơn.

function getXMLData($url){
    $content = getPageContent($url);
    if(!$content){
        return null;
    }
    $content = '<?xml version="1.0" encoding="UTF-8"?>'.$content;
    return new \Symfony\Component\DomCrawler\Crawler($content);
}

Vì nội dung file xml của zing không có thẻ xml để định nghĩa, nên DomCrawler sẽ không biết đây là file xml, vì vậy mình phải thêm phần thẻ mở xml vào. Tiếp theo mình gọi tới class DomCrawler để parse nội dung xml này về dạng có cấu trúc để dễ sử dụng.

Ở các bước phía trước, chúng ta đã làm gần như hoàn hảo mọi việc, bước này chỉ cần gọi ra và sử dụng thôi, bạn có thể mở một file xml lên để xem cấu trúc của nó. Dưới đây là hàm lấy nội dung của một bài hát.

function getAudioItems( Crawler $crawler){
    $items = $crawler->filterXPath('//data/item')->each(function (Crawler $node, $i) {
        return array(
            'title' =>$node->filterXPath('//title')->text(),
            'performer' =>$node->filterXPath('//performer')->text(),
            'link' =>$node->filterXPath('//link')->text(),
            'source' =>$node->filterXPath('//source')->text(),
            'lyric' =>$node->filterXPath('//lyric')->text(),
            'backimage' =>$node->filterXPath('//backimage')->text(),
        );
    });
    return $items;
}

Hàm này nhận vào tham số có kiểu Crawler, chính là kiểu trả về của hàm getXMLData().

Ta lấy thông tin video cũng tương tự như thông tin của audio, nhưng vì các thuộc tính của nó khác biệt nhiều, nên ta sẽ phải viết một hàm riêng cho nó :

function getVideoItems( Crawler $crawler){
    $items = $crawler->filterXPath('//data/item')->each(function (Crawler $node, $i) {
        $item = array(
            'title' =>$node->filterXPath('//title')->text(),
            'performer' =>$node->filterXPath('//performer')->text(),
            'link' =>$node->filterXPath('//link')->text(),
            'duration' =>$node->filterXPath('//duration')->text(),
            'cover' =>$node->filterXPath('//cover')->text(),
            'mp3link' =>$node->filterXPath('//mp3link')->text(),
            'thumbnail' =>$node->filterXPath('//thumbnail')->text(),
        );
        if($f240 = $node->filterXPath('//f240')){
            $item['f240'] = $f240->text();
        }
        if($f360 = $node->filterXPath('//f360')){
            $item['f360'] = $f360->text();
        }
        if($f480 = $node->filterXPath('//f480')){
            $item['f480'] = $f480->text();
        }
        if($f720 = $node->filterXPath('//f720')){
            $item['f720'] = $f720->text();
        }
        if($f1080 = $node->filterXPath('//f1080')){
            $item['f1080'] = $f1080->text();
        }
        return $item;
    });
    return $items;
}

Cách sử dụng

Giờ mọi hàm cần thiết đã được định nghĩa, xong, phần còn lại là gọi nó và sử dụng mà thôi, một lưu ý ở đây là bạn phải handle giá trị trả về của các hàm để xác định xem có lỗi xảy ra hay không, code như sau :

//$url = 'http://mp3.zing.vn/album/Se-Chi-La-Mo-Single-Emily/ZWZBFCAC.html';
$url = 'http://mp3.zing.vn/bai-hat/Khuon-Mat-Dang-Thuong-Son-Tung-M-TP/ZW70UUZF.html';
//$url = 'http://mp3.zing.vn/video-clip/Giay-Phut-Cuoi-Trance-Version-Giang-Hong-Ngoc/ZW7IB6ZO.html';
$type = getLinkType($url);
if(!$type){
    die('Link is not valid');
}
$content = getPageContent($url);
if(!$content){
    die('Can not get page content');
}
$xmlLink = getXMLLink($content);
if(!$xmlLink){
    die('Can not get xml Link');
}
$xmlData = getXMLData($xmlLink);
if(!$xmlData){
    die('can not get xml data');
}
 
switch($type){
    case 'bai-hat':
    case 'album':
        $items = getAudioItems($xmlData);
        break;
        break;
    case 'video-clip':
        $items = getVideoItems($xmlData);
        break;
}
var_dump($items);

Kết quả trả về sẽ giống như sau :

array (size=1)
  0 => 
    array (size=6)
      'title' => string ' KhuĂ´n Mặt ÄĂ¡ng ThÆ°Æ¡ng' (length=29)
      'performer' => string 'SÆ¡n TĂ¹ng M-TP' (length=15)
      'link' => string ' http://mp3.zing.vn/tim-kiem/bai-hat.html?q=Son+Tung+M-TP' (length=57)
      'source' => string 'http://mp3.zing.vn/xml/load-song/MjAxNSUyRjAzJTJGMTYlMkYzJTJGYyUyRjNjMmNiZjlkYzE4NjNmNGVkYmNiOThhYzU5YTNjYzgwLm1wMyU3QzEz' (length=121)
      'lyric' => string 'http://static.mp3.zdn.vn/lyrics/2015/4/2/426708e5794fdc4f774114209cc428b6_1075246047.lrc' (length=88)
      'backimage' => string 'http://image.mp3.zdn.vn/cover3_artist/d/0/d05363699cbc5b039597082caf9e79eb_1422267415.jpg' (length=89)

Link ở thuộc tính source chính là url đến file mp3, khi truy cập vào link này, sẽ tự động được redirect tới file nhạc. có thể đặt nó vào các flashplayer hoặc dùng link này để download.

Lời kết

Như vậy là chúng ta đã hiện thực thành công code getlink nhạc mp3 từng mp3.zing.vn , Không có gì phức tạp cả, chỉ là bạn cần phải cài đặt composer mà thôi. Với bài này, mình không nói chi tiết và ý nghĩa các code cũng như giải thích, nói rộng về các thư viện… vì mục tiêu của nó là làm sao cho đơn giản nhất có thể. Nên các bạn đừng thắc mắc tại sao lại ngắn vậy nhé.