Javascript 收集要跟随的按钮的完整列表,而无需滚动页面(DevTools Google Chrome)

Javascript 收集要跟随的按钮的完整列表,而无需滚动页面(DevTools Google Chrome),javascript,google-chrome-devtools,devtools,Javascript,Google Chrome Devtools,Devtools,DevTools谷歌浏览器: 在这个站点()上,要加载追随者的完整列表,有必要不断向下滚动页面以重新加载更多的配置文件,但有时页面太重以至于浏览器崩溃,最终需要关闭 是否有任何方法可以收集以下按钮而不发生这种情况 我当前使用的脚本是: setInterval(function(){ document.getElementById("layout-content").scrollTo(0, 50000000000000000000000000000000000000); do

DevTools谷歌浏览器:

在这个站点()上,要加载追随者的完整列表,有必要不断向下滚动页面以重新加载更多的配置文件,但有时页面太重以至于浏览器崩溃,最终需要关闭

是否有任何方法可以收集以下按钮而不发生这种情况

我当前使用的脚本是:

setInterval(function(){
document.getElementById("layout-content").scrollTo(0, 50000000000000000000000000000000000000);

document.querySelectorAll('.components-button.components-button-size-mini.components-button-type-orange.desktop.components-button-inline').forEach(btn => btn.click());
}, 10)
我使用
setInterval
创建以下循环:

1-滚动页面
2-加载更多配置文件
3-单击以下按钮

我的需要:

对于我为学习所做的研究,我的个人资料会跟踪一个最著名个人资料的所有个人资料追随者,以分析有多少人在这个社交媒体上跟进。

其他:

在Leftium提供的回答中,只能遵循一个配置文件:

在KCGD给出的回答中,可以收集整个追随者列表,但在收集过程中不遵循配置文件,可以创建列表并保存数据,但不遵循配置文件:

我试图联系他们两人,但他们还没有回来。这是一个很好的方法,但我不能将两个答案结合起来,这样我就可以跟踪所有的配置文件,我考虑了收集
KCGD
响应的配置文件的可能性,我也会跟踪配置文件,但不仅是第一个,而且是
Leftium
的答案

是否有可能利用KCGD响应和每个响应创建的循环,已经遵循所有配置文件,而不仅仅是Leftium响应中的第一个配置文件?


我尝试创建,但未成功。它崩溃,因为间隔太快

setInterval(function(){}, 10)
您正在尝试每隔
10毫秒调用一次滚动并单击函数(即
100
每隔
1秒调用一次函数)。当他们在滚动时获取新用户时,这也会干扰服务器


如果您将间隔调整为至少1000毫秒(1秒)
,则脚本可以工作。当然,这可能需要一段时间,但它会起作用。您还应该预料到,页面可能会变得滞后,特别是当页面已经加载了大量用户时,因为此页面中未实现此功能。

即使降低了滚动速度,但仍会使浏览器陷入困境,解决此问题的方法可能是使用页面联系人的API。为了获得用户的关注者,它会联系网站的V3API

API中的用户返回]&计数=100

获取将显示在页面中的所有用户。我编写了一个脚本,可以反复联系api以获取所有关注者数据,只需在页面控制台中运行它,并在想要导出数据时使用print() 并将其复制/粘贴到.json文件中

//WARNING: THIS SCRIPT USES RECURSION, i have no clue how long the followers list goes so use at your own risk

var followers = []; //data collected from api

function getFollowers(cursor){

    httpGet(`https://booyah.live/api/v3/users/41874362/followers?cursor=${cursor}&count=100`, function (data) { //returns data from API for given cursor (user at the end of last follower chunk)

        console.log("got cursor: "+cursor);

        var _followChunk = JSON.parse(String(data));

        console.log(_followChunk)

        followers.push(_followChunk.follower_list); //saves followers from chunk

        var last_user = _followChunk.follower_list[_followChunk.follower_list.length - 1]; //gets last user of chunk (cursor for the next chunk)


        setTimeout(function(){ //1 second timeout so that the API doesnt return "too many requests", not nessicary but you should probably leave this on

            getFollowers(last_user.uid); //get next chunk

        },1000)

    })

}

var print = function(){console.log(JSON.stringify(followers))};

getFollowers(0); //get initial set of followers (cursor 0)

function httpGet(theUrl, callback) {
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open("GET", theUrl, false); // false for synchronous request

    xmlHttp.setRequestHeader("Cache-Control", "no-store");
    xmlHttp.send(null);

    callback(xmlHttp.responseText);
};

如果您真的只需要按钮元素,那么唯一的方法就是每次加载新的关注者时都向下滚动,因为页面会在您向下滚动时创建元素,浏览器会崩溃,因为使用了太多内存。当您向下滚动页面时,HTMLDOM树被扩展,更多的化身图像被下载。这些HTML和图像资源对于您的目标不是必需的

通过直接调用(内部)Booyah API可以避免崩溃。由于只传输文本,因此这将更快且消耗更少的资源。有两个感兴趣的API端点:

GET/api/v3/users/[USERID]/followers?cursor=0&count=100
获取跟随某个用户的跟随者列表:

  • [USERID]
    是被研究用户的ID(WEEDZAO的ID)
  • 游标
    是要开始列出的跟随者列表中的位置。当页面第一次加载时,这是0。当您向下滚动时,以下API调用会增加该值(101、201、301…)
  • count
    是要返回的结果数
  • 因为这是一个GET调用,所以您可以在浏览器中打开此URL

POST/api/v3/users/[USERID]/以下内容
跟踪用户(与单击用户的“跟踪”按钮相同)

  • 此处
    [USERID]
    是其追随者列表将被更新的用户的ID(您自己的ID)
  • 必须发送如下所示的有效负载:
    {followee\u uid:ID,source:43}
    。我不确定
    源代码是什么
  • 还必须包括一个CSRF头
  • 因为这是一个POST类型调用,所以无法直接在浏览器中打开此类型的URL
DELETE/api/v3/users/[USERID]/以下内容
还有一个API可以帮助用户解除跟踪。(仅供参考)

如果从浏览器外部调用这些API,则可能需要发送会话cookie


此脚本将列出WEEDZAO的前10个追随者,然后从列表中选择第一个:

  • 您必须用自己的值替换USERID和CSRF_令牌
  • 您可以将此代码复制/粘贴到浏览器开发控制台中
  • 或者,您可以使用类似于Puppeter的web抓取框架中的代码


这是一个完全有效的解决方案,我在自己的Chrome浏览器中用一个新帐户测试了它,成功地跟踪了你目标帐户的所有追随者帐户

更新(2021-06-18) 我已经将我的解决方案更新为一个大大改进和更快的函数,用
async
/
wait
重写。此新功能将估计运行时间从约45分钟减少到约10分钟。10分钟仍然是很长的一段时间,但考虑到你的目标用户拥有大量的追随者,这是可以预料的

经过几次迭代后,最新的函数不仅提高了速度、性能
// Find these values in dev console "Network" tab:
var CSRF_TOKEN, USERID, USERID_TARGET, main;
USERID_TARGET = '41874362';
USERID =        '12345678';
CSRF_TOKEN = 'MTYy...p8wg';

main = async function() {
  var body, followers, json, options, payload, response, url;

  // Get list of first 10 followers
  console.log(url = `/api/v3/users/${USERID_TARGET}/followers?cursor=0&count=10`);
  response = (await fetch(url));
  json = (await response.json());
  followers = json.follower_list;
  console.table(followers);

  
  // Follow first member from list above
  console.log(url = `/api/v3/users/${USERID}/followings`);
  payload = JSON.stringify({
    followee_uid: followers[0].uid,
    source: 43
  });
  response = (await fetch(url, options = {
    method: 'POST',
    body: payload,
    headers: {
      'X-CSRF-Token': CSRF_TOKEN
    }
  }));
  body = (await response.text());
  return console.log(body);
};

main();