JavaFX中的WebView,不适用于Whatsapp Web

Jef*_*ano 5 java javafx javafx-8

我需要从没有得到的JavaFX应用程序访问WhatsApp Web。当页面打开时,我收到一条消息,要求使用其他浏览器。我试图更改UserAgent,但是它不起作用。

在此处输入图片说明

码:

WebEngine eng = webView.getEngine();
eng.load("https://web.whatsapp.com/");
eng.setJavaScriptEnabled(true);
eng.setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36");
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

bur*_*ete 5

我无法从 JavaFX 访问 whatsapp,这似乎不是用户代理问题,而是使用 FX 时缺少某些依赖项,或者只是 whatsapp 使用其他一些指标阻止,但找到了替代方案;潘多姆

它与 JavaFX 不兼容,但与 Swing 兼容,并且可以访问任何站点而无需考虑用户代理或任何依赖性问题,因为它是JCEF实现,即 Chromium Framework for Java,本质上是嵌入式 Chrome for Java .

只需在您的依赖项中使用 Pandomium jar 执行以下操作即可;

public static void main(String[] args) {
    PandomiumSettings settings = PandomiumSettings.getDefaultSettingsBuilder().build();
    settings.getCefSettings().cache_path = "C:\\temp\\cache";
    // setting this option is paramount otherwise no cache is kept, and sesions are lost

    Pandomium pandomium = new Pandomium(settings);
    pandomium.initialize();

    PandomiumClient client = pandomium.createClient();
    PandomiumBrowser browser = client.loadURL("https://web.whatsapp.com");

    JFrame frame = new JFrame();
    frame.getContentPane().add(browser.toAWTComponent(), BorderLayout.CENTER);
    frame.setTitle("Whatsapp");
    frame.setSize(1720, 840);
    frame.setVisible(true);
}
Run Code Online (Sandbox Code Playgroud)

  • @DevashishJaiswal 从理论上讲,您可以从 JCEF/Pandomium 中逐个删除功能,直到获得与 webview 相同的屏幕,这将是对问题进行逆向工程的一种方法,但我认为没有必要,因为它只是基于 whatsapp 的逻辑,明天可能会改变,因为他们最终定义的东西总是在改变,最好利用铬,一个合适的嵌入式浏览器来规避此类当前和未来的问题 IMO (2认同)

tom*_*kab 3

以下简单的 WebViewTest 类可以帮助您确定问题(或至少更接近确定问题):

package test;

import com.sun.javafx.webkit.WebConsoleListener;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class WebViewTest extends Application {
    public static void main(String[] args) {
        Application.launch(args);
    }

    @Override
    public void start(final Stage stage) {
        // create WebView
        WebView webView = new WebView();
        webView.setFontScale(1.20);
        webView.setZoom(1.20);

        // print debug info
        WebConsoleListener.setDefaultListener(
                (webView1, message, lineNumber, sourceId) ->
                        System.out.println("Console: [" + sourceId + ":" + lineNumber + "] " + message));

        // create WebEngine
        final WebEngine webEngine = webView.getEngine();
        webEngine.setJavaScriptEnabled(true);
        webEngine.setUserAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36");

        webEngine.load("https://web.whatsapp.com/");

        VBox root = new VBox();
        root.getChildren().add(webView);

        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上运行上述代码时控制台输出如下:

Console: [https://web.whatsapp.com/vendor2.3973e7c149ced441846f.js:11] Unhandled rejection: https://web.whatsapp.com/vendor2.3973e7c149ced441846f.js:12:20732
Y@https://web.whatsapp.com/vendor2.3973e7c149ced441846f.js:11:7487
G@https://web.whatsapp.com/vendor2.3973e7c149ced441846f.js:11:7307
getDatabaseNames@https://web.whatsapp.com/vendor2.3973e7c149ced441846f.js:12:20699
deleteLegacyDBs@https://web.whatsapp.com/app.cf6d46b7e29e2f232d65.js:16:16530
i@https://web.whatsapp.com/app.cf6d46b7e29e2f232d65.js:16:14199
"cceejgejjg"@https://web.whatsapp.com/app.cf6d46b7e29e2f232d65.js:16:16681
a@https://web.whatsapp.com/progress.05fda25452b93c319bddcb3c2f6fdcb3.js:2:111
"hcddbeaic"@https://web.whatsapp.com/app.cf6d46b7e29e2f232d65.js:15:10748
a@https://web.whatsapp.com/progress.05fda25452b93c319bddcb3c2f6fdcb3.js:2:111
"baggieehcg"@https://web.whatsapp.com/app.cf6d46b7e29e2f232d65.js:22:22662
a@https://web.whatsapp.com/progress.05fda25452b93c319bddcb3c2f6fdcb3.js:2:111
"jfefjijii"@https://web.whatsapp.com/app.cf6d46b7e29e2f232d65.js:9:25328
a@https://web.whatsapp.com/progress.05fda25452b93c319bddcb3c2f6fdcb3.js:2:111
i@https://web.whatsapp.com/app.cf6d46b7e29e2f232d65.js:10:30397
d@https://web.whatsapp.com/app.cf6d46b7e29e2f232d65.js:6:11780
r@https://web.whatsapp.com/progress.05fda25452b93c319bddcb3c2f6fdcb3.js:2:5338
onload@https://web.whatsapp.com/progress.05fda25452b93c319bddcb3c2f6fdcb3.js:2:4883
Console: [https://web.whatsapp.com/app.cf6d46b7e29e2f232d65.js:3] XMLHttpRequest cannot load https://web.whatsapp.com/img/c5088e888c97ad440a61d247596f88e5.png due to access control checks.
Run Code Online (Sandbox Code Playgroud)

这部分内容Unhandled rejection: https://web.whatsapp.com/vendor2.3973e7c149ced441846f.js:12:20732指向您尝试加载的页面上的一个(相当不可读的)JavaScript 文件。

我的 JavaScript 不是很强大,但从快速浏览中我可以看出,该页面似乎需要 IndexedDB 支持,而 JavaFX WebView 中不提供该支持(据我所知)。