#javascript #web-scraping #puppeteer #telegram #telegraf
Вопрос:
Я кодирую телеграмм-бота с помощью telegraph, и весь день у меня возникали проблемы. То, что я пытался сделать, — это заставить моего бота telegram получать разделенную удерживаемую сумму и значение для печати значения каждого токена, но я не могу понять, как вернуть значение боту. Кроме того, он создает исключение, когда я пытаюсь запустить его таким образом, если я оставляю бота вне функции. Я отключил ссылки по соображениям конфиденциальности, но цифры не имеют значения, так как они правильно делятся.
const { Telegraf } = require('telegraf') const puppeteer = require("puppeteer-extra") const stealth = require("puppeteer-extra-plugin-stealth")() const anon = require(`puppeteer-extra-plugin-anonymize-ua`)() puppeteer.use(stealth).use(anon); (async () => { const bot = new Telegraf('my telegraf bot ID, can't post it') //the token URL let tokenUrl = 'https://bscscan.com/tokenholdings?a=0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c'; let browser = await puppeteer.launch(); let page = await browser.newPage(); await page.goto(tokenUrl, { waitUntil: 'networkidle2' }); let tokenPrice = await page.evaluate(() => { let amount = document.querySelector('div[class="table-responsive mb-2 mb-md-0"]>table>tbody> tr:nth-child(4) > td:nth-child(4)').innerText; //console.log(amount); amount = Number(amount.replace(`,`, ``)); let holdingPrice = document.querySelector('span[class="h5 mr-1 mb-0"]').innerText; //console.log(holdingPrice); holdingPrice = Number(holdingPrice.replace(` #javascript #web-scraping #puppeteer #telegram #telegraf
Вопрос:
Я кодирую телеграмм-бота с помощью telegraph, и весь день у меня возникали проблемы. То, что я пытался сделать, - это заставить моего бота telegram получать разделенную удерживаемую сумму и значение для печати значения каждого токена, но я не могу понять, как вернуть значение боту. Кроме того, он создает исключение, когда я пытаюсь запустить его таким образом, если я оставляю бота вне функции. Я отключил ссылки по соображениям конфиденциальности, но цифры не имеют значения, так как они правильно делятся. , ``).replace(`,`, ``).replace(`,`, ``).replace(`,`, ``)); let tokenCurrentPrice = holdingPrice / amount; return tokenCurrentPrice; }); console.log(tokenPrice); })(); //bot.command('price', (ctx) => ctx.reply(tokenPrice))
Ответ №1:
Он выдает исключение, когда я пытаюсь запустить его таким образом, если я оставляю бота вне функции.
const bot
объявляется в другой области. Константы имеют область действия блока, поэтому имя bot
не определяется за пределами области действия.
Чтобы проиллюстрировать проблему:
{
const a = 5
}
console.log(a);
Это возвращается ReferenceError
, потому a
что живет в другой области.
Но это прекрасно:
{
const a = 5
console.log(a);
}
Я не могу понять, как вернуть значение боту.
Ваш ИИХФ-это асинхронная функция, все асинхронные функции возвращают обещание. Чтобы проиллюстрировать это, здесь не будет напечатано 5, потому что обещание еще не выполнено:
async function getValue () {
return 5;
}
console.log(getValue());
Если вы хотите получить значение, вам нужно подождать, пока обещание не будет выполнено:
async function getValue () {
return 5;
}
(async () => {
console.log(await getValue());
})();
Также убедитесь, что вы не используете await
вне асинхронной области:
async function getValue () {
return 5;
}
console.log(await getValue());
Это не сработает, и это приведет к ошибке. Вот почему я использовал ИИХФ с асинхронной областью.
Комментарии:
1. Спасибо, теперь я все понял.