using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; using BarrageGrab.Modles; using BarrageGrab.Modles.ProtoEntity; using Newtonsoft.Json.Linq; using Org.BouncyCastle.Asn1.Cmp; using Org.BouncyCastle.Asn1.Crmf; namespace BarrageGrab { /// /// 抖音服务 /// internal class DyServer { /// /// 获取直播礼物列表 /// /// public static async Task GetGifts() { var url = "https://live.douyin.com/webcast/gift/list/"; var qparam = new Dictionary() { {"device_platform","webapp"}, {"aid","6383"}, }; var client = new HttpClient(); client.DefaultRequestHeaders.Add("referer", "https://live.douyin.com/405518163654"); client.DefaultRequestHeaders.Add("authority", "www.douyin.com"); var builder = new UriBuilder(url); builder.Query = string.Join("&", qparam.Select(x => $"{x.Key}={x.Value}")); try { var response = await client.GetAsync(builder.Uri); if (!response.IsSuccessStatusCode) { Logger.LogError($"响应失败: {response.StatusCode}"); return null; } var json = await response.Content.ReadAsStringAsync(); var jobj = JObject.Parse(json); var data = jobj?["data"].ToObject(); return data; } catch (Exception ex) { Logger.LogError($"礼物信息从服务器请求失败: {ex.Message}"); return null; } } /// /// 获取房间信息,通过原生接口 /// /// web直播间号 /// 账号凭据 /// 查询代理 /// public static async Task GetRoomInfoForApi(string webRoomid, string cookie) { string url = "https://live.douyin.com/webcast/room/web/enter/"; var client = new HttpClient(); var uri = new UriBuilder(url); var dict = new Dictionary(); dict.Set("aid", "6383"); dict.Set("live_id", "1"); dict.Set("app_name", "douyin_web"); dict.Set("device_platform", "web"); dict.Set("language", "zh-CN"); dict.Set("cookie_enabled", "true"); dict.Set("enter_from", "page_refresh"); dict.Set("web_rid", webRoomid); //dict.Set("room_id_str", roomid); dict.Set("enter_source", ""); dict.Set("is_need_double_stream", "false"); dict.Set("insert_task_id", ""); dict.Set("live_reason", ""); dict.Set("browser_language", "zh-CN"); dict.Set("browser_platform", "Win32"); dict.Set("browser_name", "Edge"); dict.Foreach(f => uri.AddQueryParam(f.Key, f.Value)); url = uri.Uri.ToString(); var request = new HttpRequestMessage(HttpMethod.Get, url); request.Headers.Add("Accept", "application/json, text/plain, */*"); request.Headers.Add("Cache-Control", "no-cache"); request.Headers.Add("Referer", $"https://live.douyin.com/{webRoomid}"); request.Headers.Add("Host", "live.douyin.com"); request.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0"); request.Headers.Add("Cookie", cookie); var rsp = await client.SendAsync(request); if (rsp == null || rsp.StatusCode != System.Net.HttpStatusCode.OK) { return null; } var buff = rsp.Content.ReadAsByteArrayAsync(); var result = Encoding.UTF8.GetString(buff.Result); var res = RoomInfo.TryParseRoomEnterResponse(result, out var dto); int code = res.Item1; string msg = res.Item2; if (code == 0) { dto.LiveUrl = $"https://live.douyin.com/{webRoomid}"; dto.WebRoomId = webRoomid; AppRuntime.RoomCaches.AddRoomInfoCache(dto); Logger.LogInfo($"{dto.Owner.Nickname ?? dto.WebRoomId ?? dto.RoomId} 的直播间信息已添加到缓存"); } else { return null; } return dto; } } }