Heim  >  Artikel  >  Backend-Entwicklung  >  PHP下调用网易云音乐搜索API结果不正确

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

WBOY
WBOYOriginal
2016-06-06 20:32:561420Durchsuche

大家好。

这是网易云音乐的搜索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进行转码,再是真正的请求。你可以试试

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn