private void SaveCacheByOss(KeyValuePair <KeyValuePair <int, string>, dynamic> tempData) { var resumeData = tempData.Value; var resumeDetail = JsonConvert.DeserializeObject(resumeData.detialJSonStr.ToString()); var resumeId = resumeData.resumeId != null ? (int)resumeData.resumeId : resumeDetail.ResumeId != null ? (int)resumeDetail.ResumeId : 0; var resumeNumber = ((string)resumeData.resumeNo).Substring(0, 10); var model = new ResumeMatchResult { Cellphone = null, Email = null, ModifyTime = BaseFanctory.GetTime((string)resumeDetail.DateModified).ToUniversalTime(), Name = (string)resumeData.userDetials.userName, ResumeId = resumeId, ResumeNumber = resumeNumber, UserExtId = resumeDetail.UserMasterExtId.ToString(), UserId = (int)resumeData.userDetials.userMasterId, Path = $@"{savePath}\{resumeId}.json", CompanyId = tempData.Key.Key, CreateTime = BaseFanctory.GetTime((string)resumeDetail.DateCreated).ToUniversalTime() }; uploadOssActionBlock.Post(new KeyValuePair <string, dynamic>($@"{savePath}\{resumeId}.json", tempData.Value)); this.SaveResumeInfo(model); }
private void btn_Start_Click(object sender, EventArgs e) { if (string.IsNullOrWhiteSpace(this.tbx_CopyNumber.Text)) { Program.SetLog(this.tbx_Logger, "请输入拷贝份数!"); return; } int copyNumber; if (!int.TryParse(this.tbx_CopyNumber.Text, out copyNumber)) { Program.SetLog(this.tbx_Logger, "拷贝份数必须是数字!"); return; } if (string.IsNullOrWhiteSpace(this.tbx_FromFolderPath.Text)) { var folderBrowserDialog = new FolderBrowserDialog(); if (folderBrowserDialog.ShowDialog() != DialogResult.OK) { return; } this.tbx_FromFolderPath.Text = folderBrowserDialog.SelectedPath; } this.RunAsync(() => { for (var i = 0; i < copyNumber; i++) { BaseFanctory.CopyDir(this.tbx_FromFolderPath.Text, $"{this.tbx_FromFolderPath.Text}_{i + 1:000}"); this.AsyncSetLog(this.tbx_Logger, $"拷贝成功!第 {i + 1} 份"); } this.AsyncSetLog(this.tbx_Logger, "拷贝完成!"); }); }
/// <summary> /// 导入外部Josn /// </summary> private static void ImportResume() { var importCount = 0; while (true) { try { var filePaths = Directory.GetFiles(importFilePath); if (filePaths.Length == 0) { Thread.Sleep(10 * 1000); continue; } Console.WriteLine($"{DateTime.Now} > {filePaths.Length} Need Import ! "); foreach (var filePath in filePaths) { try { var jsonObj = JsonConvert.DeserializeObject <dynamic>(File.ReadAllText(filePath)); var resumeData = jsonObj.data == null ? jsonObj : jsonObj.data; var resumeDetail = JsonConvert.DeserializeObject(resumeData.detialJSonStr.ToString()); var resumeId = resumeData.resumeId != null ? (int)resumeData.resumeId : resumeDetail.ResumeId != null ? (int)resumeDetail.ResumeId : 0; var cellphone = resumeData.userDetials.mobilePhone.ToString(); if (string.IsNullOrEmpty(cellphone)) { var path = importFailPath + Path.GetFileName(filePath); if (File.Exists(path)) { File.Delete(path); } File.Move(filePath, path); continue; } var resumeNumber = ((string)resumeData.resumeNo).Substring(0, 10); var userId = (int)resumeData.userDetials.userMasterId; var refreshTime = BaseFanctory.GetTime((string)resumeDetail.DateLastReleased).ToUniversalTime(); using (var db = new MangningXssDBEntities()) { var resume = db.ZhaopinResume.FirstOrDefault(f => f.Id == resumeId); var isNeedUpload = true; var sourceFlag = -1; var isUpload = false; if (resume != null) { sourceFlag = resume.Flag; } if (!(resume?.RefreshTime != null && resume.RefreshTime.Value.Date >= refreshTime.Date) || resume?.Flag < 8) { if (resume != null) { resume.RandomNumber = resumeNumber; resume.RefreshTime = refreshTime; resume.UpdateTime = DateTime.UtcNow; if (string.IsNullOrEmpty(resume.UserExtId)) { resume.UserExtId = resumeDetail.UserMasterExtId?.ToString(); } if (resumeData.Flag != null && (int)resumeData.Flag < 0) { if (resume.Flag >= 8 || mangningOssClient.DoesObjectExist(mangningBucketName, $"Zhaopin/Resume/{resume.Id}") || mangningOssClient.DoesObjectExist(mangningBucketName, $"WatchResume/{resume.Id}")) { isNeedUpload = false; } } resume.Flag = 0xE; } else { resume = new ZhaopinResume { Id = resumeId, RandomNumber = resumeNumber, UserId = userId, RefreshTime = refreshTime, UpdateTime = DateTime.UtcNow, UserExtId = resumeDetail.UserMasterExtId.ToString(), DeliveryNumber = null, Source = "Import", Flag = 0xE }; db.ZhaopinResume.Add(resume); } var user = db.ZhaopinUser.FirstOrDefault(f => f.Id == userId); if (user != null) { if (!user.Source.Contains("MANUAL")) { user.ModifyTime = BaseFanctory.GetTime((string)resumeDetail.DateModified).ToUniversalTime(); user.CreateTime = resumeData.Flag != null && (int)resumeData.Flag < 0 ? user.CreateTime : BaseFanctory.GetTime((string)resumeDetail.DateCreated).ToUniversalTime(); user.Cellphone = resumeData.userDetials.mobilePhone.ToString(); user.Email = resumeData.userDetials.email.ToString(); user.Name = resumeData.userDetials.userName.ToString(); user.UpdateTime = DateTime.UtcNow; user.Username = resumeData.userDetials.email.ToString(); } } else { user = new ZhaopinUser { Id = userId, Source = "Import", ModifyTime = BaseFanctory.GetTime((string)resumeDetail.DateModified).ToUniversalTime(), CreateTime = BaseFanctory.GetTime((string)resumeDetail.DateCreated).ToUniversalTime(), Cellphone = resumeData.userDetials.mobilePhone.ToString(), Email = resumeData.userDetials.email.ToString(), Name = resumeData.userDetials.userName.ToString(), UpdateTime = DateTime.UtcNow, Username = resumeData.userDetials.email.ToString() }; db.ZhaopinUser.Add(user); } if (isNeedUpload) { isUpload = true; var resumeContent = JsonConvert.SerializeObject(resumeData); using (var jsonStream = new MemoryStream(GZip.Compress(Encoding.UTF8.GetBytes(resumeContent)))) { mangningOssClient.PutObject(mangningBucketName, $"Zhaopin/Resume/{resume.Id}", jsonStream); } } db.SaveChanges(); } File.Delete(filePath); Console.WriteLine($"{DateTime.Now} > Improt success ! ResumeId = {resumeId}, SourceFlag = {sourceFlag}, IsUpload = {isUpload}, Count = {++importCount}."); } } catch (Exception ex) { var path = importFailPath + Path.GetFileName(filePath); if (File.Exists(path)) { File.Delete(path); } File.Move(filePath, path); Trace.WriteLine($"{DateTime.Now} > Import Error Message = {ex.Message}, Path = {path}."); } } } catch (Exception ex) { Trace.TraceError(ex.ToString()); } } }
public void MatchZhaopin() { var resumeQueue = new ConcurrentQueue <OldResumeSummary>(); var cookieQueue = new ConcurrentQueue <QueueParam>(); var todayString = DateTime.Today.ToString("yyyy-MM-dd"); using (var db = new MangningXssDBEntities()) { var companyArr = db.ZhaoPinCompany.Where(w => w.Source.Contains("MANUAL")).Select(s => s.Id).ToArray(); var paramArr = db.ZhaopinStaff.Where(w => companyArr.Any(a => a == w.CompanyId) && !string.IsNullOrEmpty(w.Cookie)).Select(s => new { s.CompanyId, s.Cookie }).ToArray(); foreach (var param in paramArr) { var task = db.ZhaopinResumeMatchLimit.FirstOrDefault(f => f.CompanyId == param.CompanyId); if (task == null) { continue; } var todayTask = db.ZhaopinResumeMatchStatistic.FirstOrDefault(f => f.CompanyId == param.CompanyId && f.Date == todayString); if (todayTask == null) { todayTask = new ZhaopinResumeMatchStatistic { Date = todayString, CompanyId = param.CompanyId, MatchedCount = 0, SearchCount = 0, WatchCount = 0 }; db.ZhaopinResumeMatchStatistic.Add(todayTask); db.SaveChanges(); } if (todayTask.SearchCount == task.DailySearchCount || todayTask.WatchCount == task.DailyWatchCount) { continue; } cookieQueue.Enqueue(new QueueParam { CompanyId = param.CompanyId, Cookie = param.Cookie, DailySeachCount = task.DailySearchCount, DailyWatchCount = task.DailyWatchCount, MatchCount = todayTask.MatchedCount, SeachCount = todayTask.SearchCount, WatchCount = todayTask.WatchCount + todayTask.MatchedCount }); } } Task.Run(() => { while (true) { if (resumeQueue.Count < 10) { using (var db = new ResumeMatchDBEntities()) { var resumeList = db.OldResumeSummary.Where(w => w.ResumeId.Length == 10 && !w.IsMatched && w.Status == 0).Take(1000).ToList(); resumeList.ForEach(f => { resumeQueue.Enqueue(f); }); } } Thread.Sleep(TimeSpan.FromSeconds(1)); } }); for (var j = 0; j < 16; j++) { Task.Run(() => { using (var db = new ResumeMatchDBEntities()) { while (true) { #region 匹配 OldResumeSummary resume; if (!resumeQueue.TryDequeue(out resume)) { continue; } var startNum = 0; var resumeTemp = resume; resume = db.OldResumeSummary.FirstOrDefault(f => f.Id == resumeTemp.Id); QueueParam cookie; if (!cookieQueue.TryDequeue(out cookie)) { return; } try { using (var xdb = new MangningXssDBEntities()) { var filePath = $@"E:\Data\智联招聘\{resume.Template}\{resume.ResumeId}.{Path.GetFileNameWithoutExtension(resume.Template)}"; if (!File.Exists(filePath)) { LogFactory.Warn($"指定路径不存在!ResumeNumber=>{resume.ResumeId} Path=>{filePath}"); resume.Status = 1; resume.MatchTime = DateTime.Now; db.SaveChanges(); continue; } var sourceCode = File.ReadAllText(filePath); //var sourceCode = string.Empty; var genderMatch = Regex.Match(sourceCode, "(男|女)"); var gender = string.Empty; if (genderMatch.Success) { gender = genderMatch.Value == "男" ? "1" : "2"; } var matchs = Regex.Matches(sourceCode, "[\u4e00-\u9fa5]{4,11}有限公司[\u4e00-\u9fa5]{0,6}"); var companys = new List <string>(); if (matchs.Count == 0) { if (cookie.SeachCount - cookie.WatchCount < 50) { Console.WriteLine($"该简历未匹配到公司!ResumeNumber=> {resume.ResumeId}"); resume.Status = 1; resume.MatchTime = DateTime.Now; db.SaveChanges(); cookieQueue.Enqueue(cookie); continue; } companys.Add(string.Empty); } for (var i = 0; i < matchs.Count; i++) { if (i == 2) { break; } companys.Add(matchs[i].Value); } var isMatched = true; var age = string.Empty; for (var i = 0; i < companys.Count; i++) { var companyName = companys[i]; var statistic = xdb.ZhaopinResumeMatchStatistic.FirstOrDefault(f => f.Date == todayString && f.CompanyId == cookie.CompanyId); if (statistic == null) { continue; } var cookieContainer = cookie.Cookie.Serialize(".zhaopin.com"); var start = string.IsNullOrEmpty(companyName) ? startNum * 100 : 0; var paramDictionary = new Dictionary <string, string> { { "keywords", "的" }, { "startNum", $"{start}" }, { "rowsCount", "100" }, { "sortColumnName", "sortUpDate" }, { "sortColumn", "sortUpDate desc" }, { "onlyHasImg", "false" }, { "anyKeyWord", "false" }, { "sex", gender }, { "companyName", companyName }, { "onlyLastWork", "false" }, { "ageStart", age }, { "ageEnd", age } }; var requestResult = HttpClientFactory.RequestForString("https://ihr.zhaopin.com/resumesearch/search.do", HttpMethod.Post, paramDictionary, cookieContainer); if (!requestResult.IsSuccess) { isMatched = false; break; } var jObject = JsonConvert.DeserializeObject(requestResult.Data) as JObject; if (jObject["code"] != null) { LogFactory.Warn($"CompanyId => {cookie.CompanyId} 搜索异常 异常信息:{(string)jObject["message"]}"); isMatched = false; return; } statistic.SearchCount += 1; ++cookie.SeachCount; Console.WriteLine($"CompanyId => {cookie.CompanyId} 搜索公司=> {companyName} 性别=> {genderMatch.Value} 今日请求次数:{cookie.SeachCount} "); xdb.SaveChanges(); var matchResumes = (JArray)jObject?["results"]; if (matchResumes == null) { continue; } if (matchResumes.Count == 0) { continue; } var matchResume = matchResumes.FirstOrDefault(a => ((string)a["number"]).Substring(0, 10) == resume.ResumeId); var resumes = matchResumes.Where(w => DateTime.Parse((string)w["modifyDate"]) > DateTime.Today.AddDays(-2)); foreach (var item in resumes) { var wcount = matchResume == null ? cookie.WatchCount : cookie.WatchCount + 1; if (cookie.SeachCount <= wcount) { break; } var number = ((string)item["number"]).Substring(0, 10); if (xdb.ZhaopinResume.Any(a => a.RandomNumber == number)) { continue; } lock (lockObj) { if (xdb.ZhaopinWatchedResume.Any(a => a.ResumeNumber == number)) { continue; } requestResult = HttpClientFactory.RequestForString($"http://ihr.zhaopin.com/resumesearch/getresumedetial.do?resumeNo={(string)item["id"]}_1&resumeSource=1&key=&{(string)item["valResumeTimeStr"]}", HttpMethod.Get, null, cookieContainer); if (requestResult.IsSuccess) { var resumeData = JsonConvert.DeserializeObject <dynamic>(requestResult.Data).data; var resumeDetail = JsonConvert.DeserializeObject(resumeData.detialJSonStr.ToString()); var resumeid = resumeData.resumeId != null ? (int)resumeData.resumeId : resumeDetail.ResumeId != null ? (int)resumeDetail.ResumeId : 0; statistic.WatchCount += 1; Console.WriteLine($"CompanyId => {cookie.CompanyId} 查看简历成功!查看简历份数:{++cookie.WatchCount} ResumeNumber => {number}"); xdb.ZhaopinWatchedResume.Add(new ZhaopinWatchedResume { Id = resumeid, ResumeNumber = number, CompanyId = cookie.CompanyId, WatchTime = DateTime.UtcNow }); xdb.SaveChanges(); } } } if (cookie.SeachCount - cookie.WatchCount > 50 && string.IsNullOrEmpty(companyName) && matchResume == null) { i--; if (startNum == 40) { if (string.IsNullOrEmpty(age)) { age = "18"; } else { age = (Convert.ToInt32(age) + 1).ToString(); } startNum = 0; } else { startNum++; } continue; } if (matchResume == null) { continue; } var resumeNo = (string)matchResume["id"] + "_1"; var resumeNumber = ((string)matchResume["number"]).Substring(0, 10); if (xdb.ZhaopinResume.Any(a => a.RandomNumber == resumeNumber)) { continue; } var valResumeTimeStr = (string)matchResume["valResumeTimeStr"]; requestResult = HttpClientFactory.RequestForString($"http://ihr.zhaopin.com/resumesearch/getresumedetial.do?resumeNo={resumeNo}&resumeSource=1&key=&{valResumeTimeStr}", HttpMethod.Get, null, cookieContainer); if (!requestResult.IsSuccess) { continue; } ++cookie.WatchCount; var resumeJson = JsonConvert.DeserializeObject <dynamic>(requestResult.Data).data; var detail = JsonConvert.DeserializeObject(resumeJson.detialJSonStr.ToString()); var resumeId = resumeJson.resumeId != null ? (int)resumeJson.resumeId : detail.ResumeId != null ? (int)detail.ResumeId : 0; if (xdb.ZhaopinMatchedResume.Any(a => a.Id == resumeId)) { statistic.MatchedCount += 1; LogFactory.Warn($"匹配到重复简历!ResumeId=>{resumeId} ResumeNumber=>{resumeNumber}"); continue; } if (resumeId == 0) { LogFactory.Warn($"CompanyId => {cookie.CompanyId} 解析异常!ResumeId 为空, ResumeNumber:{resumeNumber}"); continue; } var userId = (int)resumeJson.userDetials.userMasterId; var user = xdb.ZhaopinUser.FirstOrDefault(f => f.Id == userId); if (user != null) { if (!user.Source.Contains("MANUAL")) { user.Id = userId; user.Source = "XSS"; user.ModifyTime = BaseFanctory.GetTime((string)detail.DateModified).ToUniversalTime(); user.CreateTime = BaseFanctory.GetTime((string)detail.DateCreated).ToUniversalTime(); user.Cellphone = resume.Cellphone; user.Email = resume.Email; user.Name = resumeJson.userDetials.userName.ToString(); user.UpdateTime = DateTime.UtcNow; user.Username = resumeJson.userDetials.email.ToString(); } } else { xdb.ZhaopinUser.Add(new ZhaopinUser { Id = userId, Source = "XSS", ModifyTime = BaseFanctory.GetTime((string)detail.DateModified).ToUniversalTime(), CreateTime = BaseFanctory.GetTime((string)detail.DateCreated).ToUniversalTime(), Cellphone = resume.Cellphone, Email = resume.Email, Name = resumeJson.userDetials.userName.ToString(), UpdateTime = DateTime.UtcNow }); } var resumeEntity = xdb.ZhaopinResume.FirstOrDefault(f => f.Id == resumeId); if (resumeEntity == null) { xdb.ZhaopinResume.Add(new ZhaopinResume { Id = resumeId, RandomNumber = resumeNumber, UserId = userId, RefreshTime = BaseFanctory.GetTime((string)detail.DateModified).ToUniversalTime(), UpdateTime = DateTime.UtcNow, UserExtId = detail.UserMasterExtId.ToString(), DeliveryNumber = resumeEntity?.DeliveryNumber, Source = resumeEntity == null ? "XSS" : resumeEntity.Source }); } else { resumeEntity.RandomNumber = resumeNumber; resumeEntity.UserId = userId; resumeEntity.RefreshTime = BaseFanctory.GetTime((string)detail.DateModified).ToUniversalTime(); resumeEntity.UpdateTime = DateTime.UtcNow; resumeEntity.UserExtId = detail.UserMasterExtId.ToString(); resumeEntity.DeliveryNumber = resumeEntity?.DeliveryNumber; resumeEntity.Source = resumeEntity == null ? "XSS" : resumeEntity.Source; } var path = $"{ConfigurationManager.AppSettings["Resume.SavePath"]}{DateTime.Now:yyyyMMdd}"; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } var resumePath = $@"{path}\{resumeId}.json"; resumeJson.userDetials.email = resume.Email; resumeJson.userDetials.mobilePhone = resume.Cellphone; File.WriteAllText(resumePath, JsonConvert.SerializeObject(resumeJson)); uploadOssActionBlock.Post(resumePath); statistic.MatchedCount += 1; Console.WriteLine($"CompanyId => {cookie.CompanyId} 搜索简历成功!匹配成功 {++cookie.MatchCount} 份, ResumeNumner=>{resumeNumber},ResumeId=>{resumeId}"); xdb.ZhaopinMatchedResume.Add(new ZhaopinMatchedResume { Id = resumeId, CompanyId = cookie.CompanyId, MatchTime = DateTime.UtcNow }); xdb.SaveChanges(); resume.IsMatched = true; break; } if (cookie.SeachCount < cookie.DailySeachCount) { cookieQueue.Enqueue(cookie); } if (isMatched) { resume.Status = 99; resume.MatchTime = DateTime.Now; } db.SaveChanges(); } } catch (Exception ex) { //while (true) //{ // if(ex.InnerException == null) break; // ex = ex.InnerException; //} if (cookie.SeachCount < cookie.DailySeachCount) { cookieQueue.Enqueue(cookie); } LogFactory.Warn($"程序异常, 异常信息:{ex.Message} 堆栈:{ex.StackTrace}"); } #endregion } } }); } }
private static DataResult <dynamic> Register(string host) { var cookie = new CookieContainer(); var password = BaseFanctory.GetRandomTel(); var userName = password + Global.Email.Substring(Global.Email.IndexOf("@", StringComparison.Ordinal)); RequestFactory.QueryRequest("http://qiye.zhaopingou.com/signup", cookieContainer: cookie, host: host); var retryTimes = 2; var param = $"userName={userName}&password={password}&code=0000&type=2&invitationNumber=&clientNo=&userToken=&clientType=2"; RequestFactory.QueryRequest("http://qiye.zhaopingou.com/zhaopingou_interface/register?timestamp=" + BaseFanctory.GetUnixTimestamp(), param, RequestEnum.POST, cookie, "http://qiye.zhaopingou.com/signup", host: host); Retry: #region 获取验证码 var loginRequest = (HttpWebRequest)WebRequest.Create("http://qiye.zhaopingou.com/zhaopingou_interface/verification_code"); loginRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"; loginRequest.Accept = "image/webp,image/*,*/*;q=0.8"; // 图片类型 loginRequest.Referer = "http://qiye.zhaopingou.com/signup"; loginRequest.CookieContainer = cookie; if (Global.IsEnanbleProxy) { var index = host.IndexOf(":", StringComparison.Ordinal); loginRequest.Proxy = new WebProxy(host.Substring(0, index), Convert.ToInt32(host.Substring(index + 1))); } 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(); } } //var sr = new StreamReader("D:\\pic.jpg"); //FenJianLiScheduling.cnf.pbx_checkNumber.Image = MediaTypeNames.Image.FromStream(sr.BaseStream); //string checkCode = Interaction.InputBox("请输入验证码!", "验证码"); //sr.Close(); //sr.Dispose(); Console.WriteLine("请输入验证码:"); var checkCode = Console.ReadLine(); #endregion // 发送注册请求 param = $"userName={userName}&password={password}&code={checkCode}&type=2&invitationNumber=&clientNo=&userToken=&clientType=2"; var dataResult = RequestFactory.QueryRequest("http://qiye.zhaopingou.com/zhaopingou_interface/register?timestamp=" + BaseFanctory.GetUnixTimestamp(), param, RequestEnum.POST, cookie, "http://qiye.zhaopingou.com/signup", host: host); if (!dataResult.IsSuccess) { return(new DataResult <dynamic>(dataResult.ErrorMsg)); } var jObject = JsonConvert.DeserializeObject(dataResult.Data) as JObject; if (jObject == null || (int)jObject["errorCode"] != 1) { if (--retryTimes > 0) { goto Retry; } throw new RequestException($"注册请求失败!响应数据:{dataResult.Data}"); } var inviteCode = jObject["user"]["invitationCode"].ToString(); LogFactory.Info($"注册成功!邮箱:{userName}", MessageSubjectEnum.ZhaoPinGou); var userToken = jObject["user"]["user_token"].ToString(); param = $"email={userName}&emailType=1&clientNo=&userToken={userToken}&clientType=2"; cookie.Add(new Cookie { Name = "zhaopingou_account", Value = userName, Domain = "qiye.zhaopingou.com" }); cookie.Add(new Cookie { Name = "zhaopingou_login_callback", Value = "http%3A//qiye.zhaopingou.com/resume", Domain = "qiye.zhaopingou.com" }); var cookieData = cookie.GetCookies(new Uri("http://qiye.zhaopingou.com/zhaopingou_interface"))["fanwenTime1"]; if (cookieData != null) { cookieData.Expires = DateTime.Now.AddDays(-1); } dataResult = RequestFactory.QueryRequest("http://qiye.zhaopingou.com/zhaopingou_interface/Binding_email?timestamp=" + BaseFanctory.GetUnixTimestamp(), param, RequestEnum.POST, cookie, "http://qiye.zhaopingou.com/user/email/verification", host: host, accept: "multipart/form-data"); // 发送激活邮件请求 if (!dataResult.IsSuccess) { return(new DataResult <dynamic>(dataResult.ErrorMsg)); } jObject = JsonConvert.DeserializeObject(dataResult.Data) as JObject; if (jObject == null || (int)jObject["errorCode"] != 1) { throw new RequestException($"发送激活邮件请求失败!响应数据:{dataResult.Data}"); } LogFactory.Info($"发送激活邮件成功!邮箱:{userName}", MessageSubjectEnum.ZhaoPinGou); return(new DataResult <dynamic>(new { Email = userName, Password = password, InviteCode = inviteCode })); }
/// <summary> /// 登录获取 Cookie /// </summary> /// <param name="email"></param> /// <param name="passWord"></param> /// <param name="host"></param> public static DataResult <CookieContainer> Login(string email, string passWord, string host) { var cookie = new CookieContainer(); var result = new DataResult <CookieContainer>(); var jumpsTimes = 0; Jumps: var param = $"userName={email}&password={passWord}&code=&clientNo=&userToken=&clientType=2"; var dataResult = RequestFactory.QueryRequest("http://qiye.zhaopingou.com/zhaopingou_interface/security_login?timestamp=" + BaseFanctory.GetUnixTimestamp(), param, RequestEnum.POST, cookie, host: host); if (!dataResult.IsSuccess) { result.IsSuccess = false; result.ErrorMsg = $"用户登录异常!异常用户:{email}"; return(result); } var jObject = JsonConvert.DeserializeObject(dataResult.Data) as JObject; if (jObject != null) { if ((int)jObject["errorCode"] != 1) { ++jumpsTimes; if (jumpsTimes > 1) { if (((string)jObject["message"]).Contains("用户不存在")) { using (var db = new ResumeMatchDBEntities()) { var user = db.User.FirstOrDefault(f => f.Email == email); if (user != null) { user.IsEnable = false; db.TransactionSaveChanges(); } } } result.IsSuccess = false; result.ErrorMsg = $"用户登录异常!异常用户:{email},异常信息:{(string)jObject["message"]}"; return(result); } goto Jumps; } cookie.Add(new Cookie { Name = "hrkeepToken", Value = jObject["user"]?["user_token"].ToString(), Domain = ".zhaopingou.com" }); cookie.Add(new Cookie { Name = "zhaopingou_select_city", Value = "-1", Domain = ".zhaopingou.com" }); result.Data = cookie; var retryCount = 0; Retry: try { RefreshFreeDownloadNumber(email, cookie, host); } catch (Exception ex) { retryCount++; if (retryCount < 2) { goto Retry; } LogFactory.Error($"刷新简历下载数异常!异常信息:{ex.Message} 堆栈信息:{ex.TargetSite}", MessageSubjectEnum.ZhaoPinGou); } return(result); } return(result); }
/// <summary> /// 发送换绑手机验证码 /// </summary> /// <param name="mobile"></param> /// <param name="picCode"></param> /// <returns></returns> public DataResult SendBindSms(string mobile, string picCode) { var sendResult = HttpClientFactory.RequestForString($"https://i.zhaopin.com/Login/LoginApi/SendBindSms?mobile={mobile}&businessType=C-Bind&piccode={picCode}&t={BaseFanctory.GetUnixTimestamp()}", HttpMethod.Get, cookieContainer: cookieContainer, referer: "https://i.zhaopin.com/ResumeCenter/AccountSet/Index?tab=2"); if (!sendResult.IsSuccess) { return(new DataResult("发送验证码失败!" + sendResult.ErrorMsg)); } var result = JsonConvert.DeserializeObject <dynamic>(sendResult.Data); if (result.Code != 1) { return(new DataResult((string)result.Msg)); } return(new DataResult()); }
public void Buquan() { var queue = new ConcurrentQueue <KeyValuePair <int, KeyValuePair <string, DateTime> > >(); var index = 0; Task.Run(() => { while (true) { KeyValuePair <int, KeyValuePair <string, DateTime> > temp; if (!queue.TryDequeue(out temp)) { Thread.Sleep(10); continue; } using (var db = new MangningXssDBEntities()) { var resume = db.ZhaopinResume.FirstOrDefault(f => f.Id == temp.Key); if (resume == null) { LogFactory.Warn($"找不到简历 ResumeId =>{temp.Key}"); continue; } var user = db.ZhaopinUser.FirstOrDefault(f => f.Id == resume.UserId); if (user == null) { LogFactory.Warn($"找不到用户 ResumeId =>{temp.Key} UserId =>{resume.UserId}"); continue; } if (string.IsNullOrEmpty(temp.Value.Key) && string.IsNullOrEmpty(user.Cellphone)) { db.ZhaopinResume.Remove(resume); db.ZhaopinUser.Remove(user); Console.WriteLine($"删除成功!ResumeId=>{temp.Key} {++index}/{buquanTotal}"); } else { resume.UserExtId = temp.Value.Key; user.CreateTime = temp.Value.Value; Console.WriteLine($"补全成功!{++index}/{buquanTotal}"); } db.SaveChanges(); } } }); using (var db = new MangningXssDBEntities()) { var idArray = db.ZhaopinResume.Where(w => w.Source == "Watch").Select(s => s.Id).ToArray(); buquanTotal = idArray.Length; foreach (var businessId in idArray) { try { var streamContent = newOss.GetObject(newBucket, $"WatchResume/{businessId}").Content; using (var stream = new MemoryStream()) { var bytes = new byte[1024]; int len; while ((len = streamContent.Read(bytes, 0, bytes.Length)) > 0) { stream.Write(bytes, 0, len); } var jsonContent = Encoding.UTF8.GetString(GZip.Decompress(stream.ToArray())); var resumeData = JsonConvert.DeserializeObject <dynamic>(jsonContent); var resumeDetail = JsonConvert.DeserializeObject <dynamic>((string)resumeData.detialJSonStr); var createDate = BaseFanctory.GetTime((string)resumeDetail.DateCreated).ToUniversalTime(); var extId = resumeDetail.UserMasterExtId.ToString(); queue.Enqueue(new KeyValuePair <int, KeyValuePair <string, DateTime> >(businessId, new KeyValuePair <string, DateTime>(extId, createDate))); } } catch (Exception ex) { LogFactory.Warn($"Oss 获取简历异常! ResumeId => {businessId} 异常原因 => {ex.Message}"); queue.Enqueue(new KeyValuePair <int, KeyValuePair <string, DateTime> >(businessId, new KeyValuePair <string, DateTime>("", DateTime.Now))); } } } }
/// <summary> /// 获取已解锁的简历详情 /// </summary> /// <param name="resumeId"></param> /// <param name="cookie"></param> /// <param name="host"></param> /// <param name="token"></param> /// <returns></returns> private static DataResult <string> ResumeDetailSpider(string resumeId, CookieContainer cookie, string host, string token) { var jumpsTimes = 0; Jumps: var param = $"resumeHtmlId={resumeId}&keyStr=&keyPositionName=&tradeId=&postionStr=&jobId=0&clientNo=&userToken={token}&clientType=2"; var dataResult = RequestFactory.QueryRequest("http://qiye.zhaopingou.com/zhaopingou_interface/zpg_find_resume_html_details?timestamp=" + BaseFanctory.GetUnixTimestamp(), param, RequestEnum.POST, cookie, "http://qiye.zhaopingou.com/resume/detail?resumeId=" + resumeId, host: host); if (!dataResult.IsSuccess) { return(dataResult); } var jObject = JsonConvert.DeserializeObject(dataResult.Data) as JObject; if (jObject != null) { if ((int)jObject["errorCode"] != 1) { ++jumpsTimes; LogFactory.Warn($"获取简历详情异常!异常信息:{(string)jObject["message"]}", MessageSubjectEnum.ZhaoPinGou); if (jumpsTimes > 1) { return(new DataResult <string>()); } goto Jumps; } dataResult.Data = (string)jObject["jsonHtml"]; return(dataResult); } return(new DataResult <string>()); }
/// <summary> /// 搜索旧库 /// </summary> /// <param name="list"></param> /// <returns></returns> public static List <ResumeMatchResult> SearchOldLibrary(IEnumerable <dynamic> list) { var resumeList = new List <ResumeMatchResult>(); using (var db = new ResumeMatchDBEntities()) { foreach (var item in list) { var resumeNumber = ((string)item.ResumeNumber).Substring(0, 10); var resume = db.OldResumeSummary.FirstOrDefault(w => w.ResumeId == resumeNumber); if (resume == null) { continue; } resume.MatchTime = DateTime.Now; resume.IsMatched = true; resumeList.Add(new ResumeMatchResult { Cellphone = resume.Cellphone, Email = resume.Email, ResumeNumber = item.ResumeNumber, Status = 2 }); using (var xdb = new MangningXssDBEntities()) { var filePath = "X:" + ((string)item.SavePath).Replace("/", "\\"); if (!File.Exists(filePath)) { LogFactory.Warn($"找不到文件路径:{filePath}, ResumeNumber:{resumeNumber}"); continue; } var resumeJson = JsonConvert.DeserializeObject <dynamic>(File.ReadAllText(filePath)); var detail = JsonConvert.DeserializeObject(resumeJson.detialJSonStr.ToString()); var resumeId = resumeJson.resumeId != null ? (int)resumeJson.resumeId : detail.ResumeId != null ? (int)detail.ResumeId : 0; if (resumeId == 0) { LogFactory.Warn($"解析异常!ResumeId 为空, ResumeNumber:{resumeNumber}"); continue; } var userId = (int)resumeJson.userDetials.userMasterId; var user = xdb.ZhaopinUser.FirstOrDefault(f => f.Id == userId); if (user != null) { if (!user.Source.Contains("MANUAL")) { user.Id = userId; user.Source = "XSS"; user.ModifyTime = BaseFanctory.GetTime((string)detail.DateModified).ToUniversalTime(); user.CreateTime = BaseFanctory.GetTime((string)detail.DateCreated).ToUniversalTime(); user.Cellphone = resume.Cellphone; user.Email = resume.Email; user.Name = resumeJson.userDetials.userName.ToString(); user.UpdateTime = DateTime.UtcNow; user.Username = resumeJson.userDetials.email.ToString(); } } else { xdb.ZhaopinUser.AddOrUpdate(a => a.Id, new ZhaopinUser { Id = userId, Source = "XSS", ModifyTime = BaseFanctory.GetTime((string)detail.DateModified).ToUniversalTime(), CreateTime = BaseFanctory.GetTime((string)detail.DateCreated).ToUniversalTime(), Cellphone = resume.Cellphone, Email = resume.Email, Name = resumeJson.userDetials.userName.ToString(), UpdateTime = DateTime.UtcNow, Username = resumeJson.userDetials.email.ToString() }); } var resumeEntity = xdb.ZhaopinResume.FirstOrDefault(f => f.Id == resumeId); if (resumeEntity == null) { xdb.ZhaopinResume.Add(new ZhaopinResume { Id = resumeId, RandomNumber = resumeNumber, UserId = userId, RefreshTime = BaseFanctory.GetTime((string)detail.DateModified).ToUniversalTime(), UpdateTime = DateTime.UtcNow, UserExtId = detail.UserMasterExtId.ToString(), DeliveryNumber = null, Source = "XSS" }); } else { resumeEntity.Id = resumeId; resumeEntity.RandomNumber = resumeNumber; resumeEntity.UserId = userId; resumeEntity.RefreshTime = BaseFanctory.GetTime((string)detail.DateModified).ToUniversalTime(); resumeEntity.UpdateTime = DateTime.UtcNow; resumeEntity.UserExtId = detail.UserMasterExtId.ToString(); resumeEntity.DeliveryNumber = resumeEntity.DeliveryNumber; resumeEntity.Source = resumeEntity.Source; } xdb.SaveChanges(); var path = $"{ConfigurationManager.AppSettings["Resume.SavePath"]}{DateTime.Now:yyyyMMdd}"; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } var resumePath = $@"{path}\{resumeId}.json"; File.WriteAllText(resumePath, JsonConvert.SerializeObject(resumeJson)); uploadOssActionBlock.Post(resumePath); } } db.TransactionSaveChanges(); } return(resumeList); }
/// <summary> /// 上传智联 Josn 格式简历 /// </summary> /// <param name="json"></param> /// <param name="jsonResumeId"></param> /// <returns></returns> public DataResult UploadZhaopinResume(string json, int jsonResumeId) { try { var resumeData = JsonConvert.DeserializeObject <dynamic>(json); var resumeDetail = JsonConvert.DeserializeObject(resumeData.detialJSonStr.ToString()); var refreshTime = BaseFanctory.GetTime((string)resumeDetail.DateLastReleased).ToUniversalTime(); resumeData.detialJSonStr = resumeDetail; var resumeNumber = ((string)resumeData.resumeNo).Substring(0, 10); var userId = (int)resumeData.userDetials.userMasterId; var resumeId = resumeData.resumeId != null ? (int)resumeData.resumeId : resumeDetail.ResumeId != null ? (int)resumeDetail.ResumeId : 0; using (var db = new MangningXssDBEntities()) { var resume = db.ZhaopinResume.FirstOrDefault(f => f.Id == resumeId); if (!(resume?.RefreshTime != null && resume.RefreshTime.Value.Date >= refreshTime.Date)) { if (resume != null) { resume.RandomNumber = resumeNumber; resume.RefreshTime = refreshTime; resume.UpdateTime = DateTime.UtcNow; if (string.IsNullOrEmpty(resume.UserExtId)) { resume.UserExtId = resumeDetail.UserMasterExtId.ToString(); } resume.Source = !resume.Source.Contains("Download") ? resume.Source += ",Download" : resume.Source; resume.Flag = 0xE; } else { resume = new ZhaopinResume { Id = resumeId, RandomNumber = resumeNumber, UserId = userId, RefreshTime = refreshTime, UpdateTime = DateTime.UtcNow, UserExtId = resumeDetail.UserMasterExtId.ToString(), DeliveryNumber = null, Source = "Download", Flag = 0xE }; db.ZhaopinResume.Add(resume); } var user = db.ZhaopinUser.FirstOrDefault(f => f.Id == userId); if (user != null) { if (!user.Source.Contains("MANUAL")) { user.ModifyTime = BaseFanctory.GetTime((string)resumeDetail.DateModified).ToUniversalTime(); user.CreateTime = BaseFanctory.GetTime((string)resumeDetail.DateCreated).ToUniversalTime(); user.Cellphone = resumeData.userDetials.mobilePhone.ToString(); user.Email = resumeData.userDetials.email.ToString(); user.Name = resumeData.userDetials.userName.ToString(); user.UpdateTime = DateTime.UtcNow; user.Username = resumeData.userDetials.email.ToString(); } } else { user = new ZhaopinUser { Id = userId, Source = "Download", ModifyTime = BaseFanctory.GetTime((string)resumeDetail.DateModified).ToUniversalTime(), CreateTime = BaseFanctory.GetTime((string)resumeDetail.DateCreated).ToUniversalTime(), Cellphone = resumeData.userDetials.mobilePhone.ToString(), Email = resumeData.userDetials.email.ToString(), Name = resumeData.userDetials.userName.ToString(), UpdateTime = DateTime.UtcNow, Username = resumeData.userDetials.email.ToString() }; db.ZhaopinUser.Add(user); } var resumeContent = JsonConvert.SerializeObject(resumeData); using (var jsonStream = new MemoryStream(GZip.Compress(Encoding.UTF8.GetBytes(resumeContent)))) { mangningOssClient.PutObject(mangningBucketName, $"Zhaopin/Resume/{resumeId}", jsonStream); } var resumePath = $"{uploadFilePath}{resumeId}.json"; File.WriteAllText(resumePath, JsonConvert.SerializeObject(resumeData)); db.SaveChanges(); } } return(new DataResult()); } catch (Exception ex) { LogFactory.Warn($"简历上传异常!异常信息:{ex.Message}, Json:{json}"); return(new DataResult { ErrorMsg = $"Josn 格式异常,resumeNo:{jsonResumeId},{ex.Message}", IsSuccess = false }); } }
/// <summary> /// 获取匹配到的简历ID /// </summary> /// <param name="keywords"></param> /// <param name="degress"></param> /// <param name="introduction"></param> /// <param name="cookie"></param> /// <param name="token"></param> /// <param name="name"></param> /// <param name="pageIndex"></param> /// <param name="user"></param> /// <param name="gender"></param> /// <returns></returns> private static DataResult <string> GetResumeId(string keywords, int gender, int degress, string introduction, CookieContainer cookie, User user, string token, string name, int pageIndex = 0) { var jumpsTimes = 0; Jumps: var param = $"pageSize={pageIndex}&pageNo=25&keyStr={keywords}&keyStrPostion=&postionStr=&startDegrees={degress}&endDegress={degress}&startAge=0&endAge=0&gender={gender}®ion=&timeType=-1&startWorkYear=-1&endWorkYear=-1&beginTime=&endTime=&isMember=0&hopeAdressStr=&cityId=-1&updateTime=&tradeId=&clientNo=&userToken={token}&clientType=2"; var referer = $"http://qiye.zhaopingou.com/resume?key={keywords}&beginDegreesType={degress}&endDegreesType={degress}&gender={gender}"; var dataResult = RequestFactory.QueryRequest("http://qiye.zhaopingou.com/zhaopingou_interface/find_warehouse_by_position_new?timestamp=" + BaseFanctory.GetUnixTimestamp(), param, RequestEnum.POST, cookie, referer, host: user.Host); if (!dataResult.IsSuccess) { return(dataResult); } if (string.IsNullOrWhiteSpace(dataResult.Data)) { goto Jumps; } var jObject = JsonConvert.DeserializeObject(dataResult.Data) as JObject; if (jObject != null) { if ((int)jObject["errorCode"] != 1) { ++jumpsTimes; LogFactory.Warn($"搜索简历异常!异常信息:{(string)jObject["message"]}", MessageSubjectEnum.ZhaoPinGou); if (jumpsTimes > 3) { return(new DataResult <string>()); } goto Jumps; } if ((int)jObject["total"] == 0) { return(new DataResult <string>()); } var totalSize = Math.Ceiling((double)jObject["total"] / 25); var jArray = jObject["warehouseList"] as JArray; var resumeIdArray = jArray?.Where(w => !string.IsNullOrEmpty((string)w["name"]) && ((string)w["name"]).Substring(0, 1) == name.Substring(0, 1)).Select(s => (string)s["resumeHtmlId"]).ToArray(); if (string.IsNullOrWhiteSpace(introduction)) { return(new DataResult <string>()); } dataResult = MatchResumes(resumeIdArray, introduction, cookie, user.Host, token, keywords); if (!dataResult.IsSuccess) { if (dataResult.Code == ResultCodeEnum.ProxyDisable) { return(dataResult); } return(new DataResult <string>()); } if (!string.IsNullOrWhiteSpace(dataResult.Data)) { return(dataResult); } if (pageIndex + 1 < totalSize && pageIndex < 1) { return(GetResumeId(keywords, gender, degress, introduction, cookie, user, token, name, ++pageIndex)); } } return(new DataResult <string>()); }
private static DataResult <dynamic> Register(string host, string inviteCode) { var cookie = new CookieContainer(); if (!string.IsNullOrWhiteSpace(inviteCode)) { cookie.Add(new Cookie { Name = "vid", Value = inviteCode, Domain = "www.fenjianli.com" }); } // GET 注册页面 var dataResult = RequestFactory.QueryRequest("http://www.fenjianli.com/register/toRegisterByEmail.htm", cookieContainer: cookie, host: host); if (!dataResult.IsSuccess) { return(new DataResult <dynamic>(dataResult.ErrorMsg)); } var id = Regex.Match(dataResult.Data, "validate-id.+?\"(\\d+)").Result("$1"); if (id == null) { throw new RequestException("获取注册 ID 失败,失败原因:请求异常,导致解析HTML出错,源码:" + dataResult.Data); } var password = BaseFanctory.GetRandomTel(); var username = password + Global.Email.Substring(Global.Email.IndexOf("@", StringComparison.Ordinal)); #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; if (Global.IsEnanbleProxy) { var index = host.IndexOf(":", StringComparison.Ordinal); loginRequest.Proxy = new WebProxy(host.Substring(0, index), Convert.ToInt32(host.Substring(index + 1))); } 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(); } } //var sr = new StreamReader("D:\\pic.jpg"); //FenJianLiScheduling.cnf.pbx_checkNumber.Image = MediaTypeNames.Image.FromStream(sr.BaseStream); //string checkCode = Interaction.InputBox("请输入验证码!", "验证码"); //sr.Close(); //sr.Dispose(); Console.WriteLine("请输入验证码:"); var checkCode = Console.ReadLine(); #endregion var param = $"id={id}®Type=email&username={username}&password={password}&confirmPassword={password}&checkCode={checkCode}&agree=1&_random={new Random().NextDouble()}"; // 发送注册请求 dataResult = RequestFactory.QueryRequest("http://www.fenjianli.com/register/register.htm", param, RequestEnum.POST, cookie, host: host); if (!dataResult.IsSuccess) { return(new DataResult <dynamic>(dataResult.ErrorMsg)); } if (!dataResult.Data.Contains("成功")) { throw new RequestException($"注册请求失败!响应数据:{dataResult.Data}"); } LogFactory.Info($"注册成功!邮箱:{username}", MessageSubjectEnum.FenJianLi); param = $"id={id}&checkSource={username}&_random={new Random().NextDouble()}"; dataResult = RequestFactory.QueryRequest("http://www.fenjianli.com/register/sendCheckEmail.htm", param, RequestEnum.POST, cookie, host: host); // 发送激活邮件请求 if (!dataResult.IsSuccess) { return(new DataResult <dynamic>(dataResult.ErrorMsg)); } if (!dataResult.Data.Contains("成功")) { throw new RequestException($"发送激活邮件请求失败!响应数据:{dataResult.Data}"); } return(new DataResult <dynamic>(new { Email = username, Password = password })); }
/// <summary> /// 處理簡歷列表 /// </summary> /// <param name="resumes"></param> /// <param name="unhandled"></param> /// <param name="staff"></param> /// <param name="isWhile"></param> /// <param name="cookieContainer"></param> /// <param name="isNewSystem"></param> private static void HandleResumes(dynamic resumes, ref int unhandled, ZhaopinStaff staff, ref bool isWhile, CookieContainer cookieContainer, bool isNewSystem) { var stopwatch = new Stopwatch(); var time = 0; foreach (var item in resumes) { #region Handle resume try { if (IsDownload((long)item.id, staff.CompanyId)) { if (++time > 30) { break; } continue; } time = 0; stopwatch.Restart(); #region Save resume and Upload var requestResult = RequestFactory.QueryRequest($"http://ihr.zhaopin.com/resumesearch/getresumedetial.do?resumeNo={item.id}_{item.jobNumber}_{item.number}_1_1&resumeSource=3", cookieContainer: cookieContainer); if (!requestResult.IsSuccess) { Trace.TraceWarning(requestResult.ErrorMsg); continue; } var content = JsonConvert.DeserializeObject <dynamic>(requestResult.Data); if ((int)content.code == 6001) // 登录过期 { using (var db = new MangningXssDBEntities()) { var zhaopinStaff = db.ZhaopinStaff.FirstOrDefault(f => f.Id == staff.Id); if (zhaopinStaff != null) { zhaopinStaff.Cookie = null; db.SaveChanges(); dictionary.TryUpdate(staff.Id, true, true); } } Trace.WriteLine($"{DateTime.Now} > Loging Timeout ! Username = {staff.Username}, Message = {content.message}."); isWhile = false; break; } if ((int)content.code != 1) { Trace.WriteLine($"{DateTime.Now} > Get Resume Detail Error ! Username = {staff.Username}, Message = {content.message}."); continue; } var resumeData = content.data; var resumeDetail = JsonConvert.DeserializeObject(resumeData.detialJSonStr.ToString()); var refreshTime = BaseFanctory.GetTime((string)resumeDetail.DateLastReleased).ToUniversalTime(); resumeData.detialJSonStr = resumeDetail; var resumeNumber = ((string)resumeData.resumeNo).Substring(0, 10); var userId = (int)resumeData.userDetials.userMasterId; var resumeId = resumeData.resumeId != null ? (int)resumeData.resumeId : resumeDetail.ResumeId != null ? (int)resumeDetail.ResumeId : 0; var status = "Handle"; using (var db = new MangningXssDBEntities()) { var resume = db.ZhaopinResume.FirstOrDefault(f => f.Id == resumeId); if (!(resume?.RefreshTime != null && resume.RefreshTime.Value.Date >= refreshTime.Date)) { if (resume != null) { resume.RandomNumber = resumeNumber; resume.RefreshTime = refreshTime; resume.UpdateTime = DateTime.UtcNow; if (string.IsNullOrEmpty(resume.UserExtId)) { resume.UserExtId = resumeDetail.UserMasterExtId.ToString(); } resume.Source = !resume.Source.Contains("Deliver") ? resume.Source += ",Deliver" : resume.Source; resume.Flag = 0xE; } else { resume = new ZhaopinResume { Id = resumeId, RandomNumber = resumeNumber, UserId = userId, RefreshTime = refreshTime, UpdateTime = DateTime.UtcNow, UserExtId = resumeDetail.UserMasterExtId.ToString(), DeliveryNumber = null, Source = "Deliver", Flag = 0xE }; db.ZhaopinResume.Add(resume); } var user = db.ZhaopinUser.FirstOrDefault(f => f.Id == userId); if (user != null) { if (!user.Source.Contains("MANUAL")) { user.ModifyTime = BaseFanctory.GetTime((string)resumeDetail.DateModified).ToUniversalTime(); user.CreateTime = BaseFanctory.GetTime((string)resumeDetail.DateCreated).ToUniversalTime(); user.Cellphone = resumeData.userDetials.mobilePhone.ToString(); user.Email = resumeData.userDetials.email.ToString(); user.Name = resumeData.userDetials.userName.ToString(); user.UpdateTime = DateTime.UtcNow; user.Username = resumeData.userDetials.email.ToString(); } } else { user = new ZhaopinUser { Id = userId, Source = "Deliver", ModifyTime = BaseFanctory.GetTime((string)resumeDetail.DateModified).ToUniversalTime(), CreateTime = BaseFanctory.GetTime((string)resumeDetail.DateCreated).ToUniversalTime(), Cellphone = resumeData.userDetials.mobilePhone.ToString(), Email = resumeData.userDetials.email.ToString(), Name = resumeData.userDetials.userName.ToString(), UpdateTime = DateTime.UtcNow, Username = resumeData.userDetials.email.ToString() }; db.ZhaopinUser.Add(user); } var resumeContent = JsonConvert.SerializeObject(resumeData); using (var jsonStream = new MemoryStream(GZip.Compress(Encoding.UTF8.GetBytes(resumeContent)))) { mangningOssClient.PutObject(mangningBucketName, $"Zhaopin/Resume/{resumeId}", jsonStream); } var resumePath = $"{uploadFilePath}{resumeId}.json"; File.WriteAllText(resumePath, JsonConvert.SerializeObject(resumeData)); } else { status = "NoHandle"; } db.ZhaopinDeliveryLog.Add(new ZhaopinDeliveryLog { CompanyId = staff.CompanyId, DeliveryId = (long)item.id }); db.ZhaopinDelivery.Add(new ZhaopinDelivery { CompanyId = staff.CompanyId, Id = (long)item.id, CreateTime = DateTime.UtcNow, ResumeId = resumeId, ResumeNumber = resumeData.resumeNo.ToString(), JobNumber = resumeData.jobNo.ToString(), JobName = resumeData.jobName.ToString() }); db.SaveChanges(); } #endregion stopwatch.Stop(); var elapsed = stopwatch.ElapsedMilliseconds; Interlocked.Increment(ref count); var version = isNewSystem ? "NewSystem" : "5.5"; Console.WriteLine($"{DateTime.Now} > {version} {count} {status} {staff.Username}:Unhandled = {--unhandled}, RId = {resumeId}, Elapsed = {elapsed} ms."); Thread.Sleep(interval); } catch (Exception ex) { Trace.TraceError(ex.ToString()); } #endregion } }
private void DownJob() { if (string.IsNullOrEmpty(this.tbx_Cookie.Text)) { this.AsyncSetLog(this.tbx_Log, "请录入 Cookie !"); return; } jobDictionary.Clear(); cookieContainer = this.tbx_Cookie.Text.Serialize(".zhaopin.com"); var request = RequestFactory.QueryRequest("https://ihr.zhaopin.com/home/getUserinfo.do", cookieContainer: cookieContainer, requestType: RequestEnum.POST); var jsonObj = JsonConvert.DeserializeObject <dynamic>(request.Data); try { this.Invoke((MethodInvoker) delegate { lbl_CompanyName.Text = jsonObj.companyname.ToString(); }); } catch (Exception) { this.AsyncSetLog(this.tbx_Log, $"{JsonConvert.SerializeObject(jsonObj)}"); return; } token = this.tbx_Cookie.Text.Substring(this.tbx_Cookie.Text.IndexOf("at=", StringComparison.Ordinal) + 3, 32); var pageIndex = 1; var pageCount = 0; do { var url = $"https://ihr.zhaopin.com/api/job/list.do?access_token={token}&jobTitle=&status=30&reviewtype=0%2C20&pageIndex={pageIndex}&pageSize=10&jobStyle=0&isJudgerefreshing=1&_={BaseFanctory.GetUnixTimestamp()}246"; var requestResult = HttpClientFactory.RequestForString(url, HttpMethod.Get, null, cookieContainer, "https://ihr.zhaopin.com/job/"); if (!requestResult.IsSuccess) { this.AsyncSetLog(this.tbx_Log, requestResult.ErrorMsg); return; } Thread.Sleep(time); var result = JsonConvert.DeserializeObject <dynamic>(requestResult.Data); if (result == null) { this.AsyncSetLog(this.tbx_Log, "返回信息序列化异常!返回结果:" + requestResult.Data); return; } if ((int)result.code != 200) { this.AsyncSetLog(this.tbx_Log, (string)result.message); return; } if (pageCount == 0) { pageCount = (int)result.data.pager.pagecount; } foreach (var item in result.data.list) { if (jobDictionary.ContainsKey($"{(string)item.jobTitle}_{(string)item.cityName}")) { this.AsyncSetLog(this.tbx_Log, $"职位名称重复!跳过该职位,重复职位:{(string)item.jobTitle}_{(string)item.cityName}"); continue; } jobDictionary.Add($"{(string)item.jobTitle}_{(string)item.cityName}", (string)item.jobNumber); } this.AsyncSetLog(this.tbx_Log, "获取职位成功!职位数:" + jobDictionary.Count); }while (++pageIndex <= pageCount); this.AsyncSetLog(this.tbx_Log, "开始刷新职位!职位数:" + jobDictionary.Count); var dictionary = new Dictionary <string, string> { { "jobNumber", string.Join(",", jobDictionary.Values) } }; var jobDownlineResult = HttpClientFactory.RequestForString("http://ihr.zhaopin.com/job/jobdownline.do?access_token=" + token, HttpMethod.Post, dictionary, cookieContainer, "http://ihr.zhaopin.com/job/"); if (!jobDownlineResult.IsSuccess) { this.AsyncSetLog(this.tbx_Log, jobDownlineResult.ErrorMsg); return; } Thread.Sleep(time); var jobDownline = JsonConvert.DeserializeObject <dynamic>(jobDownlineResult.Data); if (jobDownline == null) { this.AsyncSetLog(this.tbx_Log, "返回信息序列化异常!返回结果:" + jobDownlineResult.Data); return; } if ((int)jobDownline.code != 200) { this.AsyncSetLog(this.tbx_Log, (string)jobDownline.message); return; } this.AsyncSetLog(this.tbx_Log, "职位下线成功!下线职位数:" + jobDictionary.Count); }
/// <summary> /// 获取下载文件夹ID /// </summary> /// <param name="cookie"></param> /// <param name="user"></param> /// <param name="token"></param> /// <param name="resumeId"></param> /// <param name="host"></param> /// <returns></returns> private static DataResult <string> GetFolderId(CookieContainer cookie, User user, string token, string resumeId, string host) { var jumpsTimes = 0; Jumps: var param = $"type=1&keyStr=&clientNo=&userToken={token}&clientType=2"; var dataResult = RequestFactory.QueryRequest("http://qiye.zhaopingou.com/zhaopingou_interface/get_candidate_folder_list?timestamp=" + BaseFanctory.GetUnixTimestamp(), param, RequestEnum.POST, cookie, "Referer: http://qiye.zhaopingou.com/resume/detail?resumeId=" + resumeId, host: host); if (!dataResult.IsSuccess) { return(dataResult); } var jObject = JsonConvert.DeserializeObject(dataResult.Data) as JObject; if (jObject != null) { if ((int)jObject["errorCode"] != 1) { ++jumpsTimes; LogFactory.Warn($"获取文件夹异常!异常用户:{user.Email} 异常信息:{(string)jObject["message"]}", MessageSubjectEnum.ZhaoPinGou); if (jumpsTimes > 3) { return(new DataResult <string>()); } goto Jumps; } var jArray = jObject["dataList"] as JArray; if (jArray != null) { dataResult.Data = jArray[0]["id"].ToString(); return(dataResult); } } return(new DataResult <string>()); }
private static DataResult UnLockResume(CookieContainer cookie, User user, string token, string resumeId, string host, string folderId) { var dataResult = new DataResult(); dataResult.IsSuccess = false; var jumpsTimes = 0; Jumps: var param = $"htmlCode={resumeId}&mFolderId={folderId}¬es=&clientNo=&userToken={token}&clientType=2"; var result = RequestFactory.QueryRequest("http://qiye.zhaopingou.com/zhaopingou_interface/zpg_charge_example_unlock_new?timestamp=" + BaseFanctory.GetUnixTimestamp(), param, RequestEnum.POST, cookie, "Referer: http://qiye.zhaopingou.com/resume/detail?resumeId=" + resumeId, host: host); if (!result.IsSuccess) { return(result); } var jObject = JsonConvert.DeserializeObject(result.Data) as JObject; if (jObject != null) { if (((string)jObject["message"]).Contains("未阅读过")) { var readResult = ResumeDetailSpider(resumeId, cookie, host, token); if (!readResult.IsSuccess) { return(readResult); } goto Jumps; } if (((string)jObject["message"]).Contains("余额不足")) { dataResult.Code = ResultCodeEnum.NoDownloadNumber; return(dataResult); } if ((int)jObject["errorCode"] != 1 && (int)jObject["errorCode"] != 4) { ++jumpsTimes; LogFactory.Warn($"解锁简历失败!用户:{user.Email} 异常信息:{(string)jObject["message"]}", MessageSubjectEnum.ZhaoPinGou); if (jumpsTimes > 1) { dataResult.ErrorMsg = $"解锁简历失败!用户:{user.Email} 异常信息:{(string)jObject["message"]}"; return(dataResult); } goto Jumps; } dataResult.IsSuccess = true; } return(dataResult); }
/// <summary> /// 處理簡歷列表 /// </summary> /// <param name="resumes"></param> /// <param name="unhandled"></param> /// <param name="staff"></param> /// <param name="isWhile"></param> /// <param name="cookieContainer"></param> private static void HandleResumes(dynamic resumes, int unhandled, ZhaopinStaff staff, ref bool isWhile, CookieContainer cookieContainer) { var stopwatch = new Stopwatch(); foreach (var item in resumes) { #region Handle resume try { stopwatch.Restart(); #region Save resume and Upload var requestResult = RequestFactory.QueryRequest($"http://ihr.zhaopin.com/resumesearch/getresumedetial.do?resumeNo={item.id}_{item.jobNumber}_{item.number}_1_1&resumeSource=3", cookieContainer: cookieContainer); if (!requestResult.IsSuccess) { Trace.TraceWarning(requestResult.ErrorMsg); continue; } var content = JsonConvert.DeserializeObject <dynamic>(requestResult.Data); if ((int)content.code == 6001) // 登录过期 { using (var db = new MangningXssDBEntities()) { var zhaopinStaff = db.ZhaopinStaff.FirstOrDefault(f => f.Id == staff.Id); if (zhaopinStaff != null) { zhaopinStaff.Cookie = null; db.SaveChanges(); dictionary.TryRemove(staff.Id, out companyId); } } Trace.WriteLine($"{DateTime.Now} > Loging Timeout ! Username = {staff.Username}, Message = {content.message}."); isWhile = false; break; } if ((int)content.code != 1) { Trace.WriteLine($"{DateTime.Now} > Get Resume Detail Error ! Username = {staff.Username}, Message = {content.message}."); continue; } var resumeData = content.data; var resumeDetail = JsonConvert.DeserializeObject(resumeData.detialJSonStr.ToString()); var refreshTime = BaseFanctory.GetTime((string)resumeDetail.DateLastReleased).ToUniversalTime(); resumeData.detialJSonStr = resumeDetail; var resumeNumber = ((string)resumeData.resumeNo).Substring(0, 10); var userId = (int)resumeData.userDetials.userMasterId; var resumeId = resumeData.resumeId != null ? (int)resumeData.resumeId : resumeDetail.ResumeId != null ? (int)resumeDetail.ResumeId : 0; var status = "Handle"; using (var db = new MangningXssDBEntities()) { var resume = db.ZhaopinResume.FirstOrDefault(f => f.Id == resumeId); if (!(resume?.RefreshTime != null && resume.RefreshTime.Value.Date >= refreshTime.Date)) { if (resume != null) { resume.RandomNumber = resumeNumber; resume.RefreshTime = refreshTime; resume.UpdateTime = DateTime.UtcNow; if (string.IsNullOrEmpty(resume.UserExtId)) { resume.UserExtId = resumeDetail.UserMasterExtId.ToString(); } resume.Source = !resume.Source.Contains("Deliver") ? resume.Source += ",Deliver" : resume.Source; resume.Flag = 0xE; } else { resume = new ZhaopinResume { Id = resumeId, RandomNumber = resumeNumber, UserId = userId, RefreshTime = refreshTime, UpdateTime = DateTime.UtcNow, UserExtId = resumeDetail.UserMasterExtId.ToString(), DeliveryNumber = null, Source = "Deliver", Flag = 0xE }; db.ZhaopinResume.Add(resume); } var user = db.ZhaopinUser.FirstOrDefault(f => f.Id == userId); if (user != null) { if (!user.Source.Contains("MANUAL")) { user.ModifyTime = BaseFanctory.GetTime((string)resumeDetail.DateModified).ToUniversalTime(); user.CreateTime = BaseFanctory.GetTime((string)resumeDetail.DateCreated).ToUniversalTime(); user.Cellphone = resumeData.userDetials.mobilePhone.ToString(); user.Email = resumeData.userDetials.email.ToString(); user.Name = resumeData.userDetials.userName.ToString(); user.UpdateTime = DateTime.UtcNow; user.Username = resumeData.userDetials.email.ToString(); } } else { user = new ZhaopinUser { Id = userId, Source = "Deliver", ModifyTime = BaseFanctory.GetTime((string)resumeDetail.DateModified).ToUniversalTime(), CreateTime = BaseFanctory.GetTime((string)resumeDetail.DateCreated).ToUniversalTime(), Cellphone = resumeData.userDetials.mobilePhone.ToString(), Email = resumeData.userDetials.email.ToString(), Name = resumeData.userDetials.userName.ToString(), UpdateTime = DateTime.UtcNow, Username = resumeData.userDetials.email.ToString() }; db.ZhaopinUser.Add(user); } var resumeContent = JsonConvert.SerializeObject(resumeData); using (var jsonStream = new MemoryStream(GZip.Compress(Encoding.UTF8.GetBytes(resumeContent)))) { mangningOssClient.PutObject(mangningBucketName, $"Zhaopin/Resume/{resumeId}", jsonStream); } var resumePath = $"{uploadFilePath}{resumeId}.json"; File.WriteAllText(resumePath, JsonConvert.SerializeObject(resumeData)); db.SaveChanges(); } else { status = "NoHandle"; } } #endregion Thread.Sleep(3000); #region SignResume var data = HttpUtility.UrlEncode(JsonConvert.SerializeObject(new { signTag = "noSuit", resumeList = new List <dynamic> { new { resumeNo = $"{item.jobNumber}_{item.number}_{item.version}_1", resumenumber = item.number, item.version, lanType = 1, jobname = ((string)resumeData?.jobName)?.Replace("\"", "\\\"").Replace("\\", "\\\\"), jobno = item.jobNumber, resumesource = item.resumeSource, resumeJobId = item.id, resumerName = ((string)item?.userName).Replace("\r", "").Replace("\n", "").Replace("\"", "\\\""), resumejlName = ((string)item?.name).Replace("\r", "").Replace("\n", "").Replace("\"", "\\'").Replace("\\", "\\\\"), resumerId = item.userId } }, mark = "" })); requestResult = RequestFactory.QueryRequest("https://ihr.zhaopin.com/resumemanage/resumesignstate.do", $"data={data}", RequestEnum.POST, cookieContainer); if (!requestResult.IsSuccess) { Trace.TraceWarning(requestResult.ErrorMsg); continue; } content = JsonConvert.DeserializeObject <dynamic>(requestResult.Data); if ((int)content.code == 6001) // 登录过期 { using (var db = new MangningXssDBEntities()) { var zhaopinStaff = db.ZhaopinStaff.FirstOrDefault(f => f.Id == staff.Id); if (zhaopinStaff != null) { zhaopinStaff.Cookie = null; db.SaveChanges(); dictionary.TryRemove(staff.Id, out companyId); } } Trace.WriteLine($"{DateTime.Now} > Loging Timeout ! Username = {staff.Username}, Message = {content.message}."); isWhile = false; break; } if ((int)content.code != 1) { Trace.WriteLine($"{DateTime.Now} > Sign Resume Error ! Username = {staff.Username}, Message = {content.message}, ResumeId = {resumeId}."); continue; } #endregion stopwatch.Stop(); var elapsed = stopwatch.ElapsedMilliseconds; Interlocked.Increment(ref count); Console.WriteLine($"{DateTime.Now} > {count} {status} {staff.Username}:Unhandled = {--unhandled}, RId = {resumeId}, Elapsed = {elapsed} ms."); } catch (Exception ex) { Trace.TraceError(ex.ToString()); } #endregion } }
private static DataResult <dynamic> Register(string host, string inviteCode) { var cookie = new CookieContainer(); var password = BaseFanctory.GetRandomTel(); var username = password + Global.Email.Substring(Global.Email.IndexOf("@", StringComparison.Ordinal)); #region 获取验证码 const string imgUrl = "http://www.jianlika.com/Verify/index.html?788608415904618"; // 随机化图片验证码 var loginRequest = (HttpWebRequest)WebRequest.Create(imgUrl); loginRequest.Accept = "image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5"; // 图片类型 loginRequest.CookieContainer = cookie; if (Global.IsEnanbleProxy) { var index = host.IndexOf(":", StringComparison.Ordinal); loginRequest.Proxy = new WebProxy(host.Substring(0, index), Convert.ToInt32(host.Substring(index + 1))); } 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(); } } //var sr = new StreamReader("D:\\pic.jpg"); //FenJianLiScheduling.cnf.pbx_checkNumber.Image = MediaTypeNames.Image.FromStream(sr.BaseStream); //string checkCode = Interaction.InputBox("请输入验证码!", "验证码"); //sr.Close(); //sr.Dispose(); Console.WriteLine("请输入验证码:"); var checkCode = Console.ReadLine(); #endregion var param = $"email={username}&pwd={password}&repwd={password}&verifycode={checkCode}&invitecode={inviteCode}&agree=on"; // 发送注册请求 var dataResult = RequestFactory.QueryRequest("http://www.jianlika.com/Signup/email.html", param, RequestEnum.POST, cookie, host: host); if (!dataResult.IsSuccess) { return(new DataResult <dynamic>(dataResult.ErrorMsg)); } if (!dataResult.Data.Contains("邮件已发送至")) { throw new RequestException($"注册请求失败!响应数据:{dataResult.Data}"); } LogFactory.Info($"注册成功!邮箱:{username}", MessageSubjectEnum.JianLiKa); return(new DataResult <dynamic>(new { Email = username, Password = password })); }
/// <summary> /// 下载简历 /// </summary> /// <param name="cookieContainer"></param> /// <param name="pageIndex"></param> /// <param name="orderFlag"></param> /// <param name="companyId"></param> /// <param name="function"></param> /// <param name="token"></param> public void DownloadResumes(CookieContainer cookieContainer, int pageIndex, string orderFlag, int companyId, Func <CookieContainer, int, int, string, string, DataResult <string> > function, string token) { var cacheDictionary = new Dictionary <long, Tuple <string, string, DateTime> >(); while (true) { if (pageIndex < 0) { break; } var num = 1; if (pageIndex == 0) { num = 0; } var requestResult = function(cookieContainer, pageIndex * 90 - num, 90 + num, orderFlag, token); if (!requestResult.IsSuccess) { break; } var content = JsonConvert.DeserializeObject <dynamic>(requestResult.Data); if ((int)content.code != 1) { LogFactory.Warn($"简历信息下载异常!message:{content.message} companyId:{companyId}"); return; } var count = orderFlag == "recycle" ? (int)content.data.numFound : (int)content.data[orderFlag].numFound; if (count == 0) { break; } var pageNumber = (int)Math.Ceiling(count / 90.0); var summaries = orderFlag == "recycle" ? content.data.results : content.data[orderFlag].results; var size = summaries.Count; if (size == 0 || IsDownloadByDeliveryId((long)summaries[0].id, orderFlag)) { pageIndex -= 1; continue; } if (!IsDownloadByDeliveryId((long)summaries[size - 1].id, orderFlag) && pageNumber - 1 > pageIndex && size > (pageIndex + 1) * 90) { pageIndex += 1; continue; } cacheDictionary.Add((long)summaries[0].id, new Tuple <string, string, DateTime>((string)summaries[0].jobNumber, (string)summaries[0].number, BaseFanctory.GetTime((string)summaries[0].refreshTime))); downQueue.Enqueue(new Tuple <CookieContainer, string, string, DateTime, string, long, int, Tuple <string> >(cookieContainer, (string)summaries[0].jobNumber, (string)summaries[0].number, BaseFanctory.GetTime((string)summaries[0].refreshTime).ToUniversalTime(), orderFlag, (long)summaries[0].id, companyId, new Tuple <string>(token))); for (var i = 1; i < size; i++) { if (IsDownloadByDeliveryId((long)summaries[i].id, orderFlag)) { break; } cacheDictionary.Add((long)summaries[i].id, new Tuple <string, string, DateTime>((string)summaries[i].jobNumber, (string)summaries[i].number, BaseFanctory.GetTime((string)summaries[i].refreshTime))); downQueue.Enqueue(new Tuple <CookieContainer, string, string, DateTime, string, long, int, Tuple <string> >(cookieContainer, (string)summaries[i].jobNumber, (string)summaries[i].number, BaseFanctory.GetTime((string)summaries[i].refreshTime).ToUniversalTime(), orderFlag, (long)summaries[i].id, companyId, new Tuple <string>(token))); } cacheDictionary = cacheDictionary.Reverse().ToDictionary(k => k.Key, v => v.Value); pageIndex -= 1; break; } while (true) { if (pageIndex < 0) { break; } var num = 1; if (pageIndex == 0) { num = 0; } var requestResult = GetResumes(cookieContainer, pageIndex * 90 - num, 90 + num, orderFlag, token); if (!requestResult.IsSuccess) { break; } var content = JsonConvert.DeserializeObject <dynamic>(requestResult.Data); if ((int)content.code != 1) { LogFactory.Warn($"简历信息下载异常!message:{content.message} companyId:{companyId}"); return; } var count = orderFlag == "recycle" ? (int)content.data.numFound : (int)content.data[orderFlag].numFound; if (count == 0) { break; } var summaries = orderFlag == "recycle" ? content.data.results : content.data[orderFlag].results; var size = summaries.Count; if (size == 0 || cacheDictionary.ContainsKey((long)summaries[0].id)) { pageIndex -= 1; continue; } if (!cacheDictionary.ContainsKey((long)summaries[size - 1].id) && size > (pageIndex + 1) * 90) { pageIndex += 1; continue; } for (var i = size - 1; i > -1; i--) { if (cacheDictionary.ContainsKey((long)summaries[i].id)) { continue; } if (IsDownloadByDeliveryId((long)summaries[i].id, orderFlag)) { cacheDictionary.Add((long)summaries[i].id, new Tuple <string, string, DateTime>((string)summaries[i].jobNumber, (string)summaries[i].number, BaseFanctory.GetTime((string)summaries[i].refreshTime))); continue; } cacheDictionary.Add((long)summaries[i].id, new Tuple <string, string, DateTime>((string)summaries[i].jobNumber, (string)summaries[i].number, BaseFanctory.GetTime((string)summaries[i].refreshTime))); downQueue.Enqueue(new Tuple <CookieContainer, string, string, DateTime, string, long, int, Tuple <string> >(cookieContainer, (string)summaries[i].jobNumber, (string)summaries[i].number, BaseFanctory.GetTime((string)summaries[i].refreshTime).ToUniversalTime(), orderFlag, (long)summaries[i].id, companyId, new Tuple <string>(token))); } --pageIndex; } }
/// <summary> /// 设置简历保密 /// </summary> /// <param name="extendedId"></param> /// <param name="resumeId"></param> /// <returns></returns> public DataResult SetResumePrivate(string extendedId, string resumeId) { var responseResult = HttpClientFactory.RequestForString($"https://i.zhaopin.com/ResumeCenter/MyCenter/SetOpenStatus?Resume_ID={resumeId}&Ext_ID={extendedId}&Version_Number=1&Language_ID=1&level=1&t={BaseFanctory.GetUnixTimestamp()}784", HttpMethod.Get, cookieContainer: cookieContainer); if (responseResult.IsSuccess && responseResult.Data.Contains("修改成功")) { return(responseResult); } return(new DataResult("设置保密失败!" + responseResult.ErrorMsg)); }
/// <summary> /// 下载 /// </summary> /// <param name="cookieContainer"></param> /// <param name="jobNumber"></param> /// <param name="number"></param> /// <param name="refreshTime"></param> /// <param name="orderFlag"></param> /// <param name="deliveryId"></param> /// <param name="companyId"></param> /// <param name="token"></param> private static void Down(CookieContainer cookieContainer, string jobNumber, string number, DateTime refreshTime, string orderFlag, long deliveryId, int companyId, string token) { var resumeId = 0; var url = orderFlag == "recycle" ? $"http://ihr.zhaopin.com/resumesearch/getresumedetial.do?access_token={token}&resumeJobId={deliveryId}" : $"http://ihr.zhaopin.com/resumesearch/getresumedetial.do?resumeNo={deliveryId}_{jobNumber}_{number}_1_1&resumeSource=3"; try { var requestResult = RequestFactory.QueryRequest(url, cookieContainer: cookieContainer); if (!requestResult.IsSuccess) { LogFactory.Warn($"简历信息下载异常!异常信息:{requestResult.ErrorMsg},CompanyId:{companyId},jobNumber:{jobNumber}, ResumeNumber:{number} "); return; } var resume = JsonConvert.DeserializeObject <dynamic>(requestResult.Data); if ((int)resume.code != 1) { LogFactory.Warn($"简历信息下载异常!message:{resume.message},CompanyId:{companyId},jobNumber:{jobNumber}, ResumeNumber:{number} "); if ((int)resume.code == 6001) { while (true) { Tuple <CookieContainer, string, string, DateTime, string, long, int, Tuple <string> > param; if (!downQueue.TryDequeue(out param)) { break; } if (param.Item7 != companyId) { downQueue.Enqueue(param); } } return; // 登录过期 } return; } Thread.Sleep(1000); if (resume.data == null) { return; } var detail = JsonConvert.DeserializeObject(resume.data.detialJSonStr.ToString()); resume.data.detialJSonStr = detail; var path = $"{ConfigurationManager.AppSettings["Resume.SavePath"]}"; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } resumeId = (int)resume.data.resumeId; using (var db = new MangningXssDBEntities()) { if (db.ZhaopinDelivery.Any(a => a.Id == deliveryId)) { Console.WriteLine($"DeliveryId:{deliveryId} 已下载过!"); return; } db.ZhaopinDelivery.Add(new ZhaopinDelivery { CompanyId = companyId, Id = deliveryId, ResumeId = resumeId, JobNumber = jobNumber, ResumeNumber = number }); if (!db.ZhaopinDeliveryLog.Any(a => a.DeliveryId == deliveryId)) { db.ZhaopinDeliveryLog.Add(new ZhaopinDeliveryLog { DeliveryId = deliveryId, CompanyId = companyId }); } db.TransactionSaveChanges(); if (db.ZhaopinResume.Any(a => a.Id == resumeId && a.RefreshTime >= refreshTime && a.Flag != 2)) { var resumeNumber = number.Substring(0, 10); Console.WriteLine($"简历已下载过!ResumeNumber:{resumeNumber}"); return; } } if (!resumeDic.TryAdd(resumeId, resumeId)) { return; } var resumePath = $@"{path}\{resumeId}.json"; File.WriteAllText(resumePath, JsonConvert.SerializeObject(resume.data)); uploadOssActionBlock.Post(resumePath); var userId = (int)resume.data.userDetials.userMasterId; using (var db = new MangningXssDBEntities()) { var user = db.ZhaopinUser.FirstOrDefault(f => f.Id == userId); if (user != null) { if (!user.Source.Contains("MANUAL")) { user.Id = userId; user.Source = "XSS"; user.ModifyTime = BaseFanctory.GetTime((string)detail.DateModified).ToUniversalTime(); user.CreateTime = BaseFanctory.GetTime((string)detail.DateCreated).ToUniversalTime(); user.Cellphone = resume.data.userDetials.mobilePhone.ToString(); user.Email = resume.data.userDetials.email.ToString(); user.Name = resume.data.userDetials.userName.ToString(); user.UpdateTime = DateTime.UtcNow; user.Username = resume.data.userDetials.email.ToString(); } } else { db.ZhaopinUser.AddOrUpdate(a => a.Id, new ZhaopinUser { Id = userId, Source = "XSS", ModifyTime = BaseFanctory.GetTime((string)detail.DateModified).ToUniversalTime(), CreateTime = BaseFanctory.GetTime((string)detail.DateCreated).ToUniversalTime(), Cellphone = resume.data.userDetials.mobilePhone.ToString(), Email = resume.data.userDetials.email.ToString(), Name = resume.data.userDetials.userName.ToString(), UpdateTime = DateTime.UtcNow, Username = resume.data.userDetials.email.ToString() }); } var resumeEntity = db.ZhaopinResume.FirstOrDefault(f => f.Id == resumeId); var userExdId = Regex.IsMatch(detail.UserMasterExtId.ToString(), @"^J[MRSL]\d{9}$") ? detail.UserMasterExtId.ToString() : string.Empty; if (resumeEntity == null) { db.ZhaopinResume.Add(new ZhaopinResume { Id = resumeId, RandomNumber = number.Substring(0, 10), UserId = userId, RefreshTime = BaseFanctory.GetTime((string)detail.DateModified).ToUniversalTime(), UpdateTime = DateTime.UtcNow, UserExtId = userExdId, DeliveryNumber = null, Source = "XSS,Deliver", Flag = 0xE }); } else { resumeEntity.RandomNumber = number.Substring(0, 10); resumeEntity.UserId = userId; resumeEntity.RefreshTime = BaseFanctory.GetTime((string)detail.DateModified).ToUniversalTime(); resumeEntity.UpdateTime = DateTime.UtcNow; if (string.IsNullOrEmpty(resumeEntity.UserExtId)) { resumeEntity.UserExtId = userExdId; } resumeEntity.DeliveryNumber = resumeEntity.DeliveryNumber; resumeEntity.Source = !resumeEntity.Source.Contains("Deliver") ? resumeEntity.Source += ",Deliver" : resumeEntity.Source; resumeEntity.Flag = 0xE; if (resumeEntity.IncludeTime == null) { resumeEntity.IncludeTime = DateTime.UtcNow; } } db.SaveChanges(); } Interlocked.Increment(ref downloadCount); resumeDic.TryRemove(resumeId, out resumeId); Console.WriteLine($"下载成功!{downloadCount}/{downQueue.Count} CId:{companyId} RId:{resumeId} DId:{deliveryId} orderFlag:{orderFlag} oss:{uploadOssActionBlock.InputCount}"); } catch (Exception ex) { while (true) { if (ex.InnerException == null) { break; } ex = ex.InnerException; } LogFactory.Warn($"下载简历异常!异常信息:{ex.Message} 堆栈:{ex.StackTrace} CompanyId:{companyId},ResumeId:{resumeId}, orderFlag:{orderFlag}"); } }
/// <summary> /// 换绑手机号 /// </summary> /// <param name="verifyCode"></param> /// <param name="oldMoblie"></param> /// <param name="newMobile"></param> /// <returns></returns> public DataResult ChangeMobile(string verifyCode, string oldMoblie, string newMobile) { var dictionary = new Dictionary <string, string> { { "verifyCode", verifyCode }, { "oldMoblie", oldMoblie.Remove(3, 4).Insert(3, "****") }, { "newMobile", newMobile } }; var changeResult = HttpClientFactory.RequestForString($"https://i.zhaopin.com/usermaster/UsermasterManage/ChangeMobile?t={BaseFanctory.GetUnixTimestamp()}784", HttpMethod.Post, dictionary, cookieContainer, "https://i.zhaopin.com/ResumeCenter/AccountSet/Index?tab=2"); if (!changeResult.IsSuccess) { return(new DataResult("修改绑定手机失败!" + changeResult.ErrorMsg)); } try { var result = JsonConvert.DeserializeObject <dynamic>(changeResult.Data); if (result.Code != 0) { return(new DataResult((string)result.Msg)); } } catch (Exception) { throw new Exception(changeResult.Data); } return(new DataResult()); }
/// <summary> /// 刷新简历下载数 /// </summary> /// <param name="email"></param> /// <param name="cookie"></param> /// <param name="host"></param> private static void RefreshFreeDownloadNumber(string email, CookieContainer cookie, string host) { var userToken = cookie.GetCookies(new Uri("http://qiye.zhaopingou.com/"))["hrkeepToken"]; var param = $"isAjax=1&clientNo=&userToken={userToken?.Value}&clientType=2"; var dataResult = RequestFactory.QueryRequest("http://qiye.zhaopingou.com/zhaopingou_interface/user_information?timestamp=" + BaseFanctory.GetUnixTimestamp(), param, RequestEnum.POST, cookie, host: host); if (!dataResult.IsSuccess) { LogFactory.Warn($"用户登录刷新下载数异常!异常用户:{email}", MessageSubjectEnum.ZhaoPinGou); return; } var jObject = JsonConvert.DeserializeObject(dataResult.Data) as JObject; if (jObject != null) { if ((int)jObject["errorCode"] != 1) { LogFactory.Warn($"用户登录异常!异常用户:{email},异常信息:{(string)jObject["message"]}", MessageSubjectEnum.ZhaoPinGou); return; } using (var db = new ResumeMatchDBEntities()) { var user = db.User.FirstOrDefault(f => f.Email == email); if (user == null) { return; } var count = (int)jObject["memberEvents"]?["free_count"]; user.DownloadNumber = count; db.TransactionSaveChanges(); } } }