Source code for taxydromikilib.taxydromikilib

#!/usr/bin/env python2.7
# -*- coding: UTF-8 -*-
# File: taxydromikilib.py
"""
Main module file

Put your classes here
"""
from __future__ import unicode_literals
from requests import Session
from bs4 import BeautifulSoup as Bfs
import time
import logging

__author__ = '''Costas Tyfoxylos <costas.tyf@gmail.com>'''
__docformat__ = 'plaintext'
__date__ = '''25-09-2017'''

# This is the main prefix used for logging
LOGGER_BASENAME = '''taxydromikilib'''
LOGGER = logging.getLogger(LOGGER_BASENAME)
LOGGER.addHandler(logging.NullHandler())


[docs]class TrackingState(object): def __init__(self, data): self._data = data def _get_data(self, class_name): try: value = self._data.find('div', {'class': class_name}).contents[1] except Exception: # noqa value = None return value @property def status(self): return self._get_data('checkpoint-status') @property def location(self): return self._get_data('checkpoint-location') @property def date(self): return self._get_data('checkpoint-date') @property def time(self): return self._get_data('checkpoint-time') @property def is_final(self): return 'tracking-delivery last' in unicode(self._data)
[docs]class Taxydromiki(object): def __init__(self): self._base_url = 'https://www.taxydromiki.com' self._headers = {'User-Agent': ('Mozilla/5.0 (X11; Linux x86_64) ' 'AppleWebKit/537.36 (KHTML, like Gecko)' ' Chrome/60.0.3112.113 Safari/537.36'), 'Accept-Language': 'en-US,en;q=0.5', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': ('text/html,application/xhtml+xml,' 'application/xml;q=0.9,image/webp,' 'image/apng,*/*;q=0.8')} self._session = None def _initialize(self): self._session = Session() headers = self._headers.copy() headers.update({'Upgrade-Insecure-Requests': '1', 'cache-contol': 'max-age=0'}) url = '{base}/track'.format(base=self._base_url) response = self._session.get(url, headers=headers) form_build_id, theme_token = self._get_tokens(response) self._perform_ajax_blocks_call() return form_build_id, theme_token @staticmethod def _get_tokens(response): soup = Bfs(response.text, "html.parser") form = soup.find('form', {'id': 'custom-geniki-tracking-page-form'}) form_build_id = form.find('input', {'name': 'form_build_id'}).attrs.get('value') index = response.text.find('theme_token') theme_token = response.text[index:index + 80].split('"')[1] return form_build_id, theme_token def _perform_ajax_blocks_call(self): url = '{base}/ajaxblocks'.format(base=self._base_url) headers = self._headers.copy() headers.update({'Accept': ('application/json, text/javascript, */*; ' 'q=0.01'), 'X-Requested-With': 'XMLHttpRequest', 'Referer': '{base}/track'.format(base=self._base_url)}) payload = {'_': str(int(time.time()*1000)), 'blocks': 'custom-custom_time_date', 'path': 'track', 'nocache': '1'} response = self._session.get(url, headers=headers, params=payload) return response.ok
[docs] def search(self, tracking_number): form_build_id, theme_token = self._initialize() url = '{base}/system/ajax'.format(base=self._base_url) headers = self._headers.copy() headers.update({'Host': 'www.taxydromiki.com', 'Accept': ('application/json, text/javascript, */*; ' 'q=0.01'), 'Content-Type': 'application/x-www-form-urlencoded', 'X-Requested-With': 'XMLHttpRequest', 'Referer': '{base}/track'.format(base=self._base_url), 'Origin': self._base_url}) payload = {'_triggering_element_name': 'op', '_triggering_element_value': u'Αναζήτηση', 'ajax_html_ids[]': [ 'mp-pusher', 'mp-menu', 'block-custom-custom-time-date', 'block-custom-custom_time_date-ajax-content', 'block-custom-custom-account-menu', 'block-lang-dropdown-language-content', 'lang_dropdown_form_language_content', 'lang-dropdown-select-language_content', 'trigger', 'block-system-main-menu', 'block-custom-geniki-tracking-form', 'custom-geniki-tracking-form', 'edit-tracking-number--2', 'edit-submit--3', 'block-block-10', 'main-content', 'custom-geniki-tracking-page-form', 'edit-tracking-searchbox', 'edit-tracking-number', 'edit-submit', 'tracking-result', 'block-menu-block-1', 'block-user-login', 'user-login-form', 'edit-name', 'edit-pass', 'edit-actions', 'edit-submit--4', 'block-block-3', 'block-block-4', 'block-block-9', 'block-block-2', 'block-menu-menu-footer-menu', 'block-menu-menu-footer-second', 'block-block-8'], 'ajax_page_state[css][modules/node/node.css]': '1', 'ajax_page_state[css][sites/all/modules/ckeditor/css/ckeditor.css]': '1', 'ajax_page_state[css][sites/all/modules/ctools/css/ctools.css]': '1', 'ajax_page_state[css][sites/all/modules/date/date_api/date.css]': '1', 'ajax_page_state[css][sites/all/modules/date/date_popup/themes/datepicker.1.7.css]': '1', 'ajax_page_state[css][sites/all/modules/lang_dropdown/lang_dropdown.css]': '1', 'ajax_page_state[css][sites/all/modules/logintoboggan/logintoboggan.css]': '1', 'ajax_page_state[css][sites/all/modules/views/css/views.css]': '1', 'ajax_page_state[css][sites/all/themes/omega/omega/omega/css/modules/field/field.theme.css]': '1', 'ajax_page_state[css][sites/all/themes/omega/omega/omega/css/modules/search/search.theme.css]': '1', 'ajax_page_state[css][sites/all/themes/omega/omega/omega/css/modules/system/system.base.css]': '1', 'ajax_page_state[css][sites/all/themes/omega/omega/omega/css/modules/system/system.menus.theme.css]': '1', 'ajax_page_state[css][sites/all/themes/omega/omega/omega/css/modules/system/system.messages.theme.css]': '1', 'ajax_page_state[css][sites/all/themes/omega/omega/omega/css/modules/system/system.theme.css]': '1', 'ajax_page_state[css][sites/all/themes/omega/omega/omega/css/modules/user/user.base.css]': '1', 'ajax_page_state[css][sites/all/themes/omega/omega/omega/css/modules/user/user.theme.css]': '1', 'ajax_page_state[css][sites/all/themes/taxydromiki/css/after.css]': '1', 'ajax_page_state[css][sites/all/themes/taxydromiki/css/taxydromiki.hacks.css]': '1', 'ajax_page_state[css][sites/all/themes/taxydromiki/css/taxydromiki.no-query.css]': '1', 'ajax_page_state[css][sites/all/themes/taxydromiki/css/taxydromiki.normalize.css]': '1', 'ajax_page_state[css][sites/all/themes/taxydromiki/css/taxydromiki.print.css]': '1', 'ajax_page_state[css][sites/all/themes/taxydromiki/css/taxydromiki.styles.css]': '1', 'ajax_page_state[js][0]': '1', 'ajax_page_state[js][misc/ajax.js]': '1', 'ajax_page_state[js][misc/drupal.js]': '1', 'ajax_page_state[js][misc/form.js]': '1', 'ajax_page_state[js][misc/jquery.cookie.js]': '1', 'ajax_page_state[js][misc/jquery.js]': '1', 'ajax_page_state[js][misc/jquery.once.js]': '1', 'ajax_page_state[js][misc/progress.js]': '1', 'ajax_page_state[js][public://languages/el_j43hC-GL4y98fNlJzVRM9SL0SKGIvZ5zF9vHNPqFpS8.js]': '1', 'ajax_page_state[js][sites/all/modules/ajaxblocks/ajaxblocks.js]': '1', 'ajax_page_state[js][sites/all/modules/browserclass/browserclass.js]': '1', 'ajax_page_state[js][sites/all/modules/clientside_validation/clientside_validation.ie8.js]': '1', 'ajax_page_state[js][sites/all/modules/clientside_validation/clientside_validation.js]': '1', 'ajax_page_state[js][sites/all/modules/clientside_validation/jquery-validate/jquery.validate.min.js]': '1', 'ajax_page_state[js][sites/all/modules/clientside_validation/jquery.form.js]': '1', 'ajax_page_state[js][sites/all/modules/custom/custom_geniki/custom_geniki.tracking.js]': '1', 'ajax_page_state[js][sites/all/modules/google_analytics/googleanalytics.js]': '1', 'ajax_page_state[js][sites/all/modules/lang_dropdown/lang_dropdown.js]': '1', 'ajax_page_state[js][sites/all/themes/omega/omega/omega/js/no-js.js]': '1', 'ajax_page_state[js][sites/all/themes/taxydromiki/js/classie.js]': '1', 'ajax_page_state[js][sites/all/themes/taxydromiki/js/jquery.hoverIntent.js]': '1', 'ajax_page_state[js][sites/all/themes/taxydromiki/js/jquery.uniform.js]': '1', 'ajax_page_state[js][sites/all/themes/taxydromiki/js/jquery.wookmark.js]': '1', 'ajax_page_state[js][sites/all/themes/taxydromiki/js/mlpushmenu.js]': '1', 'ajax_page_state[js][sites/all/themes/taxydromiki/js/modernizr.custom.js]': '1', 'ajax_page_state[js][sites/all/themes/taxydromiki/js/taxydromiki.behaviors.js]': '1', 'ajax_page_state[js][sites/all/themes/taxydromiki/js/taxydromiki.responsive.js]': '1', 'ajax_page_state[js][sites/all/themes/taxydromiki/libraries/html5shiv/html5shiv-printshiv.min.js]': '1', 'ajax_page_state[js][sites/all/themes/taxydromiki/libraries/html5shiv/html5shiv.min.js]': '1', 'ajax_page_state[theme]': 'taxydromiki', 'ajax_page_state[theme_token]': theme_token, 'form_build_id': form_build_id, 'form_id': 'custom_geniki_tracking_page_form', 'tracking_number': tracking_number} response = self._session.post(url, headers=headers, data=payload) response_data = next((entry for entry in response.json() if entry.get('command') == 'insert'), None) soup = Bfs(response_data.get('data'), 'html.parser') entries = soup.find_all('div', {'class': 'tracking-checkpoint'}) return [TrackingState(entry) for entry in entries]