Сервер ByetHost передает значения html «Проверка вашего браузера» с помощью JSON String

При попытке проанализировать строку json для android, передаются значения HTML. До дня все работало хорошо, и внезапно мое приложение начало сбой при попытке получить базу данных с помощью php-файлов.

Когда я проверил, заметил, что значения html .. см. Logcat

08-10 01:09:55.814: E/result(6744): <html><body><h2>Checking your browser..<h2><script type="text/javascript" src="/aes.js" ></script><script>function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}function toHex(){for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++)e+=(16>d[f]?"0":"")+d[f].toString(16);return e.toLowerCase()}var a=toNumbers("f655ba9d09a112d4968c63579db590b4"),b=toNumbers("98344c2eee86c3994890592585b49f80"),c=toNumbers("7965e114a1dccaf35af3756261f75ad8");document.cookie="__test="+toHex(slowAES.decrypt(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/";location.href="http://realroom.byethost24.com/medical/stokist.php?ckattempt=1";</script></body></html> 08-10 01:09:55.814: E/JSON Parser(6744): Error parsing data org.json.JSONException: Value <html><body><h2>Checking of type java.lang.String cannot be converted to JSONObject 08-10 01:09:55.816: E/AndroidRuntime(6744): FATAL EXCEPTION: AsyncTask #1 08-10 01:09:55.816: E/AndroidRuntime(6744): Process: com.example.medionline, PID: 6744 08-10 01:09:55.816: E/AndroidRuntime(6744): java.lang.RuntimeException: An error occured while executing doInBackground() 08-10 01:09:55.816: E/AndroidRuntime(6744): at android.os.AsyncTask$3.done(AsyncTask.java:304) 08-10 01:09:55.816: E/AndroidRuntime(6744): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 08-10 01:09:55.816: E/AndroidRuntime(6744): at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 08-10 01:09:55.816: E/AndroidRuntime(6744): at java.util.concurrent.FutureTask.run(FutureTask.java:242) 08-10 01:09:55.816: E/AndroidRuntime(6744): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 08-10 01:09:55.816: E/AndroidRuntime(6744): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 08-10 01:09:55.816: E/AndroidRuntime(6744): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 08-10 01:09:55.816: E/AndroidRuntime(6744): at java.lang.Thread.run(Thread.java:818) 08-10 01:09:55.816: E/AndroidRuntime(6744): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.json.JSONObject.toString()' on a null object reference 08-10 01:09:55.816: E/AndroidRuntime(6744): at com.example.medionline.All_supplier_list$FetchMFG.doInBackground(All_supplier_list.java:182) 08-10 01:09:55.816: E/AndroidRuntime(6744): at com.example.medionline.All_supplier_list$FetchMFG.doInBackground(All_supplier_list.java:1) 08-10 01:09:55.816: E/AndroidRuntime(6744): at android.os.AsyncTask$2.call(AsyncTask.java:292) 08-10 01:09:55.816: E/AndroidRuntime(6744): at java.util.concurrent.FutureTask.run(FutureTask.java:237) 08-10 01:09:55.816: E/AndroidRuntime(6744): ... 4 more 

Это происходит со всеми страницами, которые я размещал на сервере byethost, а страницы, размещенные на другом сервере, работают хорошо и хорошо. Я попытался переместить один из моих файлов на другой сервер и на то, что он возвращает правильную строку json.

Также, когда я проверяю URL-адрес в браузере, он возвращает правильную строку json без каких-либо исключений или ошибок с byethost .., но в android давая html значения ..

Вот мой класс JSONfunction

 package com.example.medionline; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.utils.URLEncodedUtils; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONException; import org.json.JSONObject; import android.util.Log; public class JSONfunctions { static InputStream is = null; static String result = ""; static JSONObject jArray = null; public static JSONObject getJSONfromURL(String url) { // Download JSON data from URL try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(url); httppost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240 "); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); is = entity.getContent(); } catch (Exception e) { Log.e("log_tag", "Error in http connection " + e.toString()); } try { BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { Log.e("jsonnnnnnn", line); sb.append(line + "\n"); } is.close(); result = sb.toString(); Log.e("result", result); } catch (Exception e) { Log.e("log_tag", "Error converting result " + e.toString()); } try { jArray = new JSONObject(result); } catch (JSONException e) { Log.e("log_tag", "Error parsing data " + e.toString()); } return jArray; } public static JSONObject makeHttpRequest(String loginUrl, String post, List<NameValuePair> para) { try { if(post == "POST") { HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(loginUrl); httpPost.setEntity(new UrlEncodedFormEntity(para)); httpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240 "); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); } else if(post == "GET") { HttpClient httpClient = new DefaultHttpClient(); String paramString = URLEncodedUtils.format(para, "utf-8"); loginUrl += "?" + paramString; HttpGet httpGet = new HttpGet(loginUrl); HttpResponse httpResponse = httpClient.execute(httpGet); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 8); StringBuilder sb = new StringBuilder(); String line = null; if (is != null) { while ((line = reader.readLine()) != null) { //Log.e("jsonnnnnnn", line); sb.append(line + "\n"); } is.close(); result = sb.toString(); Log.e("result", result); } } catch (Exception e) { Log.e("Buffer Error", "Error converting result " + e.toString()); } try { jArray = new JSONObject(result); } catch (JSONException e) { Log.e("JSON Parser", "Error parsing data " + e.toString()); } return jArray; } } 

И это мой PHP-файл

 <?php include('config.php'); date_default_timezone_set("Asia/Calcutta"); $result1 = mysqli_query($con,"SELECT * FROM `pj_medionline_mst_stockist` ORDER BY `pj_medionline_mst_stockist`.`ID` ASC "); $response = array(); $posts = array(); while($row=mysqli_fetch_array($result1)) { $id =$row["ID"]; $stkcode =$row["stkcode"]; $comName =$row["ComName"]; $operatorid =$row["operatorid"]; $password =$row["Password"]; $posts[] = array('id'=>$id, 'stkcode'=>$stkcode, 'stkname'=>$comName, 'operatorid'=>$operatorid, 'password'=>$password); } $response['stokist'] = $posts; print(json_encode($response)); ?> в <?php include('config.php'); date_default_timezone_set("Asia/Calcutta"); $result1 = mysqli_query($con,"SELECT * FROM `pj_medionline_mst_stockist` ORDER BY `pj_medionline_mst_stockist`.`ID` ASC "); $response = array(); $posts = array(); while($row=mysqli_fetch_array($result1)) { $id =$row["ID"]; $stkcode =$row["stkcode"]; $comName =$row["ComName"]; $operatorid =$row["operatorid"]; $password =$row["Password"]; $posts[] = array('id'=>$id, 'stkcode'=>$stkcode, 'stkname'=>$comName, 'operatorid'=>$operatorid, 'password'=>$password); } $response['stokist'] = $posts; print(json_encode($response)); ?> в <?php include('config.php'); date_default_timezone_set("Asia/Calcutta"); $result1 = mysqli_query($con,"SELECT * FROM `pj_medionline_mst_stockist` ORDER BY `pj_medionline_mst_stockist`.`ID` ASC "); $response = array(); $posts = array(); while($row=mysqli_fetch_array($result1)) { $id =$row["ID"]; $stkcode =$row["stkcode"]; $comName =$row["ComName"]; $operatorid =$row["operatorid"]; $password =$row["Password"]; $posts[] = array('id'=>$id, 'stkcode'=>$stkcode, 'stkname'=>$comName, 'operatorid'=>$operatorid, 'password'=>$password); } $response['stokist'] = $posts; print(json_encode($response)); ?> 

Solutions Collecting From Web of "Сервер ByetHost передает значения html «Проверка вашего браузера» с помощью JSON String"

Решено!

У меня была такая же проблема с использованием Byethost для извлечения данных JSON с моего PHP-сервера. Нам просто нужно добавить файл cookie к HTTP-запросу для передачи модуля testcookie-nginx

Как ответ Ричарда говорит:

Основная проблема заключается в том, что Byet Host реализует простой модуль защиты антивируса> named testcookie-nginx-module

https://kyprizel.github.io/testcookie-nginx-module/

По ссылке, которую он предоставил, мы видим, что модуль testcookie-nginx делает проверку на 2 шага:

  1. В первый раз, когда HTTP-запрос завершен, модуль возвращает javascript вместо ожидаемого JSON. Этот скрипт выполняется на клиенте (типично веб-браузер) и генерирует файл cookie проверки, содержащий ключ AES.

Вот сценарий, который я получил от моего сервера:

 <html> <body> <script type="text/javascript" src="/aes.js" ></script> <script> function toNumbers(d){ var e=[]; d.replace(/(..)/g,function(d){ e.push(parseInt(d,16))}); return e } function toHex(){ for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++) e+=(16>d[f]?"0":"")+d[f].toString(16); return e.toLowerCase() } var a=toNumbers("f655ba9d09a112ffff8c63579db590b4"), b=toNumbers("98344c2eee86c3ffff90592585b49f80"), c=toNumbers("1286963467aa92ffff8323bdca0d7be9"); document.cookie="__test="+toHex(slowAES.decrypt(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/"; location.href="http://myserver.byethost8.com/myPhpPage.php?i=1"; </script> <noscript>This site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support</noscript> </body> 

  1. Скрипт добавляет cookie проверки в документ и перенаправляет его на URL-адрес, который мы действительно хотим получить. Модуль testcookie-nginx проверяет ключ AES файла cookie и позволяет запросу получить URL-адрес, который будет отвечать данными JSON, к которым мы хотим получить доступ.

По следующим HTTP-запросам клиент сохранит файл cookie и добавит его в запрос, пропустив шаг 1.

Решение для Android-приложения

Мы собираемся пропустить создание файла cookie, получив его из веб-браузера и добавить его непосредственно в наш запрос HTTP для Android (если, конечно, вы не хотите участвовать в его создании).

Прежде чем вы получите cookie из веб-браузера, убедитесь, что вы получили доступ к URL-адресу хотя бы один раз с помощью браузера для его создания.

  • Получение ключа cookie из веб-браузера. Я использовал Google Chrome для этого:

    1. В меню Chrome в правом верхнем углу браузера выберите « Настройки» .
    2. В нижней части страницы нажмите « Показать дополнительные настройки …» .
    3. В разделе «Конфиденциальность» выберите « Настройки содержимого» ….
    4. выберите Все файлы cookie и данные сайта ….
    5. Найдите название вашего сайта. Просматривая «byethost», вы найдете его.
    6. Откройте файл cookie с именем __test и скопируйте значения содержимого , путь и срок действия
  • Настройка файла cookie в нашем приложении для Android. На вашем коде должно быть что-то вроде:

     try { if(post == "POST") { HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(loginUrl); httpPost.setEntity(new UrlEncodedFormEntity(para)); httpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240 "); httpPost.addHeader("Cookie", "__test=THE_CONTENT_OF_YOUR_COOKIE_HERE; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/"); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); } else if(post == "GET") { HttpClient httpClient = new DefaultHttpClient(); String paramString = URLEncodedUtils.format(para, "utf-8"); loginUrl += "?" + paramString; HttpGet httpGet = new HttpGet(loginUrl); httpGet.addHeader("Cookie", "__test=THE_CONTENT_OF_YOUR_COOKIE_HERE; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/"); HttpResponse httpResponse = httpClient.execute(httpGet); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); } } 

Вот и все. Теперь каждый раз, когда приложение делает HTTP-запрос, он будет включать файл cookie для передачи модуля testcookie-nginx и будет извлекать ваши данные JSON.

Надеюсь, это поможет и не слишком поздно.

С уважением

Основная проблема заключается в том, что Byet Host реализует простой модуль защиты от вирусов с именем testcookie-nginx-module

https://kyprizel.github.io/testcookie-nginx-module/

Это приведет к сбою приложения

Это новая функция обнаружения ботов на бесплатном хостинге для предотвращения нежелательных ботов. Это появляется только при первом посещении страницы.

Например, /upper_respiratory_infection.htm?ckattempt=1 зарегистрировался 37 раз моей веб-аналитикой с 8 августа по 11 августа. Это создает хаос с моей веб-аналитикой, так как теперь я собираю два набора данных для каждой страницы (один с один без CKattempt = 1, а некоторые даже с надстройкой CKattempt = 2)

К сожалению, это невозможно удалить

более подробно

Я должен добавить следующее в качестве ответа, поскольку обходной путь обходит эту проблему. Проводка, поскольку это может помочь кому-то:

Эта проблема может быть решена простым написанием exit (); в файле php в последнем исполняемом заявлении. Это выйдет из файла php и не добавит текст. например.

 <?php include('config.php'); date_default_timezone_set("Asia/Calcutta"); $result1 = mysqli_query($con,"SELECT * FROM `pj_medionline_mst_stockist` ORDER BY `pj_medionline_mst_stockist`.`ID` ASC "); $response = array(); $posts = array(); while($row=mysqli_fetch_array($result1)) { $id =$row["ID"]; $stkcode =$row["stkcode"]; $comName =$row["ComName"]; $operatorid =$row["operatorid"]; $password =$row["Password"]; $posts[] = array('id'=>$id, 'stkcode'=>$stkcode, 'stkname'=>$comName, 'operatorid'=>$operatorid, 'password'=>$password); } $response['stokist'] = $posts; print(json_encode($response)); exit(); ?> в <?php include('config.php'); date_default_timezone_set("Asia/Calcutta"); $result1 = mysqli_query($con,"SELECT * FROM `pj_medionline_mst_stockist` ORDER BY `pj_medionline_mst_stockist`.`ID` ASC "); $response = array(); $posts = array(); while($row=mysqli_fetch_array($result1)) { $id =$row["ID"]; $stkcode =$row["stkcode"]; $comName =$row["ComName"]; $operatorid =$row["operatorid"]; $password =$row["Password"]; $posts[] = array('id'=>$id, 'stkcode'=>$stkcode, 'stkname'=>$comName, 'operatorid'=>$operatorid, 'password'=>$password); } $response['stokist'] = $posts; print(json_encode($response)); exit(); ?> в <?php include('config.php'); date_default_timezone_set("Asia/Calcutta"); $result1 = mysqli_query($con,"SELECT * FROM `pj_medionline_mst_stockist` ORDER BY `pj_medionline_mst_stockist`.`ID` ASC "); $response = array(); $posts = array(); while($row=mysqli_fetch_array($result1)) { $id =$row["ID"]; $stkcode =$row["stkcode"]; $comName =$row["ComName"]; $operatorid =$row["operatorid"]; $password =$row["Password"]; $posts[] = array('id'=>$id, 'stkcode'=>$stkcode, 'stkname'=>$comName, 'operatorid'=>$operatorid, 'password'=>$password); } $response['stokist'] = $posts; print(json_encode($response)); exit(); ?>