Внимание! Информация предоставлена исключительно с целью ознакомления. За использование материалов статьи в противозаконных целях автор ответственности не несет.
На днях нужно было «скопипастить» один ресурс на локальный сайт (для личного пользования, конечно) с CMS типа Joomla. Решил выложить результаты сих потуг.
В первую очередь необходимо авторизоваться в Joomla-вскую админку. Так как Joomla у меня на локальном компьютере, WireShark для анализа http-заголовков (и соответственно выяснения алгоритма авторизации) не подходит. Для данной задачи я воспользовался удобным плагином FireFox. Имя ему LiveHTTPHeaders.
В html-коде страницы авторизации обнаруживаем скрытые параметры.
Особое внимание следует уделить последнему параметру со значением «1″. Но о нем позже.
Итак, кодим…
# -*- coding: utf-8 #импорт необходимых библиотек import urllib import urllib2 import cookielib import re import string #адрес админка локального сайта host = 'http://localhost/administrator/' #сечас стих сочиню: #информация, # для авторизации user = 'admin' pasw = 'pass' #подготовка опенера с функцией обработки кукисов CookieJar = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(CookieJar)) #запрос админской страницы conn = urllib2.Request(host) page = opener.open(conn).read() #получаем скрытые поля params = re.findall(r'name="([^"]+)" value="([^"]+)"', page) #Предварительная подготовка параметров для отправки POST-запроса params.append( ('username', user) ) params.append( ('passwd', pasw) ) params.append( ('lang', '') ) buf = {} ident = '' for param in params: buf[param[0]] = param[1] #Отправляем подготовленные параметры post = urllib.urlencode(buf) conn = urllib2.Request(host+'index.php', post) page = opener.open(conn).read()
По тексту странички, полученной после авторизации, видно, что имя последнего скрытого поля изменяется. Поэтому необходимо его снова отловить.
ident = re.findall(r'<input type="hidden" name="([^"]+)" value="1" />', page)[0]
Ну а дальше все просто:
#Собственно сам постинг title='заголовок материала' sectionid = 1 #номер раздела catid = 2 #номер категории text = 'текст материала' #Передаваемые параметры buf = { 'title':title.encode("utf-8"), #заголовок 'state':'1', 'alias':'', 'frontpage':'0', 'sectionid':section, 'catid':category, 'details%5Bcreated_by%5D':'62', #идентификатор автора 'details%5Baccess%5D':'0', 'text':text.encode("utf-8"), 'version':'0', 'mask':'0', 'option':'com_content', 'task':'apply', ident:'1' #ранее найденный скрытый параметр } #постим месседж post = urllib.urlencode(buf) conn = urllib2.Request(host+'index.php', post) page = opener.open(conn).read()
Идентификатор автора (его конечно можно из html-кода после авторизации вытащить, но заморачиваться было лень) смотреть так:
Вот пожалуй и все, за исключением нескольких замечаний:
- Поля необходимые для отправки брал по-минимуму. Точно также можно управлять и расширенными опциями, вроде «показать заголовок» и «заголовок как ссылка»
- После добавления материла скриптом у него ставится статус «Опубликовано, но приостановлено». Максимум через сутки статус поменяется. Если нужно публиковать мигом, добавьте к отправляемым параметр ’details%5Bpublish_up%5D’ со значением какой-нибудь прошлой даты.

