Skip to content

Commit

Permalink
Merge branch 'feature/cookie' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
RayWangQvQ committed Feb 24, 2023
2 parents 5fb82be + 241ff4f commit d5fa6ec
Show file tree
Hide file tree
Showing 10 changed files with 141 additions and 53 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,13 @@ public AddCoinRequest(long aid, string csrf)
public string Cross_domain { get; set; } = "true";

public string Csrf { get; set; }

public string Eab_x { get; set; } = "2";

public string Ramval { get; set; } = "3";

public string Source { get; set; } = "web_normal";

public string Ga { get; set; } = "1";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using System.Collections.Generic;

namespace Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos.Passport
{
public class GetSsoListResponse
{
public List<string> sso { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,8 @@ public interface IPassportApi : IBiliBiliApi
[HttpGet("/x/passport-login/web/qrcode/poll?qrcode_key={qrcode_key}&source=main_mini")]
//Task<BiliApiResponse<TokenDto>> CheckQrCodeHasScaned(string qrcode_key);
Task<HttpResponseMessage> CheckQrCodeHasScaned(string qrcode_key);

[HttpGet("/x/passport-login/web/sso/list?biliCSRF={csrf}")]
Task<BiliApiResponse<GetSsoListResponse>> GetSsoListAsync(string csrf);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,10 @@ public interface IVideoApi : IBiliBiliApi
/// <param name="csrf"></param>
/// <returns></returns>
[Header("Content-Type", "application/x-www-form-urlencoded")]
[Header("Referer", "https://www.bilibili.com/")]
//[Header("Referer", "https://www.bilibili.com/")]
[Header("Origin", "https://www.bilibili.com")]
[HttpPost("/x/web-interface/coin/add?aid={aid}&multiply={multiply}&select_like={select_like}&cross_domain=true&csrf={csrf}")]
Task<BiliApiResponse> AddCoinForVideo([FormContent] AddCoinRequest request);
[HttpPost("/x/web-interface/coin/add")]
Task<BiliApiResponse> AddCoinForVideo([FormContent] AddCoinRequest request,[Header("referer")]string refer= "https://www.bilibili.com/video/BV123456/?spm_id_from=333.1007.tianma.1-1-1.click&vd_source=80c1601a7003934e7a90709c18dfcffd");

/// <summary>
/// 获取当前用户对<paramref name="aid"/>视频的投币信息
Expand Down
3 changes: 1 addition & 2 deletions src/Ray.BiliBiliTool.Application/DailyTaskAppService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,7 @@ public DailyTaskAppService(
[TaskInterceptor("每日任务", TaskLevel.One)]
public override async Task DoTaskAsync(CancellationToken cancellationToken)
{
var ck = await SetCookiesAsync(_biliCookie, cancellationToken);
_biliCookie.MergeCurrentCookie(ck.ToString());
await SetCookiesAsync(_biliCookie, cancellationToken);

//每日任务赚经验:
UserInfo userInfo = await Login();
Expand Down
47 changes: 26 additions & 21 deletions src/Ray.BiliBiliTool.DomainService/DonateCoinDomainService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -95,12 +95,12 @@ public async Task AddCoinsForVideos()
{
_logger.LogDebug("开始尝试第{num}次", i);

Tuple<string, string> video = await TryGetCanDonatedVideo();
UpVideoInfo video = await TryGetCanDonatedVideo();
if (video == null) continue;

_logger.LogInformation("【视频】{title}", video.Item2);
_logger.LogInformation("【视频】{title}", video.Title);

bool re = await DoAddCoinForVideo(video.Item1, 1, _dailyTaskOptions.SelectLike, video.Item2);
bool re = await DoAddCoinForVideo(video, _dailyTaskOptions.SelectLike);
if (re) success++;
}

Expand All @@ -116,9 +116,9 @@ public async Task AddCoinsForVideos()
/// 尝试获取一个可以投币的视频
/// </summary>
/// <returns></returns>
public async Task<Tuple<string, string>> TryGetCanDonatedVideo()
public async Task<UpVideoInfo> TryGetCanDonatedVideo()
{
Tuple<string, string> result;
UpVideoInfo result;

//从配置的up中随机尝试获取1次
result = await TryGetCanDonateVideoByConfigUps(1);
Expand All @@ -145,17 +145,17 @@ public async Task<Tuple<string, string>> TryGetCanDonatedVideo()
/// <param name="multiply">投币数量</param>
/// <param name="select_like">是否同时点赞 1是0否</param>
/// <returns>是否投币成功</returns>
public async Task<bool> DoAddCoinForVideo(string aid, int multiply, bool select_like, string title = "")
public async Task<bool> DoAddCoinForVideo(UpVideoInfo video, bool select_like)
{
BiliApiResponse result;
try
{
var request = new AddCoinRequest(long.Parse(aid), _biliBiliCookie.BiliJct)
var request = new AddCoinRequest(video.Aid, _biliBiliCookie.BiliJct)
{
Multiply = multiply,
Select_like = select_like ? 1 : 0
};
result = await _videoApi.AddCoinForVideo(request);
var referer = $"https://www.bilibili.com/video/{video.Bvid}/?spm_id_from=333.1007.tianma.1-1-1.click&vd_source=80c1601a7003934e7a90709c18dfcffd";
result = await _videoApi.AddCoinForVideo(request, referer);
}
catch (Exception)
{
Expand Down Expand Up @@ -200,13 +200,13 @@ private async Task<int> GetNeedDonateCoinNum()
return configCoins;
}


//已投的硬币
int alreadyCoins = await _coinDomainService.GetDonatedCoins();
//目标
int targetCoins = configCoins > Constants.MaxNumberOfDonateCoins
? Constants.MaxNumberOfDonateCoins
: configCoins;
//int targetCoins = configCoins > Constants.MaxNumberOfDonateCoins
// ? Constants.MaxNumberOfDonateCoins
// : configCoins;
int targetCoins = configCoins;

_logger.LogInformation("【今日已投】{already}枚", alreadyCoins);
_logger.LogInformation("【目标欲投】{already}枚", targetCoins);
Expand All @@ -227,7 +227,7 @@ private async Task<int> GetNeedDonateCoinNum()
/// </summary>
/// <param name="tryCount"></param>
/// <returns></returns>
private async Task<Tuple<string, string>> TryGetCanDonateVideoByConfigUps(int tryCount)
private async Task<UpVideoInfo> TryGetCanDonateVideoByConfigUps(int tryCount)
{
//是否配置了up主
if (_dailyTaskOptions.SupportUpIdList.Count == 0) return null;
Expand All @@ -240,7 +240,7 @@ private async Task<Tuple<string, string>> TryGetCanDonateVideoByConfigUps(int tr
/// </summary>
/// <param name="tryCount"></param>
/// <returns></returns>
private async Task<Tuple<string, string>> TryGetCanDonateVideoBySpecialUps(int tryCount)
private async Task<UpVideoInfo> TryGetCanDonateVideoBySpecialUps(int tryCount)
{
//获取特别关注列表
var request = new GetSpecialFollowingsRequest(long.Parse(_biliBiliCookie.UserId));
Expand All @@ -255,7 +255,7 @@ private async Task<Tuple<string, string>> TryGetCanDonateVideoBySpecialUps(int t
/// </summary>
/// <param name="tryCount"></param>
/// <returns></returns>
private async Task<Tuple<string, string>> TryGetCanDonateVideoByFollowingUps(int tryCount)
private async Task<UpVideoInfo> TryGetCanDonateVideoByFollowingUps(int tryCount)
{
//获取特别关注列表
var request = new GetFollowingsRequest(long.Parse(_biliBiliCookie.UserId));
Expand All @@ -270,15 +270,20 @@ private async Task<Tuple<string, string>> TryGetCanDonateVideoByFollowingUps(int
/// </summary>
/// <param name="tryCount"></param>
/// <returns></returns>
private async Task<Tuple<string, string>> TryGetCanDonateVideoByRegion(int tryCount)
private async Task<UpVideoInfo> TryGetCanDonateVideoByRegion(int tryCount)
{
try
{
for (int i = 0; i < tryCount; i++)
{
var video = await _videoDomainService.GetRandomVideoOfRanking();
RankingInfo video = await _videoDomainService.GetRandomVideoOfRanking();
if (!await IsCanDonate(video.Aid.ToString())) continue;
return Tuple.Create<string, string>(video.Aid.ToString(), video.Title);
return new UpVideoInfo()
{
Aid = video.Aid,
Bvid = video.Bvid,
Title = video.Title
};
}
}
catch (Exception e)
Expand All @@ -295,7 +300,7 @@ private async Task<Tuple<string, string>> TryGetCanDonateVideoByRegion(int tryCo
/// <param name="upIds"></param>
/// <param name="tryCount"></param>
/// <returns></returns>
private async Task<Tuple<string, string>> TryCanDonateVideoByUps(List<long> upIds, int tryCount)
private async Task<UpVideoInfo> TryCanDonateVideoByUps(List<long> upIds, int tryCount)
{
if (upIds == null || upIds.Count == 0) return null;

Expand Down Expand Up @@ -329,7 +334,7 @@ private async Task<Tuple<string, string>> TryCanDonateVideoByUps(List<long> upId
//检查是否可以投
if (!await IsCanDonate(videoInfo.Aid.ToString())) continue;

return Tuple.Create(videoInfo.Aid.ToString(), videoInfo.Title);
return videoInfo;
}
}
catch (Exception e)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using Ray.BiliBiliTool.Agent.BiliBiliAgent.Dtos;
using System;
using System.Threading.Tasks;

namespace Ray.BiliBiliTool.DomainService.Interfaces
Expand All @@ -10,8 +11,8 @@ public interface IDonateCoinDomainService : IDomainService
{
Task AddCoinsForVideos();

Task<Tuple<string, string>> TryGetCanDonatedVideo();
Task<UpVideoInfo> TryGetCanDonatedVideo();

Task<bool> DoAddCoinForVideo(string aid, int multiply, bool select_like, string title = "");
Task<bool> DoAddCoinForVideo(UpVideoInfo video, bool select_like);
}
}
8 changes: 4 additions & 4 deletions src/Ray.BiliBiliTool.DomainService/LoginDomainService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
using Newtonsoft.Json.Linq;
using QRCoder;
using Ray.BiliBiliTool.Agent.QingLong;
using Ray.BiliBiliTool.Infrastructure.Cookie;

namespace Ray.BiliBiliTool.DomainService
{
Expand Down Expand Up @@ -100,7 +101,7 @@ public async Task<BiliCookie> LoginByQrCodeAsync(CancellationToken cancellationT
_logger.LogInformation("扫描成功!");
IEnumerable<string> cookies = check.Headers.SingleOrDefault(header => header.Key == "Set-Cookie").Value;

var cookieStr = GetCookieStr(cookies);
var cookieStr = CookieInfo.ConvertSetCkHeadersToCkStr(cookies);
cookieInfo = new BiliCookie(cookieStr);
cookieInfo.Check();

Expand All @@ -121,9 +122,8 @@ public async Task<BiliCookie> SetCookieAsync(BiliCookie biliCookie, Cancellation
if (homePage.IsSuccessStatusCode)
{
_logger.LogInformation("访问主站成功");
IEnumerable<string> cookies = homePage.Headers.SingleOrDefault(header => header.Key == "Set-Cookie").Value;
var cookieStr = GetCookieStr(cookies);
biliCookie = new BiliCookie($"{cookieStr}; {biliCookie}");
IEnumerable<string> setCookieHeaders = homePage.Headers.SingleOrDefault(header => header.Key == "Set-Cookie").Value;
biliCookie.MergeCurrentCookieBySetCookieHeaders(setCookieHeaders);
_logger.LogInformation("SetCookie成功");
return biliCookie;
}
Expand Down
72 changes: 57 additions & 15 deletions src/Ray.BiliBiliTool.Infrastructure/Cookie/CookieInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,17 @@ public virtual void Check()

public override string ToString()
{
var list= CookieItemDictionary.Select(d => $"{CkNameBuild(d.Key)}={CkValueBuild(d.Value)}");
var list = CookieItemDictionary.Select(d => $"{CkNameBuild(d.Key)}={CkValueBuild(d.Value)}");
return string.Join("; ", list);
}

#region merge

public void MergeCurrentCookieBySetCookieHeaders(IEnumerable<string> setCookieList)
{
_ckFactory.MergeCurrentCookieBySetCookieHeaders(setCookieList);
}

public void MergeCurrentCookie(string ckStr)
{
_ckFactory.MergeCurrentCookie(ckStr);
Expand All @@ -51,24 +56,61 @@ public void MergeCurrentCookie(Dictionary<string, string> ckDic)

#endregion

[Obsolete]
public static Dictionary<string, string> BuildCookieItemDictionaryByCookieItemList(IEnumerable<string> cookieItemList, Func<string, string> nameBuilder = null, Func<string, string> valueBuilder = null)
#region convert

/// <summary>
/// List<setCkHeader>—>List<ckItem>
/// </summary>
/// <param name="setCookieList"></param>
/// <returns></returns>
public static List<string> ConvertSetCkHeadersToCkItemList(IEnumerable<string> setCookieList)
{
var re = new Dictionary<string, string>();
foreach (var item in cookieItemList ?? new List<string>())
{
var index = item.IndexOf('=');
if (index == -1) continue;
return setCookieList.Select(item => item.Split(';').FirstOrDefault()?.Trim()).ToList();
}

/// <summary>
/// List<setCkHeader>—>ckStr
/// </summary>
/// <param name="setCookieList"></param>
/// <returns></returns>
public static string ConvertSetCkHeadersToCkStr(IEnumerable<string> setCookieList)
{
var ckItemList = ConvertSetCkHeadersToCkItemList(setCookieList);
return ConvertCkItemListToCkStr(ckItemList);
}

var name = item[..index].Trim();
if (nameBuilder != null) name = nameBuilder(name);
/// <summary>
/// ckStr—>List<ckItem>
/// </summary>
/// <param name="ckStr"></param>
/// <returns></returns>
public static List<string> ConvertCkStrToCkItemList(string ckStr)
{
return ckStr.Split(";", StringSplitOptions.TrimEntries).ToList();
}

var value = item[(index+1)..].Trim();
if (valueBuilder != null) value = valueBuilder(value);
/// <summary>
/// List<ckItem>—>ckStr
/// </summary>
/// <param name="ckItemList"></param>
/// <returns></returns>
public static string ConvertCkItemListToCkStr(IEnumerable<string> ckItemList)
{
return string.Join("; ", ckItemList);
}

re.TryAdd(name, value);
}
return re;
/// <summary>
/// List<ckItem>—>Dictionary<>
/// </summary>
/// <param name="ckItemList"></param>
/// <returns></returns>
public static Dictionary<string, string> ConvertCkItemListToCkDic(IEnumerable<string> ckItemList)
{
return ckItemList.ToDictionary(k => k[..k.IndexOf("=", StringComparison.Ordinal)].Trim(),
v => v[(v.IndexOf("=", StringComparison.Ordinal) + 1)..].Trim().TrimEnd(';'));
}

#endregion

}
}
31 changes: 26 additions & 5 deletions src/Ray.BiliBiliTool.Infrastructure/Cookie/CookieStrFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@ public CookieStrFactory(List<string> strList)
{
_cookieDictionary.Add(i + 1, CkStrToDictionary(strList[i]));
}

CurrentNum = 1;
}

public int CurrentNum { get; set; } = 1;
public int CurrentNum { get; set; }

public int Count => _cookieDictionary.Count;

Expand All @@ -45,17 +47,37 @@ public string GetCurrentCookieStr()

#region merge

/// <summary>
/// 根据请求返回header中的set-cookie来merge cookie
/// </summary>
/// <param name="setCookieList">["ak=av; expire=abc;"]</param>
public void MergeCurrentCookieBySetCookieHeaders(IEnumerable<string> setCookieList)
{
MergeCurrentCookie(CookieInfo.ConvertSetCkHeadersToCkItemList(setCookieList));
}

/// <summary>
/// 根据cookie字符串merge
/// </summary>
/// <param name="ckStr"></param>
public void MergeCurrentCookie(string ckStr)
{
MergeCurrentCookie(ckStr.Split(";", StringSplitOptions.TrimEntries).ToList());
MergeCurrentCookie(CookieInfo.ConvertCkStrToCkItemList(ckStr));
}

/// <summary>
/// 根据cookie item集合merge(一个“ak=av”为一个cookie item)
/// </summary>
/// <param name="ckItemList">["ak=av","bk=bv"]</param>
public void MergeCurrentCookie(List<string> ckItemList)
{
MergeCurrentCookie(ckItemList.ToDictionary(k => k[..(k.IndexOf("=", StringComparison.Ordinal) + 1)],
v => v[v.IndexOf("=", StringComparison.Ordinal)..]));
MergeCurrentCookie(CookieInfo.ConvertCkItemListToCkDic(ckItemList));
}

/// <summary>
/// 根据cookie dic来merge
/// </summary>
/// <param name="ckDic">{{"ak":"av"}}</param>
public void MergeCurrentCookie(Dictionary<string, string> ckDic)
{
var currentCkDic = GetCurrentCookieDic();
Expand All @@ -74,7 +96,6 @@ public void MergeCurrentCookie(Dictionary<string, string> ckDic)

#endregion


#region private

private Dictionary<string, string> CkStrToDictionary(string ckStr)
Expand Down

0 comments on commit d5fa6ec

Please sign in to comment.