关于javascript:如何获取在思否问答打卡中的完成次数

59次阅读

共计 2707 个字符,预计需要花费 7 分钟才能阅读完成。

已参加了 SegmentFault 思否社区 10 周年「问答」打卡,欢送正在浏览的你也退出。

最近 「SegmentFault 思否社区 10 周年「问答」打卡」 非常炽热,然而有一个小问题,常常不晓得是否实现明天的 KPI,以及小尾巴是否失常增加,那咱们明天来做个小工具。

剖析

  1. 先关上集体的问答页
  2. 查找是否有独自拉问答数据的接口 。( 感激官网老板在前期做过优化,间接有接口
  3. 右键 copy as fetch 咱们就能够高兴的应用了

革新 & 循环

革新成能够查出所有数据,并且过滤掉不感兴趣的信息(graphql 的就更好了,惋惜不是

getAnswers = function(username, page = 1, startTime = new Date('2022-06-01 00:00:00.000').getTime() / 1000){return fetch(`https://segmentfault.com/gateway/homepage/${username}/answers?size=20&page=${page}&sort=newest`)
.then(v=>v.json())
.then(v=>v.rows)
.then(async v=>{if(v.length === 20 && (v[v.length - 1]?.created || 0) > startTime){return v.concat(await getAnswers(username, page + 1, startTime))
}else{return v.filter(v=>v.created > startTime)
}
})
// .then(console.log)
}
list = [];
getAnswers('linong')
.then(console.log)
// new Date(1655005451 * 1000).toLocaleString();
// new Date('2022-06-01 00:00:00.000').getTime()

仅供学习,不要守法哟!

查看几个沉闷用户

await getAnswers('hfhan')
.then(console.log)
await getAnswers('jamesfancy')
.then(console.log)
await getAnswers('nickw_cn')
.then(console.log)
await getAnswers('xdsnet')
.then(console.log)

咱们会发现这里的 username 如同是一个固定值,和用户名是不一样的,那咱们在做一个 url 提取,不便咱们不必手动选中

'https://segmentfault.com/u/jamesfancy/answers'.match(/\/u\/([^/]+)/)[1]

剖析如何获取是否有小尾巴

因为不是 graphql 的,所以上述内容只能有多少答复,如果想查看小尾巴的增加情况咱们还须要再做一次采集。

通过查看如同也没有暴露出有接口,那咱们只能间接解决 html 数据了。

xhr = new XMLHttpRequest()
xhr.open('get', 'https://segmentfault.com/q/1010000041964562/a-1020000041964682')
xhr.responseType = 'document'
xhr.send();
xhr.onload = () => console.log(xhr.response, xhr.response.querySelector('[id="1020000041964682"] [href^="https://segmentfault.com/a/1190000041925107"]'))

这样咱们应用选择器间接 判断答复中是否蕴含特征值即可,你猜为什么我这里用了 xhr,而不是 fetch 呢?

url 提取 id

'https://segmentfault.com/q/1010000041964562/a-1020000041964682'.match(/\/a-(\d+)$/)[1]

革新 循环

getAnswers = function(username, page = 1, startTime = new Date('2022-06-01 00:00:00.000').getTime() / 1000){return fetch(`https://segmentfault.com/gateway/homepage/${username}/answers?size=20&page=${page}&sort=newest`)
.then(v=>v.json())
.then(v=>v.rows)
.then(async v=>{if(v.length === 20 && (v[v.length - 1]?.created || 0) > startTime){return v.concat(await getAnswers(username, page + 1, startTime))
}else{return v.filter(v=>v.created > startTime)
}
})
// .then(console.log)
}
checkAnswerExt = async function(url){const id = url.match(/\/a-(\d+)$/)[1];
var xhr = new XMLHttpRequest()
xhr.open('get', `https://segmentfault.com${url}`)
xhr.responseType = 'document'
xhr.send();
return new Promise(function(resolve, reject){xhr.onload = () =>
resolve(
xhr
.response
.querySelector(`[id="${id}"] [href^="https://segmentfault.com/a/1190000041925107"]`)
)
})
}
list = [];
getAnswers('cowcomic')
.then(async function(list){for(var i = 0; i < list.length; i++){// console.log(i, list[i], list[i].url, await checkAnswerExt(list[i].url))
list.push({answers: list[i],
checked: await checkAnswerExt(list[i].url)
})
}
})
// .then(console.log)

正文完
 0