Home  >  Article  >  Backend Development  >  PHP下调用网易云音乐搜索API结果不正确

PHP下调用网易云音乐搜索API结果不正确

WBOY
WBOYOriginal
2016-06-06 20:32:561419browse

大家好。

这是网易云音乐的搜索API。

当调用下面一段function,$word是英文时搜索结果正常,但中文的时候返回结果不正确。

为什么呢,请指教?

<code>function music_search($word, $type=1)
{
    $url = "http://music.163.com/api/search/pc";
    $post_data = array(
        's' => $word,
        'offset' => '0',
        'limit' => '20',
        'type' => $type,
    );
    $referrer = "http://music.163.com/";
    $URL_Info = parse_url($url);
    $values = [];
    $result = '';
    $request = '';
    foreach ($post_data as $key => $value) {
        $values[] = "$key=" . urlencode($value);
    }
    $data_string = implode("&", $values);
    if (!isset($URL_Info["port"])) {
        $URL_Info["port"] = 80;
    }
    $request .= "POST " . $URL_Info["path"] . " HTTP/1.1\n";
    $request .= "Host: " . $URL_Info["host"] . "\n";
    $request .= "Referer: $referrer\n";
    $request .= "Content-type: application/x-www-form-urlencoded\n";
    $request .= "Content-length: " . strlen($data_string) . "\n";
    $request .= "Connection: close\n";
    $request .= "Cookie: " . "appver=1.5.0.75771;\n";
    $request .= "\n";
    $request .= $data_string . "\n";
    $fp = fsockopen($URL_Info["host"], $URL_Info["port"]);
    fputs($fp, $request);
    $i = 1;
    while (!feof($fp)) {
        if ($i >= 15) {
            $result .= fgets($fp);
        } else {
            fgets($fp);
            $i++;
        }
    }
    fclose($fp);
    return $result;
}
</code>

回复内容:

大家好。

这是网易云音乐的搜索API。

当调用下面一段function,$word是英文时搜索结果正常,但中文的时候返回结果不正确。

为什么呢,请指教?

<code>function music_search($word, $type=1)
{
    $url = "http://music.163.com/api/search/pc";
    $post_data = array(
        's' => $word,
        'offset' => '0',
        'limit' => '20',
        'type' => $type,
    );
    $referrer = "http://music.163.com/";
    $URL_Info = parse_url($url);
    $values = [];
    $result = '';
    $request = '';
    foreach ($post_data as $key => $value) {
        $values[] = "$key=" . urlencode($value);
    }
    $data_string = implode("&", $values);
    if (!isset($URL_Info["port"])) {
        $URL_Info["port"] = 80;
    }
    $request .= "POST " . $URL_Info["path"] . " HTTP/1.1\n";
    $request .= "Host: " . $URL_Info["host"] . "\n";
    $request .= "Referer: $referrer\n";
    $request .= "Content-type: application/x-www-form-urlencoded\n";
    $request .= "Content-length: " . strlen($data_string) . "\n";
    $request .= "Connection: close\n";
    $request .= "Cookie: " . "appver=1.5.0.75771;\n";
    $request .= "\n";
    $request .= $data_string . "\n";
    $fp = fsockopen($URL_Info["host"], $URL_Info["port"]);
    fputs($fp, $request);
    $i = 1;
    while (!feof($fp)) {
        if ($i >= 15) {
            $result .= fgets($fp);
        } else {
            fgets($fp);
            $i++;
        }
    }
    fclose($fp);
    return $result;
}
</code>

是不是你用的编码不一样

不正确是什么意思?我测试了下没问题

<code>php</code><code>print_r(json_decode(music_search('十年'),1));
Array
(
    [result] => Array
        (
            [songCount] => 300
            [songs] => Array
                (
                    [0] => Array
                        (
                            [starred] => 
                            [popularity] => 100
                            [starredNum] => 0
                            [playedNum] => 0
                            [dayPlays] => 0
                            [hearTime] => 0
                            [mp3Url] => http://m1.music.126.net/V6G5ER-inEZ_Oufxq9tmfA==/1153387697546241.mp3
                            [rtUrls] => Array
                                (
                                )

                            [name] => 十年
                            [id] => 66842
                            [position] => 4
                            [duration] => 206000
                            [status] => 1
                            [alias] => Array
                                (
                                )

                            [commentThreadId] => R_SO_4_66842
                            [copyFrom] => 
                            [album] => Array
                                (
                                    [songs] => Array
                                        (
                                        )

                                    [name] => 黑白灰
                                    [id] => 6548
                                    [type] => 专辑
                                    [size] => 10
                                    [status] => 1
                                    [description] => 
                                    [tags] => 
                                    [alias] => Array
                                        (
                                        )

                                    [company] => 英皇娱乐
                                    [artist] => Array
                                        (
                                            [img1v1Id] => 0
                                            [name] => 
                                            [id] => 0

</code>

估计人家的接口不能接受原生的中文字符的编码。建议在post传入的参数当中,利用urlencode进行转码,再是真正的请求。你可以试试

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn