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.

pro/»»»
pro»
Directory, фото
pro/show_block.php»
_photo_ids(data[«data»])
parse_int(фото[«id»])
..» не всегда работает (см. модульные тесты)
pro/liya», {
35photo.pro/liya»),
request(url).text
pro/tags/landscape/», {
unquote(self.tag).lower()}
= photo_id
)?35photo\.pro/genre_(\d+)(/new/)?»
request(url).text
_pagination({
)?35photo\.pro/photo_(\d+)»
__init__(я, совпадение)