Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 15, 2012 10:29:26

mironich
От:
Зарегистрирован: 2011-05-23
Сообщения: 118
Репутация: +  2  -
Профиль   Отправить e-mail  

Как правильно реализовать?

Есть класс для работы vk api.
Есть метод для загрузки фото, и тут начинаються проблемы, ВК за раз можно загрузить 5 фото, но описание в таком случае надо указывать каждой отдельно, ну это пол беды, обьеденил аплоад и установку описания в один метод.
Проблема: при установке описаний может вылететь каптча, соответсвенно фото загружены, а описание установлено допустим 2 фото из 5, при появлении каптчи вылетает исключение, оно обрабатываеться человек вводит какптчу, но как программе вернуться потом на тоже место… Насколько оптимально, сохраняться все нужные переменные, в атрибуты класса чтобы потом вернуться в нужное место и закончить нужные действия.
Или лучше разбить аплоад и прикрпление описания на 2 метода?

    def uploads_foto_to_album(self, photos, aid, gid = None, cp_sid = None, cp_key = None):
        """
        VKApi.uploads_foto_to_album(photos, aid, gid = None)
        photos - Список кортежей вида: (Тело фото, расширение фото, описание фото(м.б None)), 
        должен содержать не более 5 кортежей.
        aid - Айди альбома например 126663199.
        gid - Айди группы необходимо указать если грузим в группу.
        cp_sid - Айди каптчи
        cp_key - Текст каптчи
        Грузит все фото в указанный альбом\группу, и прикрепляет описание если указано
        """
        if len(photos) > 5: #ВК разрешено грузить за раз не более 5 фото
            raise vkApiError('Many photo')
        if gid:             #Если грузим в группу необходимо указать ID
            params = {
                'aid': aid,
                'gid': gid
            }
        else:
            params = {
                'aid': aid,
            }
        if cp_sid and cp_key:
            #Получаем сервер куда грузить фото 
            upload_url = str(self.call_api('photos.getUploadServer', params)['upload_url'], cp_sid, cp_key)
        else:
            upload_url = str(self.call_api('photos.getUploadServer', params)['upload_url'])
        #Формируем тело multipart\form-data запроса
        post_data = Multipart()
        photo_num = 1
        for photo, ext, dest in photos:
             field_name = 'file%i' % photo_num
             post_data.addPart(field_name, photo, ''.join([field_name, ext]), 'image/%s' % ext)
             photo_num += 1
        self._httpCl.post(upload_url, post_data) #Грузим фото на сервер ВК
        self.request_result = json.loads(self._httpCl.body)
        if gid:
            params['gid'] = gid
        params['hash'] = self.request_result[u'hash']
        params['photos_list'] = self.request_result[u'photos_list']
        params['server'] = self.request_result[u'server']
        params['aid'] = aid
        #Т.к при загрузке более одного фото прифигачит всем одинаковое описание,
        #далее в цикле ниже проверяються кортежи с фото на наличие описаний, дабы
        #не дергать лишний раз этот цикл написано это условие..
        if len(photos) == 1 and photos[0][2]: 
            params['caption'] = photos[0][2]
        resp_photo = self.call_api('photos.save', params) #Сохраняем в нужном альбоме..
        #Если фоток несколько то каждую в цикле чекаем на наличие описание, 
        #и если оно есть, то через метод photos.edit(ВК API) добавляем им описание..
        if len(photos) > 1: 
            resp_photo.reverse() #Т.к из списка полученых фото все достаеться через pop реверсим список..
            for photo_item in photos:  #Вот тут м.б исключение с каптчей
                pid = resp_photo.pop()[u'pid']
                if photo_item[2]:
                    if gid:
                        params = {
                        'pid': pid,
                        'caption': photo_item[2],
                        'owner_id': ''.join(['-', gid])
                        }
                    self.call_api('photos.edit', params)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version