Search code examples
c#python-requestsdotnet-httpclient

System.Net.Http.HttpRequestException with UnauthorizedException


I am trying to convert my Python code into C# code but I got some exceptions during the translation.

What I want is to fetch json/string data from the url. I am new to C# network programming. I tried several ways, read there documents, google their usages, but I still couldn't find out the correct way, as I keep getting the exceptions in the title.

This is my Python code that works:

    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)

This is the C# code that I have tried:

    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();
            }
        }
    }

Solution

  • The problem is that I didn't enable network access ability for my uwp app. Adding it in the Package.appxmanifest would solve this issue.

    My code is right but I have made some improvements according to the 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");
            }
        }