带有未授权异常的System.Net.Http.HttpRequestException



我正试图将Python代码转换为C#代码,但在翻译过程中遇到了一些异常。

我想要的是从url中获取json/string数据。我是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();
}
}
}

问题是我没有为我的uwp应用程序启用网络访问功能。在Package.appxmanifest中添加它将解决这个问题。

我的代码是正确的,但我已经根据微软文档进行了一些改进:

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

相关内容

最新更新