Advertisement
CompaqZeus

Untitled

Feb 22nd, 2019
14,961
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.82 KB | None | 0 0
  1. const axios = require("axios");
  2. const qs = require("qs");
  3. const Fortnite = require("fortnite-api");
  4. const EndPoints = require("./tools/endpoints");
  5. const Stats = require("./tools/stats");
  6.  
  7. let fortniteAPI = new Fortnite(
  8. [
  9. "EMAIL_ACCOUNT",
  10. "PASSWORD",
  11. "MzQ0NmNkNzI2OTRjNGE0NDg1ZDgxYjc3YWRiYjIxNDE6OTIwOWQ0YTVlMjVhNDU3ZmI5YjA3NDg5ZDMxM2I0MWE=",
  12. "ZWM2ODRiOGM2ODdmNDc5ZmFkZWEzY2IyYWQ4M2Y1YzY6ZTFmMzFjMjExZjI4NDEzMTg2MjYyZDM3YTEzZmM4NGQ="
  13. ]
  14. );
  15.  
  16. fortniteAPI.login().then(() => {
  17.  
  18.  
  19. class FortniteApi {
  20. constructor(credentials) {
  21. if (
  22. credentials &&
  23. credentials.constructor === Array &&
  24. credentials.length == 4
  25. ) {
  26. this.credentials = credentials;
  27. this.SOLO = "_p2";
  28. this.DUO = "_p10";
  29. this.SQUAD = "_p9";
  30. } else {
  31. throw new Error(
  32. "Please give credentials [Email, Password, Client Launcher Token, Client Fortnite Token] (see ReadMe.md)"
  33. );
  34. }
  35. }
  36.  
  37. //Check Token Validity (Executed every 5 seconds)
  38. checkToken() {
  39. let actualDate = new Date();
  40. let expireDate = new Date(new Date(this.expires_at).getTime() - 15 * 60000);
  41. if (this.access_token && this.expires_at && expireDate < actualDate) {
  42. this.expires_at = undefined;
  43. //Refresh Token
  44. this.refreshToken();
  45. }
  46. }
  47.  
  48. //Force Refresh Token to Epic Games
  49. refreshToken() {
  50. axios({
  51. url: EndPoints.OAUTH_TOKEN,
  52. headers: {
  53. Authorization: "basic " + this.credentials[3]
  54. },
  55. data: qs.stringify({
  56. grant_type: "refresh_token",
  57. refresh_token: this.refresh_token,
  58. includePerms: true
  59. }),
  60. method: "POST",
  61. responseType: "json"
  62. })
  63. .then((data) => {
  64. this.expires_at = data.expires_at;
  65. this.access_token = data.access_token;
  66. this.refresh_token = data.refresh_token;
  67. this.account_id = data.account_id;
  68. })
  69. .catch(() => {
  70. throw new Error("Error: Fatal Error Impossible to Renew Token");
  71. });
  72. }
  73.  
  74. //Login to Epic Games API
  75. login() {
  76. return new Promise((resolve, reject) => {
  77. axios({
  78. url: EndPoints.OAUTH_TOKEN,
  79. headers: {
  80. "Authorization": "basic " + this.credentials[2],
  81. "Content-Type": "application/x-www-form-urlencoded"
  82. },
  83. data: qs.stringify({
  84. grant_type: "password",
  85. username: this.credentials[0],
  86. password: this.credentials[1],
  87. includePerms: true
  88. }),
  89. method: "POST",
  90. responseType: "json",
  91. })
  92. .then(res => {
  93. this.access_token = res.data.access_token;
  94. axios({
  95. url: EndPoints.OAUTH_EXCHANGE,
  96. headers: {
  97. Authorization: "bearer " + this.access_token
  98. },
  99. method: "GET",
  100. responseType: "json"
  101. })
  102. .then(res => {
  103. this.code = res.data.code;
  104. axios({
  105. url: EndPoints.OAUTH_TOKEN,
  106. headers: {
  107. Authorization: "basic " + this.credentials[3]
  108. },
  109. data: qs.stringify({
  110. grant_type: "exchange_code",
  111. exchange_code: this.code,
  112. includePerms: true,
  113. token_type: "eg1"
  114. }),
  115. method: "POST",
  116. responseType: "json"
  117. })
  118. .then(res => {
  119. this.expires_at = res.data.expires_at;
  120. this.access_token = res.data.access_token;
  121. this.refresh_token = res.data.refresh_token;
  122. this.account_id = res.data.account_id;
  123. this.intervalCheckToken = setInterval(() => {
  124. this.checkToken();
  125. }, 1000);
  126. resolve(this.expires_at);
  127. })
  128. .catch(err => {
  129. reject({
  130. message: "Please enter good credentials (Fortnite Client Token)",
  131. err
  132. });
  133. });
  134. })
  135. .catch(err => {
  136. reject({
  137. message: "Something wrong is happened, please try again.",
  138. err
  139. });
  140. });
  141. })
  142. .catch(err => {
  143. reject({
  144. message: "Please enter good credentials (Login/Username/Launcher Token)",
  145. err
  146. });
  147. });
  148. });
  149. }
  150.  
  151. //Get User from Username
  152. lookup(username) {
  153. return new Promise((resolve, reject) => {
  154. axios({
  155. url: EndPoints.lookup(username),
  156. headers: {
  157. Authorization: "bearer " + this.access_token
  158. },
  159. method: "GET",
  160. responseType: "json"
  161. })
  162. .then(res => {
  163. resolve(res.data);
  164. })
  165. .catch(err => {
  166. reject({
  167. message: "Impossible to found this user",
  168. err
  169. });
  170. });
  171. });
  172. }
  173.  
  174. //Found User by Id
  175. lookupById(id) {
  176. return new Promise((resolve, reject) => {
  177. axios({
  178. url: EndPoints.displayNameFromId(id),
  179. headers: {
  180. Authorization: "bearer " + this.access_token
  181. },
  182. method: "GET",
  183. responseType: "json"
  184. })
  185. .then(res => {
  186. resolve(res.data);
  187. })
  188. .catch(err => {
  189. reject({
  190. message: "Impossible to found this user",
  191. err
  192. });
  193. });
  194. });
  195. }
  196.  
  197. //Find User by authenticated User ID
  198. lookupMe() {
  199. return this.lookupById(this.account_id);
  200. }
  201.  
  202. //Check if Player exist on the platform
  203. checkPlayer(username, platform, timeWindow) {
  204. return new Promise((resolve, reject) => {
  205. if (!username || !platform) {
  206. reject({message: "Please precise username and platform"});
  207. return;
  208. }
  209.  
  210. if (!(platform == "pc" || platform == "ps4" || platform == "xb1")) {
  211. reject({message: "Please precise a good platform: ps4/xb1/pc"});
  212. return;
  213. }
  214.  
  215. this.lookup(username)
  216. .then(data => {
  217. axios({
  218. url: EndPoints.statsBR(data.id, timeWindow),
  219. headers: {
  220. Authorization: "bearer " + this.access_token
  221. },
  222. method: "GET",
  223. responseType: "json"
  224. })
  225. .then(res => {
  226. if (
  227. res.data &&
  228. Stats.checkPlatform(res.data, platform.toLowerCase() || "pc")
  229. ) {
  230. resolve(res.data);
  231. } else {
  232. reject({
  233. message: "Impossible to fetch User. User not found on this platform"
  234. });
  235. }
  236. })
  237. .catch((err) => {
  238. reject({
  239. message: "Impossible to found stats for this user.",
  240. err
  241. });
  242. });
  243. })
  244. .catch(() => {
  245. reject({
  246. message: "Player Not Found"
  247. });
  248. });
  249. });
  250. }
  251.  
  252. //Battle Royal Stats from Username
  253. getStatsBR(username, platform, timeWindow) {
  254. return new Promise((resolve, reject) => {
  255.  
  256. this.checkPlayer(username, platform, timeWindow)
  257. .then((statsdata) => {
  258. this.lookup(username)
  259. .then(lookupdata => {
  260. const resultStats = Stats.convert(
  261. statsdata,
  262. lookupdata,
  263. platform.toLowerCase()
  264. );
  265. resolve(resultStats);
  266. })
  267. .catch(() => {
  268. reject({
  269. message: "Player Not Found"
  270. });
  271. });
  272. })
  273. .catch((err) => {
  274. reject(err);
  275. });
  276. });
  277. }
  278.  
  279. //Battle Royal Stats from User ID
  280. getStatsBRFromID(id, platform, timeWindow) {
  281. return new Promise((resolve, reject) => {
  282. if (!id || !platform) {
  283. reject({
  284. message: "Please precise username and platform"
  285. });
  286. return;
  287. }
  288.  
  289. if (!(platform == "pc" || platform == "ps4" || platform == "xb1")) {
  290. reject({
  291. message: "Please precise a good platform: ps4/xb1/pc"
  292. });
  293. return;
  294. }
  295.  
  296. this.lookupById(id)
  297. .then(data => {
  298. axios({
  299. url: EndPoints.statsBR(data[0].id, timeWindow),
  300. headers: {
  301. Authorization: "bearer " + this.access_token
  302. },
  303. method: "GET",
  304. responseType: "json"
  305. }).then(res => {
  306. if (
  307. res.data &&
  308. Stats.checkPlatform(res.data, platform.toLowerCase() || "pc")
  309. ) {
  310. let resultStats = Stats.convert(
  311. res.data,
  312. data[0],
  313. platform.toLowerCase()
  314. );
  315. resolve(resultStats);
  316. } else {
  317. reject({
  318. message: "Impossible to fetch User. User not found on this platform"
  319. });
  320. }
  321. });
  322. })
  323. .catch(err => {
  324. reject({
  325. message: "Player Not Found",
  326. err
  327. });
  328. });
  329. });
  330. }
  331.  
  332. //Battle Royale Stats from authenticated User ID
  333. getMyStatsBR(platform, timeWindow) {
  334. return this.getStatsBRFromID(this.account_id, platform, timeWindow);
  335. }
  336.  
  337. //Get Fortnite Ingame News
  338. getFortniteNews(lang = "") {
  339. return new Promise((resolve, reject) => {
  340. let headers = {};
  341. switch (lang.toLowerCase()) {
  342. case "fr": // French
  343. headers["Accept-Language"] = "fr";
  344. break;
  345. case "de": // Deutsch
  346. headers["Accept-Language"] = "de";
  347. break;
  348. case "es": // Spanish
  349. headers["Accept-Language"] = "es";
  350. break;
  351. case "zh": // Chinese
  352. headers["Accept-Language"] = "zh";
  353. break;
  354. case "it": // Italian
  355. headers["Accept-Language"] = "it";
  356. break;
  357. case "ja": // Japanese
  358. headers["Accept-Language"] = "ja";
  359. break;
  360. case "en": // English
  361. headers["Accept-Language"] = "en";
  362. break;
  363. default: // Default: English
  364. headers["Accept-Language"] = "en";
  365. }
  366.  
  367. axios({
  368. url: EndPoints.FortniteNews,
  369. method: "GET",
  370. headers: headers,
  371. responseType: "json"
  372. })
  373. .then(({data}) => {
  374. resolve({
  375. common: data.athenamessage.overrideablemessage.message ||
  376. data.athenamessage.overrideablemessage.messages,
  377. subgame: {
  378. battleRoyale: data.subgameselectdata.battleRoyale.message ||
  379. data.subgameselectdata.battleRoyale.messages,
  380. creative: data.subgameselectdata.creative.message ||
  381. data.subgameselectdata.creative.messages,
  382. saveTheWorld: data.subgameselectdata.saveTheWorld.message ||
  383. data.subgameselectdata.saveTheWorld.messages,
  384. saveTheWorldUnowned: data.subgameselectdata.saveTheWorldUnowned.message ||
  385. data.subgameselectdata.saveTheWorldUnowned.messages,
  386. },
  387. br: data.battleroyalenews.news.message ||
  388. data.battleroyalenews.news.messages,
  389. battlepass: data.battlepassaboutmessages.news.message ||
  390. data.battlepassaboutmessages.news.messages,
  391. stw: data.savetheworldnews.news.message ||
  392. data.savetheworldnews.news.messages,
  393. loginmessage: data.loginmessage.loginmessage.message ||
  394. data.loginmessage.loginmessage.messages,
  395. survivalmessage: data.survivalmessage.overrideablemessage.message ||
  396. data.survivalmessage.overrideablemessage.messages,
  397. tournamentinformation: data.tournamentinformation.tournament_info.tournament ||
  398. data.tournamentinformation.tournament_info.tournaments,
  399. emergencynotice: data.emergencynotice.news.message ||
  400. data.emergencynotice.news.messages
  401. });
  402. })
  403. .catch((err) => {
  404. reject({
  405. message: "Impossible to fetch fortnite data",
  406. err
  407. });
  408. });
  409. });
  410. }
  411.  
  412. //Get Fortnite Server Status
  413. checkFortniteStatus() {
  414. return new Promise((resolve, reject) => {
  415. axios({
  416. url: EndPoints.FortniteStatus,
  417. method: "GET",
  418. headers: {
  419. Authorization: "bearer " + this.access_token
  420. },
  421. responseType: "json"
  422. })
  423. .then(({data}) => {
  424. if (data && data[0] && data[0].status && data[0].status == "UP") {
  425. resolve(true);
  426. } else {
  427. resolve(false);
  428. }
  429. })
  430. .catch(() => {
  431. reject({
  432. message: "Impossible to fetch fortnite data"
  433. });
  434. });
  435. });
  436. }
  437.  
  438. //Get Fortnite PVE Info
  439. getFortnitePVEInfo(lang = "") {
  440. return new Promise((resolve, reject) => {
  441. let headers = {};
  442. switch (lang.toLowerCase()) {
  443. case "fr": // French
  444. headers["X-EpicGames-Language"] = "fr-FR";
  445. break;
  446. case "en": // English
  447. headers["X-EpicGames-Language"] = "en";
  448. break;
  449. default: // Default English
  450. headers["X-EpicGames-Language"] = "en";
  451. }
  452.  
  453. headers["Authorization"] = "bearer " + this.access_token;
  454.  
  455. axios({
  456. url: EndPoints.FortnitePVEInfo,
  457. method: "GET",
  458. headers: headers,
  459. responseType: "json"
  460. })
  461. .then(res => {
  462. resolve(res.data);
  463. })
  464. .catch(err => {
  465. reject({
  466. message: "Impossible to fetch Fortnite PVE data !",
  467. err
  468. });
  469. });
  470. });
  471. }
  472.  
  473. //Get Store Data
  474. getStore(lang = "") {
  475. return new Promise((resolve, reject) => {
  476. let headers = {};
  477. switch (lang.toLowerCase()) {
  478. case "fr": // French
  479. headers["X-EpicGames-Language"] = "fr";
  480. break;
  481. case "de": // Deutsch
  482. headers["X-EpicGames-Language"] = "de";
  483. break;
  484. case "es": // Spanish
  485. headers["X-EpicGames-Language"] = "es";
  486. break;
  487. case "it": // Italian
  488. headers["X-EpicGames-Language"] = "it";
  489. break;
  490. case "en": // English
  491. headers["X-EpicGames-Language"] = "en";
  492. break;
  493. default: // Default English
  494. headers["X-EpicGames-Language"] = "en";
  495. }
  496.  
  497. headers["Authorization"] = "bearer " + this.access_token;
  498.  
  499. axios({
  500. url: EndPoints.FortniteStore,
  501. method: "GET",
  502. headers: headers,
  503. responseType: "json"
  504. })
  505. .then(data => {
  506. resolve(data);
  507. })
  508. .catch(err => {
  509. reject({
  510. message: "Impossible to fetch fortnite data !",
  511. err
  512. });
  513. });
  514. });
  515. }
  516.  
  517. //Get Leaderboard
  518. getScoreLeaderBoard(platform, type) {
  519. return new Promise((resolve, reject) => {
  520. if (!(platform == "pc" || platform == "ps4" || platform == "xb1")) {
  521. reject({
  522. message: "Please precise a good platform: ps4/xb1/pc"
  523. });
  524. return;
  525. }
  526.  
  527. if (
  528. !(
  529. type == this.SOLO ||
  530. type == this.DUO ||
  531. type == this.SQUAD
  532. )
  533. ) {
  534. reject({
  535. message: "Please precise a good type FortniteApi.SOLO/FortniteApi.DUO/FortniteApi.SQUAD"
  536. });
  537. return;
  538. }
  539.  
  540. axios({
  541. url: EndPoints.leaderBoardScore(platform, type),
  542. headers: {
  543. Authorization: "bearer " + this.access_token,
  544. "Content-Type": "application/json"
  545. },
  546. method: "POST",
  547. responseType: "json",
  548. })
  549. .then(({data}) => {
  550. let leaderboard = data;
  551. leaderboard = leaderboard.entries;
  552.  
  553. leaderboard.forEach(i => {
  554. i.accountId = i.accountId.replace(/-/g, "");
  555. });
  556.  
  557. axios({
  558. url: EndPoints.displayNameFromIds(leaderboard.map(i => i.accountId)),
  559. headers: {
  560. Authorization: "bearer " + this.access_token
  561. },
  562. method: "GET",
  563. responseType: "json"
  564. })
  565. .then(res => {
  566.  
  567. leaderboard.forEach(i => {
  568. const account = res.data.find(ii => ii.id === i.accountId);
  569. // for some reason not all the accounts are returned
  570. i.displayName = account ? account.displayName : "";
  571. });
  572. resolve(leaderboard);
  573. })
  574. .catch(err => {
  575. reject({
  576. message: "Impossible to get Accounts name Leaderboard",
  577. err
  578. });
  579. });
  580. })
  581. .catch(err => {
  582. reject({
  583. message: "Impossible to get Leaderboard Entries",
  584. err
  585. });
  586. });
  587. });
  588. }
  589.  
  590. //Kill Epic Games Session
  591. killSession() {
  592. return new Promise((resolve, reject) => {
  593. axios({
  594. url: EndPoints.killSession(this.access_token),
  595. headers: {
  596. Authorization: "bearer " + this.access_token
  597. },
  598. method: "DELETE",
  599. responseType: "json",
  600. body: {}
  601. })
  602. .then(() => {
  603. resolve({message: "Session Clean"});
  604. })
  605. .catch((err) => {
  606. reject({message: "Impossible to kill Epic Games Session", err});
  607. });
  608. });
  609. }
  610.  
  611. //Kill Fortnite API Instance
  612. kill() {
  613. return new Promise((resolve, reject) => {
  614. this.killSession()
  615. .then(() => {
  616. clearInterval(this.intervalCheckToken);
  617. resolve({message: "Api Closed"});
  618. })
  619. .catch(() => {
  620. reject({message: "Impossible to kill the API. Please Try Again !"});
  621. });
  622. });
  623. }
  624.  
  625. //Event Flags Infos
  626. eventFlags() {
  627. return new Promise((resolve, reject) => {
  628. let headers = {};
  629.  
  630. headers["Authorization"] = "bearer " + this.access_token;
  631.  
  632. axios({
  633. url: EndPoints.FortniteEventFlag,
  634. method: "GET",
  635. headers: headers,
  636. responseType: "json"
  637. })
  638. .then(res => {
  639. resolve(res.data);
  640. })
  641. .catch(err => {
  642. reject({
  643. message: "Impossible to fetch Fortnite PVE data !",
  644. err
  645. });
  646. });
  647. });
  648. }
  649. }
  650. });
  651. module.exports = FortniteApi;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement