handler.ts 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import type { Handler } from "aws-lambda";
  2. import { createRestAPIClient } from "masto";
  3. import "dotenv/config";
  4. import ScraperArticles from "../../utils/scraper-articles";
  5. import RedisClient from "../../libs/redis-client";
  6. import config from "../../config";
  7. import LogLevels from "../../enums/log-levels";
  8. import Emojis from "../../enums/emojis";
  9. export const handler: Handler = async (event, context) => {
  10. const name = "Interferencia";
  11. const baseDomain = "https://interferencia.cl"
  12. try {
  13. const redisClient = new RedisClient();
  14. const mastodon = createRestAPIClient({
  15. url: config.MASTODON_URL,
  16. accessToken: config.MASTODON_ACCESS_TOKEN
  17. });
  18. const scraperArticles = new ScraperArticles(name, {
  19. url: config.INTERFERENCIA,
  20. articlesSelector: "div.row.container:eq(6) div.row div.col-md-4, div.row.container:eq(6) div.row div.col-md-6, div.row.container:eq(6) div.row div.col-md-8",
  21. titleSelector: "div.views-field-title",
  22. contentSelector: "div.views-field-field-subhead div.field-content p",
  23. linkSelector: "div.views-field-title a",
  24. imageSelector: "",
  25. authorSelector: "div.views-field-field-cover-authors div.field-content",
  26. dateSelector: "div.views-field-created span.field-content"
  27. });
  28. const articles = await scraperArticles.getArticles();
  29. if (config.LOG_LEVEL === LogLevels.DEBUG) {
  30. console.log("Articles", articles);
  31. }
  32. let totalPublished = 0;
  33. const length = articles.length;
  34. // Order has to be reversed to appear in the correct order when posting
  35. for (let i = length - 1; i >= 0; i--) {
  36. const article = articles[i];
  37. const exists = await redisClient.retrieve(article.link);
  38. if (exists !== null) {
  39. continue;
  40. }
  41. const date = new Date(Date.now()).toLocaleDateString();
  42. let message = `${Emojis.NEWS} ${article.title}.\n\n${article.content}\n${baseDomain}${article.link}`;
  43. if (message.trim().length === 0) {
  44. continue;
  45. }
  46. if (message.length > 400) {
  47. message = `${Emojis.NEWS} ${article.title}.\n\n${article.content}`.substring(0, 397) + "...";
  48. message = `${message}\n${baseDomain}${article.link}`;
  49. }
  50. console.log("\nSending", message);
  51. await mastodon.v1.statuses.create({ status: message });
  52. await redisClient.store(article.link, date, { EX: 60 * 60 * 24 }); // EX: 24 hrs expiration
  53. totalPublished++
  54. }
  55. console.log(`Published ${totalPublished} new articles`);
  56. } catch (err: any) {
  57. console.log('An error has occurred\n')
  58. console.error(err.message);
  59. if (config.LOG_LEVEL === LogLevels.DEBUG) {
  60. console.debug("\nEvent\n");
  61. console.debug(event);
  62. console.debug("\nContext\n");
  63. console.debug(context);
  64. }
  65. }
  66. return "The End.";
  67. };