javascript - 在提交表单中使用 Jquery 创建一个动态表单的 Webscraping 登录页面
问题描述
我必须尝试抓取这个 URL Supermarket 登录页面
当我输入我的用户(有效的用户电子邮件)和密码错误时,我只使用 Chrome 调试器查看......
我可以看到这个页面引发了这样的调用:
Request URL: https://accounts.eu1.gigya.com/accounts.login?context=R1521042408&&saveResponseID=R1521042408
Request Method: POST
loginID: [my real email for testing]
password: [any word except my real password, to get ERROR p.e. Helloooo]
sessionExpiration: -1
targetEnv: jssdk
include: profile,data,emails,subscriptions,preferences,
includeUserInfo: true
loginMode: standard
lang: es
APIKey: 3_Ns3U5-wXeiSQL-vZtu1Fd2DpWBsEdB78mYs2dn0_kyFFwwSJAZZd1EHUm9kodfND
source: showScreenSet
sdk: js_latest
authMode: cookie
pageURL: https://www.carrefour.es/access?pagesitename=supermercado&redirect=https%3A%2F%2Fwww.carrefour.es%2Fsupermercado%2F%3FDPSLogout%3Dtrue&back=https%3A%2F%2Fwww.carrefour.es%2Fsupermercado%2F%3FDPSLogout%3Dtrue
format: jsonp
callback: gigya.callback
context: R1521042408
utf8: ✓
我尝试使用 cURL 创建一个 php 脚本来调用此 URL: https ://accounts.eu1.gigya.com/accounts.login?context=something&&saveResponseID=something
和 POST 参数....但我有一个问题...此页面在内部使用 API 生成具有此结果的上下文:
回调:gigya.callback 上下文:R1642825906
有人可以解释一下这个页面是如何工作的,因为我不知道如何重新生成这个 contextID 来调用这个 URI 的登录帐户: https ://accounts.eu1.gigya.com/accounts.login?context=something&&saveResponseID=something
请帮我!我需要尝试了解此页面的工作原理。谢谢!
阿尼
解决方案
登录 POST 中使用的 API 密钥被硬编码在一个文件config.js
中,因此您可以使用 Regex 检索它,例如:
curl -s "https://www.carrefour.es/nlogin/resources/config.js?v=v1.0.24" | sed -rn 's/\s+val:\s+\x27(.*)\x27,.*/\1/p'
但这不是很好,使用像selenium这样的自动化浏览器工具会更好
还有 2 个 API 需要调用登录:
- https://accounts.eu1.gigya.com/accounts.login上的 POST,其中
saveResponseID
查询参数和登录名、密码和 apiKey 形式-url-编码在正文中 - 在https://accounts.eu1.gigya.com/socialize.getSavedResponse上使用
saveResponseID
&作为参数的 GETAPIKey
(以 JSON 格式响应)
saveResponseID
似乎是一种存储在服务器上的会话 ID
USERNAME="your.email@gmail.com"
PASSWORD="test"
CONTEXT=responseId
API_KEY=$(curl -s "https://www.carrefour.es/nlogin/resources/config.js?v=v1.0.24" | sed -rn 's/\s+val:\s+\x27(.*)\x27,.*/\1/p')
curl "https://accounts.eu1.gigya.com/accounts.login?saveResponseID=$CONTEXT" \
--data-urlencode "loginID=$USERNAME" \
--data-urlencode "APIKey=$API_KEY" \
--data-urlencode "password=$PASSWORD" \
-c cookie.txt
curl "https://accounts.eu1.gigya.com/socialize.getSavedResponse?APIKey=$API_KEY&saveResponseID=$CONTEXT" -b cookie.txt
请注意,最后一个 API(获取响应的 API)需要/accounts.login
API生成的 cookie
这个saveResponseID
(上下文)似乎有时间或多或少地生活在 2 分钟左右。在您的情况下,如果您只在socialize.getSavedResponse
没有调用的情况下重复使用相同的内容accounts.login
,这可能会解释一些请求错误。