Как стать автором
Поиск
Написать публикацию
Обновить

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

Время на прочтение4 мин
Количество просмотров12K


Введение


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

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

Для разработки я взял 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/$', Url_Manager, name='Form'),
    url(r'^projects/vk_album/download/$', Url_Manager, name='Form'),
    url(r'^projects/vk_album/authorize/$', Authorize, name='Authorize'),

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

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

Заключение


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

GitHub
Демо
Теги:
Хабы:
Всего голосов 9: ↑7 и ↓2+5
Комментарии7

Публикации

Ближайшие события