如何从Stack Overflow获取新问题的通知?

13

我想回答有关新的javascript、react、react-native和node的问题。那么,我如何知道用户在这些领域提出的新问题呢?


1
你的意思是在网站上直接操作还是通过使用 Stack Exchange API 的应用程序来进行操作? - Emile Bergeron
1个回答

17

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

问题数据需要单独检索(截至SE的2021/2022冬季重新设计)。一种方法是像/newest页面上的SE一样,使用问题ID POST到/posts/ajax-load-realtime-list/,它将响应问题摘要。(不幸的是,由于跨源限制,这种方法无法嵌入到实时Stack Snippet中)

在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网站以外的地方使用它,你可能还希望嵌入他们的CSS
你需要监听一个hb消息并回复它,这样StackExchange就知道要保持连接。
请注意,对于每个正在监听的标签,套接字都会为给定的问题发送数据。例如,如果某个问题既被标记为Javascript又被标记为React,并且你已经发送了请求来监听这两个标签,那么你将会收到该问题的消息两次,因此需要使用Set来避免列出重复项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接