我尝试为登录joomla网站whit python pycurl创建小脚本, 我写这段代码:
import sys, re
import pycurl
import cStringIO
import time
import urllib
def LoginJoomla(url):
buf = cStringIO.StringIO()
c = pycurl.Curl()
c.setopt(c.URL, url)
post_params = [('usrname','admin'),('passwd','1234567789'),('submit','Login')]
resp_data = urllib.urlencode(post_params)
c.setopt(c.POSTFIELDS, resp_data)
c.setopt(pycurl.POST, 1)
c.setopt(c.WRITEFUNCTION, buf.write)
c.perform()
html = buf.getvalue()
buf.close()
print html
LoginJoomla("http://www.domain.com/administrator/index.php?option=com_user&view=login")
蝙蝠不工作,给我正常的登录网页, 请任何人都可以说我错在哪里。
答案 0 :(得分:2)
首先阅读BUT!
您需要正确获取网址参数(我认为您的网址不好):
POST to http://www.example.com/administrator/
使用以下参数:
但是来自我对Joomla的了解!认证,你不能这样做,因为Joomla!从Web浏览器发送令牌,以确保表单是从浏览器发布的。
如果没有从浏览器发布,则会出现“最近的请求被拒绝,因为它包含无效的安全令牌”之类的错误。请刷新页面然后重试。'
我知道可以远程登录Joomla!,继续搜索。您可能需要自定义身份验证插件。
答案 1 :(得分:0)
我也需要做同样的事情,而且我已经做到了。我们需要执行以下操作:
将HTTP POST发送到包含所有字段和cookie的登录处理脚本。
import bs4
import requests
import urllib, urllib2, cookielib
jar = cookielib.FileCookieJar("cookies")
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(jar))
r = opener.open("[INSERT LOGIN PAGE URL]").read()
soup=bs4.BeautifulSoup(r, "html.parser")
hidden_tags = soup.find_all("input", type="hidden")
# Get the randomized token - which is the 5th hidden field in the form
token_name = hidden_tags[4]['name']
token_val= hidden_tags[4]['value']
login_data = {'username':'[INSERT USERNAME]',
'password':'[INSERT PASSWORD]',
'remember':'yes',
token_name: token_val}
# Attempt login
opener.open("[LOGIN PAGE FORM ACTION]", urllib.urlencode(login_data))
# Now open logged-in page you wish
logged_response = opener.open("[LOGIN PROTECTED PAGE]")
logged_result = logged_response.read()
print logged_result
答案 2 :(得分:0)
对于在 Python 3 中寻找解决方案的任何人,我将发布我的解决方案:
它使用 requests
包并查看登录操作后是否返回了正确的 set-cookie 标头。
import re
import requests
session = requests.Session()
response = session.get("[INSERT LOGIN PAGE URL]")
hidden_tags = re.findall(r'<input.+type="hidden".+>', response.text)
# Get the randomized token - which is the 6th hidden field in the form
token_name = re.findall(r'name="(\S+)"', hidden_tags[5])[0]
token_val = re.findall(r'value="(\S+)"', hidden_tags[5])[0]
login_data = {
"username": '[INSERT USERNAME]',
"password": '[INSERT PASSWORD]',
"remember": "yes",
"return": "",
token_name: token_val,
}
login_response = session.post("[LOGIN PAGE FORM ACTION]", data=login_data, allow_redirects=False)
login_cookie = login_response.headers.get('set-cookie', "")
print("joomla_user_state=logged_in" in login_cookie)