我不想关注你了,饭否

写完题目才发现好像有些标题党...html

背景

事情是这样的,以前常常上饭否看一些大佬们的脑洞以及开一些新脑洞,但长此以往,不知道是本身手残仍是被机器人操做了,关注列表出现了一大批本身不认识的陌生人,忽然递增到了140+人node

人数

过多的人数已经严重打扰了个人timeline,只能手动取消关注。在取消关注的时候才发现,饭否只支持单我的取消关注,没办法批量操做。ajax

取消关注

难道只能连续点140下吗...得考虑下如何进行批量操做。shell

思路

批量操做,通常是由脚原本完成,这里咱们先观察一下饭否的取消关注方式:bash

  1. 每次点击取消关注后,会发送一个POST请求,看一下data中的主要内容:
    POST请求
  2. 其中用户信息和鉴权验证,都是放在请求的cookie中实现的。
  3. 在data信息中,有以下几个字段。由分析可得知,其实重要信息就是friend好友id的获取:
    • action: friend.remove,是处理接触好友的方法名(固定)
    • friend: 好友的id
    • token: 本人的token值(固定)
    • ajax: 是否为ajax方式(固定)
  4. 那么咱们看一下html部分,经测试发现,每一个人是一个li标签,子元素a标签的href取值,便是每一个人的id
    dom元素
  5. 全部关键信息均可以获取到了,下面即可以写脚本了。

实现

这里有两种方式:cookie

  1. 一种方式是利用node和shell脚本,经过ajax对好友关系进行遍历,拿到html后获取到全部人的id,以后伪造remove请求,对idList中每一个元素进行取关处理。
  2. 直接在console中处理,获取到DOM元素以后过滤到idList列表,以后对每一个id进行remove请求的fetch操做。

这两种方法相比,第一种方法须要处理用户鉴权、登陆信息,以及引用ajax依赖等,考虑到时间成本,直接使用第二种方法进行实现:cors

  1. 手动进入某个页码,遍历DOM中的每一个<li>标签,获取到全部的href取值。
  2. 先取关一个好友,而后在network中copy请求的fetch操做,这样的话能够直接设置header,利用cookie攻击
    copy as fetch
  3. 处理idList中的元素,对每一个元素根据步骤2中的fetch,替换body中的内容进行处理。

下面贴出具体代码:dom

// 获取idList
let nameList = [].map.call(document.getElementsByClassName('avatar'),(item)=>item.href.replace('http://fanfou.com/',''))

// 进行fetch操做
nameList.forEach(item=>{
	fetch("${url}", {"credentials":"include","headers":${header信息},"body":`action=friend.remove&friend=${item}&token=xxx&ajax=yes`,"method":"POST","mode":"cors"});
})
复制代码

尾巴

这种方式虽然简单,但仍须要手动的进行分页的控制,你们有兴趣能够试试第一种实现方式来作脚本测试一下。测试

相关文章
相关标签/搜索