LoginSignup
2
2

More than 5 years have passed since last update.

okHttp3 の client に selenium でとった cookie を差し込む

Last updated at Posted at 2017-03-29

selenium(selenideもおなじ) の webdriver から cookie をとって okhttp の client に差し込む

型が違うので受け渡してやる必要あった。もっとうまくやれそうだがあきらめた。
以下は、url を download する例

    private void downloadFileSync(final String downloadUrl, String orgFilename) throws Exception {
        List<Cookie> cookies = new ArrayList();
        String domain = "example.com";// . で始まるドメインだと例外になるので k.getDomain() でとったあと . をとるか、直接指定する
        val cc = new Cookie.Builder();
        for (org.openqa.selenium.Cookie k : getWebDriver().manage().getCookies()) {
            cc.domain(domain).name(k.getName()).path(k.getPath()).value(k.getValue());
            if (k.isSecure()) { cc.secure(); }
            if (k.isHttpOnly()) { cc.httpOnly(); }
            if (k.getExpiry() != null) { cc.expiresAt(k.getExpiry().getTime()); }
            cookies.add(cc.build());
        }
        CookieManager cookieManager = new CookieManager(null, ACCEPT_ALL);
        CookieHandler.setDefault(cookieManager);
        JavaNetCookieJar cookieJar = new JavaNetCookieJar(cookieManager);
        cookieJar.saveFromResponse(HttpUrl.parse(downloadUrl), cookies);
        OkHttpClient client = new OkHttpClient().newBuilder().cookieJar(cookieJar).build();

        String filename = orgFilename + ".jpg";
        log.info("download filename : {}", filename);
        Request request = new Request.Builder().url(downloadUrl).build();
        Response response = client.newCall(request).execute();
        if (!response.isSuccessful()) {
            throw new IOException("Failed to download file: " + response);
        }
        FileOutputStream fos = new FileOutputStream("/tmp/" + filename);
        fos.write(response.body().bytes());
        fos.close();
    }

ChromeDriver では get(url) で、画像ファイルなどを取得する方法がみつからなかったので、上記のように url を okhttp に渡して、cookie との整合性も用意してやるようにしました。

あるいは

        String[] cookieKeys = { "hoge", "hogehoge", "hogehogehoge" };
        StringBuilder cookie = new StringBuilder();
        for (String key : cookieKeys) {
            val oneCookie = getWebDriver().manage().getCookieNamed(key);
            cookie.append(String.format("%s=%s;", key, oneCookie.getValue()));
        }

        OkHttpClient client = new OkHttpClient().newBuilder().build();
        Request request = new Request.Builder().url(downloadUrl).header("Cookie", cookie.toString()).build();

        Response response = client.newCall(request).execute();

こんなで header にいれてやるだけでも良かった。
getWebDriver().manage().getCookie() が、String でまるっととれればいいんだが。できるのかな?

over.

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2