如何正确循环访问 API 密钥数组以同步发出请求?



我对这个项目做了很多研究,我想知道最好的方法是什么。这是一个扫描来自Twitter的新推文的脚本。 它可能从根本上是有缺陷的,我什至不知道。 基本上,我有多个 API 密钥,并在密钥之间以交错的速度运行请求。

获取现有推文:

const Twitter = require("twitter");
var i = 0;
var store = [];
var clients = [
new Twitter({
consumer_key: "",
consumer_secret: "",
access_token_key: "",
access_token_secret: "",
}),
new Twitter({
consumer_key: "",
consumer_secret: "",
access_token_key: "",
access_token_secret: "",
}),
]
const users = [
'twitteruser1',
'twitteruser2',
]
users.forEach(function (user) {
clients[0].get("statuses/user_timeline", { screen_name: user, count: 1 }, (error, tweets, response) => {
store.push(tweet.id_str)  
})
})

我需要以下方面的帮助(跟踪多个帐户以获取新推文(:

clients.forEach(function (client) {
setTimeout(() => {
setInterval(() => {
client.get("statuses/user_timeline", { screen_name: params[???], count: 1}, (error, tweets, response) => {
if (error) return console.log(error);
if (!store.some(found => found == tweets[0].id_str)) {
store.push(tweets[0].id_str)
console.log('new tweet!')
}
})
}, 1000)
}, (1000 / clients.length) * (clients.indexOf(client) % clients.length))
})

起初我正在使用它,但它无法正常工作,因为它可能写得很糟糕。我尝试以多种方式重写它,以使其运行良好且高效。地图在这里有用吗?

每个 API 密钥的速率限制为 900/900 秒,因此我根据拥有的密钥数量计算不受速率限制所需的延迟,并每 1 秒运行一次。 例如,20 个密钥意味着我可以有 20 个请求/秒,这意味着 50 毫秒交错 1 秒。

感谢您的帮助。

我不是 Twitter API 的专家,我不太确定为什么您拥有/需要多个 API 密钥(除了这一点(。我仍然不太明白你想做什么。

现在,使 JavaScript 中的异步任务看起来同步的一种方法是使用async/await。如果一个函数不使用 promises,你可以自己把它包装在 promise 中(尽管 RxJS 是处理异步操作的新首选方式(:

const Twitter = require("twitter");
const store = [];
const users = [
'twitteruser1',
'twitteruser2',
];
const clients = [
new Twitter({
consumer_key: "",
consumer_secret: "",
access_token_key: "",
access_token_secret: "",
}),
new Twitter({
consumer_key: "",
consumer_secret: "",
access_token_key: "",
access_token_secret: "",
}),
];
function getTweets(client, user, api) {
const url = api || "statuses/user_timeline";
return new Promise((resolve, reject) => {
client.get(url, { screen_name: user, count: 1}, (error, tweets, response) => {
if (error) {
resolve({ error, response });
} else {
resolve({ tweets, response });
}
});
});
}
async function trackTweets() {
for (const client of clients) {
for (const user of users) {
const results = await getTweets(client, user);
if (results.error) {
// do error handling
} else {
// results.tweets is defined. the listed should be sorted so no need for the .some loop call
if (store[0] !== results.tweets[0].id_str) {
store.unshift(results.tweets[0].id_str);
console.log('new tweet!')
}
}
}
}
}
trackTweets();
// or at in interval/timeout/etc.
const intervalDuration = (1000 / clients.length) * (clients.indexOf(client) % clients.length);
setInterval(trackTweets, intervalDuration);

现在,对于这样的情况,也许值得研究流式传输数据而不是进行连续的 API 调用? 检查这些链接,有许多有效的方法可以做到这一点:

  • https://www.google.com/search?q=twitter+api+stream+tweets&oq=twitter+api+strea&aqs=chrome.2.0j69i57j0l6.6847j0j4&sourceid=chrome&ie=UTF-8
  • https://socket.io/(他们直接在主页上流式传输推特(
  • https://www.npmjs.com/package/socket.io

最新更新