Модуль tabun_api.utils

Вспомогательный модуль с независимыми от API функциями.

class tabun_api.utils.HTMLFormatter(params=None)[исходный код]

Гибкий и расширяемый конвертер lxml-элементов в красивые строки подобно браузеру links и родственным ему.

В словаре params можно указать следующие параметры:

  • fancy (True/False, по умолчанию True) — грамотно форматирует спойлеры и убирает кнопку ката при наличии
  • strike_mode (unicode (по умолчанию) или html) — как форматировать зачёркивания
  • vk_links (True/False, по умолчанию False) — преобразует ссылки вида https://vk.com/foo в @foo (текст ссылки) для отправки во ВКонтакте
  • disable_links (True/False, по умолчанию False) — удаляет ссылки, если текст ссылки совпадает с самой ссылкой (примитивный антиспам)

Пример использования:

node = parse_html_fragment('<div>a <s>bc</s> <hr/> d   ef<br/>g<a></a>cut</div>')[0]
HTMLFormatter({'strike_mode': 'html'}).format(node, with_cutted=False)

Результат:

a <s>bc</s>
=====
d ef
g
format(node, with_cutted=True)[исходный код]

Форматирует lxml-элемент.

Параметры:
  • node – сам lxml-элемент
  • with_cutted (bool) – если False, обработка будет прекращена после натыкания на тег-кат (когда is_cut() вернёт True)
Тип результата:

строка

tabun_api.utils.ava_regex = re.compile('\\/((images)|(storage))\\/([0-9]+)\\/([0-9]+)\\/([0-9]+)\\/([0-9]+)\\/([0-9]+)\\/([0-9]+)\\/avatar_([0-9]+)x([0-9]+)\\.(...)(\\?([0-9]+))?')

Регулярка для парсинга ссылки на аватарку — из неё можно узнать много полезного!

tabun_api.utils.block_elems = ('div', 'p', 'blockquote', 'section', 'ul', 'li', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6')

Блочные элементы, для красивого вывода в htmlToString (устарело, используйте HTMLFormatter.block_elems)

tabun_api.utils.build_proxy_params(proxy=None)[исходный код]

Парсит URL с параметрами прокси-сервера и возвращает словарь с аргументами для конструктора SocksiPyHandler. Если прокси пустой, возвращает просто None.

Параметры:proxy (str) – URL с параметрами прокси
Тип результата:dict или None
tabun_api.utils.cf_email = re.compile('<[A-Za-z]+( href="/cdn-cgi/l/email-protection")? class="__cf_email__".*? data-cfemail="([0-9a-f]+)".+?</[A-Za-z]+>', re.DOTALL)

Регулярка для расшифровки почты, которую шифрует CloudFlare.

tabun_api.utils.cf_email_a = re.compile('<[Aa]\\s([^>]*)href="/cdn-cgi/l/email-protection#([0-9a-f]+)"(\\s[^>]*)?>', re.DOTALL)

Тоже регулярка для расшифровки почты, которую шифрует CloudFlare, но для ссылок.

tabun_api.utils.cf_email_s = re.compile('<script.{1,2048}getAttribute\\(.data-cfemail.\\).{1,2048}</script>', re.DOTALL)

Регулярка, убирающая скрипты расшифровки почты от CloudFlare.

tabun_api.utils.download(url, maxmem=20971520, timeout=5, waitout=15, headers=None)[исходный код]

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

Параметры:
  • url (строка) – ссылка, которую скачать
  • maxmem (int) – допустимый максимальный размер скачиваемых данных
  • timeout (float) – как долго можно ждать ответа
  • waitout (float) – как долго можно скачивать данные (простенькая защита от Slow TCP DoS Attack — timeout тут не поможет)
Тип результата:

bytes

tabun_api.utils.encode_multipart_formdata(fields, files, boundary=None)[исходный код]

Возвращает кортеж (content_type, body), готовый для отправки HTTP POST–запроса.

Значения полей и файлов могут быть строками (закодируются в utf-8), bytes или числами (будут преобразованы в строку).

Параметры:
  • fields (коллекция кортежей (название, имя файла, значение)) – простые поля запроса
  • fields – файлы запроса (MIME-тип будет выбран по расширению)
  • boundary (строка или bytes) – boundary (по умолчанию генерируется случайные)
Тип результата:

(строка, bytes)

tabun_api.utils.escape_blog_content(data)[исходный код]

Экранирует описание блога.

tabun_api.utils.escape_comment_contents(data)[исходный код]

Экранирует содержимое комментов.

tabun_api.utils.escape_profile_content(data)[исходный код]

Экранирует содержимое блока «О себе» профиля.

tabun_api.utils.escape_topic_contents(data, may_be_short=False)[исходный код]

Экранирует содержимое постов для защиты от поехавшей вёрстки и багов lxml.

tabun_api.utils.find_good_image(urls, maxmem=20971520)[исходный код]

Ищет годную картинку из предложенного списка ссылок и возвращает ссылку и скачанные данные картинки (файл, bytes). Такой простенький фильтр смайликов и элементов оформления поста по размеру.

Требует PIL или Pillow.

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

tabun_api.utils.find_images(body, spoiler_title=True, no_other=False)[исходный код]

Ищет картинки в lxml-элементе и возвращает их список в виде [[ссылки до ката], [ссылки после ката]].

Параметры:
  • spoiler_title (bool) – включать ли картинки с заголовков спойлеров
  • no_other (bool) – исключать ли всякий мусор. Фильтрация простейшая: по наличию «smile» или «gif» в ссылке, также убираются табунские аватарки и навигация АльтерБРЕДаций.
Тип результата:

[list, list]

tabun_api.utils.find_substring(s, start, end, extend=False, with_start=True, with_end=True)[исходный код]

Возвращает подстроку, находящуюся между кусками строки start и end, или None, если не нашлось.

При extend=True кусок строки end ищется с конца (rfind).

tabun_api.utils.gen_user_agent()[исходный код]

Генерирует кусочек юзерагента с информацией о системе.

tabun_api.utils.generate_comments_tree(comms)[исходный код]

Строит дерево комментариев из словаря, возвращаемого функциями get_comments[_from].

Формат элемента: [(комментарий, элемент), (комментарий, элемент), …]

Возвращает само такое дерево и список номеров комментариев-сирот (по идее должен быть пустой, но мало ли).

Параметры:comms ({id: Comment()}) – словарь комментариев
Тип результата:(list, list)
tabun_api.utils.get_content_type(filename)[исходный код]

return mimetypes.guess_type(filename)[0] or „application/octet-stream“

tabun_api.utils.get_cookies_dict(headers)[исходный код]

Возвращает словарь с печеньками, взятыми из HTTP-заголовков Set-Cookie. Ключи и значения — Unicode-строки (unicode в Python 2, str в Python 3).

Параметры:headers (http.client.HTTPMessage) – объект с HTTP-заголовками
Тип результата:dict
tabun_api.utils.html_escape(s, single_quote=False)[исходный код]

Заменяет на html-сущности следующие символы: &, <, >, ". При single_quote=True ещё и ' на &#39;.

tabun_api.utils.is_cut(item)[исходный код]

Возвращает True, если тег похож на кат (на момент написания это <a id="cut"></a> (новый) или <a></a> (старый)).

tabun_api.utils.is_module_available(name)[исходный код]

Проверяет доступность модуля для импорта, при этом не импортируя его.

Параметры:name (str) – имя модуля
Тип результата:bool
tabun_api.utils.logger = <logging.Logger object>

Логгер tabun_api.

tabun_api.utils.mon2num(s)[исходный код]

Переводит названия месяцев в числа, чтобы строку можно было скормить в strftime.

tabun_api.utils.mons = ('января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря')

Месяцы, для парсинга даты.

tabun_api.utils.node2string(node, encoding='utf-8')[исходный код]

Переводит html-элемент в байтовую строку.

tabun_api.utils.normalize_body(body=None, raw_body=None, cls='text')[исходный код]

Кодирует lxml-элемент в исходник html или наоборот декодирует исходник в lxml-элемент.

tabun_api.utils.parse_avatar_url(url)[исходный код]

Парсит ссылку на аватарку и возвращает id пользователя, дату отправки, размер, расширение и какой-то номер с конца ссылки. Если не удалось распарсить, то всё None.

Параметры:url (строка) – ссылка
Тип результата:(int, «YYYY-MM-DD», (int, int), строка, int или None)
tabun_api.utils.parse_datetime(s, utc=True)[исходный код]

Парсит дату-время в формате ISO 8601 и возвращает объект datetime с часовым поясом. При utc=True возвращает время в UTC (без привязки к часовому поясу для совместимости с Python 2), иначе — что распарсилось.

tabun_api.utils.parse_html(data, encoding='utf-8')[исходный код]

Парсит HTML-код и возвращает lxml.etree-элемент.

tabun_api.utils.parse_html_fragment(data, encoding='utf-8')[исходный код]

Парсит кусок HTML-кода и возвращает список lxml.etree-элементов и строк.

tabun_api.utils.replace_cloudflare_emails(data)[исходный код]

Декодирует почты, которые зашифровал CloudFlare, в html-странице.

tabun_api.utils.send_form(url, fields, files, timeout=None, headers=None)[исходный код]

Отправляет форму, пользуясь функцией encode_multipart_formdata().

Значения полей и файлов могут быть строками (закодируются в utf-8), bytes или числами (будут преобразованы в строку).

Параметры:
  • fields (коллекция кортежей (название, имя файла, значение)) – простые поля запроса
  • fields – файлы запроса (MIME-тип будет выбран по расширению)
  • timeout (float) – сколько ожидать ответа, не дождётся - кидается исключением urllib
  • headers (кортежи из двух строк/bytes или словарь) – дополнительные HTTP-заголовки (повторяться не могут)
Тип результата:

urllib.addinfourl / urllib.response.addinfourl

tabun_api.utils.youtube_regex = re.compile('youtube.com\\/embed\\/(.{10,15})((\\?)|($))')

Регулярка для парсинга ютуба для выдирания превьюшки.