I am coding a telegram bot using telegraph and I have been running into issues the whole day. What I was trying to do was to make my telegram bot receive the divided held amount and value to print the value of each token, but I cannot figure out how to return the value to bot. Also it throws an exception when I try to run it like this if I leave the bot outside of function. I switched out the links for privacy reasons but the numbers do not matter since they divide correctly.
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(`$`, ``).replace(`,`, ``).replace(`,`, ``).replace(`,`, ``));
let tokenCurrentPrice = holdingPrice / amount;
return tokenCurrentPrice;
});
console.log(tokenPrice);
})();
//bot.command('price', (ctx) => ctx.reply(tokenPrice))
Advertisement
Answer
It throws an exception when I try to run it like this if I leave the bot outside of function.
const bot
is declared in a different scope. Constants are block-scoped, so the name bot
is not defined outside of the scope.
To illustrate the problem:
{
const a = 5
}
console.log(a);
This returns ReferenceError
because a
lives in a different scope.
But this is fine:
{
const a = 5
console.log(a);
}
I cannot figure out how to return the value to bot.
Your IIHF is an async function, all async functions return a promise. To illustrate this, this won’t print 5 because the promise is not resolved yet:
async function getValue () {
return 5;
}
console.log(getValue());
If you want to get the value, you need to wait for the promise to get resolved:
async function getValue () {
return 5;
}
(async () => {
console.log(await getValue());
})();
Also make sure you don’t use await
outside of an async scope:
async function getValue () {
return 5;
}
console.log(await getValue());
This won’t work and it will give an error. That’s why I used the IIHF with an async scope.