if call.data == 'apple' or 'melon': #Вот в этом месте проблема
Ещё один ботописатель с этой проблемой. Вот откуда такое упорное желание дословно переводить с русского на питон?
Правильно:
if call.data in ('apple', 'melon'):
Ну или так:
if call.data == 'apple' or call.data == 'melon':
То, что ты написал, расшифровывается как
if (call.data == 'apple') or ('melon' != ''):
что эквивалентно
if (call.data == 'apple') or True:
А x or True всегда даст True, так же как x and False всегда даст False.
Так что получается в итоге
if True:
Учи основы языка - потом уже берись за ботов.