Javascript 收集要跟随的按钮的完整列表,而无需滚动页面(DevTools Google Chrome)
DevTools谷歌浏览器: 在这个站点()上,要加载追随者的完整列表,有必要不断向下滚动页面以重新加载更多的配置文件,但有时页面太重以至于浏览器崩溃,最终需要关闭 是否有任何方法可以收集以下按钮而不发生这种情况 我当前使用的脚本是: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
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();