Node.js如何循环发送GET请求,检测到响应变化后更新Instagram简介
代码修改方案
核心调整逻辑如下:
- 封装GET请求为异步可复用函数,解决原代码回调嵌套导致的变量时序问题
- 登录操作仅在程序启动时执行1次,避免频繁登录触发Instagram账号风控
- 新增变量存储上一次的有效响应值作为比对基准
- 新增5秒定时轮询逻辑,仅当新获取的响应值和基准值不一致时才触发简介更新,同时刷新基准值
完整修改后代码
const { IgApiClient } = require("instagram-private-api") const ig = new IgApiClient() const https = require('https') const USERNAME = "MYUSERNAME" const PASSWORD = "MYPASSWORD" const CHECK_INTERVAL = 5000 // 轮询间隔单位为毫秒,5000即5秒 ig.state.generateDevice(USERNAME) // 存储上一次的有效值作为比对基准 let lastSearchValue = null // 封装GET请求为Promise格式,适配async/await语法 const getSearchValue = () => { return new Promise((resolve, reject) => { const url = "https://11z.co/_w/14011/selection"; https.get(url, (res) => { let body = ""; res.on("data", (chunk) => { body += chunk; }); res.on("end", () => { try { const value = JSON.parse(body).value; resolve(value); } catch (error) { reject(error); } }); }).on("error", (error) => { reject(error); }) }) } const main = async () => { // 程序启动时先执行一次登录,仅执行一次 await ig.simulate.preLoginFlow() await ig.account.login(USERNAME, PASSWORD) process.nextTick(async () => await ig.simulate.postLoginFlow()) console.log("Instagram登录成功,开始轮询检测...") // 首次运行先拉取初始值,直接更新简介并存为基准 try { lastSearchValue = await getSearchValue() await ig.account.setBiography(lastSearchValue) console.log(`初始简介已更新为:${lastSearchValue}`) } catch (e) { console.error("初始值获取或更新失败:", e.message) } // 启动5秒定时轮询 setInterval(async () => { try { const newValue = await getSearchValue() // 比对新旧值,有变化才更新 if (newValue !== lastSearchValue) { await ig.account.setBiography(newValue) lastSearchValue = newValue console.log(`检测到值变更,简介已更新为:${newValue}`) } // 没有变化则不做操作,减少接口调用 } catch (e) { console.error("轮询过程出错:", e.message) } }, CHECK_INTERVAL) } main()
关键改动说明
- 修复了原代码中异步请求时序问题:原代码中
https.get是异步回调逻辑,setBiography执行时大概率还没拿到search值,修改后用Promise+async/await保证执行顺序 - 所有错误都做了捕获处理,单次请求失败不会导致整个程序崩溃
- 仅在值发生变更时才调用Instagram的简介更新接口,大幅降低接口调用频率,减少账号被限制的风险
内容的提问来源于stack exchange,提问作者magificul
相关产品推荐
相关产品推荐

