Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
E
EduSpider
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
viitto
EduSpider
Commits
abf73c7e
Commit
abf73c7e
authored
Jun 07, 2022
by
黄奎
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
http://gitlab.oytour.com/viitto/eduspider
parents
62c03c5b
20c02f2f
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
0 additions
and
1179 deletions
+0
-1179
AccountManagerHelper.cs
EduSpider/Spiders/EasterLineRule/AccountManagerHelper.cs
+0
-293
CookiesHelper.cs
EduSpider/Spiders/EasterLineRule/CookiesHelper.cs
+0
-52
PassengerHelper.cs
EduSpider/Spiders/EasterLineRule/PassengerHelper.cs
+0
-155
QueryFlightHelper.cs
EduSpider/Spiders/EasterLineRule/QueryFlightHelper.cs
+0
-179
TicketOrderHelper.cs
EduSpider/Spiders/EasterLineRule/TicketOrderHelper.cs
+0
-500
No files found.
EduSpider/Spiders/EasterLineRule/AccountManagerHelper.cs
deleted
100644 → 0
View file @
62c03c5b
using
Newtonsoft.Json.Linq
;
using
OpenQA.Selenium
;
using
OpenQA.Selenium.Chrome
;
using
OpenQA.Selenium.Interactions
;
using
OpenQA.Selenium.Remote
;
using
System
;
using
System.Collections.Generic
;
using
System.Collections.ObjectModel
;
using
System.Drawing
;
using
System.Drawing.Imaging
;
using
System.IO
;
using
System.Linq
;
using
System.Net
;
using
System.Net.Http
;
using
System.Text
;
using
System.Threading
;
using
System.Threading.Tasks
;
namespace
TicketSpider.Spiders.EasterLineRule
{
public
class
AccountManagerHelper
{
private
static
object
lockerSafe
=
new
object
();
private
static
string
_loginCookies
=
null
;
private
static
bool
_openHeartTimer
=
false
;
public
static
string
_userId
=
String
.
Empty
;
public
static
string
GetInstance
()
{
if
(
_loginCookies
==
null
)
{
lock
(
lockerSafe
)
{
if
(
_loginCookies
==
null
)
{
_loginCookies
=
string
.
Empty
;
var
cnt
=
0
;
while
(
cnt
<
4
)
{
cnt
++;
var
result
=
RunAsync
();
if
(
result
&&
!
_openHeartTimer
)
{
_openHeartTimer
=
true
;
Task
.
Run
(()
=>
HeartLine
());
break
;
}
else
{
Console
.
WriteLine
(
"开始重新尝试登录"
);
Thread
.
Sleep
(
2000
);
}
}
}
}
}
return
_loginCookies
;
}
public
static
bool
RunAsync
()
{
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
);
try
{
driver
.
Navigate
().
GoToUrl
(
$"https://sso.ceair.com/login/?type=ffp&redirectUrl=https%3A%2F%2Fwww.ceair.com%2F&lang=zh_CN"
);
driver
.
Manage
().
Timeouts
().
PageLoad
=
TimeSpan
.
FromSeconds
(
15
);
inputEle
=
driver
.
FindElements
(
By
.
TagName
(
"input"
));
if
(
inputEle
!=
null
&&
inputEle
.
Count
>
0
)
{
inputEle
[
0
].
SendKeys
(
"17308037817"
);
inputEle
[
1
].
SendKeys
(
"36925814"
);
var
loginCount
=
0
;
//开始模拟登录
while
(
true
)
{
loginCount
++;
Console
.
WriteLine
(
$"正在进行第
{
loginCount
}
次模拟登录..."
);
var
login
=
BeginSliderLoginHandler
(
driver
);
if
(
login
.
IsCompleted
)
{
Console
.
WriteLine
(
$"操作完成,正在等待结果"
);
//睡眠1秒,等待跳转
Thread
.
Sleep
(
1
*
1000
);
if
(
driver
.
Url
.
Contains
(
"sso.ceair.com/login"
))
{
Console
.
WriteLine
(
$"模拟登录失败,准备重新执行..."
);
IWebElement
silderBoxEle
=
null
;
try
{
driver
.
FindElement
(
By
.
CssSelector
(
".geetest_popup_ghost"
));
}
catch
(
Exception
){}
if
(
silderBoxEle
!=
null
)
{
silderBoxEle
.
Click
();
}
if
(
loginCount
==
4
)
{
Console
.
WriteLine
(
"连续4次失败,请检查账号密码是否正确,系统执行完毕"
);
break
;
}
}
else
{
//处理
foreach
(
var
item
in
driver
.
Manage
().
Cookies
.
AllCookies
)
{
_loginCookies
+=
item
.
Name
+
"="
+
item
.
Value
+
";"
;
}
_loginCookies
=
_loginCookies
.
Substring
(
0
,
_loginCookies
.
Length
-
1
);
var
jscript
=
(
IJavaScriptExecutor
)
driver
;
var
userInfo
=
JObject
.
Parse
((
string
)
jscript
.
ExecuteScript
(
"return window.sessionStorage.getItem('user')"
));
_userId
=
userInfo
[
"userId"
].
ToString
();
flag
=
true
;
break
;
}
}
else
{
Console
.
WriteLine
(
"未知异常,程序退出"
);
break
;
}
}
}
}
catch
(
Exception
ex
)
{
Console
.
WriteLine
(
$"获取cooki失败,
{
ex
.
Message
}
"
);
}
driver
.
Quit
();
return
flag
;
}
public
static
Task
BeginSliderLoginHandler
(
IWebDriver
driver
)
{
var
buttonEle
=
driver
.
FindElement
(
By
.
CssSelector
(
".global-login-btn"
));
Thread
.
Sleep
(
1000
);
//开始登录
buttonEle
.
Click
();
//等待滑块加载
Thread
.
Sleep
(
2000
);
var
bgCanvas
=
driver
.
FindElement
(
By
.
CssSelector
(
".geetest_window"
));
((
IJavaScriptExecutor
)
driver
).
ExecuteScript
(
"document.querySelector(\".geetest_canvas_bg\").style.opacity = 1;document.querySelector(\".geetest_canvas_slice\").style.opacity = 0;"
);
var
bgPng
=
((
ITakesScreenshot
)
bgCanvas
).
GetScreenshot
();
var
dirpath
=
$"
{
Environment
.
CurrentDirectory
}
\\geetest"
;
if
(!
Directory
.
Exists
(
dirpath
))
{
Directory
.
CreateDirectory
(
dirpath
);
}
var
filePath
=
$"
{
dirpath
}
\\
{
DateTime
.
Now
.
Ticks
}
.png"
;
bgPng
.
SaveAsFile
(
filePath
,
ScreenshotImageFormat
.
Png
);
using
(
Bitmap
?
bitmap
=
(
Bitmap
)
Image
.
FromFile
(
filePath
))
{
var
grey
=
GetGrey
(
bitmap
)
/
10
*
3
;
var
bgX
=
GetBoundary
(
bitmap
,
grey
)
-
8
;
Console
.
WriteLine
(
$"读取背景缺口边界X坐标:
{
bgX
}
"
);
Actions
action
=
new
Actions
(
driver
);
var
sliderButton
=
driver
.
FindElement
(
By
.
CssSelector
(
".geetest_slider_button"
));
if
(
sliderButton
!=
null
)
{
((
IJavaScriptExecutor
)
driver
).
ExecuteScript
(
"document.querySelector(\".geetest_canvas_bg\").style.opacity = 1;document.querySelector(\".geetest_canvas_slice\").style.opacity = 1;"
);
action
.
ClickAndHold
(
sliderButton
).
Build
().
Perform
();
#
region
开始拟人移动
var
d1
=
Math
.
Round
(
bgX
*
0.8
);
var
d2
=
Math
.
Round
(
bgX
*
0.1
);
var
d3
=
Math
.
Round
(
bgX
*
0.1
);
action
.
MoveByOffset
((
int
)
d1
,
1
);
Thread
.
Sleep
(
new
Random
().
Next
(
100
)
+
150
);
action
.
MoveByOffset
((
int
)
d2
,
1
);
Thread
.
Sleep
(
new
Random
().
Next
(
100
)
+
150
);
action
.
MoveByOffset
((
int
)
d3
,
1
);
action
.
MoveByOffset
((
bgX
-
(
int
)
d1
-
(
int
)
d2
-
(
int
)
d3
),
1
);
Thread
.
Sleep
(
2000
);
#
endregion
action
.
Release
(
sliderButton
);
action
.
Build
().
Perform
();
Thread
.
Sleep
(
5000
);
}
}
File
.
Delete
(
filePath
);
return
Task
.
CompletedTask
;
}
private
static
int
GetGrey
(
Bitmap
bmpobj
)
{
var
rgb
=
0
;
for
(
int
i
=
0
;
i
<
bmpobj
.
Width
;
i
++)
{
for
(
int
j
=
0
;
j
<
bmpobj
.
Height
;
j
++)
{
var
currentColor
=
bmpobj
.
GetPixel
(
i
,
j
);
var
r
=
currentColor
.
R
+
currentColor
.
G
+
currentColor
.
B
;
rgb
+=
r
;
}
}
return
rgb
/
(
bmpobj
.
Width
*
bmpobj
.
Height
);
}
private
static
int
GetBoundary
(
Bitmap
bitmap
,
int
level
)
{
int
lastY
=
0
,
count
=
0
,
outBoundary
=
0
;
for
(
int
i
=
0
;
i
<
bitmap
.
Width
;
i
++)
{
for
(
int
j
=
0
;
j
<
bitmap
.
Height
;
j
++)
{
var
currentColor
=
bitmap
.
GetPixel
(
i
,
j
);
var
r
=
currentColor
.
R
+
currentColor
.
G
+
currentColor
.
B
;
if
(
r
<
level
&&
lastY
+
1
==
j
)
{
count
++;
}
else
{
count
=
0
;
}
lastY
=
j
;
if
(
count
>
6
)
{
outBoundary
=
i
;
break
;
}
}
if
(
outBoundary
>
0
)
{
break
;
}
}
return
outBoundary
;
}
private
static
void
HeartLine
()
{
while
(
_openHeartTimer
)
{
var
handler
=
new
HttpClientHandler
();
handler
.
AllowAutoRedirect
=
false
;
handler
.
UseCookies
=
true
;
handler
.
CookieContainer
=
CreateCookie
();
handler
.
AutomaticDecompression
=
DecompressionMethods
.
GZip
;
handler
.
ClientCertificateOptions
=
ClientCertificateOption
.
Automatic
;
var
http
=
new
HttpClient
(
handler
);
http
.
GetAsync
(
"https://www.ceair.com/"
);
//TODO:检查是否需要重新登录
Thread
.
Sleep
(
60
*
1000
);
}
}
public
static
void
StopHeartLine
()
{
_openHeartTimer
=
false
;
}
private
static
CookieContainer
CreateCookie
()
{
var
uri
=
new
Uri
(
"https://www.ceair.com"
);
var
cc
=
new
CookieContainer
();
foreach
(
var
str
in
_loginCookies
.
Split
(
';'
))
{
cc
.
SetCookies
(
uri
,
str
);
}
return
cc
;
}
}
}
EduSpider/Spiders/EasterLineRule/CookiesHelper.cs
deleted
100644 → 0
View file @
62c03c5b
using
OpenQA.Selenium
;
using
OpenQA.Selenium.Chrome
;
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Text
;
using
System.Threading.Tasks
;
namespace
TicketSpider.Spiders.EasterLineRule
{
public
class
CookiesHelper
{
/// <summary>
/// 获取初始化Cookies
/// </summary>
/// <returns></returns>
public
Task
<
string
>
GetInitCookie
()
{
var
cookieStr
=
string
.
Empty
;
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
);
try
{
var
param
=
"{\"travelType\":\"oneway\",\"passengerNum\":\"1,0,0\",\"depCity\":\"BKK\",\"arrCity\":\"SHA\",\"depValues\":\"BKK\",\"arrValues\":\"PVG, SHA\",\"depCityName\":\"曼谷\",\"arrCityName\":\"上海\",\"date\":\"2022-12-11\",\"cabinClass\":\"ALL\",\"payWay\":\"money\",\"depSelectValue\":\"BKK\",\"arrSelectValue\":\"PVG, SHA\",\"depLabel\":\"\",\"arrLabel\":\"\",\"isArrCity\":true,\"isDepCity\":true,\"arrCn\":\"CN\",\"depCn\":\"TH\",\"t\":"
+
DateTime
.
Now
.
Ticks
+
"}"
;
param
=
System
.
Web
.
HttpUtility
.
UrlEncode
(
param
);
param
=
Convert
.
ToBase64String
(
Encoding
.
UTF8
.
GetBytes
(
param
));
driver
.
Navigate
().
GoToUrl
(
$"https://www.ceair.com/shopping?searchKey=
{
param
}
ENCODEKEY"
);
foreach
(
var
item
in
driver
.
Manage
().
Cookies
.
AllCookies
)
{
cookieStr
+=
item
.
Name
+
"="
+
item
.
Value
+
";"
;
}
cookieStr
=
cookieStr
.
Substring
(
0
,
cookieStr
.
Length
-
1
);
}
catch
(
Exception
ex
)
{
Console
.
WriteLine
(
$"获取cooki失败,
{
ex
.
Message
}
"
);
}
driver
.
Quit
();
return
Task
.
FromResult
(
cookieStr
);
}
}
}
EduSpider/Spiders/EasterLineRule/PassengerHelper.cs
deleted
100644 → 0
View file @
62c03c5b
using
Newtonsoft.Json
;
using
Newtonsoft.Json.Linq
;
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Net
;
using
System.Net.Http
;
using
System.Text
;
using
System.Threading.Tasks
;
using
TicketSpider.Model
;
namespace
TicketSpider.Spiders.EasterLineRule
{
public
class
PassengerHelper
{
public
static
List
<
Passenger
>
GLOBAL_USERLIST
{
get
;
private
set
;
}
public
async
void
RegistPassengerHandler
()
{
GLOBAL_USERLIST
=
new
List
<
Passenger
>();
var
registResult
=
await
RegistPassenger
(
CmdHelper
.
PASSENGETS
);
var
passengersArray
=
await
IsHavePassenger
();
if
(
passengersArray
.
Any
())
{
var
passengers
=
passengersArray
.
ToObject
<
List
<
Passenger
>>();
CmdHelper
.
PASSENGETS
.
ForEach
(
user
=>
{
passengers
.
ToList
().
ForEach
(
x
=>
{
x
.
favorPaxIdDtoList
.
ForEach
(
y
=>
{
if
(
y
.
idType
==
user
.
favorPaxIdDtoList
.
First
().
idType
&&
y
.
idNo
==
user
.
favorPaxIdDtoList
.
First
().
idNo
)
{
y
.
idValidDt
=
user
.
favorPaxIdDtoList
[
0
].
idValidDt
;
GLOBAL_USERLIST
.
Add
(
x
);
}
});
});
});
if
(
GLOBAL_USERLIST
.
Any
())
{
Console
.
WriteLine
(
"完成乘客信息锁定"
);
}
else
{
Console
.
WriteLine
(
"警告:未能绑定乘客信息"
);
}
}
else
{
Console
.
WriteLine
(
"警告:未能绑定乘客信息"
);
}
}
private
async
Task
<
bool
>
RegistPassenger
(
List
<
Passenger
>
userList
)
{
JObject
passengers
=
new
JObject
();
passengers
.
Add
(
"paxs"
,
JArray
.
FromObject
(
userList
));
passengers
.
Add
(
"singleAlone"
,
false
);
passengers
.
Add
(
"deviceId"
,
""
);
var
paramster
=
JsonConvert
.
SerializeObject
(
passengers
);
var
request
=
CreateRequest
();
var
url
=
"https://www.ceair.com/portal/v3/customer/addPassenger"
;
var
content
=
new
StringContent
(
paramster
,
System
.
Text
.
Encoding
.
UTF8
,
"application/json"
);
var
response
=
await
request
.
PostAsync
(
url
,
content
);
var
result
=
response
.
Content
.
ReadAsStringAsync
().
Result
;
if
(
result
.
Contains
(
"A200"
)
||
result
.
Contains
(
"U200127"
))
{
return
true
;
}
return
false
;
}
private
async
Task
<
JArray
>
IsHavePassenger
()
{
var
request
=
CreateRequest
();
var
resloveResult
=
new
JArray
();
var
url
=
"https://www.ceair.com/portal/v3/customer/queryPassengerList"
;
var
content
=
new
StringContent
(
"{\"userId\": "
+
AccountManagerHelper
.
_userId
+
", \"deviceId\": \"\"}"
,
System
.
Text
.
Encoding
.
UTF8
,
"application/json"
);
var
response
=
await
request
.
PostAsync
(
url
,
content
);
var
result
=
response
.
Content
.
ReadAsStringAsync
().
Result
;
if
(
result
.
Contains
(
"U200"
))
{
try
{
resloveResult
=
JObject
.
Parse
(
result
)[
"resultContent"
]
as
JArray
;
}
catch
(
Exception
)
{
}
}
//if (resloveResult.Any())
//{
// Console.WriteLine($"获取乘客信息成功:{JsonConvert.SerializeObject(resloveResult)}");
//}
return
resloveResult
;
}
private
HttpClient
CreateRequest
()
{
var
handler
=
new
HttpClientHandler
();
handler
.
AllowAutoRedirect
=
false
;
handler
.
UseCookies
=
true
;
handler
.
CookieContainer
=
CreateCookie
(
AccountManagerHelper
.
GetInstance
());
handler
.
AutomaticDecompression
=
DecompressionMethods
.
GZip
;
handler
.
ClientCertificateOptions
=
ClientCertificateOption
.
Automatic
;
var
http
=
new
HttpClient
(
handler
);
CreateRequestHeaders
(
ref
http
);
return
http
;
}
private
CookieContainer
CreateCookie
(
string
cookieStr
)
{
var
uri
=
new
Uri
(
"https://www.ceair.com"
);
var
cc
=
new
CookieContainer
();
foreach
(
var
str
in
cookieStr
.
Split
(
';'
))
{
cc
.
SetCookies
(
uri
,
str
);
}
return
cc
;
}
private
void
CreateRequestHeaders
(
ref
HttpClient
http
)
{
var
random
=
new
Random
();
http
.
DefaultRequestHeaders
.
Add
(
"Accept"
,
"application/json, text/plain, */*"
);
http
.
DefaultRequestHeaders
.
Add
(
"Accept-Encoding"
,
"gzip, deflate, br"
);
http
.
DefaultRequestHeaders
.
Add
(
"Accept-Language"
,
"zh-CN,zh;q=0.9"
);
http
.
DefaultRequestHeaders
.
Add
(
"Cache-Control"
,
"no-cache"
);
//http.DefaultRequestHeaders.Add("Connection", "keep-alive");
//http.DefaultRequestHeaders.Add("Content-Length", "188");
//http.DefaultRequestHeaders.Add("Content-Type", new MediaTypeHeaderValue("application/json"));
//http.DefaultRequestHeaders.Add("Host", "m.ceair.com");
http
.
DefaultRequestHeaders
.
Add
(
"Origin"
,
"https://www.ceair.com"
);
http
.
DefaultRequestHeaders
.
Add
(
"Pragma"
,
"no-cache"
);
http
.
DefaultRequestHeaders
.
Add
(
"Referer"
,
"https://www.ceair.com/leftNavigation/personCenter/passengers"
);
//http.DefaultRequestHeaders.Add("salesChannel", "NzcwMQ==");
http
.
DefaultRequestHeaders
.
Add
(
"sec-ch-ua"
,
"\" Not; A Brand\";v=\"99\", \"Google Chrome\";v=\"97\", \"Chromium\";v=\"97\""
);
http
.
DefaultRequestHeaders
.
Add
(
"sec-ch-ua-mobile"
,
"?0"
);
http
.
DefaultRequestHeaders
.
Add
(
"sec-ch-ua-platform"
,
"\"Windows\""
);
http
.
DefaultRequestHeaders
.
Add
(
"Sec-Fetch-Dest"
,
"empty"
);
http
.
DefaultRequestHeaders
.
Add
(
"Sec-Fetch-Mode"
,
"cors"
);
http
.
DefaultRequestHeaders
.
Add
(
"Sec-Fetch-Site"
,
"same-origin"
);
http
.
DefaultRequestHeaders
.
Add
(
"User-Agent"
,
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"
);
http
.
DefaultRequestHeaders
.
Add
(
"x-tingyun-id"
,
$"DuR5xFLm8eI;r=
{
random
.
Next
(
100000000
,
999999999
)}
"
);
http
.
DefaultRequestHeaders
.
Add
(
"site"
,
"zh_CN"
);
http
.
DefaultRequestHeaders
.
Add
(
"shakehand"
,
"535206fb27efbaf75066ff179b975ff6"
);
http
.
DefaultRequestHeaders
.
Add
(
"pragma"
,
"no-cache"
);
}
}
}
EduSpider/Spiders/EasterLineRule/QueryFlightHelper.cs
deleted
100644 → 0
View file @
62c03c5b
using
Newtonsoft.Json
;
using
Newtonsoft.Json.Linq
;
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Net
;
using
System.Net.Http
;
using
System.Net.Http.Headers
;
using
System.Text
;
using
System.Threading
;
using
System.Threading.Tasks
;
namespace
TicketSpider.Spiders.EasterLineRule
{
public
class
QueryFlightHelper
{
private
static
decimal
REQUEST_QPS
=
2
;
private
static
int
INTERVAL_TIMER
=
1000
;
//public CookieContainer cookieContainer = new CookieContainer();
public
QueryFlightHelper
(
decimal
qps
=
2
)
{
REQUEST_QPS
=
qps
;
INTERVAL_TIMER
=
(
int
)(
1000
/
REQUEST_QPS
);
}
public
async
Task
<
JObject
>
RunAsync
(
string
date
)
{
var
timerCount
=
1
;
var
flightResult
=
new
JObject
();
var
cookieContainer
=
new
CookieContainer
();
CreateCookie
(
ref
cookieContainer
);
while
(!
TaskHelper
.
cancelTokenSource
.
IsCancellationRequested
)
{
Console
.
WriteLine
(
$"正在执行第
{
timerCount
}
次航班查询请求"
);
var
result
=
await
Action
(
date
,
cookieContainer
);
timerCount
++;
if
(
result
.
result
.
Contains
(
"S200"
))
{
var
resloveResult
=
new
JArray
();
try
{
resloveResult
=
JObject
.
Parse
(
result
.
result
)[
"data"
][
"flightItems"
]
as
JArray
;
var
realFlight
=
resloveResult
.
ToList
().
Where
(
x
=>
(
x
[
"cabinInfoDescs"
]
as
JArray
).
Any
());
if
(
realFlight
.
Any
())
{
resloveResult
=
JArray
.
FromObject
(
realFlight
);
}
else
{
resloveResult
.
Clear
();
}
}
catch
(
Exception
){}
if
(
resloveResult
.
Any
())
{
while
(!
TaskHelper
.
GetInstance
().
UpdateTicketStatus
()
&&
!
TaskHelper
.
cancelTokenSource
.
IsCancellationRequested
)
{
Console
.
WriteLine
(
"已获取到机票信息,排队中,等待其他线程释放"
);
Thread
.
Sleep
(
1000
);
}
if
(
TaskHelper
.
cancelTokenSource
.
IsCancellationRequested
)
break
;
flightResult
=
JObject
.
Parse
(
result
.
result
);
flightResult
[
"data"
][
"flightItems"
]
=
resloveResult
;
break
;
}
}
else
{
Console
.
WriteLine
(
"未找到机票"
);
//var newCookies = result.cookies.Split(';',StringSplitOptions.RemoveEmptyEntries);
//if (newCookies.Any())
//{
// var uri = new Uri("https://www.ceair.com");
// foreach (var cookie in newCookies)
// {
// var haveCookies = cookieContainer.GetAllCookies().Where(x => x.Name == cookie.Split("=")[0]);
// if (haveCookies.Any())
// {
// haveCookies.First().Value = cookie.Split("=")[1];
// }
// else
// {
// cookieContainer.SetCookies(uri, cookie);
// }
// }
//}
//TODO 切换代理
}
Thread
.
Sleep
(
INTERVAL_TIMER
);
}
//Console.WriteLine($"获取到航班数据");
return
flightResult
;
}
public
async
Task
<(
string
result
,
string
cookies
)>
Action
(
string
date
,
CookieContainer
cookieContainer
)
{
var
result
=
string
.
Empty
;
var
cookies
=
string
.
Empty
;
try
{
var
handler
=
new
HttpClientHandler
();
handler
.
AllowAutoRedirect
=
false
;
handler
.
UseCookies
=
true
;
handler
.
CookieContainer
=
cookieContainer
;
handler
.
AutomaticDecompression
=
DecompressionMethods
.
GZip
;
handler
.
ClientCertificateOptions
=
ClientCertificateOption
.
Automatic
;
var
http
=
new
HttpClient
(
handler
);
CreateRequestHeaders
(
ref
http
);
var
url
=
"https://www.ceair.com/portal/v3/shopping/briefInfo"
;
var
f
=
CmdHelper
.
FLIGHTS
.
FirstOrDefault
();
var
paramStr
=
$"
{{
\
"adultCount\":1,\"arrCityCode\":\"{f.arrCityCode}\",\"arrCode\":\"{f.arrCode}\",\"arrDate\":\"\",\"childCount\":0,\"depCityCode\":\"{f.depCityCode}\",\"depCode\":\"{f.depCode}\",\"depDate\":\"{date.Replace("
/
","
-
")}\",\"infantCount\":0,\"routeType\":\"OW\",\"onlyPlaneFlag\":false,\"cabinLevel\":\"\",\"deviceId\":\"\"}}"
;
var
content
=
new
StringContent
(
paramStr
,
System
.
Text
.
Encoding
.
UTF8
,
"application/json"
);
var
response
=
await
http
.
PostAsync
(
url
,
content
);
//var setCookies = response.Headers.GetValues("Set-Cookie");
//foreach (var item in setCookies)
//{
// cookies += item + ";";
//}
result
=
response
.
Content
.
ReadAsStringAsync
().
Result
;
}
catch
(
Exception
e
)
{
Console
.
WriteLine
(
$"查询航班发生异常,异常信息如下:
{
e
.
Message
}
"
);
}
//FlightDataHelper.TARGET_FLIGHT=resu
return
(
result
,
cookies
);
}
private
void
CreateCookie
(
ref
CookieContainer
cookieContainer
)
{
var
cookieStr
=
new
CookiesHelper
().
GetInitCookie
().
Result
;
var
uri
=
new
Uri
(
"https://www.ceair.com"
);
var
cc
=
new
CookieContainer
();
foreach
(
var
str
in
cookieStr
.
Split
(
';'
))
{
cc
.
SetCookies
(
uri
,
str
);
}
cookieContainer
=
cc
;
}
private
void
CreateRequestHeaders
(
ref
HttpClient
http
)
{
var
random
=
new
Random
();
http
.
DefaultRequestHeaders
.
Add
(
"Accept"
,
"application/json, text/plain, */*"
);
http
.
DefaultRequestHeaders
.
Add
(
"Accept-Encoding"
,
"gzip, deflate, br"
);
http
.
DefaultRequestHeaders
.
Add
(
"Accept-Language"
,
"zh-CN,zh;q=0.9"
);
http
.
DefaultRequestHeaders
.
Add
(
"Cache-Control"
,
"no-cache"
);
//http.DefaultRequestHeaders.Add("Connection", "keep-alive");
//http.DefaultRequestHeaders.Add("Content-Length", "188");
//http.DefaultRequestHeaders.Add("Content-Type", new MediaTypeHeaderValue("application/json"));
//http.DefaultRequestHeaders.Add("Host", "m.ceair.com");
http
.
DefaultRequestHeaders
.
Add
(
"Origin"
,
"https://www.ceair.com"
);
http
.
DefaultRequestHeaders
.
Add
(
"Pragma"
,
"no-cache"
);
http
.
DefaultRequestHeaders
.
Add
(
"Referer"
,
"https://www.ceair.com/shopping?searchKey=JTdCJTIydHJhdmVsVHlwZSUyMiUzQSUyMm9uZXdheSUyMiUyQyUyMnBhc3Nlbmdlck51bSUyMiUzQSUyMjElMkMwJTJDMCUyMiUyQyUyMmRlcENpdHklMjIlM0ElMjJCS0slMjIlMkMlMjJhcnJDaXR5JTIyJTNBJTIyU0hBJTIyJTJDJTIyZGVwVmFsdWVzJTIyJTNBJTIyQktLJTIyJTJDJTIyYXJyVmFsdWVzJTIyJTNBJTIyUFZHJTJDU0hBJTIyJTJDJTIyZGVwQ2l0eU5hbWUlMjIlM0ElMjIlRTYlOUIlQkMlRTglQjAlQjclMjIlMkMlMjJhcnJDaXR5TmFtZSUyMiUzQSUyMiVFNCVCOCU4QSVFNiVCNSVCNyUyMiUyQyUyMmRhdGUlMjIlM0ElMjIyMDIyLTEyLTExJTIyJTJDJTIyY2FiaW5DbGFzcyUyMiUzQSUyMkFMTCUyMiUyQyUyMnBheVdheSUyMiUzQSUyMm1vbmV5JTIyJTJDJTIyZGVwU2VsZWN0VmFsdWUlMjIlM0ElMjJCS0slMjIlMkMlMjJhcnJTZWxlY3RWYWx1ZSUyMiUzQSUyMlBWRyUyQ1NIQSUyMiUyQyUyMmRlcExhYmVsJTIyJTNBJTIyJTIyJTJDJTIyYXJyTGFiZWwlMjIlM0ElMjIlMjIlMkMlMjJpc0FyckNpdHklMjIlM0F0cnVlJTJDJTIyaXNEZXBDaXR5JTIyJTNBdHJ1ZSUyQyUyMmFyckNuJTIyJTNBJTIyQ04lMjIlMkMlMjJkZXBDbiUyMiUzQSUyMlRIJTIyJTJDJTIydCUyMiUzQTE2NTA4NzYwOTA5MjAlN0Q%3DENCODEKEY"
);
http
.
DefaultRequestHeaders
.
Add
(
"salesChannel"
,
"NzcwMQ=="
);
http
.
DefaultRequestHeaders
.
Add
(
"sec-ch-ua"
,
"\" Not; A Brand\";v=\"99\", \"Google Chrome\";v=\"97\", \"Chromium\";v=\"97\""
);
http
.
DefaultRequestHeaders
.
Add
(
"sec-ch-ua-mobile"
,
"?0"
);
http
.
DefaultRequestHeaders
.
Add
(
"sec-ch-ua-platform"
,
"\"Windows\""
);
http
.
DefaultRequestHeaders
.
Add
(
"Sec-Fetch-Dest"
,
"empty"
);
http
.
DefaultRequestHeaders
.
Add
(
"Sec-Fetch-Mode"
,
"cors"
);
http
.
DefaultRequestHeaders
.
Add
(
"Sec-Fetch-Site"
,
"same-origin"
);
http
.
DefaultRequestHeaders
.
Add
(
"User-Agent"
,
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"
);
http
.
DefaultRequestHeaders
.
Add
(
"site"
,
"zh_CN"
);
http
.
DefaultRequestHeaders
.
Add
(
"shakehand"
,
"535206fb27efbaf75066ff179b975ff6"
);
http
.
DefaultRequestHeaders
.
Add
(
"pragma"
,
"no-cache"
);
}
}
}
EduSpider/Spiders/EasterLineRule/TicketOrderHelper.cs
deleted
100644 → 0
View file @
62c03c5b
using
Newtonsoft.Json
;
using
Newtonsoft.Json.Linq
;
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Net
;
using
System.Net.Http
;
using
System.Text
;
using
System.Threading
;
using
System.Threading.Tasks
;
using
TicketSpider.Model
;
namespace
TicketSpider.Spiders.EasterLineRule
{
public
class
TicketOrderHelper
{
public
async
Task
<(
bool
result
,
JObject
order
)>
RunAsync
(
JObject
ticket
)
{
var
flag
=
true
;
var
passengers
=
PassengerHelper
.
GLOBAL_USERLIST
;
//此步骤直接使用登录后的cookies
FormatPassengers
(
ticket
,
ref
passengers
);
Console
.
WriteLine
(
"获取航班详情"
);
//var details = await GetSingleTicketDetailsAsync(ticket, passengers);
//Thread.Sleep(1000);
Console
.
WriteLine
(
"创建订单模板"
);
var
verifyFlight
=
new
JObject
();
var
verifyCount
=
3
;
while
(
verifyCount
>
0
)
{
verifyFlight
=
await
GetSingleTicketVerifyFlightInfoAsync
(
ticket
,
passengers
);
if
(
verifyFlight
.
ContainsKey
(
"cacheKey"
))
{
break
;
}
else
{
Console
.
WriteLine
(
"创建订单模板失败,准备重试"
);
if
(
verifyCount
==
1
)
{
flag
=
false
;
break
;
}
}
verifyCount
--;
Thread
.
Sleep
(
2000
);
}
if
(!
flag
)
return
(
false
,
new
JObject
());
Thread
.
Sleep
(
2000
);
Console
.
WriteLine
(
"获取联系人信息..."
);
var
concats
=
new
JArray
();
var
contactCnt
=
3
;
while
(
contactCnt
>
0
)
{
concats
=
await
GetListContactAsync
();
if
(
concats
.
Any
())
{
break
;
}
else
{
Console
.
WriteLine
(
"获取联系人信息,准备重试"
);
if
(
contactCnt
==
1
)
{
flag
=
false
;
break
;
}
}
contactCnt
--;
Thread
.
Sleep
(
1000
);
}
if
(!
flag
)
return
(
false
,
new
JObject
());
Thread
.
Sleep
(
1000
);
Console
.
WriteLine
(
"开始创建订单...."
);
var
order
=
new
JObject
();
var
orderCnt
=
3
;
while
(
orderCnt
>
0
)
{
order
=
await
CreateBookingAsync
(
ticket
,
passengers
,
concats
.
First
()
as
JObject
,
verifyFlight
[
"cacheKey"
].
ToString
());
if
(
order
.
ContainsKey
(
"resultCode"
))
{
break
;
}
else
{
Console
.
WriteLine
(
"创建订单失败,准备重试"
);
if
(
orderCnt
==
1
)
{
flag
=
false
;
break
;
}
}
orderCnt
--;
Thread
.
Sleep
(
1000
);
}
if
(!
flag
)
return
(
false
,
new
JObject
());
return
(
true
,
order
);
}
private
async
Task
<
JObject
>
CreateBookingAsync
(
JObject
ticket
,
List
<
Passenger
>
passengers
,
JObject
contact
,
string
tempOrderId
)
{
var
order
=
new
JObject
();
var
request
=
CreateRequest
();
var
url
=
"https://www.ceair.com/portal/v3/booking/"
;
#
region
组装参数
var
parameters
=
new
JObject
();
var
firstFlight
=
ticket
[
"data"
][
"flightItems"
][
0
];
var
flightSegment
=
firstFlight
[
"flightInfos"
][
0
][
"flightSegments"
][
0
];
var
cabin
=
firstFlight
[
"cabinInfoDescs"
][
0
];
var
sort
=
firstFlight
[
"flightInfos"
][
0
][
"flightSort"
];
parameters
.
Add
(
"calculateInfo"
,
null
);
parameters
.
Add
(
"channelType"
,
""
);
parameters
.
Add
(
"depDt"
,
$"
{
flightSegment
[
"fltDate"
].
ToString
()}
{
flightSegment
[
"orgTime"
].
ToString
()}
"
);
parameters
.
Add
(
"depDtCode"
,
flightSegment
[
"orgCode"
].
ToString
());
parameters
.
Add
(
"deviceId"
,
""
);
var
favorAddress
=
@"{
'docaAddressType': 'R',
'docaAddress': '',
'docaCity': '',
'docaNationCode': '',
'docaPostcode': '',
'docaState': ''
}"
;
parameters
.
Add
(
"favorAddress"
,
JObject
.
Parse
(
favorAddress
.
Replace
(
"'"
,
"\""
)));
var
favorContact
=
@
$"
{{
'
name
'
:
'
{
contact
[
"name"
].
ToString
()}
'
,
'
mobile
'
:
'
{
contact
[
"mobile"
].
ToString
()}
'
,
'
phoneCountry
'
:
'
86
'
}}
"
;
parameters
.
Add
(
"favorContact"
,
JObject
.
Parse
(
favorContact
.
Replace
(
"'"
,
"\""
)));
parameters
.
Add
(
"inter"
,
"T"
);
parameters
.
Add
(
"invoiceInfoList"
,
new
JArray
());
parameters
.
Add
(
"jfType"
,
""
);
parameters
.
Add
(
"orderDiscountDetail"
,
null
);
parameters
.
Add
(
"points"
,
false
);
parameters
.
Add
(
"seatInfo"
,
null
);
parameters
.
Add
(
"sxtCouponInfo"
,
null
);
parameters
.
Add
(
"tempOrderId"
,
tempOrderId
);
parameters
.
Add
(
"tripType"
,
"OW"
);
parameters
.
Add
(
"useCoupons"
,
null
);
parameters
.
Add
(
"userId"
,
AccountManagerHelper
.
_userId
);
parameters
.
Add
(
"xtypes"
,
new
JArray
());
var
favorPassengerList
=
new
JArray
();
var
docaAddress
=
new
JObject
();
docaAddress
.
Add
(
"addressD"
,
""
);
docaAddress
.
Add
(
"cityD"
,
""
);
docaAddress
.
Add
(
"countryD"
,
""
);
docaAddress
.
Add
(
"stateD"
,
""
);
docaAddress
.
Add
(
"zipD"
,
""
);
passengers
.
ForEach
(
x
=>
{
var
obj
=
new
JObject
();
obj
.
Add
(
"beneficiary"
,
false
);
obj
.
Add
(
"birthday"
,
x
.
birthday
);
obj
.
Add
(
"cardType"
,
""
);
obj
.
Add
(
"carrierName"
,
null
);
obj
.
Add
(
"cradle"
,
""
);
obj
.
Add
(
"docaAddress"
,
docaAddress
);
obj
.
Add
(
"email"
,
x
.
email
);
obj
.
Add
(
"gender"
,
x
.
gender
);
obj
.
Add
(
"idNo"
,
x
.
favorPaxIdDtoList
[
0
].
idNo
);
obj
.
Add
(
"idType"
,
"PP"
);
obj
.
Add
(
"member"
,
false
);
obj
.
Add
(
"mileageCard"
,
""
);
obj
.
Add
(
"name"
,
$"
{
x
.
paxNameFirst
}
/
{
x
.
paxNameLast
}
"
);
obj
.
Add
(
"natnCd"
,
"CN"
);
obj
.
Add
(
"passengerType"
,
x
.
paxType
);
obj
.
Add
(
"paxHolderFG"
,
"Y"
);
obj
.
Add
(
"paxIdDl"
,
DateTime
.
Now
.
AddYears
(
1
).
ToString
(
"yyyy-MM-dd"
));
obj
.
Add
(
"paxIdNatnCd"
,
"CN"
);
obj
.
Add
(
"phoneCountry"
,
"86"
);
obj
.
Add
(
"phoneNumber"
,
x
.
mobile
);
obj
.
Add
(
"secIdNo"
,
null
);
obj
.
Add
(
"secIdType"
,
""
);
favorPassengerList
.
Add
(
obj
);
});
parameters
.
Add
(
"favorPassengerList"
,
favorPassengerList
);
#
endregion
var
content
=
new
StringContent
(
JsonConvert
.
SerializeObject
(
parameters
),
System
.
Text
.
Encoding
.
UTF8
,
"application/json"
);
var
response
=
await
request
.
PostAsync
(
url
,
content
);
var
result
=
response
.
Content
.
ReadAsStringAsync
().
Result
;
if
(
result
.
Contains
(
"S200"
))
{
try
{
order
=
JObject
.
Parse
(
result
);
}
catch
(
Exception
)
{
}
}
return
order
;
}
private
string
FormatBrithday
(
string
brith
)
{
brith
=
brith
.
Insert
(
4
,
"-"
);
brith
=
brith
.
Insert
(
7
,
"-"
);
return
brith
;
}
private
void
FormatPassengers
(
JObject
ticket
,
ref
List
<
Passenger
>
passengers
)
{
var
firstFlight
=
ticket
[
"data"
][
"flightItems"
][
0
];
var
sort
=
firstFlight
[
"flightInfos"
][
0
][
"flightSort"
];
var
arrd
=
sort
[
"depDate"
].
ToString
();
passengers
.
ForEach
(
x
=>
{
x
.
birthday
=
FormatBrithday
(
x
.
birthday
);
var
age
=
CalculateAgeCorrect
(
x
.
birthday
,
arrd
);
if
(
age
>=
12
)
{
x
.
paxType
=
"ADT"
;
}
else
if
(
age
>=
2
)
{
x
.
paxType
=
"CHD"
;
}
else
{
x
.
paxType
=
"INF"
;
}
});
}
private
int
CalculateAgeCorrect
(
string
birth
,
string
arrd
)
{
DateTime
birthDate
,
now
;
birthDate
=
DateTime
.
Parse
(
birth
);
now
=
DateTime
.
Parse
(
arrd
);
int
age
=
now
.
Year
-
birthDate
.
Year
;
if
(
now
.
Month
<
birthDate
.
Month
||
(
now
.
Month
==
birthDate
.
Month
&&
now
.
Day
<
birthDate
.
Day
))
age
--;
return
age
;
}
private
async
Task
<
JObject
>
GetSingleTicketDetailsAsync
(
JObject
ticket
,
List
<
Passenger
>
passengers
)
{
var
ticketDetails
=
new
JObject
();
var
request
=
CreateRequest
();
var
url
=
"https://www.ceair.com/portal/v3/shopping/fareDetail"
;
#
region
组装参数
var
firstFlight
=
ticket
[
"data"
][
"flightItems"
][
0
];
var
flightSegment
=
firstFlight
[
"flightInfos"
][
0
][
"flightSegments"
][
0
];
var
cabin
=
firstFlight
[
"cabinInfoDescs"
][
0
];
var
sort
=
firstFlight
[
"flightInfos"
][
0
][
"flightSort"
];
var
paramerter
=
new
JObject
();
paramerter
.
Add
(
"airlineCode"
,
flightSegment
[
"airlineCode"
]);
paramerter
.
Add
(
"cabinCode"
,
cabin
[
"ccode"
].
ToString
());
paramerter
.
Add
(
"cabinLevel"
,
cabin
[
"fareLevel"
].
ToString
());
paramerter
.
Add
(
"cacheKey"
,
ticket
[
"cacheKey"
].
ToString
());
paramerter
.
Add
(
"currency"
,
"CNY"
);
paramerter
.
Add
(
"departDateTime"
,
$"
{
sort
[
"depDate"
].
ToString
()}
{
sort
[
"depTime"
].
ToString
()}
"
);
paramerter
.
Add
(
"deviceId"
,
""
);
paramerter
.
Add
(
"domesticOrInter"
,
firstFlight
[
"flightInfos"
][
0
][
"domesticOrInter"
]);
paramerter
.
Add
(
"flightFareIdList"
,
(
firstFlight
[
"flightInfos"
][
0
][
"flightFareIds"
]
as
JArray
));
paramerter
.
Add
(
"flightInfoIdList"
,
new
JArray
()
{
flightSegment
[
"flightInfoId"
]
});
paramerter
.
Add
(
"foldingFlag"
,
"1"
);
paramerter
.
Add
(
"ifReschedule"
,
"0"
);
string
intList
=
@
$"
[{{
'
itnIndex
':'
1
','
segInfos
'
:[{{
'
segIndex
'
:
1
,
'
oriEng
'
:
'
{
flightSegment
[
"orgCode"
].
ToString
()}
'
,
'
desEng
'
:
'
{
flightSegment
[
"destCode"
].
ToString
()}
'
,
'
fltDate
'
:
'
{
flightSegment
[
"fltDate"
].
ToString
()}
'
,
'
depTime
'
:
'
{
flightSegment
[
"orgTime"
].
ToString
()}
'
,
'
arrTime
'
:
'
{
flightSegment
[
"destTime"
].
ToString
()}
'
,
'
carrier
'
:
'
{
flightSegment
[
"carrierCode"
].
ToString
()}
'
,
'
carrier_o
'
:
'
{
flightSegment
[
"airlineCode"
].
ToString
()}
'
,
'
flightNo
'
:
'
{
flightSegment
[
"flightNo"
].
ToString
()}
'
,
'
diType
'
:
'
{
flightSegment
[
"domesticOrInter"
].
ToString
()}
'
,
'
classLevel
'
:
''
,
'
classCode
'
:
''
,
'
allCabins
'
:
'
{
flightSegment
[
"allCabins"
].
ToString
()}
'
,
'
planType
'
:
'
{
flightSegment
[
"planeType"
].
ToString
()}
'
}}]}}]
";
intList
=
intList
.
Replace
(
"'"
,
"\""
);
paramerter
.
Add
(
"itnList"
,
JArray
.
Parse
(
intList
));
paramerter
.
Add
(
"orgCode"
,
flightSegment
[
"orgCode"
].
ToString
());
int
[]
pg
=
new
int
[
3
]{
0
,
0
,
0
};
passengers
.
ForEach
(
x
=>
{
if
(
x
.
paxType
==
"CHD"
)
{
pg
[
1
]
=
pg
[
1
]
+
1
;
}
else
if
(
x
.
paxType
==
"INF"
)
{
pg
[
2
]
=
pg
[
2
]
+
1
;
}
else
{
pg
[
0
]
=
pg
[
0
]
+
1
;
}
});
paramerter
.
Add
(
"passengerCount"
,
string
.
Join
(
','
,
pg
));
paramerter
.
Add
(
"priceSource"
,
cabin
[
"fareInfoDescList"
][
0
][
"priceSource"
].
ToString
());
paramerter
.
Add
(
"productCode"
,
cabin
[
"fareInfoDescList"
][
0
][
"productCode"
].
ToString
());
paramerter
.
Add
(
"routeType"
,
"OW"
);
paramerter
.
Add
(
"segNum"
,
passengers
.
Count
);
paramerter
.
Add
(
"sequenceId"
,
flightSegment
[
"sequenceId"
].
ToString
());
#
endregion
var
content
=
new
StringContent
(
JsonConvert
.
SerializeObject
(
paramerter
),
System
.
Text
.
Encoding
.
UTF8
,
"application/json"
);
var
response
=
await
request
.
PostAsync
(
url
,
content
);
var
result
=
response
.
Content
.
ReadAsStringAsync
().
Result
;
if
(
result
.
Contains
(
"S200"
))
{
try
{
ticketDetails
=
JObject
.
Parse
(
result
)[
"data"
]
as
JObject
;
}
catch
(
Exception
)
{
}
}
return
ticketDetails
;
}
private
async
Task
<
JObject
>
GetSingleTicketVerifyFlightInfoAsync
(
JObject
ticket
,
List
<
Passenger
>
passengers
)
{
var
result
=
new
JObject
();
var
request
=
CreateRequest
();
var
url
=
"https://www.ceair.com/portal/v3/shopping/verifyFlightInfo"
;
#
region
组装参数
var
firstFlight
=
ticket
[
"data"
][
"flightItems"
][
0
];
var
flightSegment
=
firstFlight
[
"flightInfos"
][
0
][
"flightSegments"
][
0
];
var
cabin
=
firstFlight
[
"cabinInfoDescs"
][
0
];
var
sort
=
firstFlight
[
"flightInfos"
][
0
][
"flightSort"
];
var
paramerter
=
new
JObject
();
paramerter
.
Add
(
"cacheKey"
,
ticket
[
"cacheKey"
].
ToString
());
paramerter
.
Add
(
"checkFareSource"
,
cabin
[
"fareInfoDescList"
][
0
][
"priceSource"
].
ToString
());
paramerter
.
Add
(
"deviceId"
,
""
);
paramerter
.
Add
(
"fId"
,
ticket
[
"fId"
].
ToString
());
var
flightItems
=
@
$"[
{{
'
depCode
'
:
'
{
flightSegment
[
"orgCode"
].
ToString
()}
'
,
'
arrCode
'
:
'
{
flightSegment
[
"destCode"
].
ToString
()}
'
,
'
depDt
'
:
'
{
sort
[
"depDate"
].
ToString
()}
'
,
'
odType
'
:
0
,
'
index
'
:
1
,
'
flightInfoList
'
:
[
{{
'
depCode
'
:
'
{
flightSegment
[
"orgCode"
].
ToString
()}
'
,
'
arrCode
'
:
'
{
flightSegment
[
"destCode"
].
ToString
()}
'
,
'
depDt
'
:
'
{
sort
[
"depDate"
].
ToString
()}
'
,
'
carrierO
'
:
'
{
flightSegment
[
"carrierCode"
].
ToString
()}
'
,
'
flightNoO
'
:
'
{
flightSegment
[
"carrierNo"
].
ToString
()}
'
,
'
carrier
'
:
'
{
flightSegment
[
"airlineCode"
].
ToString
()}
'
,
'
flightNo
'
:
'
{
flightSegment
[
"flightNo"
].
ToString
()}
'
,
'
depTime
'
:
'
{
flightSegment
[
"orgTime"
].
ToString
()}
'
,
'
arriveTime
'
:
'
{
flightSegment
[
"destTime"
].
ToString
()}
'
,
'
arriveDate
'
:
'
{
flightSegment
[
"arriDate"
].
ToString
()}
'
,
'
sequenceId
'
:
'
{
flightSegment
[
"sequenceId"
].
ToString
()}
'
,
'
tripId
'
:
null
,
'
cabin
'
:
'
{
cabin
[
"ccode"
].
ToString
()}
'
,
'
pricePointId
'
:
null
}}
]
}}
]
";
flightItems
=
flightItems
.
Replace
(
"'"
,
"\""
);
paramerter
.
Add
(
"flightItems"
,
JArray
.
Parse
(
flightItems
));
paramerter
.
Add
(
"flightType"
,
flightSegment
[
"domesticOrInter"
].
ToString
());
paramerter
.
Add
(
"ifReschedule"
,
"0"
);
paramerter
.
Add
(
"originalRoute"
,
null
);
paramerter
.
Add
(
"routeType"
,
"OW"
);
paramerter
.
Add
(
"searchOneFlag"
,
false
);
paramerter
.
Add
(
"shoppingKey"
,
null
);
int
[]
pg
=
new
int
[
3
]
{
0
,
0
,
0
};
passengers
.
ForEach
(
x
=>
{
if
(
x
.
paxType
==
"CHD"
)
{
pg
[
1
]
=
pg
[
1
]
+
1
;
}
else
if
(
x
.
paxType
==
"INF"
)
{
pg
[
2
]
=
pg
[
2
]
+
1
;
}
else
{
pg
[
0
]
=
pg
[
0
]
+
1
;
}
});
var
preference
=
@
$"
{{
'
adtCount
'
:
{
pg
[
0
]},
'
chdCount
'
:
{
pg
[
1
]},
'
infCount
'
:
{
pg
[
2
]},
'
currencyCode
'
:
'
CNY
'
,
'
productCode
'
:
'
{
cabin
[
"fareInfoDescList"
][
0
][
"productCode"
].
ToString
()}
'
,
'
brandLevel
'
:
'
{
cabin
[
"fareInfoDescList"
][
0
][
"brandLevel"
].
ToString
()}
'
,
'
onlyPlaneFlag
'
:
false
}}
"
;
preference
=
preference
.
Replace
(
"'"
,
"\""
);
paramerter
.
Add
(
"preference"
,
JObject
.
Parse
(
preference
));
#
endregion
var
content
=
new
StringContent
(
JsonConvert
.
SerializeObject
(
paramerter
),
System
.
Text
.
Encoding
.
UTF8
,
"application/json"
);
var
response
=
await
request
.
PostAsync
(
url
,
content
);
var
resultStr
=
response
.
Content
.
ReadAsStringAsync
().
Result
;
if
(
resultStr
.
Contains
(
"S200"
))
{
try
{
result
=
JObject
.
Parse
(
resultStr
)[
"data"
]
as
JObject
;
}
catch
(
Exception
)
{
}
}
return
result
;
}
private
async
Task
<
JArray
>
GetListContactAsync
()
{
var
result
=
new
JArray
();
var
request
=
CreateRequest
();
var
url
=
"https://www.ceair.com/portal/v3/customer/listContact"
;
var
content
=
new
StringContent
(
"{\"deviceId\":\"\"}"
,
System
.
Text
.
Encoding
.
UTF8
,
"application/json"
);
var
response
=
await
request
.
PostAsync
(
url
,
content
);
var
resultStr
=
response
.
Content
.
ReadAsStringAsync
().
Result
;
if
(
resultStr
.
Contains
(
"U200"
))
{
try
{
result
=
JObject
.
Parse
(
resultStr
)[
"resultContent"
]
as
JArray
;
}
catch
(
Exception
)
{
}
}
return
result
;
}
private
HttpClient
CreateRequest
()
{
var
handler
=
new
HttpClientHandler
();
handler
.
AllowAutoRedirect
=
false
;
handler
.
UseCookies
=
true
;
handler
.
CookieContainer
=
CreateCookie
(
AccountManagerHelper
.
GetInstance
());
handler
.
AutomaticDecompression
=
DecompressionMethods
.
GZip
;
handler
.
ClientCertificateOptions
=
ClientCertificateOption
.
Automatic
;
var
http
=
new
HttpClient
(
handler
);
CreateRequestHeaders
(
ref
http
);
return
http
;
}
private
CookieContainer
CreateCookie
(
string
cookieStr
)
{
var
uri
=
new
Uri
(
"https://www.ceair.com"
);
var
cc
=
new
CookieContainer
();
foreach
(
var
str
in
cookieStr
.
Split
(
';'
))
{
cc
.
SetCookies
(
uri
,
str
);
}
return
cc
;
}
private
void
CreateRequestHeaders
(
ref
HttpClient
http
)
{
var
random
=
new
Random
();
http
.
DefaultRequestHeaders
.
Add
(
"Accept"
,
"application/json, text/plain, */*"
);
http
.
DefaultRequestHeaders
.
Add
(
"Accept-Encoding"
,
"gzip, deflate, br"
);
http
.
DefaultRequestHeaders
.
Add
(
"Accept-Language"
,
"zh-CN,zh;q=0.9"
);
http
.
DefaultRequestHeaders
.
Add
(
"Cache-Control"
,
"no-cache"
);
//http.DefaultRequestHeaders.Add("Connection", "keep-alive");
//http.DefaultRequestHeaders.Add("Content-Length", "188");
//http.DefaultRequestHeaders.Add("Content-Type", new MediaTypeHeaderValue("application/json"));
//http.DefaultRequestHeaders.Add("Host", "m.ceair.com");
http
.
DefaultRequestHeaders
.
Add
(
"Origin"
,
"https://www.ceair.com"
);
http
.
DefaultRequestHeaders
.
Add
(
"Pragma"
,
"no-cache"
);
http
.
DefaultRequestHeaders
.
Add
(
"Referer"
,
"https://www.ceair.com/leftNavigation/personCenter/passengers"
);
//http.DefaultRequestHeaders.Add("salesChannel", "NzcwMQ==");
http
.
DefaultRequestHeaders
.
Add
(
"sec-ch-ua"
,
"\" Not; A Brand\";v=\"99\", \"Google Chrome\";v=\"97\", \"Chromium\";v=\"97\""
);
http
.
DefaultRequestHeaders
.
Add
(
"sec-ch-ua-mobile"
,
"?0"
);
http
.
DefaultRequestHeaders
.
Add
(
"sec-ch-ua-platform"
,
"\"Windows\""
);
http
.
DefaultRequestHeaders
.
Add
(
"Sec-Fetch-Dest"
,
"empty"
);
http
.
DefaultRequestHeaders
.
Add
(
"Sec-Fetch-Mode"
,
"cors"
);
http
.
DefaultRequestHeaders
.
Add
(
"Sec-Fetch-Site"
,
"same-origin"
);
http
.
DefaultRequestHeaders
.
Add
(
"User-Agent"
,
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"
);
http
.
DefaultRequestHeaders
.
Add
(
"x-tingyun-id"
,
$"DuR5xFLm8eI;r=
{
random
.
Next
(
100000000
,
999999999
)}
"
);
http
.
DefaultRequestHeaders
.
Add
(
"site"
,
"zh_CN"
);
http
.
DefaultRequestHeaders
.
Add
(
"shakehand"
,
"535206fb27efbaf75066ff179b975ff6"
);
http
.
DefaultRequestHeaders
.
Add
(
"pragma"
,
"no-cache"
);
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment