• Есть ли какой-то способ прохода по заданным в переменной состояниям в AIOgramm Python?

    @HardX Автор вопроса
    import config
    import logging
    from aiogram import Bot, Dispatcher, executor, types
    from aiogram.dispatcher import FSMContext
    from aiogram.contrib.fsm_storage.memory import MemoryStorage
    from data_base import sqllite_db
    storage=MemoryStorage()
    from All_executions_bot import FSMAdmin as All_executions
    #ans_list = [0: Execution now, 1: Step_Back, 2: number of photo]
    
    need_exec_id = 10 # Number of executions
    nxt=1
    exec_id = 0
    logging.basicConfig(level=logging.INFO)
    Bot = Bot(token=config.API_TOKEN)
    dp = Dispatcher(Bot, storage=storage)
    async def on_startup(_):
        print('Бот онлайн')
        sqllite_db.sql_start()
    
    async def loading_photo(state,message,ans_list): #Функция загрузки фото с ТГ в БД
        global i
        global exec_id
        global nxt
        diction.update(await state.get_data())
        if message.content_type == 'text':
            if message.text == '0':
                await All_executions.previous()
                await message.answer(ans_list[1])
            else:
                await message.answer('Жду фото')
        elif message.content_type == 'photo':
                try:
                    if i in range(kolfoto):
                        diction.update({'photo_SET_'+ans_list[2]+'_'+str(i) : message.photo[i].file_id})
                        i+=1   
                        await message.photo[-1].download(make_dirs=True, \
                        destination_file='photos/'+diction['adress']+'/'+diction['podiezd']+'/'+message.photo[i-1].file_id+'.jpg')  # скачиваем фото в папку /photos
                    else:
                        return            
                except:
                    print('error loading part '+ans_list[2])
                    await message.answer('Что-то пошло не так, попробуйте заново.')
                if i == kolfoto:
                    i=0
                    print(diction)
                    exec_id+=1
                    try:
                        await sqllite_db.sql_update_test(diction)
                    except:
                        print('изменения не внесены в БД')
                    if exec_id==need_exec_id:
                        await message.answer('Все фото для подъезда №'+diction['podiezd']+\
                                ' загружены, введите номер подъезда или 0 чтобы ввести новый адрес')
                        if int(pod_load) in pod:
                            pod.remove(int(pod_load)) #Удаляем загруженный подьезд из списка
                            if len(pod)==0:
                                await message.answer('Все фото для адреса '+diction['adress']+' загружены.')
                                await state.finish()
                                adresses.remove(adr)
                                keyboard = types.InlineKeyboardMarkup()
                                if len(adresses)>0:
                                    for j in range(len(adresses)):
                                        keyboard.add(types.InlineKeyboardButton(text=adresses[j],\
                                                        callback_data=adresses[j])) #забиваем клавиатуру по списку из БД
                                    await message.answer('Доступные адреса:',reply_markup=keyboard) #вывод клавиатуры с адресами
                                    await All_executions.adress.set() #Запуск состояния ADRESS
                                    await message.answer('Выберите адрес: \
            (если адрес отсутствует, введите вручную)\nИли введите 0 чтобы выйти')
                            else:
                                await All_executions.podiezd.set()
                                await podiezd_input(message, state)  
                    else:
                        await message.answer('Загрузите '+str(kolfoto)+' фото:\n'+ans_list[0])
                        diction.clear()
                        nxt+=1
                        #await All_executions.next()   
                        await All_executions.photostate[nxt].set()
                        await load_photo(message,state)
        else:
            await message.answer('Неизвестный тип входных данных')
    
    def norm_str(findadr):  #Функция нормализации введенного вручную адреса задания
        findadr = findadr.capitalize()
        x = findadr.rfind(' ')
        findadr=findadr[:findadr.index(' ')+1]+findadr[findadr.index(' ')+1].upper()+findadr[findadr.index(' ')+2:]
        findadr=findadr[:findadr.rfind(' ')+1]+'ул, '+findadr[x+1:]
        return findadr
        
    diction ={}
    kolfoto=sqllite_db.sql_start() #количество фото для загрузки
    adress=[]
    pod=[]
    i=0
    pod_load=0
    id_adr=0
    loginin=''
    adr=''
    
    @dp.message_handler(commands=['start'])
    async def send_welcome(message: types.Message):
        await message.answer(f'{message.from_user.first_name},\nВведите | Логин пароль | (через пробел) для начала работы')
    
    #Создание инлайн клавиатуры 
    @dp.message_handler(state=None)
    async def strt_bot(message: types.Message, state: FSMContext):
        keyboard = types.InlineKeyboardMarkup() 
        if message.text != '0':
            global loginin
            loginin=message.text #ввод логин\пароль
            await message.answer('логин = '+loginin)
            if loginin in sqllite_db.login:
                global adresses
                adresses = await sqllite_db.sql_get_adresses(loginin,adress) #запрос в БД для получения списка адресов
                if len(adresses)>0:
                    for j in range(len(adresses)):
                        keyboard.add(types.InlineKeyboardButton(text=adresses[j],\
                             callback_data=adresses[j])) #забиваем клавиатуру по списку из БД
                    await message.answer('Доступные адреса:',reply_markup=keyboard) #вывод клавиатуры с адресами
                    await All_executions.adress.set() #Запуск состояния ADRESS
                    await message.answer('Выберите адрес: (если адрес отсутствует, введите вручную)\nИли введите 0 чтобы выйти')
                else:
                    await message.answer('Нет доступных адресов\nВведите | Логин пароль | (через пробел) для начала работы')
            else:
                await message.answer('Логин пароль = '+loginin+' не имеет задач')
        else:
            if message.text == '0':
                await message.answer('Вы успешно вышли.\nВведите | Логин пароль | (через пробел) для начала работы')
                
    #Нажата инлайн кнопка с адресом
    @dp.callback_query_handler(text_startswith='', state=All_executions.adress)
    async def button_click(call: types.CallbackQuery, state:FSMContext):
        if call.data in adresses:
            async with state.proxy() as data:
                    data['adress']= call.data
                    await call.message.answer(call.data)
                    await All_executions.podiezd.set()  # Запуск состояния ввода номера подьезда
                    global adr
                    adr=call.data #переменная для передачи в запрос к бд
                    global pod
                    global id_adr
                    pod,id_adr = await sqllite_db.sql_get_kol_pod(adr,pod,id_adr) # получаем список подьездов к выбранному адресу и id адреса
                    await call.message.answer('Адрес найден: '+call.data)
                    await call.message.answer("Введите № подьезда, в который пойдете или 0 чтобы ввести адрес заново\nПо данному адресу расположено подьездов: "+str(len(pod)))
                    await call.answer()
        else:
            await call.answer('Нет в списке заданий')
            All_executions.previous()
            await call.answer()
    
    #Адрес введен вручную
    @dp.message_handler(state=All_executions.adress)
    async def hand_input(message: types.Message, state:FSMContext):
        async with state.proxy() as data:
                if data :
                    if message.text == '0':
                        await state.finish()
                        await strt_bot(message, state)
                    else:
                        try:
                            findadr = message.text
                            findadr = norm_str(findadr)
                        except:
                            findadr = message.text
                        if findadr in adresses:  #Поиск в списке адресов
                            await message.answer('Адрес найден: '+findadr)
                            data['adress'] = findadr
                            await All_executions.podiezd.set()
                            global adr
                            global id_adr
                            adr=findadr #переменная для передачи в запрос к бд
                            global pod
                            pod,id_adr = await sqllite_db.sql_get_kol_pod(adr,pod,id_adr) # получаем список подьездов к выбранному адресу
                            await message.answer("Введите № подьезда, в который пойдете или 0 чтобы ввести адрес заново\nПо данному адресу расположено подьездов: "+str(len(pod)))  
                        else:
                            await message.answer('Адрес не найден, введите адрес или введите 0 чтобы выйти')
  • Есть ли какой-то способ прохода по заданным в переменной состояниям в AIOgramm Python?

    @HardX Автор вопроса
    Vindicar, или я что-то делаю не так, или не понял суть, но не происходит перехода по photostates[i], ни через States.next() ни через photostates[i].set()
  • Python 3.10 requests, как прописать try, except для перебора разных прокси?

    @HardX Автор вопроса
    Сорян, забыл про волшебный break
    Спасибо за наводку.
  • Python 3.10 requests, как прописать try, except для перебора разных прокси?

    @HardX Автор вопроса
    Мне нужно, чтобы после удачного подключения прокси функция выполнялась дальше, не перебирая прокси
  • Python 3.10 requests как сформировать не стандартный post?

    @HardX Автор вопроса
    Как доберусь до пк, пришлю код
  • Python 3.10 requests как сформировать не стандартный post?

    @HardX Автор вопроса
    При отправке как файл files=, добавляются лишние поля, и не хватает части того что должно быть. Сервер не принимает.