当前位置: 首页 > news >正文

[JS真好玩] 掘金创作者必备: 监控每天是谁取关了你?

我是HullQin,公众号线下聚会游戏的作者(欢迎关注公众号,发送加微信,交个朋友),转发本文前需获得作者HullQin授权。我独立开发了《联机桌游合集》,是个网页,可以很方便的跟朋友联机玩斗地主、五子棋等游戏,不收费没广告。还开发了《Dice Crush》参加Game Jam 2022。喜欢可以关注我 HullQin 噢~我有空了会分享做游戏的相关技术。

背景

他在沸点说:「我这么好你还舍得取关我,那我什么时候能成为百万粉丝博主?」

1.png

如果有人取消关注了你,你一定想知道是谁吧!

掘金没告诉你是谁取关了你,今天我来告诉你,是谁取关了你。

思路如下:

  • 获取你当前的粉丝列表,保存到本地。
  • 第二天,再次获取列表,看看少了谁,同时更新本地粉丝列表。
  • 后续每一天,重复第二天的操作。

抓包看请求

看过我这专栏的人已经学会抓包了吧!学会Copy as fetch了吗?

没看过的,在这里学:《遇到表格,手动翻页太麻烦?我教你写脚本,一页展示所有数据》。

点击这里,查看所有关注者:

2.png

就是这个请求,对它进行Copy as fetch操作:

3.png

循环,获取粉丝列表

以下代码,需要在掘金页面的Console里运行,否则不会带cookie的。

// 不能给掘金太大压力,我们定义个sleep函数,1秒请求一次就好
const sleep = async () => new Promise(resolve => setTimeout(resolve, 1000));
// 获取所有新增粉丝,保存到followers。
const getFollowers = async () => {
  const followers = {};
  console.log('开始读取你的粉丝啦');
  for (let i = 0; i < 100; i++) {
    const res = await fetch("https://api.juejin.cn/user_api/v1/follow/followers?aid=改成你的&uuid=改成你的&user_id=改成你的&cursor=" + i * 20 + "&limit=20", {
      "headers": {
        "content-type": "application/json",
      },
      "referrer": "https://juejin.cn/",
      "referrerPolicy": "strict-origin-when-cross-origin",
      "body": null,
      "method": "GET",
      "mode": "cors",
      "credentials": "include"
    });
    const data = await res.json();
    const result = data.data.data;
    result.forEach(fan => {
      followers[fan.user_id] = fan.user_name;
    });
    // 如果该页数量少于20,说明是最后一页,结束循环
    if (result.length < 20) break;
    // 不能给掘金太大压力,我们1秒请求一次就好
    await sleep();
  }
  console.log('读取完毕你的粉丝啦');
  return followers;
}

调用函数await getFollowers()即可发请求,并返回现在的粉丝列表。

保存到LocalStorage

相信大家对浏览器的localStorage一定不会陌生!我们定义一个key,叫做my_followers,专门用来存储我们的粉丝。

因为localStorage只能存储字符串,我们用JSON序列化一下。

// 利用localStorage在本地记录所有粉丝
const FOLLOWER_KEY = 'my_followers';
const followers = await getFollowers();
localStorage.setItem(FOLLOWER_KEY, JSON.stringify(followers));

第二天,再获取列表,跟昨天的粉丝diff一下

获取老粉丝,用localStorage中的数据。

获取新粉丝,重新调用await getFollowers()即可。

const FOLLOWER_KEY = 'my_followers';
const oldFollowers = JSON.parse(localStorage.getItem(FOLLOWER_KEY) || '{}');
const newFollowers = await getFollowers();

问题来了,我们要找出取消关注的粉丝,那么只要遍历oldFollowers,看他们还在不在newFollowers里面即可,在的,就是老粉,不在的,就上暗杀名单。

const badFollowers = Object.keys(oldFollowers).filter(fan => !(fan in newFollowers));

记得更新今日最新粉丝名单:

localStorage.setItem(FOLLOWER_KEY, JSON.stringify(newFollowers));

一些名单

输出暗杀名单

console.log(badFollowers.map(id => oldFollowers[id]));

大家别上暗杀名单噢!

输出帅哥美女的名单

console.log(Object.values(newFollowers));

每天看看是谁那么帅那么美!

输出今日变帅变美的人的名单

const goodFollowers = Object.keys(newFollowers).filter(fan => !(fan in oldFollowers));
console.log(goodFollowers.map(id => newFollowers[id]));

看看今天是谁又变帅变美了!

写在最后

我是HullQin,公众号线下聚会游戏的作者(欢迎关注公众号,发送加微信,交个朋友),转发本文前需获得作者HullQin授权。我独立开发了《联机桌游合集》,是个网页,可以很方便的跟朋友联机玩斗地主、五子棋等游戏,不收费没广告。还开发了《Dice Crush》参加Game Jam 2022。喜欢可以关注我 HullQin 噢~我有空了会分享做游戏的相关技术。

相关文章:

  • Nginx服务之Rewrite
  • 【一起学Rust | 进阶篇 | reqwest库】纯 Rust 编写的 HTTP 客户端——reqwest
  • 数据库技术基础--基本概念
  • [springboot专栏]文件本地上传与提供访问服务
  • 基于AI算法的数据库异常监测系统的设计与实现
  • 猿创征文|手把手玩转docker,从入门到精通
  • 【Rust日报】2022-08-31 RustDesk 跻身 Rust 开源项目 Top 10 第九名
  • 【项目】通讯录1(C语言)
  • 一年赚一百万的思路—别做大多数的傻瓜
  • Java基于JSP+Servlet的宠物养护网站
  • 【spring】一文读懂SpringIOC和AOP
  • 在Adult数据集上使用pandas进行独热编码,之后部署Logistic Reggresion模型
  • Dubbo分组聚合
  • 前端HTML5 +CSS3 3. HMTL基础 3 表单标签
  • 2022.9.1 SAP RFC
  • classpath对获取配置文件的影响
  • HomeBrew常规使用教程
  • java概述
  • js算法-归并排序(merge_sort)
  • mysql常用命令汇总
  • Mysql数据库的条件查询语句
  • React+TypeScript入门
  • Spring Boot MyBatis配置多种数据库
  • SSH 免密登录
  • vue 个人积累(使用工具,组件)
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 码农张的Bug人生 - 初来乍到
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 三栏布局总结
  • 算法之不定期更新(一)(2018-04-12)
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 我与Jetbrains的这些年
  • 新手搭建网站的主要流程
  • Java数据解析之JSON
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​你们这样子,耽误我的工作进度怎么办?
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # Apache SeaTunnel 究竟是什么?
  • #大学#套接字
  • (1)(1.11) SiK Radio v2(一)
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • @Controller和@RestController的区别?
  • @RequestMapping-占位符映射
  • [android] 天气app布局练习
  • [Asp.net mvc]国际化
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标
  • [C++]指针与结构体
  • [Codeforces] number theory (R1600) Part.11