首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用python动态键值对/混淆的js代码解析登录到网页

无法使用python动态键值对/混淆的js代码解析登录到网页
EN

Stack Overflow用户
提问于 2020-09-18 19:09:05
回答 1查看 61关注 0票数 1

我最近开始使用Python,并决定开始我的第一个项目,其中包括抓取我的大学网站。现在我被卡住了,因为我无法通过登录页面。基本上,我正面临着this问题中描述的完全相同的问题。

根据我有限的理解,根据@t.m.adam发布的最后一条评论,我似乎需要使用登录页面上的inspect元素,搜索第11个标记,并使用正则表达式解析js代码。我几乎迷路了,因为第11个标签看起来一点也不像十六进制字符串。

我将我的代码发布在下面以供参考:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-20 08:29:34

有一个额外的参数,它是通过jsfuck中加载的脚本动态加载的。您需要对该字符串进行解码。用JS解码很简单,但需要用python编写一个库,虽然有this python project,但您也可以用nodejs (从this)编写一个小脚本:

代码语言:javascript
复制
"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]))

然后你可以像这样使用它:

代码语言:javascript
复制
node unjsfuck.js '[][(![]+[])[+[]]+([![].........)'

并在您的python脚本中使用子进程和脚本值,但不使用eval(...)附件

下面是一个应该可以工作的脚本,假设您已经在相同的位置保存了unjsfuck.js上一个文件:

代码语言:javascript
复制
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解码器)。使用t.m.adam推荐的selenium将是一个很好的解决方案

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63954611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档