using DownKyi.Core.BiliApi.Users.Models;
using DownKyi.Core.Logging;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
namespace DownKyi.Core.BiliApi.Users
{
///
/// 用户空间信息
///
public static class UserSpace
{
///
/// 查询空间设置
///
///
///
public static SpaceSettings GetSpaceSettings(long mid)
{
string url = $"https://space.bilibili.com/ajax/settings/getSettings?mid={mid}";
string referer = "https://www.bilibili.com";
string response = WebClient.RequestWeb(url, referer);
try
{
SpaceSettingsOrigin settings = JsonConvert.DeserializeObject(response);
if (settings == null || settings.Data == null || !settings.Status) { return null; }
return settings.Data;
}
catch (Exception e)
{
Utils.Debugging.Console.PrintLine("GetSpaceSettings()发生异常: {0}", e);
LogManager.Error("UserSpace", e);
return null;
}
}
#region 投稿
///
/// 获取用户投稿视频的所有分区
///
/// 用户id
///
public static List GetPublicationType(long mid)
{
int pn = 1;
int ps = 1;
SpacePublicationList publication = GetPublication(mid, pn, ps);
return GetPublicationType(publication);
}
///
/// 获取用户投稿视频的所有分区
///
/// 用户id
///
public static List GetPublicationType(SpacePublicationList publication)
{
if (publication == null || publication.Tlist == null)
{
return null;
}
List result = new List();
JObject typeList = JObject.Parse(publication.Tlist.ToString("N"));
foreach (KeyValuePair item in typeList)
{
SpacePublicationListTypeVideoZone value = JsonConvert.DeserializeObject(item.Value.ToString());
result.Add(value);
}
return result;
}
///
/// 查询用户所有的投稿视频明细
///
/// 用户id
/// 排序
/// 视频分区
/// 搜索关键词
///
public static List GetAllPublication(long mid, int tid = 0, PublicationOrder order = PublicationOrder.PUBDATE, string keyword = "")
{
List result = new List();
int i = 0;
while (true)
{
i++;
int ps = 100;
SpacePublicationList data = GetPublication(mid, i, ps, tid, order, keyword);
if (data == null || data.Vlist == null || data.Vlist.Count == 0)
{ break; }
result.AddRange(data.Vlist);
}
return result;
}
///
/// 查询用户投稿视频明细
///
/// 用户id
/// 页码
/// 每页的视频数
/// 排序
/// 视频分区
/// 搜索关键词
///
public static SpacePublicationList GetPublication(long mid, int pn, int ps, int tid = 0, PublicationOrder order = PublicationOrder.PUBDATE, string keyword = "")
{
string url = $"https://api.bilibili.com/x/space/arc/search?mid={mid}&pn={pn}&ps={ps}&order={order.ToString("G").ToLower()}&tid={tid}&keyword={keyword}";
string referer = "https://www.bilibili.com";
string response = WebClient.RequestWeb(url, referer);
try
{
// 忽略play的值为“--”时的类型错误
JsonSerializerSettings settings = new JsonSerializerSettings
{
Error = (sender, args) =>
{
if (Equals(args.ErrorContext.Member, "play") &&
args.ErrorContext.OriginalObject.GetType() == typeof(SpacePublicationListVideo))
{
args.ErrorContext.Handled = true;
}
}
};
SpacePublicationOrigin spacePublication = JsonConvert.DeserializeObject(response, settings);
if (spacePublication == null || spacePublication.Data == null) { return null; }
return spacePublication.Data.List;
}
catch (Exception e)
{
Utils.Debugging.Console.PrintLine("GetPublication()发生异常: {0}", e);
LogManager.Error("UserSpace", e);
return null;
}
}
#endregion
#region 频道
///
/// 查询用户频道列表
///
/// 用户id
///
public static List GetChannelList(long mid)
{
string url = $"https://api.bilibili.com/x/space/channel/list?mid={mid}";
string referer = "https://www.bilibili.com";
string response = WebClient.RequestWeb(url, referer);
try
{
SpaceChannelOrigin spaceChannel = JsonConvert.DeserializeObject(response);
if (spaceChannel == null || spaceChannel.Data == null) { return null; }
return spaceChannel.Data.List;
}
catch (Exception e)
{
Utils.Debugging.Console.PrintLine("GetChannelList()发生异常: {0}", e);
LogManager.Error("UserSpace", e);
return null;
}
}
///
/// 查询用户频道中的所有视频
///
///
///
///
public static List GetAllChannelVideoList(long mid, long cid)
{
List result = new List();
int i = 0;
while (true)
{
i++;
int ps = 100;
List data = GetChannelVideoList(mid, cid, i, ps);
if (data == null || data.Count == 0)
{ break; }
result.AddRange(data);
}
return result;
}
///
/// 查询用户频道中的视频
///
///
///
///
///
///
public static List GetChannelVideoList(long mid, long cid, int pn, int ps)
{
string url = $"https://api.bilibili.com/x/space/channel/video?mid={mid}&cid={cid}&pn={pn}&ps={ps}";
string referer = "https://www.bilibili.com";
string response = WebClient.RequestWeb(url, referer);
try
{
SpaceChannelVideoOrigin spaceChannelVideo = JsonConvert.DeserializeObject(response);
if (spaceChannelVideo == null || spaceChannelVideo.Data == null || spaceChannelVideo.Data.List == null)
{ return null; }
return spaceChannelVideo.Data.List.Archives;
}
catch (Exception e)
{
Utils.Debugging.Console.PrintLine("GetChannelVideoList()发生异常: {0}", e);
LogManager.Error("UserSpace", e);
return null;
}
}
#endregion
#region 合集和列表
///
/// 查询用户的合集和列表
///
///
/// 第几页
/// 每页的数量;最大值为20
///
public static SpaceSeasonsSeries GetSeasonsSeries(long mid, int pageNum, int pageSize)
{
// https://api.bilibili.com/x/polymer/space/seasons_series_list?mid=49246269&page_num=1&page_size=18
string url = $"https://api.bilibili.com/x/polymer/space/seasons_series_list?mid={mid}&page_num={pageNum}&page_size={pageSize}";
string referer = "https://www.bilibili.com";
string response = WebClient.RequestWeb(url, referer);
try
{
SpaceSeasonsSeriesOrigin origin = JsonConvert.DeserializeObject(response);
if (origin == null || origin.Data == null || origin.Data.ItemsLists == null)
{ return null; }
return origin.Data.ItemsLists;
}
catch (Exception e)
{
Utils.Debugging.Console.PrintLine("GetSeasonsSeries()发生异常: {0}", e);
LogManager.Error("UserSpace", e);
return null;
}
}
///
/// 查询用户的合集的视频详情
///
///
///
///
///
public static SpaceSeasonsDetail GetSeasonsDetail(long mid, long seasonId, int pageNum, int pageSize)
{
// https://api.bilibili.com/x/polymer/space/seasons_archives_list?mid=23947287&season_id=665&sort_reverse=false&page_num=1&page_size=30
string url = $"https://api.bilibili.com/x/polymer/space/seasons_archives_list?mid={mid}&season_id={seasonId}&page_num={pageNum}&page_size={pageSize}&sort_reverse=false";
string referer = "https://www.bilibili.com";
string response = WebClient.RequestWeb(url, referer);
try
{
SpaceSeasonsDetailOrigin origin = JsonConvert.DeserializeObject(response);
if (origin == null || origin.Data == null)
{ return null; }
return origin.Data;
}
catch (Exception e)
{
Utils.Debugging.Console.PrintLine("GetSeasonsDetail()发生异常: {0}", e);
LogManager.Error("UserSpace", e);
return null;
}
}
///
/// 查询用户的列表元数据
///
///
///
public static SpaceSeriesMetaData GetSeriesMeta(long seriesId)
{
// https://api.bilibili.com/x/series/series?series_id=1253087
string url = $"https://api.bilibili.com/x/series/series?series_id={seriesId}";
string referer = "https://www.bilibili.com";
string response = WebClient.RequestWeb(url, referer);
try
{
SpaceSeriesMetaOrigin origin = JsonConvert.DeserializeObject(response);
if (origin == null || origin.Data == null)
{ return null; }
return origin.Data;
}
catch (Exception e)
{
Utils.Debugging.Console.PrintLine("GetSeriesMeta()发生异常: {0}", e);
LogManager.Error("UserSpace", e);
return null;
}
}
///
/// 查询用户的列表的视频详情
///
///
///
///
///
///
public static SpaceSeriesDetail GetSeriesDetail(long mid, long seriesId, int pn, int ps)
{
// https://api.bilibili.com/x/series/archives?mid=27899754&series_id=1253087&only_normal=true&sort=desc&pn=1&ps=30
string url = $"https://api.bilibili.com/x/series/archives?mid={mid}&series_id={seriesId}&only_normal=true&sort=desc&pn={pn}&ps={ps}";
string referer = "https://www.bilibili.com";
string response = WebClient.RequestWeb(url, referer);
try
{
SpaceSeriesDetailOrigin origin = JsonConvert.DeserializeObject(response);
if (origin == null || origin.Data == null)
{ return null; }
return origin.Data;
}
catch (Exception e)
{
Utils.Debugging.Console.PrintLine("GetSeriesDetail()发生异常: {0}", e);
LogManager.Error("UserSpace", e);
return null;
}
}
#endregion
#region 课程
///
/// 查询用户发布的课程列表
///
/// 目标用户UID
/// 页码
/// 每页项数
///
public static List GetCheese(long mid, int pn, int ps)
{
string url = $"https://api.bilibili.com/pugv/app/web/season/page?mid={mid}&pn={pn}&ps={ps}";
string referer = "https://www.bilibili.com";
string response = WebClient.RequestWeb(url, referer);
try
{
SpaceCheeseOrigin cheese = JsonConvert.DeserializeObject(response);
if (cheese == null || cheese.Data == null || cheese.Data.Items == null)
{ return null; }
return cheese.Data.Items;
}
catch (Exception e)
{
Utils.Debugging.Console.PrintLine("GetCheese()发生异常: {0}", e);
LogManager.Error("UserSpace", e);
return null;
}
}
///
/// 查询用户发布的所有课程列表
///
/// 目标用户UID
///
public static List GetAllCheese(long mid)
{
List result = new List();
int i = 0;
while (true)
{
i++;
int ps = 50;
List data = GetCheese(mid, i, ps);
if (data == null || data.Count == 0)
{ break; }
result.AddRange(data);
}
return result;
}
#endregion
#region 订阅
///
/// 查询用户追番(追剧)明细
///
/// 目标用户UID
/// 查询类型
/// 页码
/// 每页项数
///
public static BangumiFollowData GetBangumiFollow(long mid, BangumiType type, int pn, int ps)
{
string url = $"https://api.bilibili.com/x/space/bangumi/follow/list?vmid={mid}&type={type:D}&pn={pn}&ps={ps}";
string referer = "https://www.bilibili.com";
string response = WebClient.RequestWeb(url, referer);
try
{
BangumiFollowOrigin bangumiFollow = JsonConvert.DeserializeObject(response);
if (bangumiFollow == null || bangumiFollow.Data == null)
{ return null; }
return bangumiFollow.Data;
}
catch (Exception e)
{
Utils.Debugging.Console.PrintLine("GetBangumiFollow()发生异常: {0}", e);
LogManager.Error("UserSpace", e);
return null;
}
}
///
/// 查询用户所有的追番(追剧)明细
///
/// 目标用户UID
/// 查询类型
///
public static List GetAllBangumiFollow(long mid, BangumiType type)
{
List result = new List();
int i = 0;
while (true)
{
i++;
int ps = 30;
BangumiFollowData data = GetBangumiFollow(mid, type, i, ps);
if (data == null || data.List == null || data.List.Count == 0)
{ break; }
result.AddRange(data.List);
}
return result;
}
#endregion
}
}