System. Net .Http.HttpRequestException с UnauthorizedException - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь преобразовать мой Python код в C# код, но я получил некоторые исключения во время перевода.

Что мне нужно, это получить данные json / string из URL. Я новичок в C# сетевом программировании. Я пробовал несколько способов, читал там документы, гугл их использования, но я все еще не мог найти правильный путь, так как я продолжаю получать исключения в заголовке.

Это мой Python код, который работает :

    url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'
    params = {
        'ct': 24,
        'qqmusic_ver': 1298,
        'new_json': 1,
        'remoteplace':'sizer.yqq.lyric_next',
        'searchid': 63514736641951294,
        'aggr': 1,
        'cr': 1,
        'catZhida': 1,
        'lossless': 0,
        'sem': 1,
        't': 7,
        'p': 1,
        'n': 1,
        'w': keyword,
        'g_tk': 1714057807,
        'loginUin': 0,
        'hostUin': 0,
        'format': 'json',
        'inCharset': 'utf8',
        'outCharset': 'utf-8',
        'notice': 0,
        'platform': 'yqq.json',
        'needNewCode': 0
    }
    headers = {
        'content-type': 'application/json',
        'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0',
        'referer':'https://y.qq.com/portal/search.html'
    }
    result = requests.get(url, params = params, headers = headers)

Это код C#, который я пробовал:

    public static async Task<string> SearchLyrics(string keyword)
    {
        keyword = Uri.EscapeUriString(keyword);
        // method 1
        string uri = $"https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=sizer.yqq.lyric_next&searchid=63514736641951294&aggr=1&cr=1&catZhida=1&lossless=0&sem=1&t=7&p=1&n=1&w={keyword}&g_tk=1714057807&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0";
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri(uri);
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            using (var request = new HttpRequestMessage(HttpMethod.Get, uri))
            {
                request.Headers.Add("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0");
                request.Headers.Add("referer", "https://y.qq.com/portal/search.html");
                var response = await client.SendAsync(request);
                //response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                return await response.Content.ReadAsStringAsync();
            }
        }
        // method 2
        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Add("ct", "24");
            client.DefaultRequestHeaders.Add("qqmusic_ver", "1298");
            client.DefaultRequestHeaders.Add("new_json", "1");
            client.DefaultRequestHeaders.Add("remoteplace", "sizer.yqq.lyric_next");
            client.DefaultRequestHeaders.Add("searchid", "63514736641951294");
            client.DefaultRequestHeaders.Add("aggr", "1");
            client.DefaultRequestHeaders.Add("catZhida", "1");
            client.DefaultRequestHeaders.Add("lossless", "0");
            client.DefaultRequestHeaders.Add("t", "7");
            client.DefaultRequestHeaders.Add("p", "1");
            client.DefaultRequestHeaders.Add("n", "1");
            client.DefaultRequestHeaders.Add("w", keyword);
            client.DefaultRequestHeaders.Add("g_tk", "1714057807");
            client.DefaultRequestHeaders.Add("loginUin", "0");
            client.DefaultRequestHeaders.Add("hostUin", "0");
            client.DefaultRequestHeaders.Add("format", "json");
            client.DefaultRequestHeaders.Add("inCharset", "utf8");
            client.DefaultRequestHeaders.Add("outCharset", "utf-8");
            client.DefaultRequestHeaders.Add("notice", "0");
            client.DefaultRequestHeaders.Add("platform", "yqq.json");
            client.DefaultRequestHeaders.Add("needNewCode", "0");
            using (var request = new HttpRequestMessage(HttpMethod.Get, "https://c.y.qq.com/soso/fcgi-bin/client_search_cp"))
            {
                request.Headers.Add("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0");
                request.Headers.Add("referer", "https://y.qq.com/portal/search.html");
                var response = await client.SendAsync(request);
                //response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                return await response.Content.ReadAsStringAsync();
            }
        }
    }

1 Ответ

0 голосов
/ 28 марта 2020

Проблема в том, что я не включил возможность доступа к сети для моего приложения uwp. Добавление этого в Package.appxmanifest решит эту проблему.

Мой код верен, но я сделал некоторые улучшения в соответствии с Microsoft Document :

public static async Task<string> SearchLyrics(string keyword)
{
    string uri = $"https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=sizer.yqq.lyric_next&searchid=63514736641951294&aggr=1&cr=1&catZhida=1&lossless=0&sem=1&t=7&p=1&n=1&w={Uri.EscapeUriString(keyword)}&g_tk=1714057807&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0";
    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.UserAgent.TryParseAdd("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0");
        var response = await client.GetAsync(uri);
        response.EnsureSuccessStatusCode();
        var content = await response.Content.ReadAsStringAsync();
        Windows.Data.Json.JsonObject json = Windows.Data.Json.JsonObject.Parse(content);
        return json.GetNamedObject("data").GetNamedObject("lyric").GetNamedArray("list").GetObjectAt(0).GetNamedString("content");
        }
    }
...