我知道我在问什么有点奇怪。有一个 Web 应用程序(我们无权访问它的源代码),我们希望将它的一些功能公开为 Web 服务。
我正在考虑使用 Selenium WebDriver 之类的东西,所以我根据 Web 服务请求模拟了应用程序上的 Web 点击。
我想知道这是否是更好的解决方案或模式。
我将提到该应用程序是使用 Java、Spring MVC(它不是 SPA)和 Spring Security 编写的。并且有一个提供 SSO 的 CAS 服务器。
我知道我在问什么有点奇怪。有一个 Web 应用程序(我们无权访问它的源代码),我们希望将它的一些功能公开为 Web 服务。
我正在考虑使用 Selenium WebDriver 之类的东西,所以我根据 Web 服务请求模拟了应用程序上的 Web 点击。
我想知道这是否是更好的解决方案或模式。
我将提到该应用程序是使用 Java、Spring MVC(它不是 SPA)和 Spring Security 编写的。并且有一个提供 SSO 的 CAS 服务器。
有多种方法可以实现它。在我看来,Selenium/PhantomJS 并不是最好的选择,因为如果 web 设计得当,你可以只使用提供的 HTML 甚至一些 API 与它交互,而不需要所有的 CSS,并执行 javascript 异步请求。由于您的页面不是 SPA,因此“API”很可能已经以 GET/POST 请求的形式存在,您可能很幸运没有 CSRF 保护。
首先,您需要解决针对 CAS 的身份验证问题。oAuth 中有多种类型的身份验证,但您应该获得一个 API 令牌,使您能够访问应用程序。这个令牌应该以 HTTP Header 或 Cookie 的形式添加到每个请求中。理想情况下,此令牌不应过期,否则您需要在应用中实现重新身份验证逻辑。
身份验证部分解决后,您需要非常耐心,使用首选 Web 浏览器的 Web 检查器打开目标网站,然后转到“网络”面板并执行您希望以编程方式运行的操作。在那里,您会找到包含所有标头和内容以及响应的请求。这就是您需要编码的内容。有很多库可以在 Java 中实现这一点。您可以查看Jsop
是否需要解析 HTML,但要运行普通的 GET/POST 请求,请选择RestTemplate
(在 Spring 中)或JAX-RS/Jersey 2 Client
.
如果查询结果在一段时间内保持不变,您可能会考虑实施缓存层以提高性能,或者您可以假设在 5 分钟内,对同一查询的响应将相同。
您可以使用您喜欢的语言/框架创建您的应用程序。我建议从SpringBoot + MVC + DevTools
. 如果您需要解析一些 HTML,那将包含您需要的所有内容 + Jsoup。稍后您可以根据需要添加缓存提供程序。
我们做一些类似的事情,代表用户访问网上银行,抓取他的账户数据并获得信用评分。在大多数情况下,我们已经设法对移动应用程序进行逆向工程并嗅探流量以使用未记录的 API。在其他情况下,我们不得不退回到网络抓取。
您可以抓取其他两种类型的应用程序:
在第一种情况下,您可以让您的爬虫运行并填充本地数据库,并使用您的本地数据来提供 Web 服务。在后一种情况下,您不能这样做,您需要根据用户的请求抓取网站。
我从您的解释中了解到,您属于后一种情况。
当网络抓取时,您会发现非常困难的网络应用程序:
如果这两种情况中的任何一种是您的情况,Selenium 将使您的实现更容易,但性能不佳。
实现第一个不使用 selenium 将需要您进行大量尝试错误以使事情正常工作,因为您将模拟请求并且您将需要知道客户端期望的数据。而如果您使用 selenium,您将执行与浏览器相同的交互,从而发送预期的数据。实现第二种情况需要你的爬虫支持 JavaScript。AFAIK 的最佳支持由 selenium 提供。HtmlUnit声称提供公平的支持,我认为 JSoup 不支持 JavaScript。
最后,如果您的解决方案花费了太多时间,您可以通过通知机制来缓解问题,为您的 Web 服务提供类似于 Webhooks 或Resthooks的通知机制:
POST
。在请求的正文中,您将添加响应资源的 URI。GET
获取响应资源,并且由于请求和响应具有相同的 id,因此客户端可以将两者关联起来。Selenium 不是使用 Web 服务的最佳方式。Selenium 最好是一种自动化工具,主要用于测试应用程序。假设服务已经开发,我们需要做的第一件事是验证用户请求。这可以通过添加一个 HttpHeader 来完成,键为“授权”,值为“基本”+ Base64Encode(username+":"+password)
如果用户有效(用户登录凭据与服务器中的凭据匹配)则生成唯一令牌,通过与用户 ID 映射将令牌存储在服务器中并在响应标头中设置相同的令牌或创建包含令牌的 cookie。通过这样做,我们可以避免验证来自同一用户的以下请求的凭据,只需在响应标头或 cookie 中查找令牌。如果服务设计为每次发出请求时都需要在请求中设置“授权”标头时检查登录。
可能是矫枉过正......但是RPA?http://windowsitpro.com/scripting/review-automation-anywhere-enterprise
我认为使用 a 会产生很多开销,webdriver
但这取决于您真正想要实现的目标。有了你提供的信息,我宁愿使用一个restTemplate
实现,将适当的 http 消息发送到现有的 webapp,用一个漂亮的@service
层包装它,并在它上面构建你的 web 服务(rest 或 soap)。
身份验证是一个配置问题,您可以将其打包在一个微服务中,@EnableOAuth2Sso
并且您的restTemplate
bean,感谢 Spring Boot,将为您处理下划线的身份验证部分。