AutoForwarder for Joomla


Внимание! Информация предоставлена исключительно с целью ознакомления. За использование материалов статьи в противозаконных целях автор ответственности не несет.

На днях нужно было «скопипастить» один ресурс на локальный сайт (для личного пользования, конечно) с 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-кода после авторизации вытащить, но заморачиваться было лень) смотреть так:

"Вычисляем" идентификатор автора

Вот пожалуй и все, за исключением нескольких замечаний:

  1. Поля необходимые для отправки брал по-минимуму. Точно также можно управлять и расширенными опциями, вроде «показать заголовок» и «заголовок как ссылка»
  2. После добавления материла скриптом у него ставится статус «Опубликовано, но приостановлено». Максимум через сутки статус поменяется. Если нужно публиковать мигом, добавьте к отправляемым параметр  ’details%5Bpublish_up%5D’ со значением какой-нибудь прошлой даты.

, , ,



  1. Пока нет комментариев.
(никто не узнает)