2

我尝试使用 python pycurl 为登录 joomla 网站创建小脚本,我编写了以下代码:

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")

蝙蝠不工作,给我正常的登录网页,请任何人都可以告诉我我哪里错了。

4

3 回答 3

2

先读BUT!

您需要正确获取 URL 参数(我认为您的 URL 不好):

POST to http://www.example.com/administrator/

具有以下参数:

  • 选项=com_login
  • 任务=登录
  • 用户名=你的用户(不是你的用户名!你有)
  • 密码

但是根据我对 Joomla 的了解!认证,你不能这样做,因为Joomla!从网络浏览器将发送一个令牌,以确保表单是从浏览器发布的。

如果它不是从浏览器发布的,则会出现类似“最近的请求被拒绝,因为它包含无效的安全令牌”之类的错误。请刷新页面并重试。

我知道可以远程登录 Joomla!,继续搜索。您可能需要自定义身份验证插件。

于 2013-03-15T19:41:04.467 回答
0

我需要同样的事情,我已经设法做到了。我们需要做以下事情:

  1. 打开登录页面,并接受所有返回的 cookie。
  2. 解析 html 页面并获取随机令牌 - 隐藏输入字段。
  3. 将包含所有字段和 cookie 的 HTTP POST 发送到登录处理脚本。

    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
    
于 2019-03-25T09:29:40.173 回答
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)
于 2021-04-29T12:29:38.977 回答