Форум сайта python.su
Есть класс для работы 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)
Офлайн