关注此问题:Trouble monitoring website changes using node
我正在尝试抓取openmarketcap API,然后在价格变化时提醒我。
到目前为止,我已经完成了大部分的初始编码,我使用SetInterval每2.5秒调用一次该函数,并且确实看到了价格变化,但是我没有得到我期望的结果。我试图让它与旧数组中的最后一个调用进行比较,并将其与新的scrape进行比较。我想这是我犯的一个愚蠢的错误,仍然是游戏的学生!
const request = require("request");
const fs = require("fs");
function discord(messages){
request({
url: "https://discordapp.com/api/webhooks/57143540025348169/notmyrealwebhook",
method: "POST",
json: messages
}),
function(body, response, error){
console.log(body);
if(error){
console.log(error);
}
};
}
const headers = {
"Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36",
"Upgrade-Insecure-Requests" : "1"
}
const options = {
url: "http://api.openmarketcap.com/api/v1/tokens",
headers: headers,
json: true
}
let oldCoinData = [];
let initial = true;
const call = () => {
request(options, function(err, response, body){
if(err){
console.log(err);
}
const data = body.data;
let coinData = [];
if(initial){
for(i in data){
oldCoinData.push(data[i])
}
}
if(initial == false){
for(i in data){
coinData.push(data[i]);
}
oldCoinData = coinData;
}
let oldPrice = oldCoinData[0].price_usd;
let newPrice = coinData[0].price_usd;
console.log(oldPrice, newPrice);
if(oldPrice != newPrice){
console.log("Bitcoin price change!!!!");
console.log(`Bitcoin was ${oldPrice}, it is now ${newPrice}`);
}
else if(oldPrice === newPrice){
console.log("No changes detected.");
}
})
};
initial = false;
const delay = 2500;
setInterval(call, delay);
我认为我的问题出在oldCoinData = coinData上,但是我不确定每次调用它时如何在初始化时比较两个数组。
更改后,应该存储了旧数组,新的刮板应该将价格与旧数组进行比较。但是,由于我的代码行oldCoinData = coinData,在调用该函数时会将它们设置为相等。不确定如何获取它以比较旧数据和新数据。因此,我的逻辑有些错误。
答案 0 :(得分:0)
有许多问题需要修正和建议。现在,让我们忘记真正的openmarketcap api,并考虑这个模拟的请求功能
let data = [{ price_usd: 5298 }]
setInterval(() => {
data = [{ price_usd: data[0].price_usd + 100 }]
console.log('--- price has definitely changed ---')
}, 5000)
const request = (option, cb) => {
cb(undefined, undefined, { data })
}
每5秒提供一次不同的price_usd
值,因此可以确定您确实获得了不同的值。
第一个问题是,甚至在initial
设置为true的情况下,request(...)
回调至少被调用一次之前,initial
设置为false。要解决此问题,请将initial = false;
移至if(initial){...}
接下来,由于没有先前的数据可比较,因此在相同的if语句中添加了一个返回值。
正如您所建议的那样,问题还在于该配置oldCoinData = coinData;
。您真正想做的是仅在检测到价格变化时才用新数据覆盖oldCoinData,因此,当价格再次发生变化时,oldPrice != newPrice
的评估结果为true。