You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

87 lines
3.4 KiB

# -*- 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'<original-text><content>%s</content></original-text>' % 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)