javascript - 如何从堆栈溢出中获取新问题的通知?

标签 javascript node.js reactjs react-native stackexchange-api

我想回答新的 javascript、react、react-native 和 Node 问题。那么,我如何了解用户在这些领域提出的新问题?

最佳答案

打开到 wss://qa.sockets.stackexchange.com/ 的 Websocket 连接,然后发送消息 1-questions-newest-tag-TAG 其中 TAG 是您要监视的标签。当发布新问题时,您将收到一条包含问题 ID 的消息。

问题数据需要单独检索(截至 SE 2021/2022 年冬季重新设计)。一种方法 - 正如 SE 在 /newest pages 上所做的那样- 是使用问题ID POST 到 /posts/ajax-load-realtime-list/ ,它将回复问题摘要。 (不幸的是,由于跨域限制,这种方法无法嵌入到实时堆栈片段中)

在 Stack Overflow 上打开一个空白页面,例如 this one ,然后将以下内容粘贴到您的控制台中,您将看到新问题在发布时出现在页面上:

const socket = new WebSocket('wss://qa.sockets.stackexchange.com/');
socket.onopen = () => {
  socket.send('1-questions-newest-tag-javascript');
  socket.send('1-questions-newest-tag-java');
  socket.send('1-questions-newest-tag-python');
  socket.send('1-questions-newest-tag-php');
  console.log('Listening...');
};
const seenQuestions = new Set();
socket.onmessage = ({ data }) => {
  const obj = JSON.parse(data);
  if (obj.action === 'hb') {
    socket.send('pong');
    return;
  }
  const { id, body } = JSON.parse(obj.data);
  if (seenQuestions.has(id)) {
    // Duplicate question, a message for it has already been handled:
    return;
  }
  seenQuestions.add(id);
  console.log('New question:', id);
  insertQuestion(id)
};
socket.onerror = console.error; // just in case

const insertQuestion = (questionId) => {
  const params = new URLSearchParams();
  params.append('postIdsSemiColonDelimited', questionId);
  fetch('https://stackoverflow.com/posts/ajax-load-realtime-list/', {
    method: 'post',
    body: params
  })
    .then(r => r.json())
    .then((result) => {
      document.body.insertAdjacentHTML('beforeend', result[questionId]);
    })
    .catch(console.error); // just in case
};

如果您想在 Stack Exchange 站点以外的其他地方使用它,您可能还希望embed their CSS

确实需要监听hb消息并回复它,以便StackExchange知道保持连接处于事件状态。

请注意,套接字将为正在监听的每个标签发送给定问题的数据。例如,如果某个东西同时用 Javascript 和 React 标记,并且您已发送请求来监听这两个标记,您将收到一条消息两次,因此需要 Set 来避免列出重复。

关于javascript - 如何从堆栈溢出中获取新问题的通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59097949/

相关文章:

javascript - 在 React 中将图像设置为嵌套状态的问题

javascript - 如何在不旋转图像的情况下以圆周运动移动图像?

javascript - Angular js 没有在 Controller 上返回任何内容

javascript - 使用 Nodejs 的 csvtojson 转换给出乱码数据

json - Mongodb更新语句: How do i update the json object?

javascript - 处理 React.js 上的单元格单击状态

javascript - 制作特殊格式的js代码

node.js - express multer 无法读取未定义的属性 'profileimage'

javascript - 当渲染到另一个元素时如何停止handleSubmit更新?

javascript - React Flux - 在调度中调度 - 如何避免?