Разработка сервиса по загрузке альбомов

от автора

Введение

Не так давно появилось желание скачать из альбома сообщества все изображения, поискав в интернете подходящий сервис, наткнулся лишь на платные сервисы, что мне не совсем подходило.

И вот в преддверии дня рождения, появилось время и отличное настроение для написания сервиса.

Для разработки я взял Python, и решил что напишу приложение для уже имеющегося проекта на Django. Итак, поехали.

Создаем приложение Вконтакте, указываем сайт где будет размещаться сервис. И получаем данные приложения, которые записываем в наше приложение.

Исходные данные приложения Вконтакте.

client_id = '5366344' client_secret = 'g8uyxFMdQcnL9Hak5hup' redirect_uri = 'https://devel0per.space/projects/vk_album/authorize' 

Создадим главную форму для ввода пользователем ссылки на альбом.

class Form_Album(forms.Form):     url_album = forms.CharField(widget=forms.Textarea(attrs={'class': 'form-control materail_input', 'rows': '1',                                                              'style': 'resize:none'})) 

Авторизуем пользователя, и так как мы используем метод photos.get полученный token нам не потребуется. После авторизации просто переадресуем пользователя на нашу форму.

def Authorize(request):     if request.method == 'GET':         code = request.GET.get('code')         responce = (requests.get('https://oauth.vk.com/access_token?client_id='+client_id+'&client_secret='+client_secret+'&redirect_uri='+redirect_uri+'&code='+code)).json()         token = responce['access_token']          return HttpResponseRedirect ('/projects/vk_album/') 

Добавляем обработчик формы.

#Обработчик формы def Url_Manager(request):     if request.method == 'POST':         form = Form_Album(request.POST)         #Проверяем введенные пользователем данные на наличие слова альбом, т.к все альбомы вконтакте его содержат.         if re.findall('album',request.POST.get('url_album')) == ['album']:              #Удаляем все символы заканчивающиеся слово album и разделяем             url_album = re.sub('.*album','',request.POST.get('url_album')).split("_")              #фотографии на странице             if url_album[1] == '0':                 photos_get = (requests.post('https://api.vk.com/method/photos.get?owner_id='+str(url_album[0])+'&album_id=profile&v=5.50')).json()                 return Download_Url(photos_get,url_album)              #фотографии на стене             elif url_album[1] == '00?rev=1':                 photos_get = (requests.post('https://api.vk.com/method/photos.get?owner_id='+str(url_album[0])+'&album_id=wall&v=5.50')).json()                 return Download_Url(photos_get,url_album)              #сохраненные фотографии             elif url_album[1] == '000':                 photos_get = (requests.post('https://api.vk.com/method/photos.get?owner_id='+str(url_album[0])+'&album_id=saved&v=5.50')).json()                 return Download_Url(photos_get,url_album)              #Обычный альбом             elif re.match ('\d',str(url_album [1])) != None:                 photos_get = (requests.post('https://api.vk.com/method/photos.get?owner_id='+str(url_album[0])+'&album_id='+str(url_album[1])+'&v=5.50')).json()                 return Download_Url(photos_get,url_album)             else:                 #Ошибка пользователю, что не правильно введена ссылка                 return render(request, 'vk_album.html', {'error': 'Введите правильную ссылку','form': form})          else:             #Ошибка пользователю, что не правильно введена ссылка             return render(request, 'vk_album.html', {'error': 'Введите правильную ссылку','form': form})     else:         form = Form_Album()      #отрисовка страницы с формой     return render(request, 'vk_album.html', {'form': form}) 

И последний штрих, получение ссылок и скачивание. А так же создание архива.

def Download_Url(photos_get,url_album):      #директория для загрузки     download_dir = '/home/khramtsov/vk_album/'+url_album[0]      os.mkdir(download_dir)      #Выборка у каждого объекта лучшего разрешения     for slice in photos_get['response']['items']:             if 'photo_1280' in slice:                 os.system('wget -P '+download_dir+' '+slice['photo_1280'])             elif 'photo_807' in slice:                 os.system('wget -P '+download_dir+' '+slice['photo_807'])             elif 'photo_604' in slice:                 os.system('wget -P '+download_dir+' '+slice['photo_604'])             elif 'photo_130' in slice:                 os.system('wget -P '+download_dir+' '+slice['photo_130'])             elif 'photo_75' in slice:                 os.system('wget -P '+download_dir+' '+slice['photo_75'])      #Архивирование изображений     zip=ZipFile(download_dir+'.zip',mode='w')     for root, dirs, files in os.walk(download_dir):         for file in files:             zip.write(os.path.join(root,file),arcname=os.path.join('Album', file))     zip.close()      #Удаялем директорию в которую производилась закачка     os.system('rm -R '+download_dir)      #Отдаем файл пользователю     response = HttpResponse(open(download_dir+'.zip', 'rb').read(),content_type='application/zip')     response['Content-Disposition'] = 'attachment; filename='+url_album[1]+'.zip'      return response 

Добавляем url к нашему проекту:

    url(r'^projects/vk_album/$', Download_Album, name='Form'),     url(r'^projects/vk_album/download/$', Download_Album, name='Form'),     url(r'^projects/vk_album/authorize/$', Authorize, name='Authorize'), 

И теперь когда у вас все готово, делаем html страницу с формой.

<!-- Выводим наши ошибки о том, что пользователь ввел не правильную ссылку --> <p class="bg-danger text-center">{{ error }}</p> <!-- Выводим форму --> {{ form }} 

Заключение

В итоге у нас получился свой сервис загрузки изображений из альбомов Вконтакте, который можно дополнить своим функционалом. Как например сбор статистики, и так далее.

Сервис на продакшене можно найти в Bitbucket.

ссылка на оригинал статьи https://habrahabr.ru/post/279977/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *