使用 python 登录 moodle

问题描述 投票:0回答:2

我正在尝试编写一些从 Moodle 网站下载内容的代码。 第一件事是尝试登录,但从我到目前为止的尝试来看,似乎我在登录后实际上并没有被重定向到页面(使用课程数据等......)。这是我试过的

user = 'my_username'
pas = 'my_password'
payload = {'username':user, 'password':pas}


login_site = "https://moodle2....?" # actual login webpage
data_site = "https://moodle2...." # should be the inner webpage with the courses etc...
    
with requests.Session() as session:
    post = session.post(login_site, data=payload)
    r = session.get(data_site)
    content = r.text
    print(content) # doesn't actually contain the HTML of the main courses page (seems to me its the login page)

知道为什么会这样吗?非常感谢您的帮助;)

python python-3.x moodle
2个回答
0
投票

如果不了解您尝试登录的特定站点的更多信息,就很难提供帮助。

值得一试的是改变

session.post(login_site, data=payload)

session.post(login_site, json=payload)

使用

data
参数时,
content-type
头没有设置为“application/json”。一些站点会据此拒绝 POST。

我也遇到过一些网站,这些网站可以防止脚本登录。他们可能需要在 POST 中发送额外的令牌。

如果一切都失败了,你可以考虑使用selenium。 Selenium 允许您以编程方式控制浏览器实例 您可以简单地加载页面并将文本输入发送到登录页面上的用户名和密码字段。这也可以让您访问通过 javascript 在客户端呈现的任何内容。但是,根据您的用例,这可能有点矫枉过正。


0
投票

根据answer(不是在python中)需要一个额外的登录令牌。此令牌在登录屏幕的 HTML 中给出。

Theo 下面的示例代码可以解决问题,我使用正则表达式提取令牌,您也可以使用 beautiful soup 或其他工具...

s = requests.Session()

r = s.get(url_login)
match = re.search(r'name="logintoken" value="(.+?)"', r.text)
if match:
    login_token = match.group(1)
    # print(login_token)

# you'll have to define variables for username and password
login_data = {'logintoken': login_token, 'username': username, 'password': passwort}

r = s.post(url_login, login_data)
print(r.status_code)
print(r.text)
© www.soinside.com 2019 - 2024. All rights reserved.