Как стать автором
Поиск
Написать публикацию
Обновить

Авторизация и добавление сайта в Яндекс Вебмастер с помощью python

Здравствуйте. В этой статье я постараюсь подробно рассказать о работе urllib2 с cookie на примере авторизации и добавления сайта в Yandex Webmaster. Писал код при создании автоматизированного seo комплекса.

Ну что ж, приступим.

Первым этапом необходимо перехватить все запросы браузера к серверу. Для этого я пользовался всем известным дополнением firebug для firefox. Можно использовать и другие средства, например, live http headers для того же firefox. Думаю, с этим вопросов не возникнет.
После получения всей необходимой информации, можно приступать к написанию программы.

Первоначально импортируем необходимые модули и подготавливаем urllib2 к работе с cookie:
Copy Source | Copy HTML
  1. import urllib
  2. import urllib2
  3. import re
  4. import cookielib
  5.  
  6. cookieJar = cookielib.CookieJar()
  7. opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))
  8. headers = {"User-Agent":"Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6", "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Keep-Alive": "115", "Connection":"keep-alive"}


Теперь мы можем открывать страницы таким образом:
Copy Source | Copy HTML
  1. params=urllib.urlencode({ словарь переменных и значений })
  2. req=urllib2.Request('http://test.com', params, headers) #headers - из предыдущего листинга; представляемся серверу браузером а не роботом
  3. opener.open(req) #собственно, открываем страницу с параметрами 


Теперь проходим авторизацию:
Copy Source | Copy HTML
  1. account=['yandex_login', 'yandex_password'] #ваши логин и пароль от аккаунта Яндекса
  2. params = urllib.urlencode({'login':account[ 0], 'passwd':account[1], 'twoweeks':'yes', 'retpath':'http://webmaster.yandex.ru'})
  3. req = urllib2.Request('http://pda-passport.yandex.ru/passport?mode=mauth', params, headers)
  4. opener.open(req)


И все! urllib2 предоставляет очень высокоуровневые методы работы с сайтами. Если вы посмотрите всю процедуру авторизации в Яндексе, то увидите, что она состоит из множества шагов, с переадресациями и прочими сложностями. А urllib2 все это делает автоматически.

Теперь выложу сразу всю функцию добавления сайта с пояснениями. Думаю, там все понятно.
Copy Source | Copy HTML
  1. def getUniq(data):
  2.     d=re.compile('(.*?)')
  3.     res=re.findall(d, data)
  4.     return res[ 0]
  5. """После добавления сайта в панель Вебмастера необходимо пройти процедуру верификации сайта путем создания пустого файла в корне сайта. Функция getUniq() получает имя этого файла.<br/>Наверно, удобнее использовать BeautifulSoup для этой цели, но и решение с regexp имеет место быть."""
  6.  
  7. def addSite(your_site):
  8.     params = urllib.urlencode({'hostname': your_site, 'do':'add'})
  9.     req = urllib2.Request('http://webmaster.yandex.ru/site/add.xml?'+params, headers=headers)
  10.     f=opener.open(req)
  11.     data=f.read()
  12.     url=f.geturl()
  13.     query=urlparse.urlparse(url).query.split('&')
  14.     HOST=-1
  15.     for i in query:
  16.         if 'host=' in i:
  17.             HOST=urllib.splitvalue(i)[1]
  18.     """Довольно некрасиво получилось, но суть вот в чем.<br/>       После добавления сайта он получает в Вебмастере уникальный id, который лучше сохранить для выполнения различных действий,<br/>       например, верификации сайта и добавления sitemap для ускорения индексации.<br/>       Приведенный выше код получает этот id из url."""
  19.  
  20.     SECRET=getUniq(data) #получаем уникальное имя файла для прохождения верификации
  21.  
  22.     f=open('/var/www/%s/%s'%(your_site, SECRET), 'w')
  23.     f.close()
  24.     """Если ваш сайт хранится на локальном сервере, то сразу создаем файл верификации."""
  25.  
  26.     params = urllib.urlencode({'host': HOST, 'do':'verify', 'type': '0'})
  27.     req=urllib2.Request('http://webmaster.yandex.ru/site/verification.xml?'+params, headers=headers)
  28.     opener.open(req)
  29.     opener.open(req)
  30.     """Это не ошибка, необходимо действительно отправлять два одинаковых запроса. Так и в браузере надо делать (нажимать два раза на кнопку) - какой-то глюк Яндекса."""
  31.  
  32.     params = urllib.urlencode({'host': HOST, 'do':'add', 'url': 'http://%s/sitemap.xml'%(your_site)})
  33.     req = urllib2.Request('http://webmaster.yandex.ru/site/map.xml?'+params, headers=headers)
  34.     opener.open(req)
  35.     """Сабмитим наш sitemap."""
  36.  

Хочу сразу предупредить, что при большом количестве запросов аккаунт будет забанен, поэтому сильно увлекаться не стоит.

Собственно, это все, о чем я хотел сегодня рассказать. С радостью отвечу на любые ваши вопросы.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.