From 54eb353d0def4d8268ccc94533064f67beda9b80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Mauduit?= Date: Wed, 7 Dec 2016 18:34:39 +0100 Subject: [PATCH] Add ReCaptcha Activity * ReCaptchas are implemented using a simple WebView with Javascript enable. * All HTTP responses inside the WebView are catched (using onPageFinished()) ** When Google reCatcha cookies are detected, register cookies to the Downloader class and Return to MainActivity --- app/src/main/AndroidManifest.xml | 3 + .../org/schabi/newpipe/ReCaptchaActivity.java | 138 ++++++++++++++++++ .../main/res/layout/activity_recaptcha.xml | 10 ++ app/src/main/res/values/strings.xml | 2 + 4 files changed, 153 insertions(+) create mode 100644 app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java create mode 100644 app/src/main/res/layout/activity_recaptcha.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 447d01ddc..5ce399d91 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -153,6 +153,9 @@ android:label="@string/title_activity_channel" android:theme="@style/AppTheme.NoActionBar" /> + \ No newline at end of file diff --git a/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java b/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java new file mode 100644 index 000000000..f503bfcff --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java @@ -0,0 +1,138 @@ +package org.schabi.newpipe; + +import android.app.Activity; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.support.v4.app.NavUtils; +import android.support.v7.app.ActionBar; +import android.support.v7.app.AppCompatActivity; +import android.view.MenuItem; +import android.webkit.CookieManager; +import android.webkit.ValueCallback; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +/** + * Created by beneth on 06.12.16. + * + * Copyright (C) Christian Schabesberger 2015 + * ReCaptchaActivity.java is part of NewPipe. + * + * NewPipe is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * NewPipe is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NewPipe. If not, see . + */ +public class ReCaptchaActivity extends AppCompatActivity { + public static final String TAG = ReCaptchaActivity.class.toString(); + public static final String YT_URL = "https://www.youtube.com"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_recaptcha); + + ActionBar actionBar = getSupportActionBar(); + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setTitle(R.string.reCaptcha_title); + actionBar.setDisplayShowTitleEnabled(true); + + WebView myWebView = (WebView) findViewById(R.id.reCaptchaWebView); + + // Enable Javascript + WebSettings webSettings = myWebView.getSettings(); + webSettings.setJavaScriptEnabled(true); + + ReCaptchaWebViewClient webClient = new ReCaptchaWebViewClient(this); + myWebView.setWebViewClient(webClient); + + // Cleaning cache, history and cookies from webView + myWebView.clearCache(true); + myWebView.clearHistory(); + android.webkit.CookieManager cookieManager = CookieManager.getInstance(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + cookieManager.removeAllCookies(new ValueCallback() { + @Override + public void onReceiveValue(Boolean aBoolean) {} + }); + } else { + cookieManager.removeAllCookie(); + } + + myWebView.loadUrl(YT_URL); + } + + private class ReCaptchaWebViewClient extends WebViewClient { + private Activity context; + private String mCookies; + + ReCaptchaWebViewClient(Activity ctx) { + context = ctx; + } + + @Override + public void onPageFinished(WebView view, String url) { + String cookies = CookieManager.getInstance().getCookie(url); + + // find cookies : s_gl & goojf and Add cookies to Downloader + if (find_access_cookies(cookies)) { + // Give cookies to Downloader class + Downloader.setCookies(mCookies); + + // Closing activity and return to parent. + Intent intent = new Intent(context, org.schabi.newpipe.MainActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + NavUtils.navigateUpTo(context, intent); + } + } + + private boolean find_access_cookies(String cookies) { + boolean ret = false; + String c_s_gl = ""; + String c_goojf = ""; + + String[] parts = cookies.split("; "); + for (String part : parts) { + if (part.trim().startsWith("s_gl")) { + c_s_gl = part.trim(); + } + if (part.trim().startsWith("goojf")) { + c_goojf = part.trim(); + } + } + if (c_s_gl.length() > 0 && c_goojf.length() > 0) { + ret = true; + //mCookies = c_s_gl + "; " + c_goojf; + // Youtube seems to also need the other cookies: + mCookies = cookies; + } + + return ret; + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + switch (id) { + case android.R.id.home: { + Intent intent = new Intent(this, org.schabi.newpipe.MainActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + NavUtils.navigateUpTo(this, intent); + return true; + } + default: + return false; + } + } +} diff --git a/app/src/main/res/layout/activity_recaptcha.xml b/app/src/main/res/layout/activity_recaptcha.xml new file mode 100644 index 000000000..0a3b03010 --- /dev/null +++ b/app/src/main/res/layout/activity_recaptcha.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dfd247dd7..208cac70d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -269,6 +269,8 @@ "when a user tries to pick up one of cards.\n\n" Settings + reCaptcha + reCaptcha Challenge