python - 无法使用python登录网页-动态键值对/混淆的js代码解析
问题描述
我最近学习了 Python,并决定开始我的第一个项目,该项目涉及抓取我大学的网站。现在我被卡住了,因为我无法通过登录页面。基本上我面临着这个问题中描述的完全相同的问题。
根据我有限的理解和@tmadam 发布的最后一条评论,我似乎需要在登录页面上使用检查元素,搜索第 11 个标签并使用正则表达式解析 js 代码。我几乎迷路了,因为第 11 个标签看起来一点也不像十六进制字符串。
我在下面发布我的代码以供参考:
import requests
from bs4 import BeautifulSoup
# all cookies received will be stored in the session object
s = requests.Session()
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'en-US,en;q=0.5',
'Content-Type': 'application/x-www-form-urlencoded',
'Origin': 'https://student.cc.uoc.gr',
'DNT': '1',
'Connection': 'keep-alive',
'Referer': 'https://student.cc.uoc.gr/login.asp?mnuID=student&autologoff=1',
'Upgrade-Insecure-Requests': '1',
}
data = {
'userName': '*****',
'pwd': '*****',
'submit1': '%C5%DF%F3%EF%E4%EF%F2',
'loginTrue': 'login',
}
# Add headers in session.
s.headers.update(headers)
page = s.get('https://student.cc.uoc.gr')
login = s.post('https://student.cc.uoc.gr/login.asp', data=data)
home_page = s.get("https://student.cc.uoc.gr/studentMain.asp")
target = s.get("https://student.cc.uoc.gr/stud_CResults.asp")
soup = BeautifulSoup(target.content,"lxml", from_encoding='utf8')
print(soup.text)
解决方案
有一个附加参数通过jsfuck中加载的脚本动态加载。您将需要解码该字符串。在 JS 中解码它很简单,但需要 python 中的库,有这个 python 项目,但你也可以在nodejs中制作一个小脚本(来自this):
"use strict"
function decode(src) {
if (src.length > 0) {
var l = ''
if (src.length > 3 && src.slice(src.length-3) == ')()'){
var s = src.slice(0, src.length - 2)
var i = s.length
while (i--) {
l = s.slice(i)
if (l.split(')').length == l.split('(').length) {
break;
}
}
}
else {
l = src;
}
var result = eval(l);
return result
}
return "";
}
if (process.argv.length <= 2){
console.log("input required");
return;
}
var args = process.argv.slice(2);
console.log(decode(args[0]))
然后你可以像这样使用它:
node unjsfuck.js '[][(![]+[])[+[]]+([![].........)'
并使用带有脚本值的子进程从您的python脚本中使用它,而无需eval(...)
外壳
这是一个应该可以工作的脚本,假设您已将unjsfuck.js
以前的文件保存在同一位置:
import requests
from bs4 import BeautifulSoup
import subprocess
import re
s = requests.Session()
r = s.get("https://student.cc.uoc.gr/login.asp")
soup = BeautifulSoup(r.content, "lxml")
jsfuck = [ t.text for t in soup.find_all("script") if t.text.startswith("eval")][0]
result = subprocess.run(['node', 'unjsfuck.js', jsfuck[5:-2]], stdout=subprocess.PIPE)
decoded = result.stdout.decode("utf-8")
token_name = re.search('\'name\'\s*,\s*\'(\w*)\'', decoded).group(1)
token_value = re.search('\'value\'\s*,\s*\'(\w*)\'', decoded).group(1)
form = soup.find("form")
payload = dict([
(t["name"], t.get("value")) for t in form.find_all("input")
])
payload[token_name] = token_value
payload["userName"] = "your username here"
payload["pwd"] = "your password here"
print(payload)
r = s.post("https://student.cc.uoc.gr/login.asp", data = payload)
print(r.text)
如果仍然失败,您可能需要添加一些您在脚本中建议的标题
该解决方案不是非常理想,因为它依赖于外部脚本(nodejs 或其他 jsfuck 解码器)。按照 tmadam 的建议使用 selenium 将是一个很好的解决方案
推荐阅读
- python - 如何对数组中的元素进行字符串匹配以在另一个数据帧中索引并执行操作?
- javascript - 有没有办法将数组的块保存在 JavaScript 的新数组中?
- bash - Bash shell 脚本 FOR 循环遍历早于特定日期的文件
- email - Sendgrid 电子邮件被推迟
- python - 在 __init.py__ 之类的地方初始化记录器
- python - 将字典展平为数据框
- javascript - Web 组件的 HTML 属性更改未反映在 Vue 组件中
- python - 删除使用 plotly 生成的所有表格子图中的滚动条
- asp.net-core - 无法使用 AddMicrosoftIdentityWebApiAuthentication 使用 EnableTokenAcquisitionToCallDownstreamApi 设置范围
- reactjs - 开玩笑(酶)发现不起作用但元素存在于 html 中