private static string userEmail = string.Empty; // 创建的随机邮箱 /// <summary> /// 注册 /// </summary> private void Register() { string inviteCode = "861666925";// string.Empty; using (var db = new ResumeRepairDBEntities()) { var pin101 = db.Pin101.Where(w => w.IsEnable && w.IsActivation && !string.IsNullOrEmpty(w.InviteCode)).OrderBy(o => o.Integral).FirstOrDefault(); if (pin101 != null) { inviteCode = pin101.InviteCode; } } // GET 注册页面 string password = DateTime.Now.ToString("yyyyMMddHHmmss"); string username = password + Global.Email.Substring(Global.Email.IndexOf("@")); string url = "http://101pin.com/home/user/register"; string param = $"username2={username}&password2={password}&showpassword=请设置密码&protocal2=on®_flag=2&invitecode={inviteCode}&invitefrom=1"; // 发送注册请求 var sources = RequestFactory.QueryRequest(url, param, RequestEnum.POST, cookie, referer: "http://101pin.com/Home/User/register/invite/" + inviteCode); if (!sources.Contains("激活邮件已发送至你的邮箱")) { throw new RequestException($"注册请求失败!响应数据:{sources}"); } userEmail = username; using (var db = new ResumeRepairDBEntities()) { db.Pin101.Add(new Pin101 { Email = userEmail, PassWord = userEmail.Substring(0, 14), CreateTime = DateTime.UtcNow, IsEnable = true, Integral = 0, IsActivation = false, IsVerification = false, IsLocked = false, InviteCode = "" }); db.SaveChanges(); } Pin101Scheduling.ssf.SetText(Pin101Scheduling.ssf.fjl_tbx_RegisterActivation, $"注册成功!邮箱:{userEmail}"); }
/// <summary> /// 登录获取积分 /// </summary> /// <returns></returns> private DataResult Login() { var dataResult = new DataResult(); using (var db = new ResumeRepairDBEntities()) { var dateTime = DateTime.UtcNow.Date; var users = db.FenJianLi.Where(w => w.IsActivation && (w.LastLoginTime == null || w.LastLoginTime < dateTime)).Take(3).ToList(); foreach (var user in users) { var param = $"username={user.Email}&password={user.PassWord}&rememberMe=1"; var sources = RequestFactory.QueryRequest("http://www.fenjianli.com/login/login.htm", param, RequestEnum.POST, cookie); if (!sources.Contains("success")) { dataResult.IsSuccess = false; dataResult.ErrorMsg += $"帐号:{user.Email} 登录失败!{Environment.NewLine}响应源:{sources}"; continue; } To: Thread.Sleep(1000); sources = RequestFactory.QueryRequest("http://www.fenjianli.com/search/home.htm", cookieContainer: cookie); if (string.IsNullOrWhiteSpace(sources)) { goto To; } var integralStr = Regex.Match(sources, ">.(\\d+)</a>个积分").Result("$1"); user.LastLoginTime = DateTime.UtcNow; user.Integral = Convert.ToInt32(integralStr); FenJianLiScheduling.ssf.SetText(FenJianLiScheduling.ssf.fjl_tbx_LoginCheckIn, $"登录成功!账户:{user.Email},积分:{integralStr}"); } db.SaveChanges(); } //FenJianLiScheduling.ssf.SetText(FenJianLiScheduling.ssf.fjl_tbx_LoginCheckIn, $"刷新积分成功!"); return(new DataResult()); }
/// <summary> /// 登录获取积分 /// </summary> private DataResult Login() { var dataResult = new DataResult(); using (var db = new ResumeRepairDBEntities()) { var dateTime = DateTime.UtcNow.Date; var users = db.Pin101.Where(w => w.IsActivation && (w.LastLoginTime == null || w.LastLoginTime < dateTime)).Take(3).ToList(); foreach (var user in users) { cookie = Login(user.Email, user.PassWord); To: Thread.Sleep(1000); var sources = RequestFactory.QueryRequest("http://www.101pin.com/home/score/invite", cookieContainer: cookie); if (string.IsNullOrWhiteSpace(sources)) { goto To; } var integralStr = Regex.Match(sources, "剩余下载数:<strong>(\\d+)</strong>")?.Result("$1"); if (string.IsNullOrWhiteSpace(integralStr)) { dataResult.IsSuccess = false; dataResult.ErrorMsg += $"帐号:{user.Email} 获取积分失败!{Environment.NewLine}"; continue; } var inviteStr = Regex.Match(sources, "/invite/(\\d+)").Result("$1"); user.LastLoginTime = DateTime.UtcNow; user.InviteCode = inviteStr; user.Integral = Convert.ToInt32(integralStr); Pin101Scheduling.ssf.SetText(Pin101Scheduling.ssf.fjl_tbx_LoginCheckIn, $"登录成功!账户:{user.Email},积分:{integralStr},邀请码:{inviteStr}"); } db.SaveChanges(); } return(new DataResult()); }
public override DataResult Init() { var dataResult = new DataResult(); try { using (var db = new ResumeRepairDBEntities()) { var dateNow = DateTime.UtcNow.AddDays(-1); if (isFirst) { if (actionBlock.InputCount == 0) { var resumes = db.ResumeRecord.Where(w => (w.PostBackStatus == 0 || w.PostBackStatus == 2) && w.Status == (short)ResumeRecordStatus.MatchSuccess).OrderByDescending(o => o.CreateTime).Take(50).ToList(); foreach (var item in resumes) { actionBlock.Post(item.MatchResumeId); } } isFirst = false; } var users = db.FenJianLi.Where(w => w.IsEnable && w.IsActivation && w.IsVerification && w.Integral > 5 && (!w.IsLocked || w.LockedTime < dateNow)).OrderBy(o => o.VerificationAccount).ToList(); //var users = db.FenJianLi.Where(w => w.IsEnable && w.IsActivation && w.Integral > 5 && w.IsVerification && (!w.IsLocked || w.LockedTime < dateNow)).ToList(); if (users != null) { users.ForEach(f => { f.IsLocked = true; f.LockedTime = DateTime.UtcNow; queue.Enqueue(f); }); } db.SaveChanges(); } } catch (Exception ex) { dataResult.IsSuccess = false; dataResult.ErrorMsg = $"异常信息:{ex.Message},堆栈信息:{ex.StackTrace}"; } return(dataResult); }
/// <summary> /// 下载简历 /// </summary> /// <param name="ids"></param> /// <param name="folderCatalogId"></param> /// <returns></returns> private static int DownloadResume(string ids, string folderCatalogId, EntityFramework.FenJianLi user) { var cookie = Login(user.Email, user.PassWord); var param = $"ids={ids}&folderCatalogId={folderCatalogId}&folderCatalogType=Download&type=add&isResumeId=true&_random={new Random().NextDouble()}"; string html = RequestFactory.QueryRequest("http://www.fenjianli.com/userResumeDetail/addToFolderCatalog.htm", param, RequestEnum.POST, cookie); if (string.IsNullOrEmpty(html)) { throw new RequestException($"下载简历失败!响应为空!,帐号:{user.Email}"); } if (html.Contains("用户可用下载点不足")) { return(1); } if (html.Contains("渠道账号")) { return(2); } if (!html.Contains("成功")) { throw new RequestException($"下载简历失败!响应:{html},帐号:{user.Email}"); } using (var db = new ResumeRepairDBEntities()) { var fenJianLi = db.FenJianLi.FirstOrDefault(f => f.Email == user.Email); if (fenJianLi != null) { fenJianLi.Integral -= 3; } if (fenJianLi != null) { fenJianLi.IsLocked = false; } db.SaveChanges(); } return(0); }
/// <summary> /// 51 授权 /// </summary> /// <param name="user"></param> /// <param name="cookie"></param> /// <param name="isFirst"></param> /// <param name="userName"></param> /// <returns></returns> public static bool Verification(EntityFramework.FenJianLi user, CookieContainer cookie, bool isFirst, string userName) { using (var db = new ResumeRepairDBEntities()) { var account = db.AuthorizationAccount.FirstOrDefault(f => f.IsEnable); if (account == null) { FenJianLiScheduling.ssf.SetText(FenJianLiScheduling.ssf.system_tbx_Exception, "获取授权帐号失败!"); return(false); } var param = $"type=Job51&extendParam={account.ExtendParam}&username={userName}&password={account.PassWord}&_random={new Random().NextDouble()}"; var sources = RequestFactory.QueryRequest("http://www.fenjianli.com/account/bindChannel.htm", param, RequestEnum.POST, cookie); if (!sources.Contains("已经绑定") && !sources.Contains("成功")) { //FenJianLiScheduling.ssf.SetText(FenJianLiScheduling.ssf.system_tbx_Exception, $"渠道授权失败!响应Json:{sources}"); return(false); } var fjlUser = db.FenJianLi.FirstOrDefault(f => f.Email == user.Email); if (isFirst) { if (fjlUser != null) { fjlUser.Integral += 250; } } if (fjlUser != null) { fjlUser.IsVerification = true; fjlUser.VerificationAccount = userName; } db.SaveChanges(); return(true); } }
/// <summary> /// 过滤器 /// </summary> /// <param name="list"></param> /// <returns></returns> private static List <FilterResult> FilterExist(List <ResumeSearch> list) { var filterResult = new List <FilterResult>(); filterResult.AddRange(list.Select(s => new FilterResult { ResumeId = s.ResumeId, ResumeNumber = s.ResumeNumber, UserMasterExtId = s.UserMasterExtId })); if (!isFirst) { using (var db = new ResumeRepairDBEntities()) { var filterResultArr = filterResult.Select(s => s.ResumeId).ToArray(); var resumeIdArr = db.ResumeRecord.Where(w => filterResultArr.Any(a => w.ResumeId == a)).Select(s => s.ResumeId).ToArray(); filterResult.RemoveAll(r => resumeIdArr.Any(a => r.ResumeId == a)); var resumeList = filterResult.Select(s => new ResumeRecord { LibraryExist = 2, ResumePlatform = 1, ResumeId = s.ResumeId, Status = (short)ResumeRecordStatus.WaitMatch, PostBackStatus = 0 }).ToList(); db.ResumeRecord.AddRange(resumeList); db.SaveChanges(); var query = from n in resumeList.AsQueryable() join l in list.AsQueryable() on new { n.ResumeId } equals new { l.ResumeId } select new MatchResumeSearch { LastCompany = l.LastCompany, Name = l.Name, ResumeId = n.ResumeId, ResumeNumber = l.ResumeNumber, University = l.University, UserMasterExtId = l.UserMasterExtId, ResumeRecodeId = n.Id }; db.MatchResumeSearch.AddRange(query); db.SaveChanges(); } } isFirst = false; To: var result = RequestFactory.QueryRequest(Global.FilterAuthUrl, "{\"Username\": \"longzhijie\",\"Password\": \"NuRQe6kC\"}", RequestEnum.POST, contentType: EnumFactory.Codes(ContentTypeEnum.Json)); if (!string.IsNullOrWhiteSpace(result)) { var jObject = JsonConvert.DeserializeObject(result) as JObject; if ((int)jObject["Code"] == 0) { dynamic param = new { Username = "******", Signature = (string)jObject["Signature"], ResumeSummaries = new List <object>() }; param.ResumeSummaries.AddRange(list.Select(s => new { ResumeNumber = s.ResumeNumber, UserMasterExtendId = s.UserMasterExtId, ResumeId = s.ResumeId }).ToList()); result = RequestFactory.QueryRequest(Global.FilterUrl, JsonConvert.SerializeObject(param), RequestEnum.POST, contentType: EnumFactory.Codes(ContentTypeEnum.Json)); if (!string.IsNullOrWhiteSpace(result)) { jObject = JsonConvert.DeserializeObject(result) as JObject; if ((int)jObject["Code"] == 3) { goto To; } if ((int)jObject["Code"] == 0) { using (var db = new ResumeRepairDBEntities()) { var jArray = jObject["ResumeSummaries"] as JArray; var isSuccessBack = true; if (jArray.Count > 0) { Global.TotalMatchSuccess += jArray.Count; Global.TotalDownload += jArray.Count; var matchedResult = jArray.Select(s => new ResumeMatchResult { Cellphone = (string)s["Cellphone"], Email = (string)s["Email"], ResumeNumber = ((string)s["ResumeNumber"]).Substring(0, 10), Status = 2 }).ToList(); var data = RequestFactory.QueryRequest(Global.PostResumesUrl, JsonConvert.SerializeObject(matchedResult), RequestEnum.POST, contentType: "application/json"); if (!data.Contains("成功")) { isSuccessBack = false; } } foreach (var item in jArray) { var resumeId = (string)item["ResumeId"]; var resume = db.ResumeRecord.FirstOrDefault(f => f.ResumeId == resumeId); filterResult.RemoveAll(f => f.ResumeNumber == (string)item["ResumeNumber"] && f.UserMasterExtId == (string)item["UserMasterExtendId"]); if (resume != null) { resume.LibraryExist = 1; resume.Status = (short)ResumeRecordStatus.DownLoadSuccess; resume.DownLoadTime = DateTime.UtcNow; resume.Cellphone = (string)item["Cellphone"]; resume.Email = (string)item["Email"]; resume.PostBackStatus = isSuccessBack ? (short)1 : (short)2; } } db.SaveChanges(); } } } } } return(filterResult); }
/// <summary> /// 初始化启动 /// </summary> public static void Start() { isStart = true; Task.Run(() => { while (isStart) { if (actionBlock.InputCount != 0) { Thread.Sleep(1000); continue; } List <ResumeSearch> resumeSearch = new List <ResumeSearch>(); if (isFirst) { using (var db = new ResumeRepairDBEntities()) { var resumeQuery = from r in db.ResumeRecord join m in db.MatchResumeSearch on r.Id equals m.ResumeRecodeId where r.Status == 1 select m; if (resumeQuery.Count() > 0) { resumeSearch = resumeQuery.Select(s => new ResumeSearch { LastCompany = s.LastCompany, Name = s.Name, ResumeId = s.ResumeId, ResumeNumber = s.ResumeNumber, University = s.University, UserMasterExtId = s.UserMasterExtId }).ToList(); } else { resumeSearch = PullResumes(); isFirst = false; } } } else { resumeSearch = PullResumes(); } var pullResumes = resumeSearch; if (pullResumes.Count == 0) { continue; } var filterResumes = FilterExist(pullResumes); var query = from n in filterResumes.AsQueryable() join l in pullResumes.AsQueryable() on new { n.ResumeId, n.ResumeNumber, n.UserMasterExtId } equals new { l.ResumeId, l.ResumeNumber, l.UserMasterExtId } select new ResumeSearch { LastCompany = l.LastCompany, Name = l.Name, ResumeId = n.ResumeId, ResumeNumber = n.ResumeNumber, University = l.University, UserMasterExtId = l.UserMasterExtId }; var matchList = query.Distinct().ToList(); if (matchList != null) { foreach (var item in matchList) { actionBlock.Post(item); } } } }); }
/// <summary> /// 工作任务 /// </summary> /// <param name="i"></param> private static void Work(ResumeSearch i) { var dataResult = resumeSpider.ResumeRepair(i); // 纷简历平台 using (var db = new ResumeRepairDBEntities()) { if (dataResult.IsSuccess) { ContactInformationSpider.actionBlock.Post(dataResult.Data + "-" + i.ResumeNumber.Substring(0, 10)); var resume = db.ResumeRecord.FirstOrDefault(w => w.ResumePlatform == 1 && w.ResumeId == i.ResumeId); if (resume != null) { resume.Status = (int)ResumeRecordStatus.MatchSuccess; resume.MatchPlatform = 1; resume.MatchResumeId = dataResult.Data + "-" + i.ResumeNumber.Substring(0, 10); resume.MatchTime = DateTime.UtcNow; FenJianLiScheduling.ssf.SetText(FenJianLiScheduling.ssf.tbx_ResumeRepair, $"匹配成功!平台:纷简历,简历ID:{i.ResumeId}"); Interlocked.Add(ref Global.TotalMatchSuccess, 1); } else { FenJianLiScheduling.ssf.SetText(FenJianLiScheduling.ssf.system_tbx_Exception, $"记录简历匹配结果失败!简历ID:{i.ResumeId},结果:匹配成功!"); } } else { var resume = db.ResumeRecord.FirstOrDefault(w => w.ResumePlatform == 1 && w.ResumeId == i.ResumeId); if (resume != null) { resume.Status = (int)ResumeRecordStatus.MatchFailure; resume.MatchTime = DateTime.UtcNow; FenJianLiScheduling.ssf.SetText(FenJianLiScheduling.ssf.tbx_ResumeRepair, $"匹配失败!平台:纷简历,简历ID:{i.ResumeId}"); } else { FenJianLiScheduling.ssf.SetText(FenJianLiScheduling.ssf.system_tbx_Exception, $"记录简历匹配结果失败!简历ID:{i.ResumeId},结果:匹配失败!"); } var requestParam = new List <ResumeMatchResult> { new ResumeMatchResult { ResumeNumber = i.ResumeNumber.Substring(0, 10), Status = 3 } }; var data = RequestFactory.QueryRequest(Global.PostResumesUrl, JsonConvert.SerializeObject(requestParam), RequestEnum.POST, contentType: "application/json"); resume.PostBackStatus = data.Contains("成功") ? (short)1 : (short)2; } db.SaveChanges(); } }
/// <summary> /// 补全信息 /// </summary> /// <param name="resumeId"></param> /// <param name="user"></param> /// <param name="resumeNo"></param> private static void AdditionalInformation(string resumeId, EntityFramework.FenJianLi user, string resumeNo) { var cookie = Login(user.Email, user.PassWord); var id = resumeId.Substring(0, resumeId.IndexOf("/")); var param = $"id={id}&_random={new Random().NextDouble()}"; To: Thread.Sleep(500); string html = RequestFactory.QueryRequest("http://www.fenjianli.com/search/getDetail.htm", param, RequestEnum.POST, cookie, "http://www.fenjianli.com/search/detail.htm"); if (string.IsNullOrWhiteSpace(html) || (html.Contains("非法") && html.Length < 20)) { goto To; } var jObject = JsonConvert.DeserializeObject(html) as JObject; var email = (string)jObject["contact"]?["email"]; var mobile = (string)jObject["contact"]?["mobile"]; string path; if (id.Length > 4) { path = $"D:\\Resumes\\Complete\\{DateTime.Now:yyyy-MM-dd}\\{id.Remove(2)}\\{id.Substring(2, 2)}"; } else { path = $"D:\\Resumes\\Complete\\{DateTime.Now:yyyy-MM-dd}\\other"; } if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } try { File.WriteAllText($"{path}\\{id}.json", html); var requestParam = new List <ResumeMatchResult> { new ResumeMatchResult { Cellphone = mobile, Email = email, ResumeNumber = resumeNo, Status = 2 } }; var dataResult = RequestFactory.QueryRequest(Global.PostResumesUrl, JsonConvert.SerializeObject(requestParam), RequestEnum.POST, contentType: "application/json"); using (var db = new ResumeRepairDBEntities()) { var matchResumeId = $"{resumeId}-{resumeNo}"; var record = db.ResumeRecord.FirstOrDefault(w => w.MatchPlatform == 1 && w.MatchResumeId == matchResumeId); if (record != null) { record.Email = email; record.Cellphone = mobile; record.Status = (int)ResumeRecordStatus.DownLoadSuccess; record.PostBackStatus = dataResult.Contains("成功") ? (short)1 : (short)2; record.DownLoadTime = DateTime.UtcNow; db.SaveChanges(); } else { FenJianLiScheduling.ssf.SetText(FenJianLiScheduling.ssf.system_tbx_Exception, $"更新补全简历信息失败!纷简历ID:{id}"); } } Interlocked.Add(ref count, 1); Interlocked.Add(ref Global.TotalDownload, 1); FenJianLiScheduling.ssf.SetText(FenJianLiScheduling.ssf.fjl_tbx_RepairResume, $"补全简历成功!{user.Email} id:{id},补全简历份数:{count}"); } catch (FileNotFoundException ex) { throw new RequestException($"找不到文件路径, 原因:{ex.Message},帐号:{user.Email}"); } }
/// <summary> /// 工作单元 /// </summary> /// <param name="resumeId"></param> /// <param name="resumeNo"></param> private static void Work(string resumeId, string resumeNo) { EntityFramework.FenJianLi user; var cookie = new CookieContainer(); Next: while (!queue.TryDequeue(out user)) { Thread.Sleep(1000); } ; if (!user.IsVerification) { cookie = Login(user.Email, user.PassWord); var sources = RequestFactory.QueryRequest("http://192.168.1.100:15286/api/Fenjianli/GetAuthenticationAccount?token=g9Cp5O0l2ZENYI8J0PxMk7sZk624nkxY"); string userName; if (Regex.IsMatch(sources, "\"(.+?)\"") && !sources.Contains("Cookie was invalid")) { userName = Regex.Match(sources, "\"(.+?)\"").Result("$1"); } else { throw new RequestException($"解析51帐号失败!,返回信息:{sources}"); } var tryCount = 0; while (!Verification(user, cookie, true, userName)) { if (tryCount > 1) { goto Next; } tryCount++; } } cookie = Login(user.Email, user.PassWord); var id = resumeId.Substring(0, resumeId.IndexOf("/")); var param = $"id={id}&_random={new Random().NextDouble()}"; Thread.Sleep(500); var html = RequestFactory.QueryRequest("http://www.fenjianli.com/search/getDetail.htm", param, RequestEnum.POST, cookie, "http://www.fenjianli.com/search/detail.htm"); if (string.IsNullOrWhiteSpace(html) || html.Contains("很抱歉,出错了")) { using (var db = new ResumeRepairDBEntities()) { var fjl = db.FenJianLi.FirstOrDefault(w => w.Id == user.Id); if (fjl != null) { fjl.IsLocked = false; db.SaveChanges(); } else { FenJianLiScheduling.ssf.SetText(FenJianLiScheduling.ssf.system_tbx_Exception, $"用户{user.Email}解锁失败!"); } } errorCount++; FenJianLiScheduling.ssf.SetText(FenJianLiScheduling.ssf.system_tbx_Exception, $"找不到简历:简历id:{id} 用户{user.Email}! 数量:{errorCount}"); return; } var folderCatalogId = GetFolderCatalogId(user); if (string.IsNullOrWhiteSpace(folderCatalogId)) { throw new RequestException($"获取文件夹编号失败!,帐号:{user.Email}"); } Download: var result = DownloadResume(resumeId, folderCatalogId, user); if (result == 1) { using (var db = new ResumeRepairDBEntities()) { var fjl = db.FenJianLi.FirstOrDefault(w => w.Id == user.Id); if (fjl != null) { fjl.IsLocked = false; db.SaveChanges(); } else { FenJianLiScheduling.ssf.SetText(FenJianLiScheduling.ssf.system_tbx_Exception, $"用户{user.Email}解锁失败!"); } } while (!queue.TryDequeue(out user)) { Thread.Sleep(1000); } ; cookie = Login(user.Email, user.PassWord); goto Download; } if (result == 2) { var sources = RequestFactory.QueryRequest("http://192.168.1.100:15286/api/Fenjianli/GetAuthenticationAccount?token=g9Cp5O0l2ZENYI8J0PxMk7sZk624nkxY"); string userName; if (Regex.IsMatch(sources, "\"(.+?)\"")) { userName = Regex.Match(sources, "\"(.+?)\"").Result("$1"); } else { throw new RequestException($"解析51帐号失败!,返回信息:{sources}"); } var tryCount = 0; while (!Verification(user, cookie, false, userName)) { if (tryCount > 1) { goto Next; } tryCount++; } } AdditionalInformation(resumeId, user, resumeNo); }
/// <summary> /// 激活 /// </summary> /// <returns></returns> private DataResult Activation() { var dataResult = new DataResult(); using (var db = new ResumeRepairDBEntities()) { var list = db.FenJianLi.Where(w => !w.IsActivation).ToList(); if (list.Count == 0) { return(dataResult); } #region 获取未读邮件列表 var seenUids = new List <string>(); var messages = EmailFactory.FetchUnseenMessages("pop.exmail.qq.com", 995, true, Global.Email, Global.PassWord, seenUids); foreach (var userEmail in list) { var message = messages.FirstOrDefault(f => f.message.Headers.To.FirstOrDefault()?.Address == userEmail.Email); if (message == null) { //dataResult.IsSuccess = false; //dataResult.ErrorMsg += $"获取激活邮件失败!,找不到邮件!邮箱地址:{userEmail.Email}"; continue; } var content = Encoding.Default.GetString(message.message.RawMessage); var url = string.Empty; if (Regex.IsMatch(content, "(?s)code=(.+?)</a>")) { url = "http://www.fenjianli.com/register/checkEmailOfCode.htm?code=" + Regex.Match(content, "(?s)code=(.+?)</a>").Result("$1").Substring(2); } var html = RequestFactory.QueryRequest(url); if (!html.Contains("成功")) { dataResult.IsSuccess = false; dataResult.ErrorMsg += $"激活失败!,邮箱地址:{userEmail.Email}{Environment.NewLine}"; continue; } userEmail.IsActivation = true; FenJianLiScheduling.ssf.SetText(FenJianLiScheduling.ssf.fjl_tbx_RegisterActivation, $"激活成功!邮箱:{userEmail.Email}"); if (!EmailFactory.DeleteMessageByMessageId("pop.exmail.qq.com", 995, true, Global.Email, Global.PassWord, message.message.Headers.MessageId)) { FenJianLiScheduling.ssf.SetText(FenJianLiScheduling.ssf.fjl_tbx_RegisterActivation, $"删除激活邮件失败,邮箱地址:{userEmail.Email}"); } } #endregion db.SaveChanges(); } return(dataResult); }
private DataResult Activation() { var dataResult = new DataResult(); using (var db = new ResumeRepairDBEntities()) { var list = db.Pin101.Where(w => !w.IsActivation).ToList(); if (list.Count == 0) { return(dataResult); } #region 获取未读邮件列表 var seenUids = new List <string>(); var messages = EmailFactory.FetchUnseenMessages("pop.exmail.qq.com", 995, true, Global.Email, Global.PassWord, seenUids); foreach (var userEmail in list) { var message = messages.FirstOrDefault(f => f.message.Headers.To.FirstOrDefault()?.Address == userEmail.Email); if (message == null) { //dataResult.IsSuccess = false; //dataResult.ErrorMsg += $"获取激活邮件失败!,找不到邮件!邮箱地址:{userEmail.Email}"; continue; } var content = Encoding.UTF8.GetString(message.message.FindFirstHtmlVersion().Body); var url = string.Empty; //var referer = string.Empty; //if (Regex.IsMatch(content, "(?s)(http://sctrack.+?html)")) //{ // url = Regex.Match(content, "(?s)(http://sctrack.+?html)").Result("$1"); //} if (Regex.IsMatch(content, "(?s)php\\?s=(.+?/istype/\\d+)")) { url = "http://www.101pin.com/index.php?s=" + Regex.Match(content, "(?s)php\\?s=(.+?/istype/\\d+)").Result("$1"); } var html = RequestFactory.QueryRequest(url, accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); if (!html.Contains("成功")) { dataResult.IsSuccess = false; dataResult.ErrorMsg += $"激活失败!,邮箱地址:{userEmail.Email}{Environment.NewLine}"; continue; } userEmail.IsActivation = true; Pin101Scheduling.ssf.SetText(Pin101Scheduling.ssf.fjl_tbx_RegisterActivation, $"激活成功!邮箱:{userEmail.Email}"); if (!EmailFactory.DeleteMessageByMessageId("pop.exmail.qq.com", 995, true, Global.Email, Global.PassWord, message.message.Headers.MessageId)) { Pin101Scheduling.ssf.SetText(Pin101Scheduling.ssf.fjl_tbx_RegisterActivation, $"删除激活邮件失败,邮箱地址:{userEmail.Email}"); } } #endregion db.SaveChanges(); } return(dataResult); }
private static string userEmail = string.Empty; // 创建的随机邮箱 /// <summary> /// 注册 /// </summary> private void Register() { // GET 注册页面 string sources = RequestFactory.QueryRequest("http://www.fenjianli.com/register/toRegisterByEmail.htm", cookieContainer: cookie); string id = Regex.Match(sources, "validate-id.+?\"(\\d+)")?.Result("$1"); if (id == null) { throw new RequestException("获取注册 ID 失败,失败原因:请求异常,导致解析HTML出错,源码:" + sources); } string password = DateTime.Now.ToString("yyyyMMddHHmmss"); string username = password + Global.Email.Substring(Global.Email.IndexOf("@")); string url = "http://www.fenjianli.com/register/register.htm"; #region 获取验证码 var imgUrl = "http://www.fenjianli.com/register/getCheckCode.htm?" + new Random().NextDouble(); // 随机化图片验证码 var loginRequest = (HttpWebRequest)WebRequest.Create(imgUrl); loginRequest.Accept = "image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5"; // 图片类型 loginRequest.CookieContainer = cookie; using (var imgresponse = loginRequest.GetResponse()) { using (var imgreader = imgresponse.GetResponseStream()) { var writer = new FileStream("D:\\pic.jpg", FileMode.OpenOrCreate, FileAccess.Write); var buff = new byte[512]; int read; while (imgreader != null && (read = imgreader.Read(buff, 0, buff.Length)) > 0) { writer.Write(buff, 0, read); } writer.Close(); writer.Dispose(); } } StreamReader sr = new StreamReader("D:\\pic.jpg"); FenJianLiScheduling.cnf.pbx_checkNumber.Image = Image.FromStream(sr.BaseStream); string checkCode = Interaction.InputBox("请输入验证码!", "验证码"); sr.Close(); sr.Dispose(); //checkForm.Close(); #endregion string param = $"id={id}®Type=email&username={username}&password={password}&confirmPassword={password}&checkCode={checkCode}&agree=1&_random={new Random().NextDouble()}"; // 发送注册请求 sources = RequestFactory.QueryRequest(url, param, RequestEnum.POST, cookie); if (!sources.Contains("成功")) { throw new RequestException($"注册请求失败!响应数据:{sources}"); } userEmail = username; using (var db = new ResumeRepairDBEntities()) { db.FenJianLi.Add(new EntityFramework.FenJianLi { Email = userEmail, PassWord = userEmail.Substring(0, 14), CreateTime = DateTime.UtcNow, IsEnable = true, Integral = 255, IsActivation = false, IsVerification = false, IsLocked = false }); db.SaveChanges(); } FenJianLiScheduling.ssf.SetText(FenJianLiScheduling.ssf.fjl_tbx_RegisterActivation, $"注册成功!邮箱:{userEmail}"); url = "http://www.fenjianli.com/register/sendCheckEmail.htm"; param = $"id={id}&checkSource={username}&_random={new Random().NextDouble()}"; sources = RequestFactory.QueryRequest(url, param, RequestEnum.POST, cookie); // 发送激活邮件请求 if (!sources.Contains("成功")) { throw new RequestException($"发送激活邮件请求失败!响应数据:{sources}"); } FenJianLiScheduling.ssf.SetText(FenJianLiScheduling.ssf.fjl_tbx_RegisterActivation, $"发送激活邮件成功!邮箱:{userEmail}"); }
private static void FilterExist() { int total = 0; int filter = 0; int success = 0; using (var db = new ResumeRepairDBEntities()) { var resumeQuery = from r in db.ResumeRecord.AsNoTracking() join m in db.MatchResumeSearch.AsNoTracking() on r.ResumeId equals m.ResumeId where r.Status == 2 orderby r.Id select new { r, m }; var count = 8526; // var count = db.Database.SqlQuery<int>("SELECT count(*) FROM \"ResumeRecord\" AS R INNER JOIN \"MatchResumeSearch\" AS M ON R.\"ResumeId\" = M.\"ResumeId\" WHERE r.\"Status\" = 3"); total = count; To: var result = RequestFactory.QueryRequest("http://192.168.1.100:15286/api/queryresume/login", "{\"Username\": \"longzhijie\",\"Password\": \"NuRQe6kC\"}", RequestEnum.POST, contentType: "application/json"); if (!string.IsNullOrWhiteSpace(result)) { var jObject = JsonConvert.DeserializeObject(result) as JObject; if ((int)jObject["Code"] == 3) { goto To; } if ((int)jObject["Code"] == 0) { var signature = (string)jObject["Signature"]; var index = 0; NpgsqlConnection conn = new NpgsqlConnection("Server=localhost;Database=ResumeRepairDB;Uid=postgres;Pwd=a123456;"); conn.Open(); while (true) { if (index > 8526) { break; } dynamic param = new { Username = "******", Signature = signature, ResumeSummaries = new List <object>() }; NpgsqlDataAdapter ndap = new NpgsqlDataAdapter($"SELECT M.* FROM \"ResumeRecord\" AS R INNER JOIN \"MatchResumeSearch\" AS M ON R.\"ResumeId\" = M.\"ResumeId\" WHERE r.\"Status\" = 2 LIMIT 20 OFFSET {index}", conn); DataSet ds = new DataSet(); ndap.Fill(ds); var tab = ds.Tables[0]; //var list = resumeQuery.Skip(index).Take(20).ToList(); foreach (DataRow item in tab.Rows) { param.ResumeSummaries.Add(new { ResumeNumber = (string)item["ResumeNumber"], UserMasterExtendId = (string)item["UserMasterExtId"], ResumeId = (string)item["ResumeId"] }); } index += 20; //if (list == null || list.Count == 0) break; filter += 20; //param.ResumeSummaries.AddRange(list.Select(s => new { ResumeNumber = s.m.ResumeNumber, UserMasterExtendId = s.m.UserMasterExtId, ResumeId = s.m.ResumeId }).ToList()); result = RequestFactory.QueryRequest("http://192.168.1.100:15286/api/queryresume/query", JsonConvert.SerializeObject(param), RequestEnum.POST, contentType: "application/json"); if (!string.IsNullOrWhiteSpace(result)) { jObject = JsonConvert.DeserializeObject(result) as JObject; if ((int)jObject["Code"] == 0) { var jArray = jObject["ResumeSummaries"] as JArray; var isSuccessBack = true; if (jArray.Count > 0) { var matchedResult = jArray.Select(s => new { Cellphone = (string)s["Cellphone"], Email = (string)s["Email"], ResumeNumber = ((string)s["ResumeNumber"]).Substring(0, 10), Status = 2 }).ToList(); var data = RequestFactory.QueryRequest("http://192.168.1.38:8085/splider/Resume/ModifyContact", JsonConvert.SerializeObject(matchedResult), RequestEnum.POST, contentType: "application/json"); if (!data.Contains("成功")) { isSuccessBack = false; } } foreach (var item in jArray) { var resumeId = (string)item["ResumeId"]; var resume = db.ResumeRecord.FirstOrDefault(f => f.ResumeId == resumeId); if (resume != null) { resume.LibraryExist = 1; resume.Status = 4; resume.DownLoadTime = DateTime.UtcNow; resume.Cellphone = (string)item["Cellphone"]; resume.Email = (string)item["Email"]; resume.PostBackStatus = isSuccessBack ? (short)1 : (short)2; } } success += jArray.Count; } } Console.WriteLine($"共 {total} 条,已过滤 {filter} 条,匹配成功 {success} 条, 命中率 {Math.Round((decimal)success / filter, 2) * 100}% 进度 {Math.Round((decimal)filter / total,2) * 100}%"); } db.SaveChanges(); conn.Close(); } } } }
/// <summary> /// 检查命中率 /// </summary> private static void Check() { using (var db = new ResumeRepairDBEntities()) { var successList = new List <string>(); var deSuccessList = new List <string>(); var jbs = new JiebaSegmenter(); var list = db.ResumeRecord.Where(w => w.PostBackStatus == 1 && w.Status != 3).ToList(); var fileList = new DirectoryAllFiles().GetAllFiles(new DirectoryInfo("D:\\Resumes\\Complete\\")); var count = 0d; var success = 0d; var countNull = 0; foreach (var item in list) { count++; var resumeNumber = item.MatchResumeId.Substring(item.MatchResumeId.IndexOf("-") + 1); var resumeJson = RequestFactory.QueryRequest("http://192.168.1.38:8085/splider/Resume/GetResumeByNumber?resumenumber=" + resumeNumber); if (string.IsNullOrWhiteSpace(resumeJson) || resumeJson.Contains("null")) { Console.WriteLine("请求响应为空!resumenumber:" + resumeNumber); count--; countNull++; continue; } var fileName = item.MatchResumeId.Substring(0, item.MatchResumeId.IndexOf("/")) + ".json"; var file = fileList.FirstOrDefault(f => f.FileName == fileName); try { var json = File.ReadAllText(file.FilePath); var jObjectA = JsonConvert.DeserializeObject(resumeJson) as JObject; var jObjectB = JsonConvert.DeserializeObject(json) as JObject; var evaluation = ((JArray)jObjectA["Resumes"])[0]["Intention"]["Evaluation"].ToString(); if (string.IsNullOrWhiteSpace(evaluation)) { Console.WriteLine("自我介绍为空!简历ID:" + resumeNumber); count--; continue; } var arrSelf = ((JArray)jObjectB["selfIntroduction"]); if (arrSelf.Count == 0) { Console.WriteLine("自我介绍为空!Path:" + file.FilePath); count--; continue; } var selfIntroduction = arrSelf[0]?["content"].ToString(); if (string.IsNullOrWhiteSpace(selfIntroduction)) { Console.WriteLine("自我介绍为空!Path:" + file.FilePath); count--; continue; } var arrList = jbs.Cut(selfIntroduction).Where(w => w.Length > 1).Take(3); if (arrList.All(a => evaluation.Contains(a))) { success++; successList.Add($"{resumeJson}{Environment.NewLine}--------------------------------{json}"); Console.WriteLine($"命中成功!命中率:{Math.Round(success / count, 3) * 100}%"); } else { deSuccessList.Add($"{resumeJson}{Environment.NewLine}--------------------------------{json}"); } } catch (FileNotFoundException) { Console.WriteLine("找不到文件!Path:" + file.FilePath); continue; } } } Console.WriteLine("End"); }