index.js 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. const express = require('express');
  2. const app = express();
  3. const http = require('http');
  4. const server = http.createServer(app);
  5. const path = require('path');
  6. const { Server } = require("socket.io");
  7. const io = new Server(server);
  8. const { Readable } = require('stream');
  9. const { parse } = require('node-html-parser');
  10. const names = new Map();
  11. const getName = async (category = "Informatica") => {
  12. const altre = ['Anarchici+italiani', 'Informatica', 'Distretti+dell%27Irlanda+del+Nord+soppressi']
  13. const page = await fetch("https://it.wikipedia.org/wiki/Speciale:CasualeInCategoria", {
  14. "credentials": "include",
  15. "headers": {
  16. "User-Agent": "hacklabbo.indivia.net/hackordiye22 crawler",
  17. "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
  18. "Accept-Language": "en-US,en;q=0.5",
  19. "Content-Type": "application/x-www-form-urlencoded",
  20. "Upgrade-Insecure-Requests": "1",
  21. "Sec-Fetch-Dest": "document",
  22. "Sec-Fetch-Mode": "navigate",
  23. "Sec-Fetch-Site": "same-origin",
  24. "Sec-Fetch-User": "?1"
  25. },
  26. "referrer": "https://it.wikipedia.org/wiki/Speciale:CasualeInCategoria",
  27. "body": `title=Speciale%3ACasualeInCategoria&wpcategory=${category}&wpEditToken=%2B%5C&redirectparams=`,
  28. "method": "POST",
  29. "mode": "cors"
  30. });
  31. const pageText = await page.text();
  32. const name = parse(pageText)
  33. .querySelector('title')
  34. .textContent
  35. .split(' - ')[0]
  36. .toLowerCase()
  37. .split(' ')
  38. .join('-')
  39. // remove parentheses
  40. .replaceAll('(', '')
  41. .replaceAll(')', '');
  42. const link = parse(pageText)
  43. .querySelector('link[rel="canonical"]')
  44. .getAttribute('href');
  45. if (name.includes("categoria")) {
  46. return getName(altre[2]);
  47. }
  48. return { name, link };
  49. }
  50. app.get('/', (req, res) => {
  51. res.sendFile(path.join(__dirname, 'public', 'index.html'));
  52. });
  53. app.get('/waiting', (req, res) => {
  54. res.sendStatus(418);
  55. });
  56. app.get('/image', (req, res) => {
  57. res.sendFile(path.join(__dirname, 'public', 'title.png'));
  58. });
  59. io.on('connection', async (socket) => {
  60. const { name: nameForUser, link } = await getName();
  61. names.set(socket.id, nameForUser);
  62. // Emit username and chat message
  63. socket.emit('username', `${nameForUser}@@@${link}`);
  64. socket.emit('chat message', `Ciao ${nameForUser}!`);
  65. console.info(`${nameForUser} connected`);
  66. socket.on('chat message', (msg) => {
  67. const chatMessage = `${nameForUser}: ${msg}`;
  68. console.log(`${chatMessage}`);
  69. io.emit('chat message', `${nameForUser}: ${msg}`);
  70. });
  71. socket.on('disconnect', () => {
  72. console.info(`${nameForUser} disconnected`);
  73. });
  74. });
  75. server.listen(3000, () => {
  76. console.log('listening on *:3000');
  77. });