35Photo ru: социальная сеть для профессиональных фотографов
# —*- кодировка: utf-8 —*- | |
# Copyright 2019-2022 Майк Ферманн | |
# | |
# Эта программа является бесплатным программным обеспечением; вы можете распространять его и/или модифицировать | |
# это согласно условиям Стандартной общественной лицензии GNU версии 2 как | |
# опубликован Free Software Foundation. | |
«»»Экстракторы для https://35photo. pro/»»» | |
из .common import Extractor, сообщение | |
из .. текст импорта | |
класс _35photoExtractor(Extractor): | |
категория = «35 фото» | |
directory_fmt = («{категория}», «{пользователь}») | |
filename_fmt = «{id}{название:?_//}_{номер:>02}.{расширение}» | |
archive_fmt = «{id}_{num}» | |
корень = «https://35photo. pro» | |
предметов защиты (на себя): | |
сначала = Правда | |
данные = self.metadata() | |
для photo_id в self.photos(): | |
для фото в себе._photo_data(photo_id): | |
фото.обновление(данные) | |
URL = фото[«url»] | |
если первый: | |
сначала = Ложь | |
yield Message. Directory, фото | |
yield Message.Url, url, text.nameext_from_url(url, photo) | |
определение метаданных (я): | |
«»»Возвращает общие метаданные»»» | |
возврат {} | |
фотографий определения (я): | |
«»»Возвращает итерируемый объект, содержащий все соответствующие идентификаторы фотографий»»» | |
def _pagination(self, params, extra_ids=None): | |
URL = «https://35photo. pro/show_block.php» | |
заголовков = {«Referer»: self.root, «X-Requested-With»: «XMLHttpRequest»} | |
параметры[«тип»] = «getNextPageData» | |
, если «lastId» отсутствует в параметрах: | |
параметров[«lastId»] = «999999999» | |
если extra_ids: | |
выход из extra_ids | |
, а параметры[«lastId»]: | |
data = self.request(url, headers=headers, params=params).json() | |
доход от self. _photo_ids(data[«data»]) | |
параметры[«lastId»] = данные[«lastId»] | |
по определению _photo_data(self, photo_id): | |
params = {«method»: «photo.getData», «photoId»: photo_id} | |
данные = self.request( | |
«https://api.35photo.pro/», params=params).json()[«data»][photo_id] | |
информация = { | |
«url»: данные[«источник»], | |
«id»: данные [«photo_id»], | |
«заголовок»: данные[«имя_фотографии»], | |
«описание»: данные[«photo_desc»], | |
«теги» : данные [«теги»] или [], | |
«просмотров»: данные[«photo_see»], | |
«избранное»: данные[«photo_fav»], | |
«оценка»: данные[«photo_rating»], | |
«тип»: данные[«тип_фотографии»], | |
«дата»: данные[«timeAdd»], | |
«пользователь»: данные[«user_login»], | |
«user_id»: данные[«user_id»], | |
«имя_пользователя»: данные[«имя_пользователя»], | |
} | |
, если «серия» в данных: | |
для информации [«num»], фото в enumerate(data[«series»], 1): | |
информация[«url»] = фото[«источник»] | |
информация[«id_series»] = text. parse_int(фото[«id»]) | |
info[«title_series»] = фото[«title»] или «» | |
выход info.copy() | |
иначе: | |
информация[«число»] = 1 | |
выходная информация | |
@статический метод | |
по определению _photo_ids(страница): | |
«»»Извлечь уникальные идентификаторы фотографий и вернуть их в виде отсортированного списка»»» | |
# поиск photo-id=». ..» не всегда работает (см. модульные тесты) | |
если не страница: | |
возврат () | |
вернуть отсортированный( | |
набор(text.extract_iter(страница, «/photo_», «/»)), | |
ключ=text.parse_int, | |
реверс=Истина, | |
) | |
класс _35photoUserExtractor(_35photoExtractor): 9/?#]+)») | |
тест = ( | |
(«https://35photo. pro/liya», { | |
«шаблон»: r»https://([a-z][0-9]\.)?35photo\.pro» | |
r»/photos_(main|series)/.*\.jpg», | |
«количество»: 9, | |
}), | |
(«https://35photo.pro/suhoveev», { | |
# идентификатор последней фотографии (1267028) не указан как ‘photo-id=» | |
# всего 23 фото без последней | |
«количество»: «>= 33», | |
}), | |
(«https://ru. 35photo.pro/liya»), | |
(«https://ru.35photo.pro/liya»), | |
) | |
по определению __init__(я, совпадение): | |
_35photoExtractor.__init__(я, совпадение) | |
self.user = match.group(1) | |
self.user_id = 0 | |
определение метаданных (я): | |
url = «{}/{}/».format(self.root, self.user) | |
страница = self. request(url).text | |
self.user_id = text.parse_int(text.extr(страница, «/user_», «.xml»)) | |
возврат { | |
«пользователь»: self.user, | |
«user_id»: self.user_id, | |
} | |
фотографий определения (я): | |
вернуть self._pagination({ | |
«страница»: «фото пользователя», | |
«user_id»: self.user_id, | |
}) | |
класс _35photoTagExtractor (_35photoExtractor): | |
«»»Извлечение всех фотографий из списка тегов»»» | |
подкатегория = «тег» | |
directory_fmt = («{категория}», «Теги», «{search_tag}») | |
archive_fmt = «t{search_tag}_{id}_{num}» | |
тест = («https://35photo. pro/tags/landscape/», { | |
«диапазон»: «1-25», | |
«количество»: 25, | |
«архив»: Ложь, | |
}) | |
по определению __init__(я, совпадение): | |
_35photoExtractor.__init__(я, совпадение) | |
self.tag = match.group(1) | |
определение метаданных (я): | |
возврат {«search_tag»: text. unquote(self.tag).lower()} | |
фотографий определения (я): | |
число = 1 | |
, правда: | |
url = «{}/tags/{}/list_{}/».format(self.root, self.tag, число) | |
страница = self.request(url).text | |
пред. = нет | |
для photo_id в text.extract_iter(страница, «35photo.pro/photo_», «/»): | |
если photo_id != пред: | |
пред. = photo_id | |
выход photo_id | |
если не пред: | |
возврат | |
число += 1 | |
класс _35photoGenreExtractor(_35photoExtractor): | |
«»»Экстрактор изображений определенного жанра на 35photo.pro»»» | |
подкатегория = «жанр» | |
directory_fmt = («{категория}», «Жанр», «{жанр}») | |
archive_fmt = «g{genre_id}_{id}_{num}» | |
шаблон = r»(?:https?://)?(?:[a-z]+\. )?35photo\.pro/genre_(\d+)(/new/)?» | |
тест = («https://35photo.pro/genre_109/»,) | |
по определению __init__(я, совпадение): | |
_35photoExtractor.__init__(я, совпадение) | |
self.genre_id, self.new = match.groups() | |
self.photo_ids = Нет | |
определение метаданных (я): | |
url = «{}/genre_{}{}».format(self.root, self.genre_id, self.new или «/») | |
страница = self. request(url).text | |
self.photo_ids = self._photo_ids(text.extr( | |
9Страница 0005, «L195» номер строки данных = «195»/> | возврат { |
«жанр»: text.extr(страница, «жанр -«, «.»), | |
«genre_id»: text.parse_int(self.genre_id), | |
} | |
фотографий определения (я): | |
, если не self.photo_ids: | |
возврат () | |
вернуть self. _pagination({ | |
«страница»: «жанр», | |
«community_id»: self.genre_id, | |
«photo_rating»: «0», если self.new еще «50», | |
«lastId»: self.photo_ids[-1], | |
}, self.photo_ids) | |
класс _35photoImageExtractor (_35photoExtractor): | |
«»»Вытягиватель отдельных изображений с 35photo.pro»»» | |
подкатегория = «изображение» | |
шаблон = r»(?:https?://)?(?:[a-z]+\. )?35photo\.pro/photo_(\d+)» | |
тест = («https://35photo.pro/photo_753340/», { | |
«количество»: 1, | |
«ключевое слово»: { | |
«url» : r»re:https://35photo\.pro/photos_main/.*\.jpg», | |
«идентификатор»: 753340, | |
«название»: «Зимняя прогулка», | |
«Описание»: ул, | |
«теги»: список, | |
«просмотров»: целое число, | |
«избранное»: целое число, | |
«счет» : целое, | |
«тип»: 0, | |
«дата» : «15 авг, 2014», | |
«пользователь»: «лия», | |
«user_id»: 20415, | |
«user_name»: «Лия Мирзаева», | |
}, | |
}) | |
по определению __init__(я, совпадение): | |
_35photoExtractor. __init__(я, совпадение) | |
self.photo_id = match.group(1) | |
фотографий определения (я): | |
возврат (self.photo_id,) |
35Photo | Tiktok Search
Tiktok
Загрузка
Ethanmediavilla57
Ethanmediavilla57
EthanMediaLilla57 (@@ThanMediaVilla57
EthanMediaLilla 577). ТикТок
39 лайков, видео TikTok от ethanmediavilla57 (@ethanmediavilla57). 35 фото Другая любовь — Том Оделл.
5518 просмотров|
Another Love — Tom Odell
laceyhastings20
Лейси Хастингс
Все мои любимые люди🤍
63 лайка, видео в TikTok от Лейси Хастингс (@laceyhastings20): «Все мои любимые люди🤍 2022 год в 35 фото🥰 Желтый — Coldplay.
1367 просмотров|
Желтый — Coldplay
wnidd
NİDD 🥷🏻
Tiktok — это новый Twitter FR #FYP #SomethingJustsnappan #Pictures #Relatable
280 Likes, Tiktok Video от NIP 🥷🏻 🥷🏻 🥷🏻 🥷🏻 что-то только что щелкнуло #картинки #относящиеся». POV: этот звук на твоём файпе с 35 картинками Prince vegeta — Simply😵💫.
44,9 тыс. просмотров|
Prince vegeta — Simply😵💫
lamees_dardas
lameesdardas1999
2022 в 35 фото🥹🤍 #FYP #Foryoupage #Foryou #2022 #Trend foryou #2022 #трендовое #фото». 2022 На 35 фото тренд сезона 2022 x Часы от Coldplay — СОВЕТЫ ПО СОЗДАНИЮ КОНТЕНТА.
1810 просмотров|
Тренд сезона 2022 x Часы от Coldplay — СОВЕТЫ ПО СОЗДАНИЮ КОНТЕНТА
marouuasl
Maroua ✨
Прощай 2022 🫶🏼 Всегда один 👸🏼 . . . . . . . . #trend #challenge #instagram #newyear #2022 #hijabstyle #hijab #hijabfashion #hijaber #algeria #algerienne🇩🇿 #algerienne #makeupartist #CapCut
548 лайков, видео в TikTok от Maroua ✨ (@marouuasl): «Прощай, 2022 🫶🏼 Всегда одна 👸🏼 . . . instagram . . . . . . #hijabstyle #hijab #hijabfashion #hijaber #algeria #algerienne🇩🇿 #algerienne #визажист #CapCut». Гизли ашк — Ускорился.
11,9 тыс. просмотров|
Gizli aşk — Sped up
wpc_dinamo_tbilisi
WPC Dinamo Tbilisi
Lets sum up 2022 ✊🏻💦 #sumup2022 #fakebodyy⚠️ #dinamo #ფორიუ #challenge #trends #friends #photos
318 Likes, TikTok видео от WPC Dinamo Tbilisi (@wpc_dinamo_tbilisi): «Подводим итоги 2022 ✊🏻💦 #sumup2022 #fakebodyy⚠️ #dinamo #ფორიუ #ch #ch оригинальный звук — CAPCUT TEMPLATES.