首页 > 解决方案 > 在提交表单中使用 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

请帮我!我需要尝试了解此页面的工作原理。谢谢!

阿尼

标签: javascriptphpjquerycurlweb-scraping

解决方案


登录 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'

但这不是很好,使用像

还有 2 个 API 需要调用登录:

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.loginAPI生成的 cookie

这个saveResponseID(上下文)似乎有时间或多或少地生活在 2 分钟左右。在您的情况下,如果您只在socialize.getSavedResponse没有调用的情况下重复使用相同的内容accounts.login,这可能会解释一些请求错误。


推荐阅读