Как можно войти на форум phpBB3 через скрипт Python, используя urllib, urllib2 и ClientCookie?
Вопрос
(ClientCookie - это модуль для (автоматической) обработки файлов cookie: http://wwwsearch.sourceforge.net/ClientCookie)
# I encode the data I'll be sending:
data = urllib.urlencode({'username': 'mandark', 'password': 'deedee'})
# And I send it and read the page:
page = ClientCookie.urlopen('http://www.forum.com/ucp.php?mode=login', data)
output = page.read()
Скрипт не входит в систему, а скорее перенаправляется обратно на ту же страницу входа, запрашивая имя пользователя и пароль.Что я делаю не так?
Мы будем очень признательны за любую помощь!Спасибо!
Решение
Вы пробовали сначала открыть страницу входа в систему?
Я бы предложил использовать Несанкционированный доступ к данным чтобы иметь представление о том, что именно отправляется, когда вы запрашиваете страницу входа в систему, а затем войти в систему обычным способом, используя веб-браузер, с чистого листа, без первоначальных файлов cookie, чтобы ваш скрипт мог точно воспроизвести это.
Именно такой подход я использовал при написании следующего, извлеченного из скрипта, которому необходимо войти на форум Invision Power Board, используя cookielib и urllib2 - возможно, он пригодится вам в качестве ссылки.
import cookielib
import logging
import sys
import urllib
import urllib2
cookies = cookielib.LWPCookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies))
urllib2.install_opener(opener)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.0; en-GB; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12',
'Accept': 'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5',
'Accept-Language': 'en-gb,en;q=0.5',
'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
}
# Fetch the login page to set initial cookies
urllib2.urlopen(urllib2.Request('http://www.rllmukforum.com/index.php?act=Login&CODE=00', None, headers))
# Login so we can access the Off Topic forum
login_headers = headers.copy()
login_headers.update({
'Referer': 'http://www.rllmukforum.com/index.php?act=Login&CODE=00',
'Content-Type': 'application/x-www-form-urlencoded',
})
html = urllib2.urlopen(urllib2.Request('http://www.rllmukforum.com/index.php?act=Login&CODE=01',
urllib.urlencode({
'referer': 'http://www.rllmukforum.com/index.php?',
'UserName': RLLMUK_USERNAME,
'PassWord': RLLMUK_PASSWORD,
}),
login_headers)).read()
if 'The following errors were found' in html:
logging.error('RLLMUK login failed')
logging.info(html)
sys.exit(1)
Другие советы
Я бы порекомендовал взглянуть на механизировать библиотека;он предназначен именно для такого рода задач.Кроме того, это намного проще, чем делать это вручную.