kiss_diary.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import * as html 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 "@db/entity/AggroNewsItem";
  7. const urlPattern = /diary\.php\?no=(\d+)/i;
  8. const kissDiaryRoot = "http://www.kisskiss.tv/kiss";
  9. const FEED_NAME = "kisskisstv-diary";
  10. async function aggregate() {
  11. let repo = getRepository(AggroNewsItem);
  12. let lastPost = await repo.findOne({
  13. select: [ "newsId" ],
  14. where: { feedName: FEED_NAME },
  15. order: { newsId: "DESC" }
  16. });
  17. if(!lastPost)
  18. lastPost = repo.create({
  19. newsId: 0
  20. });
  21. try {
  22. let mainPageRes = await request(`${kissDiaryRoot}/diary.php`, {resolveWithFullResponse: true}) as Response;
  23. if(mainPageRes.statusCode != 200)
  24. return [];
  25. let rootNode = html.parse(mainPageRes.body, {
  26. pre: true,
  27. script: false,
  28. style: false
  29. });
  30. if(!(rootNode instanceof html.HTMLElement))
  31. return;
  32. let diaryEntries = rootNode.querySelectorAll("div.blog_frame_middle ul.disc li a");
  33. if(!diaryEntries) {
  34. console.log("[KISS DIARY] Failed to find listing!");
  35. }
  36. let result : INewsItem[] = [];
  37. let latestEntry = lastPost.newsId;
  38. for(let a of diaryEntries) {
  39. let matches = urlPattern.exec(a.rawAttributes.href);
  40. if(!matches)
  41. continue;
  42. let id = +matches[1];
  43. if(id <= lastPost.newsId)
  44. continue;
  45. if(id > latestEntry)
  46. latestEntry = id;
  47. let diaryLink = `${kissDiaryRoot}/${a.rawAttributes.href}`;
  48. let res = await request(diaryLink, {resolveWithFullResponse: true}) as Response;
  49. if(res.statusCode != 200)
  50. continue;
  51. let node = html.parse(res.body, {
  52. pre: true,
  53. script: false,
  54. style: false
  55. });
  56. if(!(node instanceof html.HTMLElement))
  57. continue;
  58. let title = node.querySelector("table.blog_frame_top tr td a");
  59. let contents = node.querySelector("div.blog_frame_middle");
  60. let bottomFrame = contents.querySelector("div.blog_data");
  61. if(bottomFrame) {
  62. let child = contents.childNodes[0];
  63. if(child instanceof html.HTMLElement)
  64. child.removeChild(bottomFrame);
  65. }
  66. result.push({
  67. newsId: id,
  68. feedId: FEED_NAME,
  69. link: diaryLink,
  70. title: title.text,
  71. author: "KISS BLOG",
  72. contents: contents.innerHTML,
  73. embedColor: 0xf4c100,
  74. needsTranslation: true
  75. });
  76. }
  77. return result;
  78. } catch(err) {
  79. return [];
  80. }
  81. }
  82. export default {
  83. aggregate: aggregate
  84. } as IAggregator;