简体   繁体   中英

How to run a telegram bot on aiogram together with aiottp?

I write a telegram bot on aiogram that gives me information about my accounts market.csgo.com . The meaning of the script is simple - I click on the button, it displays the text and and the function is run. My functions send async requests and work fine, but I don't know how to get aiohttp and aiogram to work together.

from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
from auth import *
import asyncio
import aiohttp


bot = Bot(token=token)
dp = Dispatcher(bot)


def users():
    ***Data of my accounts from txt to dict***

async def get_info(session, dictt, message):
    total_wallet = 0
    async with session.get(f'https://market.csgo.com/api/v2/get-money?key={dictt[1][1]}') as resp:
        html = await resp.json()
        total_wallet += int(html['money'])
    #await bot.send_message(message.from_user.id, f'{total_wallet}')

async def get_on_sale(session, dictt, message):
    sale_total_sum = 0
    async with session.get(f'https://market.csgo.com/api/v2/items?key={dictt[1][1]}') as resp:
        html = await resp.json()
        for i in html['items']:
            sale_total_sum += i['price']
        #await bot.send_message(message.from_user.id, f'{sale_total_sum}')


@dp.message_handler(content_types=['text'])
async def Main():
    try:
        profiles = users()
        async with aiohttp.ClientSession(trust_env=True) as session:
            tasks = [] 
            if message.text == 'info 📊':
                await bot.send_message(message.from_user.id, 'Wait for information..')
                for i in profiles.items():
                    task = asyncio.ensure_future(get_info(session, i))
                    tasks.append(task)
                await asyncio.gather(*tasks)
            if message.text == 'on sale 💰':
                await bot.send_message(message.from_user.id, 'Wait for information..')
                for i in profiles.items():
                    task = asyncio.ensure_future(get_on_sale(session, i))
                    tasks.append(task)
                await asyncio.gather(*tasks)
    except Exception as ex:
        print(f'Error {ex}')


loop = asyncio.get_event_loop()
loop.run_until_complete(Main())

executor.start_polling(dp, skip_updates=True)

My problem is that I don't know how to properly pass the message argument to the Main function

@dp.message_handler(content_types=['text'])
async def Main(): #async def Main(message)

And run aiogram along with aiohttp.

loop.run_until_complete(Main()) #loop.run_until_complete(Main(message))

If I do like this: async def Main(message) and loop.run_until_complete(Main(message)) Then I get an error:

    loop.run_until_complete(Main(message))
NameError: name 'message' is not defined

or if I use only async def Main(message) get this:

    loop.run_until_complete(Main())
TypeError: Main() missing 1 required positional argument: 'message'

Solution:

async def loop_on(message):
    loop = asyncio.get_event_loop()
    loop.run_until_complete(Main(message))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM