Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.70
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
#1

Извлечение кода из страницы WebView - Программирование Android

26.03.2015, 09:49. Просмотров 3631. Ответов 50
Метки нет (Все метки)

Здравствуйте.
Есть страница загруженная WebView с кодом авторизации, который нужно использовать в приложении.
Как этот код можно извлечь из WebView программно?
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2015, 09:49
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Извлечение кода из страницы WebView (Программирование Android):

Доступ из HTML кода страницы, загруженной в WebView, к данным приложения - Программирование Android
Возможно ли это? В частности, мне нужно передать джаваскрипту страницы версию установленного приложения.

Webview Веб браузер отображает некорректно страницы - Программирование Android
Прощу прощение если тема не в теме и такое уже== правда искал не нашел Сразу хочу оговориться я не профессиональный программист под...

WebView. Получение исходного кода. Зависание - Программирование Android
final WebView browser = (WebView) findViewById(R.id.webView); browser.getSettings().setJavaScriptEnabled(true); ...

Вместо открытия страницы в WebView предлагает открытие в браузере - Программирование Android
Добрый день. У меня есть Webview-открываю страничку в страничке есть форма которая передает значения обработчику, при клике на кнопку...

Получение кода страницы - Программирование Android
Приложение закрывается после нажатия на кнопку почему? public class MainActivity extends Activity { EditText editText; String s...

Получение кода web страницы - Программирование Android
Не могу получить код web страницы: runOnUiThread(new Runnable() { @Override public void run() { try { ...

50
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
01.04.2015, 14:40  [ТС] #31
Цитата Сообщение от fgtmenow Посмотреть сообщение
если задачу можно решить просто - то лучше решать ее просто
я и предполагал, что получить данные из объекта по имени этих денных -- это просто. )

Добавлено через 46 минут
HTML5
1
2
3
4
5
<script type="text/javascript">
   ................
   ...............
    var FORM_KEY = 'gaWM5idwEX8wl9Fv';
</script>
как изъять переменную FORM_KEY, используя парсинг jsoup?
0
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 257
01.04.2015, 15:00 #32
аналогично с адресной строкой,

Java
1
document.select("head").html().substring(  document.select("head").html().indexOf("var FORM_KEY = '")+17,document.select("head").html().indexOf("</script>"))
ну ты там допили чтоб работало
1
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
01.04.2015, 15:48  [ТС] #33
допилил, достал form_key

теперь, получая страницу с логин-паролем, отправляю post-запрос, в post data параметры
form_key
login[username]
login[password]
oauth_token

те же параметры шлет в оригинале и браузер в post data.

в ответ получаю ту же самую страницу - с полями логин-пароль.
что не хватает сформированному мною post запросу? может, куки?
0
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 257
01.04.2015, 20:22 #34
ну для начала в теме не хватает кода твоего
1
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
01.04.2015, 21:07  [ТС] #35
ну для начала в теме не хватает кода твоего
Приведу его фрагменты

метод, который непосредственно выполняет запрос POST
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public String sendPost(String targetURL, QueryString query) throws MalformedURLException, IOException{
 
        URL url;
        HttpURLConnection connection = null;
 
        try{
            
            url = new URL(targetURL);
        
            connection = (HttpURLConnection)url.openConnection();
 
            connection.setRequestMethod("POST");
            connection.setUseCaches(false);
            connection.setDoInput(true);
            connection.setDoOutput(true);
        
            DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
            wr.writeBytes(query.toString());
            wr.flush();
            wr.close();
        
            InputStream is = connection.getInputStream();
            BufferedReader rd = new BufferedReader(new InputStreamReader(is));
 
            String line;
            StringBuilder response = new StringBuilder();
 
            while((line = rd.readLine()) != null) {
 
                response.append(line);
                System.out.println(line);        
                response.append('\r');
            }
            rd.close();
            return response.toString();
 
        } catch (Exception e) {
 
            e.printStackTrace();
            return null;
 
            } finally {
 
            if(connection != null) {
                connection.disconnect();
                }
            }
        }
Класс QueryString

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class QueryString {
    private StringBuffer query;
    
    public QueryString(Object name, Object value) throws UnsupportedEncodingException{
            add(name,value);
    }
    
    public QueryString() {
        query = new StringBuffer();
    }
    
    public synchronized QueryString add(Object name, Object value) throws UnsupportedEncodingException{
 
        if (!query.toString().trim().equals("")) query.append("&");
        query.append(URLEncoder.encode(name.toString(), "UTF-8"));
        query.append("=");
        query.append(URLEncoder.encode(value.toString(), "UTF-8"));
        return this;        
    }
    
    public String toString(){
    return query.toString();
    }
    
}

Подготовка query и вызов метода POST

Java
1
2
3
4
5
6
7
8
QueryString postQuery = new QueryString();
 
        postQuery.add("form_key", formKey);
        postQuery.add("login[username]", login);
        postQuery.add("login[password]", password);        
        postQuery.add("oauth_token", requestToken);
 
myConnectionClass.sendPost(myAuthorizationUrl, postQuery);
0
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 257
02.04.2015, 00:03 #36
приведи еще содержимое пакета уровня TCP, когда авторизуешся с браузера, потмоу что с виду все впорядке... а значит чего-то не хватает
1
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
02.04.2015, 00:36  [ТС] #37
Цитата Сообщение от fgtmenow Посмотреть сообщение
содержимое пакета уровня TCP
Это POST Data?

Добавлено через 13 минут
Как-то сильно мудрено получается...
Может, использовать все-таки браузер android для отправки запросов.
А в конце, когда verifier code уже присутствует в коде загруженной страницы, изъять его оттуда в приложение.
У webview методов для изъятия html нет, как я понял. А другие браузеры android?
0
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 257
02.04.2015, 10:21 #38
в одном проекте я через JavascriptInteface работал с кодом через Webview, тоже неплохое решение

Добавлено через 7 минут
но webview работает только а ui потоке, придётся исхитриться чтобы его спрятать для пользователя. сейчас примерчик поищу как реализовать саму работу

Добавлено через 13 минут
ну вот например есть у нас активити с webview

в oncreate имеем:

Java
1
2
3
4
5
6
7
8
WebView mWebView = (WebView) findViewById(R.id.webView);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setLoadsImagesAutomatically(false);
mWebView.getSettings().setUseWideViewPort(true);
mWebView.getSettings().setLoadWithOverviewMode(true);
mWebView.getSettings().setUserAgentString("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36");
addInterface();
метод addInterface();

Java
1
2
3
4
5
6
7
8
9
  void addInterface() {
        mWebView.removeJavascriptInterface("HTMLOUT");
        class JavaScriptInterfaceGetHtml {
            public void getHTML(String s) {                           
                    Log.d("getHTML", "" + s);  
            }          
        }
        mWebView.addJavascriptInterface(new JavaScriptInterfaceGetHtml(), "HTMLOUT");
    }

и теперь, когда надо получить html код страницы - вызываем
Java
1
mWebView.loadUrl("javascript:window.HTMLOUT.getHTML('<head>'+document.getElementsByTagName('HTML')[0].innerHTML+'</head>');");
и html код подается входным параметром в метод getHTML(String s) класса JavaScriptInterfaceGetHtml
1
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
02.04.2015, 12:26  [ТС] #39
т.е., правильно я понимаю, метод getHTML(String s) может, получив строку с html страницы, пропарсить ее, извлечь verifier code и передать его дальше по назначению?
0
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 257
02.04.2015, 13:02 #40
ну да, на яве уже как хочешь извращайся со строкой. Но эту связку не легко заставить работать
1
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
02.04.2015, 15:50  [ТС] #41
Цитата Сообщение от fgtmenow Посмотреть сообщение
Но эту связку не легко заставить работать
в чем могут быть трудности?
0
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 257
02.04.2015, 16:55 #42
в Android SDK. Она версия от версии убирают некоторые "опасные" методы. Вот с этим тоже помнится проблемы были. но у меня заработало и работает. так что, вперед. это максимум чем я могу помочь
1
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
03.04.2015, 18:30  [ТС] #43
Пробую пример с JavaSctiptInterfaceGetHtml
Мой код практически не отличается от кода в примере

onCreate()
Java
1
2
3
4
5
6
7
8
9
        mWebView = (WebView)findViewById(R.id.webview);
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setLoadsImagesAutomatically(false);
        webSettings.setUseWideViewPort(true);
        webSettings.setLoadWithOverviewMode(true);
        webSettings.setUserAgentString("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) 
        Chrome/40.0.2214.115 Safari/537.36");
        addInterface();
сразу после onCreate()
Java
1
2
3
4
5
6
7
8
9
10
11
12
void addInterface(){
        
        mWebView.removeJavascriptInterface("HTMLOUT");
        class JavaSctiptInterfaceGetHtml{
 
            public void getHTML(String s){
                System.out.println("-------------------HTML " + s);
            }
        }
        mWebView.addJavascriptInterface(new JavaSctiptInterfaceGetHtml(),"HTMLOUT");
 
    }
onPageFinished()

Java
1
2
3
4
5
6
7
8
public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                
                if(url.startsWith("http://myURL/index.php/oadmin/oauth_authorize/confirm/?oauth_token"))
                {
                    mWebView.loadUrl("javascript:window.HTMLOUT.getHTML('<head>'+document.getElementsByTagName('HTML')[0].innerHTML+'</head>');");
                }
            }
-метод addInterface() срабатывает
-конструктор JavaSctiptInterfaceGetHtml тоже
-if, вызывающий
Java
1
mWebView.loadUrl("javascript:window.HTMLOUT.getHTML('<head>'+document.getElementsByTagName('HTML')[0].innerHTML+'</head>');");
также срабатывает

-метод public void getHTML(String s) не срабатывает.

При моих нынешних знаниях javascript пока не могу определить причину

Добавлено через 1 час 4 минуты
разбираюсь

Добавлено через 19 часов 28 минут
Цитата Сообщение от fgtmenow Посмотреть сообщение
Но эту связку не легко заставить работать
так оно и есть пока...
0
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 257
05.04.2015, 03:51 #44
пссс я тут в соседней теме решал схожую проблему с авторизацией - посмотри, может найдешь чего полезного

POST авторизация с использованием JSOUP
1
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
11.04.2015, 12:12  [ТС] #45
Получилось) Достал verifier code)
Осталось подпилить метод и передать verifier code для дальнейшей авторизации.

Сделал с помощью этой темы
Т.е., отправляя запросы авторизации не webview, а jsoup.

Добавлено через 13 часов 42 минуты
на следующем этапе, после запроса вида
Код
http://myUrl/api/rest//products?limit=15
получил ответ сервера 500

Добавлено через 18 минут
хотя идентичный код в NetBeans java application работает как нужно

В чем проблема Android studio и genymotion?
0
11.04.2015, 12:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2015, 12:12
Привет! Вот еще темы с ответами:

Получение html кода страницы - Программирование Android
Помогите разобраться с получением html кода интернет страницы в приложении android, для последующего извлечения из неё информации.

Вытянуть информацию с кода страницы сайта - Программирование Android
Всем привет! Нашел пример в интернете как сделать простое приложение, которое считывает температуру с сайта. По кнопке Button обновляет...

Адрес страницы отображаемой WebView - JavaFX
Всем хаю-хай, скажите, как мне получить ссылку веб-страницы, которая в данный момент отображается у меня на JFrame через WebView. Хотел...

webView загрузка страницы. Не работает сигнал - C++ Qt
ui-&gt;webView-&gt;load(QNetworkRequest(QUrl(&quot;http://m.facebook.com&quot;)), ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
45
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru