using dy.net.model.entity; using dy.net.model.response; using dy.net.service; using Quartz; using System.Collections.Generic; namespace dy.net.job { [DisallowConcurrentExecution] // 禁止并发执行,确保同一时间只有一个实例在运行 public class DouyinFollowedUsersSyncJob : IJob { /// /// 抖音Cookie服务,用于获取和管理用户Cookie /// protected readonly DouyinCookieService _dyCookieService; /// /// 抖音HTTP客户端服务,用于发送HTTP请求 /// protected readonly DouyinHttpClientService _douyinService; /// /// 抖音关注服务,用于管理关注数据 /// protected readonly DouyinFollowService _followService; protected readonly DouyinCommonService douyinCommonService; public DouyinFollowedUsersSyncJob(DouyinCookieService dyCookieService, DouyinHttpClientService douyinService, DouyinFollowService followService, DouyinCommonService douyinCommonService) { _dyCookieService = dyCookieService; _douyinService = douyinService; _followService = followService; this.douyinCommonService = douyinCommonService; } public async Task Execute(IJobExecutionContext context) { var cookies = await _dyCookieService.GetAllOpendAsync(); if (cookies != null && cookies.Any()) { AppConfig conf = douyinCommonService.GetConfig(); foreach (var ck in cookies) { if (string.IsNullOrWhiteSpace(ck.SecUserId)) { Serilog.Log.Debug($"同步关注列表博主[{ck.UserName}]-未设置secuserid,跳过."); continue; } string count = "20"; string offset = "0"; bool hasmore = true; int total= 0; List follows = new List(); while (hasmore) { try { var data = await _douyinService.SyncMyFollows(count, offset, ck.SecUserId, ck.Cookies, async err => { if (err.StatusCode != 0) { Serilog.Log.Error($"同步关注列表博主[{ck.UserName}]关注列表时发生错误,错误信息:{err.StatusMsg},状态码:{err.StatusCode}"); } // 如果是未登录错误,则跳出循环 if (err.StatusCode == 8) { hasmore = false; } ck.StatusMsg = err.StatusCode == 8 ? "无效" : "正常"; ck.StatusCode = err.StatusCode; await _dyCookieService.UpdateAsync(ck); }); if (data != null) { // 绑定我的用户ID--之前没有这个字段 if (string.IsNullOrWhiteSpace(ck.MyUserId)) { ck.MyUserId = data.MySelfUserId; await _dyCookieService.UpdateAsync(ck); } total = data.Total; hasmore = data.HasMore; offset = data.Offset.ToString(); if (data.Followings != null && data.Followings.Count > 0) { follows.AddRange(data.Followings); } } // 只有第一次启动时,才进行全部同步 if (!conf.IsFirstRunning) { hasmore = false; } } catch (Exception ex) { Serilog.Log.Error($"关注列表同步失败,{ex.Message}"); hasmore = false; break; } } if (follows.Count > 0) { var (add, update, succ) = await _followService.Sync(follows, ck); if (!succ) hasmore = false; else { hasmore = add > 100|| update > 100;//一次最多100条数据 } } } await douyinCommonService.SetConfigNotFirstRunning(); } } } }