Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> Python Форум Помощи!

Мы создали форум где отвечаем на все вопросы связанные с языком программирования Python. Ждем вас там!

>> Python Канал в Telegram

Обучающие статьи, видео и новости из мира Python. Подпишитесь на наш TELEGRAM КАНАЛ!

Свой сервис для загрузки альбомов на Python

Свой сервис для загрузки альбомов на Python

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

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

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

Самый надежный суперклей!

Ищите хороший суперклей, который будет надежно держать соединение, и склеивать практически любые материалы? В таком случае рекомендуем качественный супер клей от компании «АСКО-УКРЕМ», купить и изучить информацию о котором вы можете на официальном сайте компании www.аско.ua. Это однокомпонентный моментальный клей, основанный на этилцианакрилате, склеивает распространенные в быту материалы, качественно, надежно и быстро соединяет склеиваемые поверхности.

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

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.het, нам не нужен будет полученный 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 }}

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