// 获取知乎想法 ID
var id = window.location.href.split('/').pop();
// 知乎获取想法动作的 API
var baseurl = `https://api.zhihu.com/pins/${id}/actions?limit=20&withCredentials=true&offset=0`;
var commenturl = `https://www.zhihu.com/api/v4/pins/${id}/comments?order=normal&status=open&limit=20&offset=0`;
// 引入知乎允许来源的工具脚本
var body = document.getElementsByTagName('body')[0];
var jsNode = document.createElement('script');
jsNode.setAttribute('type', 'text/javascript');
jsNode.setAttribute('src', 'https://res.wx.qq.com/a/wx_fed/webwx/res/static/vendor/vendor_216b004.js');
// 定义数据数组
var repins = [], likes = [], comments = [];
var finaldata = [];
// 获取 JSON 内容
async function get(url) {
return await $.ajax({
url: url,
type: 'GET',
dataType: "json",
});
}
// 主程序
// count:抽奖名额数量
// mode:抽奖模式,可以由转发、鼓掌、评论任意排列
// gender:是否有性别限定,默认无,男生 1,女生 0
// like_count:仅针对评论抽奖,评论点赞数量
async function 抽奖(count = 1, mode = '转发',gender=-1,like_count=0) {
if (mode.indexOf('转发') > -1 || mode.indexOf('鼓掌') > -1) {
var jsdata = await get(baseurl);
while (true) {
// 获取动作数据
var actions = jsdata.data;
// 遍历动作
for (var action of actions) {
var member = action.member;
if(gender>-1){
if(member.gender!=gender){
continue
}
}
if (action.action_type == 'repin') {// 如果动作是转发
// 如果没有重复
if (JSON.stringify(repins).indexOf(member.url) == -1 ) {
repins.push(
{
name: member.name,
url_token: member.url_token,
url:member.url,
gender:member.gender
}
);
}
} else if (action.action_type == 'like') {
if (JSON.stringify(likes).indexOf(member.url) == -1) {
likes.push(
{
name: member.name,
url_token: member.url_token,
url:member.url,
gender:member.gender
}
);
}
}
}
if (jsdata.paging.is_end) {
break;
} else {
jsdata = await get(`https://api.zhihu.com/pins/${id}/actions?limit=20&withCredentials=true&offset=${jsdata.paging.next.split('offset=')[1]}`);
}
}
}
if (mode.indexOf('评论') > -1) {
var jsdata = await get(commenturl);
while (true) {
// 获取动作数据
var actions = jsdata.data;
// 遍历动作
for (var action of actions) {
var member = action.author.member;
if(gender>-1){
if(member.gender!=gender){
continue
}
}
if(action.vote_count && action.vote_count<like_count){
continue
}
// 如果没有重复
if (JSON.stringify(comments).indexOf(member.url) == -1) {
comments.push(
{
name: member.name,
url_token: member.url_token,
content: action.content,
url:member.url,
gender:member.gender
}
);
}
}
if (jsdata.paging.is_end) {
break;
} else {
jsdata = await get(`https://www.zhihu.com/api/v4/pins/${id}/comments?order=normal&status=open&limit=20&offset=${jsdata.paging.next.split('offset=')[1]}`);
}
}
}
// 根据参数判断
if (mode.indexOf('评论') > -1) {
finaldata = comments;
}
if (mode.indexOf('鼓掌') > -1) {
if (finaldata.length == 0) {
finaldata = likes;
} else {
finaldata = finaldata.filter(
item => {
return JSON.stringify(likes).indexOf(item.url_token) > -1;
}
);
}
}
if (mode.indexOf('转发') > -1) {
if (finaldata.length == 0) {
finaldata = repins;
} else {
finaldata = finaldata.filter(
item => {
return JSON.stringify(repins).indexOf(item.url_token) > -1;
}
);
}
}
// 根据有效人数输出文案
if (finaldata.length == 0) {
console.log("本次没有符合条件的人,无法抽奖。");
} else if (finaldata.length == 1) {
console.log(`本次只有一个符合条件的人: “${finaldata[0].name}”,地址为 https://www.zhihu.com/people/${finaldata[0].url_token}`)
} else {
console.group("本次抽奖名单为:");
finaldata.forEach((item,index)=>{
console.log(`${index + 1}. ${item.name}`);
});
console.groupEnd();
console.log(`本次抽奖有效人数为:${finaldata.length}`);
console.log(`本次抽奖名额数为:${count}`);
if (count == 1) {
var r = parseInt(Math.random() * (finaldata.length), 10);
if(finaldata[r].content !== undefined){
console.log(`中奖者的名字为 “${finaldata[r].name}”,地址为 https://www.zhihu.com/people/${finaldata[r].url_token} ,他说:${finaldata[r].content}`);
}else{
console.log(`中奖者的名字为 “${finaldata[r].name}”,地址为 https://www.zhihu.com/people/${finaldata[r].url_token}`);
}
} else {
if (count >= finaldata.length) {
console.log('很尴尬的是,你这人不够抽的啊,那就……全部中奖?')
} else {
for (let index = 0; index < count; index++) {
var r = parseInt(Math.random() * (finaldata.length), 10);
if(finaldata[r].content !== undefined){
console.log(`第${index + 1}个中奖者的名字为 “${finaldata[r].name}”,地址为 https://www.zhihu.com/people/${finaldata[r].url_token} ,他说:${finaldata[r].content}`);
}else{
console.log(`第${index + 1}个中奖者的名字为 “${finaldata[r].name}”,地址为 https://www.zhihu.com/people/${finaldata[r].url_token}`);
}
finaldata.splice(r, 1);
}
}
}
}
console.log('Powered by 一个简单的知乎抽奖器')
}
body.appendChild(jsNode);
使用方法:
第一步:复制
把上面那一大串代码,按 Ctrl+C 复制。
第二步:在电脑打开那条想法
在手机知乎打开那条想法,复制链接,分享到微信,然后在电脑浏览器打开。
第三步:打开开发者工具
可以按 F12,也可以右键菜单 --> 检查。
第四步:跳转到 Console/控制台 页面
![7ffb3b9b842bc574e849837895cc3fe2.png](https://i-blog.csdnimg.cn/blog_migrate/1fd266fa3f934406bace29e726402dd7.jpeg)
第五步:粘贴:
![ef007bb6631b8efcc1e91ec3007f657c.png](https://i-blog.csdnimg.cn/blog_migrate/f6f8e54b247cc107087f70ed27764a4e.jpeg)
第六步:回车
敲下你的 Enter 键。
第七步:输入
刚才粘贴了抽奖程序,接下来就需要运行了。
那么问题来了,有些人要抽3个人,有些人要抽1个人;有些人只要转发就送大电视,有些人需要转发并鼓掌。所以,我设计了两个参数,按需改变。
比如,如果你想要在转发里面,抽出一个人,那么你就这么用:
抽奖(1,"转发")
或者也可以用缩略的说法:
抽奖()
如果你想要的是,在鼓掌里面,抽出2个人,那么你就这么用:
抽奖(2,"鼓掌")
如果你想要的是,在转发并鼓掌里面,抽出10个人,那么你就这么用:
抽奖(10,"转发并鼓掌")
第八步:回车并等待结果
比如你刚才如果输入的是:抽奖()
![39c2c4649df4ede41db4236848bff136.png](https://i-blog.csdnimg.cn/blog_migrate/4abcd7f2ffa60fd68850402fc2acecb6.jpeg)
那么,回车一下,你就会得到下面的结果:
![12efa3f236e40c0027cc53fed232dbad.png](https://i-blog.csdnimg.cn/blog_migrate/ca98c299fb33f001d16d1f4bc9a45678.jpeg)
注意事项:
- 受知乎安全限制,本程序无法检测这个人是否为粉丝,需要大家自己手动检测;