Python. 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’ со значением какой-нибудь прошлой даты.

Written by: Toly
www: ]]>http://toly-blog.ru/programming/autoforwarder-for-joomla]]>

Комментарии

1 комментария(ев)
аватар: jimmyjonezz
jimmyjonezz
Дата: ВС, 20/06/2010 - 20:51
Звание: Мастер
Сообщений: 2465

Отлично! Язык Питон, на VR!!! Laughing out loud
Побольше бы инфы о WireShark и LiveHTTPHeaders... Wink