美文网首页程序员
如何在知乎关注N多大V?

如何在知乎关注N多大V?

作者: NARUTO_86 | 来源:发表于2015-12-28 14:37 被阅读292次

    为啥要关注N多大V

    今天突然意识到一个问题,在知乎上,我通常只关注那些价值观我比较认同的人,还会在发现关注的人的回答和我的价值观不一致时取消关注。

    可是这么一来,我的世界会越来越小,我固有的偏见也就会越来越深,还怎么发现更大的世界呢。

    关注更多的人,就能从更多的角度观察这个世界。但是尽管噪声也是声音,比较价值要小一些,所以选择关注下大V。

    怎么找大V

    根据知乎上有些回答的建议,先找个大V,然后从TA的关注列表里面加关注。

    我对于大V的认定目前比较简单,看TA的回答赞同数是不是比较高。

    方法基本确定了,但是在页面上一个个点关注,有点慢啊....

    怎么自动化加关注

    于是,我写了个脚本(比较长,代码留在最后了)。

    在调试的过程中,估计是一开始没有考虑发送一大波请求会产生问题,导致....知乎把我封号了!在通过发送短信解除封号后,我在代码里面加入了延迟,尽量模拟人的操作方式吧。

    代码使用方式

    简单用法

    1. 打开一个大V的个人页面,例如:https://www.zhihu.com/people/excited-vczh
    2. 通过 F12 打开浏览器控制台
    3. 将代码粘贴进去,回车
    4. 等待 .... DONE!

    注:2015/12/29 更新 - 简化自动关注步骤

    高级用法

    请参考代码注释....

    附录

    声明

    代码有风险,粘贴需谨慎!

    代码

    (function (factory) {
    
      var zhv = factory(window.$)
    
      // 1. 自动关注所有大V
      zhv.autoFollowBigVers()
    
      // 2. 手动处理,自行判断大V
      /*
      zhv.getAllFolloweesOfCurrentUser(function (userList) {
        // user 数据结构参考下面的说明 <UserObject 用户信息数据结构>
        zhv.followUsers(userList.filter(function (user) {
          return user.agreeCount > 1000
        }))
      })
      */
    
      /*
       * UserObject 用户信息数据结构
       *
       * - {string} id: hash_id
       * - {string} name: 该用户名称
       * - {boolean} hasFollowed: 该用户是否已被你关注
       * - {number} followerCount: 该用户的关注者数目
       * - {number} askCount: 该用户的提问数
       * - {number} answerCount: 该用户的答题数目
       * - {number} agreeCount: 该用户获得的赞同数
       */
    
    })(function ($) {
    
    var zh_xsrf = $('input[name="_xsrf"]').val()
    var zh_followee_collection = []
    var exports = {}
    
    exports.autoFollowBigVers = function () {
      getAllFolloweesOfCurrentUser(function (userList) {
        followUsers(userList.filter(isNotFollowedBigVer))
      })
    }
    exports.getAllFolloweesOfCurrentUser = getAllFolloweesOfCurrentUser
    exports.followUsers = followUsers
    
    /*
     * @param {function} [done] - 执行完毕后调用的回调函数,callback({UserObject[]})
     */
    function getAllFolloweesOfCurrentUser(done) {
      var currentUser = getCurrentUserInfo()
      var hash_id = currentUser.id
      var followeeCount = currentUser.followeeCount
    
      // 清空已缓存的用户
      zh_followee_collection.length = 0
    
      var i = 0
      var loadCount = Math.ceil(followeeCount / 20)
      var timer = setInterval(function () {
        if (i < loadCount) {
          getFolloweeList(hash_id, 20 * i).done(function (data) {
            if (data.r === 0) {
              data.msg.forEach(function (item) {
                var user = parseUserInfoFromHTML(item)
                zh_followee_collection.push(user)
              })
            }
          })
          console.log(i + '/' + loadCount + ' ' + ((i * 100 / loadCount).toFixed(2) + '%'))
          i++
        } else {
          clearInterval(timer)
          console.log('加载当前用户所有关注的人,完毕')
          if (typeof done === 'function') {
            done(zh_followee_collection)
          }
        }
      }, 200)
      console.log('尝试加载当前用户所有关注的人,共' + followeeCount + '人')
    }
    
    function parseUserInfoFromHTML(html) {
      var $el = $(html)
      var $btnFollow = $el.find('.zm-rich-follow-btn')
      var hash_id = $btnFollow.attr('data-id')
      var hasFollowed = $btnFollow.hasClass('zg-btn-unfollow')
      var userName = $el.find('.zm-item-link-avatar').attr('title')
    
      var $links = $el.find('.details').find('a')
      var followerCount = parseInt($links.eq(0).text(), 10)
      var askCount = parseInt($links.eq(1).text(), 10)
      var answerCount = parseInt($links.eq(2).text(), 10)
      var agreeCount = parseInt($links.eq(3).text(), 10)
    
      return {
        id: hash_id,
        name: userName,
        hasFollowed: hasFollowed,
        followerCount: followerCount,
        askCount: askCount,
        answerCount: answerCount,
        agreeCount: agreeCount
      }
    }
    
    function isNotFollowedBigVer(user) {
      if (user.hasFollowed) {
        return false
      } else {
        // 各种主观的评价大V的标准
        if (user.agreeCount > 1000 && user.followerCount > 500) {
          return true
        } else if (user.agreeCount > 100 && user.followerCount > 2000) {
          return true
        } else {
          return false
        }
      }
    }
    
    /*
     * @param {UserObject[]} userList
     */
    function followUsers(userList) {
      var total = userList.length
      if (total > 0) {
        console.log('关注' + total + '个用户,开始....')
        userList.forEach(function (user, i) {
          setTimeout(function () {
            console.log(
              (i + 1) + '/' + total + ' ' +
              user.name + ' ' +
              user.agreeCount + '赞同 ' +
              user.followerCount + '关注'
            )
            followUser(user.id)
            user.hasFollowed = true
            if (i + 1 === total) {
              console.log('结束')
            }
          }, i * 200)
        })
      } else {
        console.log('没有要关注的用户')
      }
    }
    
    /*
     * @return {UserObject} 当前用户信息
     */
    function getCurrentUserInfo() {
      var $btnFollow = $('.zm-profile-header-op-btns').find('.zm-rich-follow-btn')
      var $followNums = $('.zm-profile-side-following').find('strong')
      var $userNums = $('.profile-navbar').find('.num')
      return {
        // 用户的关注按钮上有该用户对应的 hash_id
        id: $btnFollow.attr('data-id'),
        name: $('.title-section').find('.name').text(),
        // TA关注的人数
        followeeCount: parseInt($followNums.eq(0).text(), 10),
        // 关注TA的人数
        followerCount: parseInt($followNums.eq(1).text(), 10),
        answerCount: parseInt($userNums.eq(1).text(), 10),
        agreeCount: parseInt($('.zm-profile-header-user-agree').find('strong').text(), 10)
      }
    }
    
    function getFolloweeList(hash_id, offset) {
      return $.ajax({
        type: 'POST',
        url: '/node/ProfileFolloweesListV2',
        data: {
          method: 'next',
          params: JSON.stringify({
            "offset": offset,
            "order_by": "created",
            "hash_id": hash_id
          }),
          _xsrf: zh_xsrf
        },
        dataType: 'json'
      })
    }
    
    function followUser(hash_id) {
      return $.ajax({
        type: 'POST',
        url: '/node/MemberFollowBaseV2',
        data: {
          method: 'follow_member',
          params: JSON.stringify({"hash_id": hash_id}),
          _xsrf: zh_xsrf
        },
        dataType: 'JSON'
      })
    }
    
    return exports
    })
    

    相关文章

      网友评论

        本文标题:如何在知乎关注N多大V?

        本文链接:https://www.haomeiwen.com/subject/jugbhttx.html