# -*- coding: utf-8 -*- from urllib import quote import requests from lxml import etree class YandexWebmasterException(Exception): def __init__(self, req, *args, **kwargs): _max_text_len = 1000 _text = u'%s ... (too long)' % req.text[:_max_text_len] if len(req.text) > _max_text_len else req.text message = u'%s %s. Error: %s' % (req.status_code, req.reason, _text) super(YandexWebmasterException, self).__init__(message, *args, **kwargs) class YandexWebmaster(object): api_url = 'https://webmaster.yandex.ru/api/v2' def __init__(self, token, domain): self.token = token self.domain = domain self.hosts_url = None self.resources_url = None self.resource = {} def _get_service_document(self): """Получить сервисный документ. Из которого извлечь адрес списка сайтов пользователя. """ req = requests.get(self.api_url, headers={'Authorization': 'OAuth %s' % self.token}) if req.status_code == 200: root = etree.fromstring(req.content) links = root.xpath('//link[@rel="host-list"]/@href') self.hosts_url = links[0] else: raise YandexWebmasterException(req) def _get_hosts(self): """Получить список сайтов пользователя и сводную информацию о каждом из них. Из этого списка извлечь адрес ресурса сайта по его домену. """ if not self.hosts_url: self._get_service_document() req = requests.get(self.hosts_url, headers={'Authorization': 'OAuth %s' % self.token}) if req.status_code == 200: root = etree.fromstring(req.content) hosts = [host for host in root.xpath('//hostlist/host') if host.xpath('./name[text()=$domain]', domain=self.domain) ] self.resources_url = hosts[0].get('href') else: raise YandexWebmasterException(req) def _get_resources(self): """Получить адреса ресурсов, относящихся к данному сайту. Пока только адрес ресурса для работы с оригинальными текстами. """ if not self.resources_url: self._get_hosts() req = requests.get(self.resources_url, headers={'Authorization': 'OAuth %s' % self.token}) if req.status_code == 200: root = etree.fromstring(req.content) links = root.xpath('//link[@rel="original-texts"]/@href') self.resource['original_texts_url'] = links[0] else: raise YandexWebmasterException(req) def add_original_text(self, content): """Добавить оригинальный текст сайта.""" if 'original_texts_url' not in self.resource: self._get_resources() content = quote(content.encode('utf-8')) xml = (u'%s' % content) req = requests.post(self.resource['original_texts_url'], data=xml, headers={'Authorization': 'OAuth %s' % self.token, 'Content-Length': len(xml)}) if not req.status_code == 201: raise YandexWebmasterException(req)