BJPK10Job.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Text.RegularExpressions;
  6. using System.Xml;
  7. using Quartz;
  8. using SCC.Common;
  9. using SCC.Models;
  10. using SCC.Interface;
  11. using HtmlAgilityPack;
  12. using Newtonsoft.Json;
  13. using Newtonsoft.Json.Linq;
  14. namespace SCC.Crawler.GP
  15. {
  16. /// <summary>
  17. /// 数据爬取类
  18. /// 北京PK10(北京赛车)
  19. /// </summary>
  20. [DisallowConcurrentExecution]
  21. [PersistJobDataAfterExecution]
  22. public class BJPK10Job : IJob
  23. {
  24. /// <summary>
  25. /// 构造函数
  26. /// </summary>
  27. public BJPK10Job()
  28. {
  29. log = new LogHelper();
  30. services = IOC.Resolve<IOpen10Code>();
  31. email = IOC.Resolve<IEmail>();
  32. }
  33. /// <summary>
  34. /// 作业执行入口
  35. /// </summary>
  36. /// <param name="context">作业执行上下文</param>
  37. public void Execute(IJobExecutionContext context)
  38. {
  39. Config = CommonHelper.GetConfigFromDataMap(context.JobDetail.JobDataMap);
  40. //预设节假日不开奖
  41. if (Config.SkipDate.Contains(CommonHelper.SCCSysDateTime.ToString("yyyyMMdd"))) return;
  42. LatestItem = context.JobDetail.JobDataMap["LatestItem"] as OpenCode10Model;
  43. try
  44. {
  45. //服务启动时配置初始数据
  46. if (LatestItem == null)
  47. {
  48. LatestItem = services.GetLastItem(currentLottery);
  49. }
  50. //第一次启动服务或最新开奖记录为昨日滴,则自检昨天开奖数据是否抓取完毕(否则插入邮件数据),并重置当天期号和失败列表
  51. if (LatestItem == null || LatestItem.OpenTime.ToString("yyyyMMdd") != CommonHelper.SCCSysDateTime.ToString("yyyyMMdd"))
  52. {
  53. CheckingYesterdayTheLotteryData();
  54. LatestItem = GenerateTodayFirstItem();
  55. }
  56. //当最新开奖记录不是今天最后一期,执行当天作业
  57. if (!CheckLatestItemIsTodayLastItem())
  58. {
  59. //var query=services.GetLastItem(currentLottery);
  60. // DoTodayJobByMainUrl();
  61. //DoTodayJobByBackUrl();
  62. DoTodayJobByDB();
  63. }
  64. }
  65. catch (Exception ex)
  66. {
  67. log.Error(typeof(BJPK10Job), string.Format("【{0}】抓取时发生错误,错误信息【{1}】", Config.Area + Config.LotteryName, ex.Message));
  68. }
  69. //保存最新期号和失败期号列表
  70. context.JobDetail.JobDataMap["LatestItem"] = LatestItem;
  71. }
  72. /// <summary>
  73. /// 新开奖号数据库拿取
  74. /// </summary>
  75. private void DoYesterdayFailedListByMainUrl_New()
  76. {
  77. var OpenList = GetYesterdayOpenListFromDB_new();
  78. if (OpenList.Count == 0) return;//无抓取数据
  79. var SuccessList = new List<string>();
  80. foreach (string failedQiHao in FailedQiHaoList)
  81. {
  82. var matchItem = OpenList.Where(R => R.Key == failedQiHao).FirstOrDefault();
  83. if (matchItem.Key != null && SaveRecord(failedQiHao, matchItem.Value, true))
  84. {
  85. //处理成功写入日志
  86. log.Info(typeof(HeBei11X5Job), CommonHelper.GetJobMainLogInfo(Config, failedQiHao));
  87. SuccessList.Add(failedQiHao);
  88. continue;
  89. }
  90. }
  91. foreach (var successQiHao in SuccessList)
  92. {
  93. FailedQiHaoList.Remove(successQiHao);
  94. }
  95. }
  96. /// <summary>
  97. /// 通过数据库点抓取昨日开奖列表
  98. /// </summary>
  99. /// <returns></returns>
  100. private Dictionary<string, string> GetYesterdayOpenListFromDB_new()
  101. {
  102. Dictionary<string, string> result = new Dictionary<string, string>();
  103. try
  104. {
  105. var list = services.GetYesterdayFailQQListDB10(currentLottery, Config.TimesPerDay);
  106. result = list;
  107. }
  108. catch (Exception ex)
  109. {
  110. log.Error(typeof(HeBei11X5Job), string.Format("【{0}】通过主站点抓取昨日开奖列表时发生错误,错误信息【{1}】", Config.Area + Config.LotteryName, ex.Message));
  111. }
  112. return result;
  113. }
  114. /// <summary>
  115. /// 通过数据库获取开奖数据
  116. /// </summary>
  117. private void DoTodayJobByDB()
  118. {
  119. var OpenList = services.GetYesterdayFailQQListDB10_toDay(currentLottery, Config.TimesPerDay);
  120. if (OpenList.Count == 0) return;//无抓取数据
  121. var newestQiHao = OpenList.OrderBy(a => a.Key).Last().Key;
  122. var startQiNum = LatestItem.Term + 1;
  123. var newestQiNum = OpenList.OrderBy(a=>a.Key).Last().Key;
  124. if (Convert.ToInt32(startQiNum) > Convert.ToInt32(newestQiNum)) return;//无最新数据
  125. //处理最新开奖数据
  126. for (var i = startQiNum; i <= Convert.ToInt32(newestQiNum); i++)
  127. {
  128. var matchItem = OpenList.Where(R => R.Key == i.ToString()).FirstOrDefault();
  129. if (matchItem.Key != null && SaveRecord(matchItem.Key, matchItem.Value, true))
  130. {
  131. //处理成功写入日志
  132. log.Info(typeof(BJPK10Job), CommonHelper.GetJobMainLogInfo(Config, i.ToString()));
  133. //LatestItem = matchItem;
  134. }
  135. }
  136. }
  137. /// <summary>
  138. /// 自检昨天开奖数据
  139. /// </summary>
  140. private void CheckingYesterdayTheLotteryData()
  141. {
  142. if (Config.SkipDate.Contains(CommonHelper.SCCSysDateTime.AddDays(-1).ToString("yyyyMMdd"))) return;//如果昨日设定不开奖则不自检昨日开奖数据
  143. //从数据库中获取昨天数据抓取失败列表
  144. FailedQiHaoList = services.GetYesterdayFailQQQList(currentLottery, GenerateYesterdayQiHaoList());
  145. if (FailedQiHaoList.Count > 0)
  146. {
  147. DoYesterdayFailedListByMainUrl_New();
  148. //DoYesterdayFailedListByMainUrl();
  149. //DoYesterdayFailedListByBackUrl();
  150. foreach (var fQiHao in FailedQiHaoList)
  151. {
  152. //将抓取失败数据推送至邮件列表,待邮件服务发送至配置管理员的邮箱中
  153. if (email.AddEmail(Config.Area + Config.LotteryName, fQiHao, GenerateYesterdayPK10OpenTime(fQiHao)))
  154. log.Error(typeof(BJPK10Job), CommonHelper.GetJobLogError(Config, fQiHao));
  155. }
  156. }
  157. }
  158. /// <summary>
  159. /// 通过主站点抓取开奖数据
  160. /// (百度彩票)
  161. /// </summary>
  162. private void DoTodayJobByMainUrl()
  163. {
  164. if (!string.IsNullOrEmpty(Config.MainUrl))
  165. {
  166. var OpenList = GetTodayOpenListFromMainUrl();
  167. if (OpenList.Count == 0) return;//无抓取数据
  168. var startQiNum = LatestItem.Term + 1;
  169. var newestQiNum = OpenList.Last().Term;
  170. if (startQiNum > newestQiNum) return;//无最新数据
  171. //处理最新开奖数据
  172. for (var i = startQiNum; i <= newestQiNum; i++)
  173. {
  174. var matchItem = OpenList.Where(R => R.Term == i).FirstOrDefault();
  175. if (matchItem != null && services.AddOpen10Code(currentLottery, matchItem))
  176. {
  177. //处理成功写入日志
  178. log.Info(typeof(BJPK10Job), CommonHelper.GetJobMainLogInfo(Config, i.ToString()));
  179. LatestItem = matchItem;
  180. }
  181. }
  182. }
  183. }
  184. /// <summary>
  185. /// 通过主站抓取错误期号列表中每一个期号
  186. /// (百度彩票)
  187. /// </summary>
  188. private void DoYesterdayFailedListByMainUrl()
  189. {
  190. if (!string.IsNullOrEmpty(Config.MainUrl) && FailedQiHaoList.Count > 0)
  191. {
  192. var OpenList = GetYesterdayOpenListFromMainUrl();
  193. if (OpenList.Count == 0) return;//无抓取数据
  194. var SuccessList = new List<string>();
  195. foreach (string failedQiHao in FailedQiHaoList)
  196. {
  197. var matchItem = OpenList.Where(R => R.Term.ToString() == failedQiHao).FirstOrDefault();
  198. if (matchItem != null && services.AddOpen10Code(currentLottery, matchItem))
  199. {
  200. //处理成功写入日志
  201. log.Info(typeof(BJPK10Job), CommonHelper.GetJobMainLogInfo(Config, failedQiHao));
  202. SuccessList.Add(failedQiHao);
  203. continue;
  204. }
  205. }
  206. foreach (var successQiHao in SuccessList)
  207. {
  208. FailedQiHaoList.Remove(successQiHao);
  209. }
  210. }
  211. }
  212. /// <summary>
  213. /// 通过主站点抓取今日最新开奖数据
  214. /// </summary>
  215. /// <returns></returns>
  216. private List<OpenCode10Model> GetTodayOpenListFromMainUrl()
  217. {
  218. List<OpenCode10Model> result = new List<OpenCode10Model>();
  219. try
  220. {
  221. var HtmlResource = NetHelper.GetBaiDuLeCaiResponse(Config.MainUrl);
  222. if (!string.IsNullOrWhiteSpace(HtmlResource))
  223. {
  224. Regex reg = new Regex(@"var phaseData = ([\s\S]*?);");
  225. Match m = reg.Match(HtmlResource);
  226. if (!m.Success) return result;
  227. var dataJson = m.Result("$1");
  228. JObject obj = JsonConvert.DeserializeObject<JObject>(dataJson);
  229. JToken items = obj[CommonHelper.SCCSysDateTime.ToString("yyyy-MM-dd")];
  230. if (items == null || !items.HasValues) return result;
  231. OpenCode10Model model = null;
  232. JObject childObject = null, openCode = null;
  233. JArray red = null;
  234. foreach (JProperty item in items)
  235. {
  236. model = new OpenCode10Model();
  237. model.Term = Convert.ToInt64(item.Name);//开奖期号
  238. childObject = (JObject)item.Value;
  239. model.OpenTime = Convert.ToDateTime(childObject["open_time"]);//开奖时间
  240. openCode = (JObject)childObject["result"];
  241. red = (JArray)openCode["red"];//20个开奖球号
  242. if (red.Count != 10) continue;
  243. model.OpenCode1 = Convert.ToInt32(red[0].ToString());
  244. model.OpenCode2 = Convert.ToInt32(red[1].ToString());
  245. model.OpenCode3 = Convert.ToInt32(red[2].ToString());
  246. model.OpenCode4 = Convert.ToInt32(red[3].ToString());
  247. model.OpenCode5 = Convert.ToInt32(red[4].ToString());
  248. model.OpenCode6 = Convert.ToInt32(red[5].ToString());
  249. model.OpenCode7 = Convert.ToInt32(red[6].ToString());
  250. model.OpenCode8 = Convert.ToInt32(red[7].ToString());
  251. model.OpenCode9 = Convert.ToInt32(red[8].ToString());
  252. model.OpenCode10 = Convert.ToInt32(red[9].ToString());
  253. if (!result.Contains(model))
  254. result.Add(model);
  255. }
  256. }
  257. }
  258. catch (Exception ex)
  259. {
  260. log.Error(typeof(BJPK10Job), string.Format("【{0}】通过主站点抓取今日最新开奖列表时发生错误,错误信息【{1}】", Config.Area + Config.LotteryName, ex.Message));
  261. }
  262. return result;
  263. }
  264. /// <summary>
  265. /// 通过主站点抓取昨日开奖数据
  266. /// </summary>
  267. /// <returns></returns>
  268. private List<OpenCode10Model> GetYesterdayOpenListFromMainUrl()
  269. {
  270. List<OpenCode10Model> result = new List<OpenCode10Model>();
  271. try
  272. {
  273. var requestUrl = string.Format("{0}/{1}", Config.MainUrl, CommonHelper.SCCSysDateTime.AddDays(-1).ToString("yyyy-MM-dd"));
  274. var HtmlResource = NetHelper.GetBaiDuLeCaiResponse(requestUrl);
  275. if (!string.IsNullOrWhiteSpace(HtmlResource))
  276. {
  277. Regex reg = new Regex(@"var phaseData = ([\s\S]*?);");
  278. Match m = reg.Match(HtmlResource);
  279. if (!m.Success) return result;
  280. var dataJson = m.Result("$1");
  281. JObject obj = JsonConvert.DeserializeObject<JObject>(dataJson);
  282. JToken items = obj[CommonHelper.SCCSysDateTime.AddDays(-1).ToString("yyyy-MM-dd")];
  283. if (items == null || !items.HasValues) return result;
  284. OpenCode10Model model = null;
  285. JObject childObject = null, openCode = null;
  286. JArray red = null;
  287. foreach (JProperty item in items)
  288. {
  289. model = new OpenCode10Model();
  290. model.Term = Convert.ToInt64(item.Name);//开奖期号
  291. childObject = (JObject)item.Value;
  292. model.OpenTime = Convert.ToDateTime(childObject["open_time"]);//开奖时间
  293. openCode = (JObject)childObject["result"];
  294. red = (JArray)openCode["red"];//20个开奖球号
  295. if (red.Count != 10) continue;
  296. model.OpenCode1 = Convert.ToInt32(red[0].ToString());
  297. model.OpenCode2 = Convert.ToInt32(red[1].ToString());
  298. model.OpenCode3 = Convert.ToInt32(red[2].ToString());
  299. model.OpenCode4 = Convert.ToInt32(red[3].ToString());
  300. model.OpenCode5 = Convert.ToInt32(red[4].ToString());
  301. model.OpenCode6 = Convert.ToInt32(red[5].ToString());
  302. model.OpenCode7 = Convert.ToInt32(red[6].ToString());
  303. model.OpenCode8 = Convert.ToInt32(red[7].ToString());
  304. model.OpenCode9 = Convert.ToInt32(red[8].ToString());
  305. model.OpenCode10 = Convert.ToInt32(red[9].ToString());
  306. if (!result.Contains(model))
  307. result.Add(model);
  308. }
  309. }
  310. }
  311. catch (Exception ex)
  312. {
  313. log.Error(typeof(BJPK10Job), string.Format("【{0}】通过主站点抓取昨日开奖列表时发生错误,错误信息【{1}】", Config.Area + Config.LotteryName, ex.Message));
  314. }
  315. return result;
  316. }
  317. /// <summary>
  318. /// 通过备用站点抓取开奖数据
  319. /// (北京福彩官网)
  320. /// </summary>
  321. private void DoTodayJobByBackUrl()
  322. {
  323. if (!string.IsNullOrEmpty(Config.BackUrl))
  324. {
  325. var OpenList = GetOpenListFromBackUrl(Config.BackUrl);
  326. if (OpenList.Count == 0) return;//无抓取数据
  327. foreach (OpenCode10Model model in OpenList)
  328. {
  329. if (services.AddOpen10Code(currentLottery, model))
  330. {
  331. //处理成功写入日志
  332. log.Info(typeof(BJPK10Job), CommonHelper.GetJobBackLogInfo(Config, model.Term.ToString()));
  333. LatestItem = model;
  334. }
  335. }
  336. //var startQiNum = LatestItem.Term + 1;
  337. //var newestQiNum = OpenList.First().Term;
  338. //if (startQiNum > newestQiNum) return;//无最新数据
  339. ////处理最新开奖数据
  340. //for (var i = startQiNum; i <= newestQiNum; i++)
  341. //{
  342. // var matchItem = OpenList.Where(R => R.Term == i).FirstOrDefault();
  343. // if (matchItem != null && services.AddOpen10Code(currentLottery, matchItem))
  344. // {
  345. // //处理成功写入日志
  346. // log.Info(typeof(BJPK10Job), CommonHelper.GetJobBackLogInfo(Config, i.ToString()));
  347. // LatestItem = matchItem;
  348. // }
  349. //}
  350. }
  351. }
  352. /// <summary>
  353. /// 通过备用地址抓取错误期号列表中每一个期号
  354. /// (北京福彩官网)
  355. /// </summary>
  356. private void DoYesterdayFailedListByBackUrl()
  357. {
  358. if (!string.IsNullOrEmpty(Config.BackUrl) && FailedQiHaoList.Count > 0)
  359. {
  360. var OpenList = GetOpenListFromBackUrl(Config.BackUrl);
  361. if (OpenList.Count == 0) return;//无抓取数据
  362. var SuccessList = new List<string>();
  363. foreach (var failedQiHao in FailedQiHaoList)
  364. {
  365. var matchItem = OpenList.Where(R => R.Term.ToString() == failedQiHao).FirstOrDefault();
  366. if (matchItem != null && services.AddOpen10Code(currentLottery, matchItem))
  367. {
  368. //处理成功写入日志
  369. log.Info(typeof(BJPK10Job), CommonHelper.GetJobBackLogInfo(Config, failedQiHao));
  370. SuccessList.Add(failedQiHao);
  371. continue;
  372. }
  373. }
  374. foreach (var successQiHao in SuccessList)
  375. {
  376. FailedQiHaoList.Remove(successQiHao);
  377. }
  378. }
  379. }
  380. /// <summary>
  381. /// 抓取备用站点开奖数据
  382. /// 北京福彩官网分页数据太多,只有通过主站点来保证开奖数据完整性
  383. /// </summary>
  384. /// <param name="url">备用站点</param>
  385. /// <returns></returns>
  386. private List<OpenCode10Model> GetOpenListFromBackUrl(string url)
  387. {
  388. List<OpenCode10Model> result = new List<OpenCode10Model>();
  389. try
  390. {
  391. string HtmlResource = string.Empty;
  392. HtmlResource = NetHelper.GetUrlResponse(url);
  393. if (!string.IsNullOrWhiteSpace(HtmlResource))
  394. {
  395. HtmlDocument doc = new HtmlDocument();
  396. doc.LoadHtml(HtmlResource);
  397. var table = doc.DocumentNode.SelectNodes("//table");
  398. if (table == null || table.Count < 2) return result;
  399. var trs = table[1].ChildNodes.Where(R => R.Name.ToLower() == "tr").ToList();
  400. if (trs.Count < 2) return result;
  401. List<HtmlNode> tds = null;
  402. OpenCode10Model model = null;
  403. string[] openCodeList = null;
  404. string openTime = string.Empty;
  405. string todayDateString = CommonHelper.SCCSysDateTime.ToString("yyyy-MM-dd");
  406. for (var i = 1; i < trs.Count; i++)//第一行是表头
  407. {
  408. tds = trs[i].ChildNodes.Where(R => R.Name.ToLower() == "td").ToList();
  409. if (tds.Count < 3) continue;
  410. openTime = tds[2].InnerText.Trim();
  411. if (!openTime.StartsWith(todayDateString)) continue;
  412. model = new OpenCode10Model();
  413. model.Term = Convert.ToInt64(tds[0].InnerText.Trim());
  414. openCodeList = tds[1].InnerText.Trim().Split(new char[] { ',' });
  415. if (openCodeList.Length < 10) continue;
  416. model.OpenCode1 = Convert.ToInt32(openCodeList[0]);
  417. model.OpenCode2 = Convert.ToInt32(openCodeList[1]);
  418. model.OpenCode3 = Convert.ToInt32(openCodeList[2]);
  419. model.OpenCode4 = Convert.ToInt32(openCodeList[3]);
  420. model.OpenCode5 = Convert.ToInt32(openCodeList[4]);
  421. model.OpenCode6 = Convert.ToInt32(openCodeList[5]);
  422. model.OpenCode7 = Convert.ToInt32(openCodeList[6]);
  423. model.OpenCode8 = Convert.ToInt32(openCodeList[7]);
  424. model.OpenCode9 = Convert.ToInt32(openCodeList[8]);
  425. model.OpenCode10 = Convert.ToInt32(openCodeList[9]);
  426. model.OpenTime = Convert.ToDateTime(openTime);
  427. if (!result.Contains(model))
  428. result.Add(model);
  429. }
  430. }
  431. }
  432. catch (Exception ex)
  433. {
  434. log.Error(typeof(BJPK10Job), string.Format("【{0}】通过备用站点抓取开奖列表时发生错误,错误信息【{1}】", Config.Area + Config.LotteryName, ex.Message));
  435. }
  436. return result;
  437. }
  438. /// <summary>
  439. /// 生成今日第一期记录
  440. /// </summary>
  441. /// <returns></returns>
  442. private OpenCode10Model GenerateTodayFirstItem()
  443. {
  444. OpenCode10Model item = new OpenCode10Model();
  445. var currentDateTime = CommonHelper.SCCSysDateTime;
  446. TimeSpan datepart = currentDateTime - new DateTime(2018, 1, 1);
  447. var t = Config.SkipDate.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  448. item.Term = (datepart.Days - t.Length) * Config.TimesPerDay + LastTermLastYear;//期号使用昨日最后一期期号,便于计算使用
  449. item.OpenTime = new DateTime(currentDateTime.Year, currentDateTime.Month, currentDateTime.Day, Config.StartHour, Config.StartMinute, 0);
  450. return item;
  451. }
  452. /// <summary>
  453. /// 核实最新一期开奖记录是否为今日最后一期
  454. /// </summary>
  455. /// <param name="QiHao">期号</param>
  456. /// <returns></returns>
  457. private bool CheckLatestItemIsTodayLastItem()
  458. {
  459. if (LatestItem == null ||
  460. LatestItem.OpenTime.ToString("yyyyMMdd") != CommonHelper.SCCSysDateTime.ToString("yyyyMMdd"))
  461. return true;
  462. var firstItem = GenerateTodayFirstItem();
  463. if (LatestItem.Term == (firstItem.Term + Config.TimesPerDay))
  464. return true;
  465. return false;
  466. }
  467. /// <summary>
  468. /// 获取今天第一期期号
  469. /// </summary>
  470. /// <returns></returns>
  471. private string GenerateTodayFirstQiHao()
  472. {
  473. var datepart = CommonHelper.SCCSysDateTime - new DateTime(2018, 1, 1);
  474. var t = Config.SkipDate.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  475. var terms = (datepart.Days - t.Length) * Config.TimesPerDay + LastTermLastYear + 1;
  476. return terms.ToString();
  477. }
  478. /// <summary>
  479. /// 生成昨天的期号列表
  480. /// </summary>
  481. /// <returns></returns>
  482. private List<string> GenerateYesterdayQiHaoList()
  483. {
  484. List<string> result = new List<string>();
  485. var todayFirstQiHao = Convert.ToInt64(GenerateTodayFirstQiHao());
  486. for (var i = Config.TimesPerDay; i > 0; i--)
  487. {
  488. result.Add((todayFirstQiHao - i).ToString());
  489. }
  490. return result;
  491. }
  492. /// <summary>
  493. /// 生成PK10的开奖时间
  494. /// </summary>
  495. /// <param name="QiHao"></param>
  496. /// <returns></returns>
  497. private DateTime GenerateYesterdayPK10OpenTime(string QiHao)
  498. {
  499. var openDay = CommonHelper.SCCSysDateTime.AddDays(-1);
  500. var StartTime = new DateTime(openDay.Year, openDay.Month, openDay.Day, Config.StartHour, Config.StartMinute, 0);
  501. var t = (Convert.ToInt64(QiHao) - LastTermLastYear) % Config.TimesPerDay;
  502. if (t == 0)
  503. return StartTime.AddMinutes((Config.TimesPerDay - 1) * Config.Interval);
  504. else
  505. return StartTime.AddMinutes((t - 1) * Config.Interval);
  506. }
  507. /// <summary>
  508. /// 将此彩种指定期号和开奖号码保存至数据库
  509. /// </summary>
  510. /// <param name="QiHao">期号</param>
  511. /// <param name="OpenCode">开奖号码(形如01,02,03)</param>
  512. /// <param name="IsYesterdayRecord">是否是保存昨天的记录</param>
  513. /// <returns></returns>
  514. private bool SaveRecord(string QiHao, string OpenCode, bool IsYesterdayRecord)
  515. {
  516. if (!string.IsNullOrWhiteSpace(QiHao) && !string.IsNullOrWhiteSpace(OpenCode))
  517. {
  518. var list = OpenCode.Split(',');
  519. OpenCode10Model model = new OpenCode10Model();
  520. model.Term = Convert.ToInt64(QiHao);//开奖期号
  521. model.OpenTime = Convert.ToDateTime(list[10]);
  522. model.OpenCode1 = Convert.ToInt32(list[0].ToString());
  523. model.OpenCode2 = Convert.ToInt32(list[1].ToString());
  524. model.OpenCode3 = Convert.ToInt32(list[2].ToString());
  525. model.OpenCode4 = Convert.ToInt32(list[3].ToString());
  526. model.OpenCode5 = Convert.ToInt32(list[4].ToString());
  527. model.OpenCode6 = Convert.ToInt32(list[5].ToString());
  528. model.OpenCode7 = Convert.ToInt32(list[6].ToString());
  529. model.OpenCode8 = Convert.ToInt32(list[7].ToString());
  530. model.OpenCode9 = Convert.ToInt32(list[8].ToString());
  531. model.OpenCode10 = Convert.ToInt32(list[9].ToString());
  532. return services.AddOpen10Code(currentLottery, model);
  533. }
  534. return false;
  535. }
  536. #region Attribute
  537. /// <summary>
  538. /// 配置信息
  539. /// </summary>
  540. private SCCConfig Config = null;
  541. /// <summary>
  542. /// 当天抓取的最新一期开奖记录
  543. /// </summary>
  544. private OpenCode10Model LatestItem = null;
  545. /// <summary>
  546. /// 当天抓取失败列表
  547. /// </summary>
  548. private List<string> FailedQiHaoList = null;
  549. /// <summary>
  550. /// 日志对象
  551. /// </summary>
  552. private LogHelper log = null;
  553. /// <summary>
  554. /// 数据服务
  555. /// </summary>
  556. private IOpen10Code services = null;
  557. /// <summary>
  558. /// 当前彩种
  559. /// </summary>
  560. private SCCLottery currentLottery
  561. {
  562. get
  563. {
  564. return SCCLottery.BeiJingPK10;
  565. }
  566. }
  567. /// <summary>
  568. /// 邮件接口
  569. /// </summary>
  570. private IEmail email = null;
  571. /// <summary>
  572. /// 2016年最后一期期号
  573. /// </summary>
  574. private long LastTermLastYear = 659223;
  575. #endregion
  576. }
  577. }