index.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. const request = require("request").defaults({ jar: true });
  2. const cheerio = require("cheerio");
  3. const fs = require("fs");
  4. const spoxurl = "http://asd.spox.spoj.pl:81";
  5. const loginurl = spoxurl + "/account/login/";
  6. const lessonsurl = spoxurl + "/LO1516/units/";
  7. const username = "nick";
  8. const password = "password";
  9. function getToken() {
  10. return new Promise((done, reject) => {
  11. let data = "";
  12. let crfToken = "";
  13. request.get(spoxurl).on("response", res => {
  14. crfToken = res.headers["set-cookie"][0]
  15. .split(";")
  16. .shift()
  17. .split("=")
  18. .pop();
  19. done(crfToken);
  20. }); //.on("data", deltaData => {
  21. // data += deltaData;
  22. // }).on("end", ()=>{
  23. // console.log(data);
  24. // });
  25. });
  26. }
  27. function login(token) {
  28. return new Promise((resolve, reject) => {
  29. request
  30. .post(loginurl)
  31. .form({
  32. username: username,
  33. password: password,
  34. csrfmiddlewaretoken: token,
  35. next: ""
  36. })
  37. .on("response", response => {
  38. resolve();
  39. });
  40. });
  41. }
  42. function fetchLessons() {
  43. return new Promise((resolve, reject) => {
  44. let body = "";
  45. request
  46. .get(lessonsurl)
  47. .on("data", bodyDelta => {
  48. body += bodyDelta;
  49. })
  50. .on("end", () => {
  51. let $ = cheerio.load(body);
  52. let units = $(".section-body > div.edit-section-link");
  53. fs.writeFile("temp.html", body, () => {});
  54. console.log(units.length);
  55. let temp = [];
  56. units.each((i, el) => {
  57. let a = $(el).find("a");
  58. // console.log(a.attr("href"), a.text());
  59. temp.push({
  60. link: a.attr("href"),
  61. title: a.text()
  62. });
  63. });
  64. // units.forEach((el) => {
  65. // console.log(el.attr("href"));
  66. // });
  67. resolve(temp);
  68. });
  69. });
  70. }
  71. function predownload(link) {
  72. return new Promise((resolve, reject) => {
  73. let body = "";
  74. console.log(spoxurl + link + "/");
  75. request
  76. .get(spoxurl + link + "/")
  77. .on("data", delta => (body += delta))
  78. .on("end", () => {
  79. let $ = cheerio.load(body);
  80. let link = $("table a").attr("href");
  81. console.log(link);
  82. resolve(link);
  83. });
  84. });
  85. }
  86. function download(link) {
  87. return new Promise((resolve, reject) => {
  88. if (!link) {
  89. resolve();
  90. return;
  91. }
  92. let body = "";
  93. request
  94. .get(spoxurl + link)
  95. .on("data", delta => (body += delta))
  96. .on("end", () => {
  97. let $ = cheerio.load(body);
  98. let problembody = $("div.section-body.problem-body").text();
  99. let code = $("textarea#id_source").val();
  100. let title = $("section header h1")
  101. .text()
  102. .toLocaleLowerCase()
  103. .replace(/ /g, "_");
  104. if (!fs.existsSync("./output/" + title)) {
  105. fs.mkdirSync("./output/" + title);
  106. }
  107. fs.writeFile(
  108. "./output/" + title + "/problem.txt",
  109. problembody,
  110. () => {}
  111. );
  112. fs.writeFile("./output/" + title + "/code.c", code, () => {});
  113. fs.writeFile("./output/" + title + "/raw.html", body, () => {});
  114. resolve();
  115. });
  116. });
  117. }
  118. getToken()
  119. .then(login)
  120. .then(fetchLessons)
  121. .then(arr => {
  122. let all = [];
  123. arr.forEach(o => {
  124. all.push(predownload(o.link).then(download));
  125. });
  126. Promise.all(all);
  127. })
  128. .catch(error => {
  129. console.log(error);
  130. });