api_lido4d copy.dart.bak 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. //import 'package:html';
  2. import 'dart:convert';
  3. import 'dart:developer';
  4. import 'package:flutter/foundation.dart';
  5. import 'package:intl/intl.dart';
  6. class ApiLido4d {
  7. //static const url = "https://tar.lido.aero";
  8. static const url =
  9. kIsWeb ? "https://proxy.fares.cyou" : "https://tar.lido.aero";
  10. //static const url = "https://proxy.fares.cyou";
  11. static const realurl = "https://tar.lido.aero";
  12. ApiLido4d({this.username = "", this.password = ""});
  13. bool get logged => cookieMap.isNotEmpty;
  14. String username;
  15. String password;
  16. String get cookie =>
  17. "${cookieMap.keys.fold("", (t, e) => (t == "") ? "$e=${cookieMap[e]}" : "$t; $e=${cookieMap[e]}")};SameSite=None; Secure";
  18. Map cookieMap = {};
  19. Map get headers => {
  20. "Accept": "application/vnd.lsy.lido.lcb.v1.hal+json",
  21. "Accept-Encoding": "gzip, deflate, br",
  22. "Accept-Language": "en",
  23. "Connection": "keep-alive",
  24. "Content-Type": "application/json;charset=UTF-8",
  25. //"Host": Uri.parse(realurl).host,
  26. "Origin": Uri.parse(realurl).host,
  27. //"sec-ch-ua":'" Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101"',
  28. // "sec-ch-ua-mobile": "?0",
  29. // "sec-ch-ua-platform": "Windows",
  30. // "Sec-Fetch-Dest": "empty",
  31. // "Sec-Fetch-Mode": "cors",
  32. // "Sec-Fetch-Site": "same-origin",
  33. "User-Agent":
  34. 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36',
  35. "X-lido-applicationId": "lido-lcb",
  36. "X-lido-clientId": "lido-lcb-web",
  37. "X-lido-customerId": "TAR",
  38. "X-lido-operatingAirline": "",
  39. "X-lido-timeStamp": DateTime.now().toUtc().toIso8601String(),
  40. "X-lido-traceId": "0c497133-2a92-45a0-8ffe-a03c77852201",
  41. "cookie": "SERVERID=docker2; ${cookie}",
  42. "X-lido-csrf": cookieMap["lido_csrf"] ?? "",
  43. };
  44. Future logout() async {
  45. var response = await post(Uri.parse('${url}USR/actionLogout.jsp'),
  46. body: {"Cookie": cookie});
  47. }
  48. Future login() async {
  49. try {
  50. var response = await get(
  51. Uri.parse(
  52. '$url/lido/las/login.jsp?DESMON_RESULT_PAGE=$realurl/briefing//'),
  53. );
  54. cookieMap.addAll(_getcookies(response.headers["set-cookie"] ??
  55. response.headers["_set-cookie"] ??
  56. ""));
  57. //print(response.headers);
  58. response = await post(
  59. Uri.parse('$url/lido/las/dwr/call/plaincall/LoginBean.login.dwr'),
  60. body: {
  61. "callCount": "1",
  62. "windowName": "DWR-5F9BFD0ECADDCF42109A9C1099F4B49B",
  63. "c0-scriptName": "LoginBean",
  64. "c0-methodName": "login",
  65. "c0-id": "0",
  66. "c0-param0": "boolean:false",
  67. "c0-param1": "boolean:false",
  68. "c0-param2": "string:$username",
  69. "c0-param3": "string:$password",
  70. "c0-param4": "string:",
  71. "c0-param5": "string:LIDO",
  72. "c0-param6": "string:en",
  73. "batchId": "1",
  74. "page":
  75. "/lido/las/login.jsp?DESMON_RESULT_PAGE=$realurl/briefing&DESMON_CODE=LAS_002&DESMON_LANG=en",
  76. "httpSessionId": "",
  77. "scriptSessionId": "C63C650BEED5A9D544876B2756E3ECF0"
  78. },
  79. headers: {});
  80. cookieMap.addAll(_getcookies(response.headers["set-cookie"] ?? ""));
  81. //log("$username $password ${response.statusCode} ${response.body}");
  82. final message = RegExp(r'(?<=errorMessage2:")(.+)(?=",)')
  83. .firstMatch(response.body)
  84. ?.group(0) ??
  85. RegExp(r'(?<=errorMessage1:")(.+)(?=",)')
  86. .firstMatch(response.body)
  87. ?.group(0);
  88. final changepass = RegExp(r'(?<=forcePasswdChange:)(.+)(?=,)')
  89. .firstMatch(response.body)
  90. ?.group(0) ==
  91. "true";
  92. cookieMap = (message != null) ? {} : cookieMap;
  93. log("api lido 4d login $username $password ${response.statusCode} logged:$logged msg:${message}");
  94. return {
  95. 'error': logged ? null : message,
  96. 'data': {"logged": logged},
  97. 'meta': {
  98. "changepass": changepass,
  99. "user": username,
  100. "pass": password,
  101. "cookie": cookieMap
  102. }
  103. };
  104. } catch (e) {
  105. return {
  106. 'error': e.toString(),
  107. 'data': {"logged": false},
  108. 'meta': {"user": username, "pass": password, "cookie": null}
  109. };
  110. }
  111. }
  112. Future list(
  113. {String date = "",
  114. String dep = "",
  115. String des = "",
  116. String al = "",
  117. String fnum = ""}) async {
  118. try {
  119. final startdate = (date == "")
  120. ? DateTime.now()
  121. .subtract(const Duration(hours: 36))
  122. .toUtc()
  123. .millisecondsSinceEpoch
  124. : DateTime.parse(date).millisecondsSinceEpoch;
  125. final endate = startdate + (1000 * 60 * 60 * 36);
  126. var response = await get(
  127. Uri.parse(
  128. "$url/lido/lcb/ui/flights?page=0&size=100&startDateTime=1653148128544&endDateTime=1653191328544")
  129. .replace(queryParameters: {
  130. "page": "0",
  131. "size": "1000",
  132. "startDateTime": startdate.toString(),
  133. "endDateTime": endate.toString(),
  134. ...(al != "" ? {"commAirLine": al} : {}),
  135. ...(fnum != "" ? {"flightNumber": fnum} : {}),
  136. ...(dep != "" ? {"departure": dep} : {}),
  137. ...(des != "" ? {"destination": des} : {}),
  138. }),
  139. headers: {"X-lido-businessId": "SearchFlights", ...headers});
  140. //log(response.headers.toString());
  141. Map decodedresponse;
  142. // print("${response.body}");
  143. try {
  144. decodedresponse = json.decode(response.body) ?? {};
  145. } catch (e) {
  146. decodedresponse = {
  147. "body": response.body,
  148. "response": response.statusCode
  149. };
  150. }
  151. String? message = decodedresponse["errorsAndWarnings"]?["warnings"]?[0]
  152. ?["message"] ??
  153. decodedresponse["errorsAndWarnings"]?["errors"]?[0]?["message"] ??
  154. ((response.statusCode == 200) ? null : "ERR");
  155. /*
  156. print(((decodedresponse["totalElements"] ?? 0) > 0
  157. ? decodedresponse["content"].fold([], (t, e) {
  158. t.add(e["leg"]);
  159. return t;
  160. })
  161. : []));
  162. */
  163. return {
  164. 'error': message,
  165. 'data': (message == null) ? decodedresponse["content"] : null,
  166. 'meta': {
  167. "legs": (decodedresponse["totalElements"] ?? 0) > 0
  168. ? decodedresponse["content"].fold([], (t, e) {
  169. t.add(e["leg"]["legidentifier"]);
  170. return t;
  171. })
  172. : [],
  173. "user": username,
  174. "pass": password,
  175. "nb": decodedresponse["totalElements"] ?? 0,
  176. "cookie": cookieMap
  177. }
  178. };
  179. } catch (e) {
  180. return {'error': e.toString(), 'data': {}, 'meta': {}};
  181. }
  182. }
  183. Future ofp(
  184. {String al = "",
  185. String fnum = "",
  186. String date = "",
  187. String origin = "",
  188. String dep = '',
  189. String des = ''}) async {
  190. try {
  191. final dateoforigin =
  192. DateTime.parse("${(origin == "") ? date : origin}T00:00:00Z")
  193. .millisecondsSinceEpoch;
  194. String brieflink = "";
  195. String legid = "";
  196. if (origin == "") {
  197. final res = await list(
  198. date: date != "" ? date : origin,
  199. al: al,
  200. fnum: fnum,
  201. dep: dep,
  202. des: des);
  203. if (res["error"] != null) {
  204. return res;
  205. } else if (res["data"]?[0]?["_links"]?["self"]?["href"] != null) {
  206. //(res["data"]?[0]?["_links"]?["self"]?["href"] ?? "").toString());
  207. brieflink = res["data"]?[0]?["_links"]?["self"]?["href"];
  208. legid = res["data"]?[0]?["leg"]?["legidentifier"];
  209. } else {
  210. // no link found
  211. return {
  212. 'error': "Can't find the requested OFP.",
  213. 'data': res["data"],
  214. 'meta': {"user": username, "pass": password, "cookie": cookieMap}
  215. };
  216. }
  217. } else {
  218. legid =
  219. '$al.$fnum.${DateFormat("ddLLLy").format(DateTime.fromMillisecondsSinceEpoch(dateoforigin))}.$dep.$des.';
  220. brieflink = "$url/lido/lcb/ui/$legid/briefing";
  221. }
  222. var response = await put(Uri.parse(brieflink),
  223. headers: {
  224. "X-lido-businessId": 'SearchBP',
  225. ...headers,
  226. },
  227. //body: json.encode(({"commercialAirline": al,"flightNumber": fnum,"operationalSuffix": "","date": dateoforigin.toString()
  228. body: json.encode(({
  229. "categories": [
  230. "APLI",
  231. "APTDXML",
  232. "SOFP",
  233. "CDA",
  234. "RADAR",
  235. "OFPDLK",
  236. "ATSXML",
  237. "REGWXXML",
  238. "WXSIGWX",
  239. "SIGWXROUTE",
  240. "VAATCA",
  241. "ASPDXML",
  242. "NOTAMXML",
  243. "OTS",
  244. "SFC",
  245. "WINDDATA",
  246. "RAIMXML",
  247. "ARPTWXXML",
  248. "SOFPINFO",
  249. "IWFRXML",
  250. "OFPNLXML",
  251. "VERTPROF",
  252. "SOFPSUM",
  253. "RAIM",
  254. "UAD",
  255. "DISMAP",
  256. "WXSATWX"
  257. ],
  258. })));
  259. //log(response.body);
  260. Map decodedresponse;
  261. try {
  262. decodedresponse = (json.decode(response.body) ?? {});
  263. } catch (e) {
  264. decodedresponse = {};
  265. }
  266. String? message = decodedresponse["errorsAndWarnings"]?["warnings"]?[0]
  267. ?["message"] ??
  268. decodedresponse["errorsAndWarnings"]?["errors"]?[0]?["message"] ??
  269. ((response.statusCode == 201) ? null : "ERR");
  270. return {
  271. 'error': (message == null) ? null : message,
  272. 'data': decodedresponse,
  273. 'meta': {
  274. "user": username,
  275. "pass": password,
  276. "cookie": cookieMap,
  277. "legid": legid
  278. }
  279. };
  280. } catch (e) {
  281. return {'error': e.toString(), 'data': {}, 'meta': {}};
  282. }
  283. }
  284. Future ofppdf(
  285. {String al = "",
  286. String fnum = "",
  287. String date = "",
  288. String origin = "",
  289. String dep = '',
  290. String des = ''}) async {
  291. try {
  292. final dateoforigin =
  293. DateTime.parse("${(origin == "") ? date : origin}T00:00:00Z")
  294. .millisecondsSinceEpoch;
  295. String legid = "";
  296. if (origin == "") {
  297. final res = await list(
  298. date: date != "" ? date : origin,
  299. al: al,
  300. fnum: fnum,
  301. dep: dep,
  302. des: des);
  303. if (res["error"] != null) {
  304. log("lido4d: ofps listed, ${res["error"]}");
  305. return res;
  306. } else if (res["data"]?[0]?["_links"]?["self"]?["href"] != null) {
  307. legid = res["data"]?[0]?["leg"]?["legidentifier"];
  308. } else {
  309. log("lido4d: no link found");
  310. // no link found
  311. return {
  312. 'error': "Can't find the requested OFP.",
  313. 'data': res["data"],
  314. 'meta': {"user": username, "pass": password, "cookie": cookieMap}
  315. };
  316. }
  317. } else {
  318. legid =
  319. '$al.$fnum.${DateFormat("ddLLLy").format(DateTime.fromMillisecondsSinceEpoch(dateoforigin))}.$dep.$des.';
  320. }
  321. var response = await put(
  322. Uri.parse("$url/lido/lcb/ui/briefing/multi/print?force=true"),
  323. headers: {
  324. "Accept":
  325. "application/vnd.lsy.lido.lcb.v1.hal+json,application/pdf",
  326. //"Accept-Encoding": "gzip, deflate, br",
  327. "Accept-Language": "en",
  328. "Connection": "keep-alive",
  329. "Content-Type": "application/json;charset=UTF-8",
  330. "Cookie": cookie,
  331. //"host": Uri.parse(realurl).host,
  332. "Origin": Uri.parse(realurl).host,
  333. // "sec-ch-ua":'" Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101"',
  334. "User-Agent":
  335. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36",
  336. "X-lido-applicationId": "lido-lcb",
  337. "X-lido-businessId": "printBP",
  338. "X-lido-clientId": "lido-lcb-web",
  339. "X-lido-csrf": cookieMap["lido_csrf"],
  340. "X-lido-customerId": "TAR",
  341. "X-lido-operatingAirline": "TU",
  342. "X-lido-timeStamp": "2022-05-25T06:29:56.659Z",
  343. "X-lido-traceId": "3cbab7e0-56ca-49ec-b158-8899c0d3bbbb",
  344. },
  345. body: json.encode({
  346. "legIdentifiers": [legid],
  347. "categories": [
  348. "OFP",
  349. "ATS",
  350. "CREWINFO",
  351. "DISP",
  352. "IWFR",
  353. "NOTAM",
  354. "UAD",
  355. "WXSIGWX",
  356. "VERTPROF",
  357. "RAIM",
  358. "DMS",
  359. "WXNOTAM",
  360. "ABD",
  361. "SIGWXROUTE",
  362. //"WXSATWX"
  363. ],
  364. "merge": false,
  365. "quickprint": false,
  366. "weatherDataRequired": false,
  367. }));
  368. Map decodedresponse;
  369. try {
  370. //decodedresponse = (json.decode(response.body) ?? {});
  371. decodedresponse = {};
  372. } catch (e) {
  373. decodedresponse = {};
  374. }
  375. String? message = decodedresponse["errorsAndWarnings"]?["warnings"]?[0]
  376. ?["message"] ??
  377. decodedresponse["errorsAndWarnings"]?["errors"]?[0]?["message"] ??
  378. ((response.statusCode == 201) ? null : "ERR");
  379. //log("xx ${response.headers}");
  380. //final id ="${DateFormat("yyyyMMdd").format(DateTime.fromMillisecondsSinceEpoch(dateoforigin))}_${dep}_${des}_$al$fnum";
  381. final id = Lido4dService.filename(
  382. al: al, fnum: fnum, dep: dep, des: des, origin: origin, date: date);
  383. var filepdf =
  384. await Io.getFile(response, filename: "$id.pdf", folder: "ofps");
  385. return {
  386. 'error': (message == null) ? null : message,
  387. 'data': (message == null)
  388. ? {"file": filepdf["location"], "bytes": filepdf["bytes"], "id": id}
  389. : null,
  390. 'meta': {"user": username, "pass": password, "cookie": cookieMap}
  391. };
  392. } catch (e) {
  393. return {'error': e.toString(), 'data': {}, 'meta': {}};
  394. }
  395. }
  396. Map<String, String> _getcookies(String cookiesData,
  397. {List<String> vars = const [
  398. "lido_auth",
  399. "lido_csrf",
  400. "JSESSIONID",
  401. "SERVERID"
  402. ]}) {
  403. Map<String, String> cookies = {};
  404. for (var title in vars) {
  405. if (cookiesData.contains(title)) {
  406. List at =
  407. (RegExp(r'(' + title + ')(.*?)[^;]+').stringMatch(cookiesData) ??
  408. "")
  409. .split('=');
  410. cookies[title] = at[1];
  411. }
  412. }
  413. return cookies;
  414. }
  415. }