com3d2_world.ts 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import html, { HTMLElement } from "node-html-parser";
  2. import request from "request-promise-native";
  3. import { Response } from "request";
  4. import { INewsItem, IAggregator } from "./aggregator";
  5. import { getRepository } from "typeorm";
  6. import { AggroNewsItem } from "../../entity/AggroNewsItem";
  7. const kissDiaryRoot = "https://com3d2.world/r18/notices.php";
  8. const FEED_NAME = "com3d2-world-notices";
  9. async function aggregate() {
  10. let repo = getRepository(AggroNewsItem);
  11. let lastPost = await repo.findOne({
  12. select: [ "newsId" ],
  13. where: { feedName: FEED_NAME },
  14. order: { newsId: "DESC" }
  15. });
  16. try {
  17. let mainPageRes = await request(kissDiaryRoot, {resolveWithFullResponse: true}) as Response;
  18. if(mainPageRes.statusCode != 200)
  19. return [];
  20. let rootNode = html.parse(mainPageRes.body, {
  21. pre: true,
  22. script: false,
  23. style: false
  24. });
  25. if(!(rootNode instanceof HTMLElement))
  26. return;
  27. let diaryEntries = rootNode.querySelectorAll("div.frame a");
  28. if(!diaryEntries) {
  29. console.log("[COM3D2 WORLD BLOG] Failed to find listing!");
  30. }
  31. let result : INewsItem[] = [];
  32. let latestEntry = lastPost.newsId;
  33. for(let a of diaryEntries) {
  34. if(!a.rawAttributes.id)
  35. continue;
  36. let id = +a.rawAttributes.id;
  37. if(id <= lastPost.newsId)
  38. continue;
  39. if(id > latestEntry)
  40. latestEntry = id;
  41. let diaryLink = `${kissDiaryRoot}?no=${id}`;
  42. let res = await request(diaryLink, {resolveWithFullResponse: true}) as Response;
  43. if(res.statusCode != 200)
  44. continue;
  45. let node = html.parse(res.body, {
  46. pre: true,
  47. script: false,
  48. style: false
  49. });
  50. if(!(node instanceof HTMLElement))
  51. continue;
  52. let title = node.querySelector("div.frame div.notice_title th");
  53. let contents = node.querySelectorAll("div.frame div")[1];
  54. result.push({
  55. newsId: id,
  56. feedId: FEED_NAME,
  57. link: diaryLink,
  58. title: title.text,
  59. author: "com3d2.world",
  60. contents: contents.outerHTML,
  61. embedColor: 0xa39869
  62. });
  63. }
  64. return result;
  65. } catch(err) {
  66. return [];
  67. }
  68. }
  69. export default {
  70. aggregate: aggregate
  71. } as IAggregator;