Commit cd4e7bfa authored by 罗超's avatar 罗超

添加ClassIn登录

parent e540b712
using Newtonsoft.Json.Linq;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using TicketSpider.Model;
using TicketSpider.Spiders.EasterLineRule;
using TicketSpider.Uitls;
namespace TicketSpider.Data
{
public class FlightFlow
{
private JArray TARGET_FLIGHT = new JArray();
public async void StartAsync()
{
Console.WriteLine("进入东航刷票模块,开始计算需求.......");
Console.WriteLine("开始模拟登录信息.......");
string loginCookies = AccountManagerHelper.GetInstance();
if (!string.IsNullOrEmpty(loginCookies) && !TaskHelper.cancelTokenSource.IsCancellationRequested)
{
Console.WriteLine("获取登录信息成功, 开始操作乘客信息");
await Task.Run(() => new PassengerHelper().RegistPassengerHandler());
Thread.Sleep(2000);
Console.WriteLine("乘客信息处理完毕,开始执行寻票...");
if (CmdHelper.FLIGHTS.Count == 1)
{
if (CmdHelper.FLIGHTS.FirstOrDefault().DepartDateMode == 1)
{
Task.Factory.StartNew(() => QueryTicketHandler(CmdHelper.FLIGHTS.FirstOrDefault().DepartDate), TaskHelper.cancelTokenSource.Token);
}
else if (CmdHelper.FLIGHTS.FirstOrDefault().DepartDateMode == 2)
{
var dates=CmdHelper.FLIGHTS.FirstOrDefault().DepartDate.Split("~");
var dt1 = DateTime.Parse(dates[0]);
var dt2 = DateTime.Parse(dates[1]);
while (true)
{
Task.Factory.StartNew(() => QueryTicketHandler(dt1.ToString("yyyy-MM-dd")), TaskHelper.cancelTokenSource.Token);
dt1.AddDays(1);
if (dt1 > dt2) break;
}
}
else if (CmdHelper.FLIGHTS.FirstOrDefault().DepartDateMode == 3)
{
var dates = CmdHelper.FLIGHTS.FirstOrDefault().DepartDate;
var dt1 = DateTime.Parse($"{dates}-01");
while (true)
{
Task.Factory.StartNew(() => QueryTicketHandler(dt1.ToString("yyyy-MM-dd")), TaskHelper.cancelTokenSource.Token);
dt1.AddDays(1);
if (dt1.ToString("yyyy/MM") != dates) break;
}
}
}
}
else
{
Console.WriteLine("获取登录信息失败,程序退出...");
Environment.Exit(0);
}
}
public async void QueryTicketHandler(string date)
{
//Setup 2:获取航班数据
var flight = new QueryFlightHelper(0.1M).RunAsync(date).Result;
if (!TaskHelper.cancelTokenSource.IsCancellationRequested) return;
Console.WriteLine("获取机票信息完毕");
Thread.Sleep(1000);
//Setup 4 创建订单
Console.WriteLine("开始创建订单...");
var orderSubmit = await new TicketOrderHelper().RunAsync(flight);
if (!TaskHelper.cancelTokenSource.IsCancellationRequested) return;
if (orderSubmit.result)
{
//Setup 5 弹出付款链接
Console.WriteLine("订单创建成功,正在准备付款页面");
OpenOrderPayPageHandler(orderSubmit.order);
}
else
{
Console.WriteLine("订单提交失败....程序退出");
TaskHelper.GetInstance().UnLockOrderStatus(); //释放锁定
}
}
public void OpenOrderPayPageHandler(JObject order)
{
var flag = false;
ReadOnlyCollection<IWebElement> inputEle = null;
var option = new ChromeOptions();
//option.AddArgument("--incognito");
//option.AddArgument("headless");
option.AddArgument("disable-infobars");
//option.AddArgument("window-size=1920,1080");
//option.AddArgument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36");
ChromeDriverService service = ChromeDriverService.CreateDefaultService(Environment.CurrentDirectory);
service.HideCommandPromptWindow = true;
option.PageLoadStrategy = PageLoadStrategy.Eager;
IWebDriver driver = new ChromeDriver(service, option);
var cookies = AccountManagerHelper.GetInstance().Split(";");
driver.Navigate().GoToUrl("https://www.ceair.com/");
Thread.Sleep(2000);
driver.Manage().Cookies.DeleteAllCookies();
foreach (var item in cookies)
{
driver.Manage().Cookies.AddCookie(new Cookie(item.Split("=")[0], item.Split("=")[1]));
}
var param= $"{{\"tdOrderNo\":\"{order["tdOrderNo"].ToString()}\",\"t\":{DateTime.Now.Ticks}}}";
param = Convert.ToBase64String(Encoding.UTF8.GetBytes(param));
param = System.Web.HttpUtility.UrlEncode(param);
driver.Navigate().GoToUrl($"https://www.ceair.com/payment?searchKey={param}ENCODEKEY");
//通知流程结束
TaskHelper.cancelTokenSource.Cancel();
AccountManagerHelper.StopHeartLine();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TicketSpider.Model
{
public class City
{
public string cityCode { get; set; }
public string cityName { get; set; }
public string firstLetterCn { get; set; }
public string firstLetterEn { get; set; }
public string group { get; set; }
public int isHotArr { get; set; }
public int isHotDep { get; set; }
public string label { get; set; }
public string match { get; set; }
public string nc { get; set; }
public int orderArr { get; set; }
public int orderDep { get; set; }
public string value { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TicketSpider.Model
{
[Serializable]
public class FavorPaxIdDtoList
{
public string id { get; set; }
public string favorPaxId { get; set; }
public string idIssueNation { get; set; }
public string idNo { get; set; }
public string idType { get; set; }
public string idValidDt { get; set; }
public string paxIDType { get; set; }
public string paxYouxiaoqi { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TicketSpider.Model
{
[Serializable]
public class Flight
{
public string? DepartCity { get; set; }
public string? ArriveCity { get; set; }
public int? DepartDateMode { get; set; }
public string? DepartDate { get; set; }
public string? AirlineCode { get; set; }
public string? SeatCode { get; set; }
public string arrCityCode { get; set; }
public string arrCode { get; set; }
public string depCityCode { get; set; }
public string depCode { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TicketSpider.Model
{
[Serializable]
public class Passenger
{
public string id { get; set; }
public string paxName { get; set; }
public string paxNameFirst { get; set; }
public string paxNameLast { get; set; }
public string gender { get; set; }
public string birthday { get; set; }
public string nationality { get; set; }
public string telephoneCode { get; set; }
public string mobile { get; set; }
public string email { get; set; }
public List<FavorPaxIdDtoList> favorPaxIdDtoList { get; set; }
public string ffpAirline { get; set; }
public string ffpNo { get; set; }
public string paxType { get; set; }
}
}
This diff is collapsed.
This diff is collapsed.
using Newtonsoft.Json.Linq;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace TicketSpider.Spiders.ClassInRule
{
public class ClassInFlow
{
public async void StartAsync()
{
Console.WriteLine("开始模拟登录信息.......");
string loginCookies = ClassInAccountManager.GetInstance();
}
}
}
......@@ -8,7 +8,6 @@ using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using TicketSpider.Model;
using TicketSpider.Uitls;
namespace TicketSpider.Spiders.EasterLineRule
{
......
......@@ -9,8 +9,6 @@ using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using TicketSpider.Data;
using TicketSpider.Uitls;
namespace TicketSpider.Spiders.EasterLineRule
{
......
......@@ -4,9 +4,10 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TicketSpider.Agent
namespace TicketSpider.Spiders
{
public class AgentService
public interface ICookiesManager
{
}
}
......@@ -7,11 +7,26 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<Compile Remove="Spiders\CityService.cs" />
<Compile Remove="Spiders\EasterLineRule\AccountManagerHelper.cs" />
<Compile Remove="Spiders\EasterLineRule\CookiesHelper.cs" />
<Compile Remove="Spiders\EasterLineRule\PassengerHelper.cs" />
<Compile Remove="Spiders\EasterLineRule\QueryFlightHelper.cs" />
<Compile Remove="Spiders\EasterLineRule\TicketOrderHelper.cs" />
</ItemGroup>
<ItemGroup>
<None Remove="zh_CN.json" />
</ItemGroup>
<ItemGroup>
<Content Include="Spiders\CityService.cs" />
<Content Include="Spiders\EasterLineRule\AccountManagerHelper.cs" />
<Content Include="Spiders\EasterLineRule\CookiesHelper.cs" />
<Content Include="Spiders\EasterLineRule\PassengerHelper.cs" />
<Content Include="Spiders\EasterLineRule\QueryFlightHelper.cs" />
<Content Include="Spiders\EasterLineRule\TicketOrderHelper.cs" />
<Content Include="zh_CN.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
......@@ -19,6 +34,7 @@
<ItemGroup>
<PackageReference Include="DotnetSpider" Version="5.0.9" />
<PackageReference Include="OpenCvSharp4.Windows" Version="4.5.5.20211231" />
<PackageReference Include="Selenium.WebDriver" Version="4.1.0" />
<PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="100.0.4896.6000" />
<PackageReference Include="Serilog.AspNetCore" Version="3.4.0" />
......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TicketSpider.Model;
namespace TicketSpider.Uitls
{
public static class CmdHelper
{
/// <summary>
/// 航司
/// </summary>
public static string[]? AIRLINE = null;
/// <summary>
/// 命令模式
/// </summary>
public static int CMD_MODEL=0;
/// <summary>
/// 航班信息
/// </summary>
public static List<Flight> FLIGHTS = new List<Flight>();
/// <summary>
/// 乘客信息
/// </summary>
public static List<Passenger> PASSENGETS = new List<Passenger>();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TicketSpider.Model;
namespace TicketSpider.Uitls
{
public static class DemoModelHelper
{
public static List<Passenger> GetTempPassenger()
{
var list=new List<Passenger>();
list.Add(new Passenger() {
id="",
paxName="罗超",
paxNameFirst="LUO",
paxNameLast="CHAO",
gender="M",
birthday="19901226",
nationality="CN",
telephoneCode="86",
mobile="17308037817",
email="",
ffpAirline="",
ffpNo="",
favorPaxIdDtoList=new List<FavorPaxIdDtoList>() {
new FavorPaxIdDtoList() {
id="",
favorPaxId="",
idIssueNation="",
idNo="EH7982905",
idType="PP",
idValidDt="",
paxIDType=""
}
},
paxType=""
});
list.Add(new Passenger()
{
id = "",
paxName = "康琪",
paxNameFirst = "Kang",
paxNameLast = "Qi",
gender = "F",
birthday = "20020316",
nationality = "CN",
telephoneCode = "86",
mobile = "17708004866",
email = "",
ffpAirline = "",
ffpNo = "",
favorPaxIdDtoList = new List<FavorPaxIdDtoList>() {
new FavorPaxIdDtoList() {
id="",
favorPaxId="",
idIssueNation="",
idNo="EH7982908",
idType="PP",
idValidDt="",
paxIDType=""
}
},
paxType = ""
});
return list;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace TicketSpider.Uitls
{
public class HttpClientHelper
{
private static HttpClientHelper httpClientHelper = null;
private HttpClient httpClient;
/// <summary>
/// 构造方法私有,用于单例
/// </summary>
private HttpClientHelper() { }
/// <summary>
/// 获取当前类的实例
/// </summary>
/// <returns></returns>
public static HttpClientHelper GetInstance()
{
if (httpClientHelper != null)
{
return httpClientHelper;
}
else
{
HttpClientHelper httpClientHelper = new HttpClientHelper();
//取消使用默认的Cookies
HttpClientHandler handler = new HttpClientHandler() { UseCookies = false };
httpClientHelper.httpClient = new HttpClient(handler);
return httpClientHelper;
}
}
/// <summary>
/// Get方法请求
/// </summary>
/// <param name="url">请求地址</param>
/// <returns></returns>
public HttpResponseMessage Get(string url, List<KeyValuePair<string, string>> headers = null)
{
HttpRequestMessage request = new HttpRequestMessage()
{
RequestUri = new Uri(url),
Method = HttpMethod.Get,
};
if (headers != null && headers.Count > 0)
{
request.Headers.Clear();
foreach (var header in headers)
{
request.Headers.Add(header.Key, header.Value);
}
}
HttpResponseMessage response = httpClient.SendAsync(request).Result;
return response;
}
/// <summary>
/// Get方法请求
/// </summary>
/// <param name="url">请求地址</param>
/// <returns></returns>
public async Task<(HttpResponseMessage response, CookieContainer cookies)> GetAsync(string url, List<KeyValuePair<string, string>> headers = null)
{
var handler = new HttpClientHandler();
var cookieContainer = new CookieContainer();
handler.CookieContainer = cookieContainer;
HttpRequestMessage request = new HttpRequestMessage()
{
RequestUri = new Uri(url),
Method = HttpMethod.Get,
};
if (headers != null && headers.Count > 0)
{
request.Headers.Clear();
foreach (var header in headers)
{
request.Headers.Add(header.Key, header.Value);
}
}
var response = await httpClient.SendAsync(request);
return (response,cookieContainer);
}
/// <summary>
/// Post方法请求 application/x-www-form-urlencoded格式
/// </summary>
/// <param name="url">请求地址</param>
/// <param name="paramList">参数集合</param>
/// <returns></returns>
public HttpResponseMessage Post(string url, List<KeyValuePair<String, String>> paramList, List<KeyValuePair<string, string>> headers = null)
{
FormUrlEncodedContent formUrlEncodedContent = new FormUrlEncodedContent(paramList);
if (headers != null && headers.Count > 0)
{
formUrlEncodedContent.Headers.Clear();
foreach (var header in headers)
{
formUrlEncodedContent.Headers.Add(header.Key, header.Value);
}
}
HttpResponseMessage response = httpClient.PostAsync(new Uri(url), formUrlEncodedContent).Result;
return response;
}
public async Task<HttpResponseMessage> PostAsync(string url, List<KeyValuePair<String, String>> paramList, List<KeyValuePair<string, string>> headers = null)
{
FormUrlEncodedContent formUrlEncodedContent = new FormUrlEncodedContent(paramList);
if (headers != null && headers.Count > 0)
{
formUrlEncodedContent.Headers.Clear();
foreach (var header in headers)
{
formUrlEncodedContent.Headers.Add(header.Key, header.Value);
}
}
return await httpClient.PostAsync(new Uri(url), formUrlEncodedContent);
}
/// <summary>
/// Post方法请求 raw data
/// </summary>
/// <param name="url">请求地址</param>
/// <param name="content">raw data</param>
/// <returns></returns>
public HttpResponseMessage Post(string url, string content, List<KeyValuePair<string, string>> headers = null)
{
StringContent stringContent = new StringContent(content, Encoding.UTF8);
if (headers != null && headers.Count > 0)
{
stringContent.Headers.Clear();
foreach (var header in headers)
{
stringContent.Headers.Add(header.Key, header.Value);
}
}
HttpResponseMessage response = httpClient.PostAsync(new Uri(url), stringContent).Result;
return response;
}
/// <summary>
/// Post方法请求 raw data
/// </summary>
/// <param name="url">请求地址</param>
/// <param name="content">raw data</param>
/// <returns></returns>
public async Task<HttpResponseMessage> PostAsync(string url, string content, List<KeyValuePair<string, string>> headers = null)
{
StringContent stringContent = new StringContent(content, Encoding.UTF8,"");
if (headers != null && headers.Count > 0)
{
stringContent.Headers.Clear();
foreach (var header in headers)
{
stringContent.Headers.Add(header.Key, header.Value);
}
}
return await httpClient.PostAsync(new Uri(url), stringContent);
}
/// <summary>
/// 释放httpclient
/// </summary>
public void Release()
{
httpClient.Dispose();
}
/// <summary>
/// 设置默认请求头
/// </summary>
/// <param name="name"></param>
/// <param name="value"></param>
public void SetDefaultHeaders(string name, string value)
{
httpClient.DefaultRequestHeaders.Add(name, value);
}
/// <summary>
/// 删除默认请求头
/// </summary>
/// <param name="name"></param>
public void RemoveDefaultHeaders(string name)
{
httpClient.DefaultRequestHeaders.Remove(name);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace TicketSpider.Uitls
{
public class TaskHelper
{
public static CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
private static TaskHelper taskHelper=null;
private static object taskHelperLock = new object();
private static object ticketLock = new object();
//public event Action CancelEvent;
private static bool TICKET_EXSITS = false;
public bool UpdateTicketStatus()
{
lock (ticketLock)
{
if (!TICKET_EXSITS)
{
TICKET_EXSITS = true;
return true;
}
else return false;
}
}
public void UnLockOrderStatus()
{
TICKET_EXSITS = false;
}
public static TaskHelper GetInstance()
{
if (taskHelper == null)
{
lock (taskHelperLock)
{
if (taskHelper == null) taskHelper = new TaskHelper();
}
}
return taskHelper;
}
public void FinishTask()
{
cancelTokenSource.Cancel();
}
public void WatchCancel()
{
while (!cancelTokenSource.IsCancellationRequested)
{
Thread.Sleep(1000);
}
Console.WriteLine("警卫:所有线程立即停止");
//CancelEvent?.Invoke();
}
}
}
using OpenQA.Selenium.Remote;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TicketSpider.Uitls
{
public class WebSiteHtmlLoader : IDisposable
{
private readonly RemoteWebDriver _remoteWebDriver;
public WebSiteHtmlLoader(RemoteWebDriver remoteWebDriver)
{
if (remoteWebDriver == null) throw new ArgumentNullException("remoteWebDriver");
_remoteWebDriver = remoteWebDriver;
}
public string GetRenderedHtml(Uri webSiteUri)
{
if (webSiteUri == null) throw new ArgumentNullException("webSiteUri");
_remoteWebDriver.Navigate().GoToUrl(webSiteUri);
return _remoteWebDriver.PageSource;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (disposing)
{
if (_remoteWebDriver != null)
{
_remoteWebDriver.Quit();
}
}
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment