Chrome控制台运行Instagram批量取关脚本报push读取错误修复方法
Instagram批量撤销已发送关注请求脚本报错修复
错误原因
抛出Uncaught TypeError: Cannot read properties of undefined (reading 'push')的核心原因是原脚本拆分两段执行时,Chrome控制台的临时上下文可能回收、覆盖link/proWindow变量,导致调用数组push方法时,目标变量不是数组类型、值为undefined。
原脚本还存在几个会导致运行失败的问题:
- 全局环境直接使用
await存在兼容性问题,部分Chrome版本会直接抛出语法错误 - 新标签页未完成加载时就操作DOM,会找不到对应按钮
- 未处理浏览器弹窗拦截逻辑,被拦截的窗口引用为null,后续操作会报错
- 旧的DOM类名选择器可能随Instagram前端版本更新失效
- 未提示用户提前加载完全部待处理关注列表(该页面为滚动加载,不滚动到底部无法获取全部待处理用户)
修复后完整代码
直接在Instagram已发送关注请求页面打开Chrome控制台,粘贴以下代码单次运行即可,不需要拆分执行:
(async () => { alert("请先允许本站弹窗权限,再点击确定运行脚本,运行前请滚动页面到底部加载完全部待处理请求"); const userLinks = []; const openedWindows = []; // 适配当前页面的用户名选择器,如果选不到元素可以自行调整类名 const userEntries = document.querySelectorAll(".-utLf, div._aacl._aaco._aacw._aacx._aad7._aade"); if (userEntries.length === 0) { console.error("未获取到待处理用户,请滚动页面加载完列表后重试,或检查DOM选择器是否匹配当前页面元素"); return; } // 收集用户主页链接并打开新标签 for (let i = 0; i < userEntries.length; i++) { const username = userEntries[i].innerText.trim(); const profileUrl = `https://www.instagram.com/${username}/`; userLinks.push(profileUrl); console.log(`打开用户主页:${profileUrl}`); const win = window.open(profileUrl); if (!win) { console.error(`弹窗被拦截,无法打开用户${username}的主页,请允许弹窗后重试`); continue; } openedWindows.push(win); // 加延迟避免触发风控、避免浏览器拦截批量弹窗 await new Promise(resolve => setTimeout(resolve, 800)); } // 等待所有标签页加载完成后执行取关操作 console.log("等待页面加载完成,开始执行取关操作..."); await new Promise(resolve => setTimeout(resolve, 3000)); for (let i = 0; i < openedWindows.length; i++) { const win = openedWindows[i]; try { // 查找关注/请求已发送按钮 const followBtn = win.document.querySelector("button.sqdOP"); if (!followBtn) { console.warn(`第${i+1}个页面未找到关注按钮,跳过`); win.close(); continue; } followBtn.click(); // 等待确认弹窗弹出 await new Promise(resolve => setTimeout(resolve, 1000)); // 查找确认取消关注按钮 const confirmBtn = win.document.querySelector(".aOOlW.-Cab_"); if (confirmBtn) { confirmBtn.click(); console.log(`第${i+1}个用户取关完成`); } // 操作完成关闭标签页,避免占用内存 await new Promise(resolve => setTimeout(resolve, 500)); win.close(); } catch (e) { console.error(`操作第${i+1}个用户时出错:`, e); } } console.log("全部操作执行完成"); })();
关键修改点
- 所有逻辑包裹在异步立即执行函数中,统一变量作用域,避免变量被控制台回收/覆盖导致的push方法报错
- 移除原代码中先初始化数组再强制清空length的冗余逻辑,直接初始化空数组
- 增加弹窗拦截检测、空列表检测、页面加载等待逻辑,减少运行错误
- 增加操作间隔延迟,降低被Instagram风控拦截的概率
- 操作完成后自动关闭打开的用户主页标签,避免打开过多标签导致浏览器卡顿
内容的提问来源于stack exchange,提问作者Saurabh
相关产品推荐
相关产品推荐

