Search code examples
pythontelegramtelegram-botaiogram

How to use link to JPG as media content in message.edit_media method in aoigram, if it requests JSON object


I'm making test bot using aiogram now and i faced a problem. I want to edit message media, but i only have a link to an image, and when i try to use an 'edit_media' method aiogram tells me that it can't parse JSON object. (error) In documentation said that 'media' parameter must be 'A JSON-serialized object for a new media content of the message'. Here is my code: code

@dp.callback_query_handler(kb.item_nav_cb.filter(action='next'))
async def item_next_cb_handler(query: types.CallbackQuery, callback_data: dict):
    await bot.answer_callback_query(query.id)
    logging.info(callback_data)
    current_index = int(callback_data['index'])
    current_index += 1

link = df_new['link'].iloc[current_index]
item_info = get_item_info.get_item_info(domen+link)

if link in favourites[f'user_{query.from_user.id}']:
    item_kb = kb.get_item_fav_kb(index=current_index,
                                 link=link)
else:
    item_kb = kb.get_item_notfav_kb(index=current_index,
                                    link=link)

await query.message.edit_caption(caption=f'<b>{item_info[0]}</b>\n{item_info[1]}\n\nЦена: {item_info[2]}',
                                 reply_markup=item_kb)
await query.message.edit_media(media=item_info[3]) # Here is the problem

Solution

  • Found a solution. Needed to use InputMediaPhoto type:

    photo = types.input_media.InputMediaPhoto(item_info[3])
    await query.message.edit_media(media=photo)
    

    And all together code looks like this:

    @dp.callback_query_handler(kb.item_nav_cb.filter(action='next'))
    async def item_next_cb_handler(query: types.CallbackQuery, callback_data: dict):
    await bot.answer_callback_query(query.id)
    logging.info(callback_data)
    current_index = int(callback_data['index'])
    current_index += 1
    
    link = df_new['link'].iloc[current_index]
    item_info = get_item_info.get_item_info(domen+link)
    
    if link in favourites[f'user_{query.from_user.id}']:
        item_kb = kb.get_item_fav_kb(index=current_index,
                                     link=link)
    else:
        item_kb = kb.get_item_notfav_kb(index=current_index,
                                        link=link)
        
    photo = types.input_media.InputMediaPhoto(item_info[3]) # Makes a difference
    
    await query.message.edit_media(media=photo)
    await query.message.edit_caption(caption=f'<b>{item_info[0]}</b>\n{item_info[1]}\n\nЦена: {item_info[2]}',
                                     reply_markup=item_kb)