Reputation: 22916
There's a website which provides some javascript which emits information I need, is there a way through androids APIs, to use this javascript to emit whatever information it has and parse through it?
This is the javascript:
<script type="text/javascript" src="http://pulllist.comixology.com/js/pulllist/5b467b28e73595311e02fe32c3081e4a.js?date=2013-05-15"></script>
If you run it in a html file you'll notice it displays images and text it retrieves from a website, I'd like to get all that information in an android app.
Upvotes: 3
Views: 5386
Reputation: 14173
I don't know if you can directly run javascript code, but you can run it within a webview (maybe a hidden one?) and intercept javascript calls with a javascript interface, in combination with injection into the webview I think you should be able to do almost everything you want. If you'd need it, you could also download the js source, parse it as you wish and then feed it to the webview. If you want more info let me know ^^
the web is full of example anyway, here an example and another one
EDIT
ok you don't need to actually run that javascript, parsing it is enough, here a working example in android implementing @T.S. parsing method, to run it you just need to add android.permission.INTERNET
to your manifest file and having a textview with myTextView id set.
public class MainActivity extends Activity implements Runnable{
TextView myTextView;
public Handler handler = new Handler(){
@Override
public void handleMessage(Message msg){
String source = (String)msg.obj;
// The index of the item
int i = 0;
// We search the data-string from the start
int position1 = 0;
// While there are items found, continue
while(true) {
// Look for the pattern a[index]={json data};
String lookFor1 = "a[" + String.valueOf(i) + "]={";
String lookFor2 = "};";
position1 = source.indexOf(lookFor1, position1+1);
// Check if we have a match
if(position1 > -1) {
// Find the end of the match
int position2 = source.indexOf(lookFor2, position1);
// Get the result
String result = source.substring(position1 + lookFor1.length() - 1, position2 + 1);
// Increase the index an check if we can find a next item
i++;
// Print out this row, which is a JSON representation of the data you want
Log.e("res",result);
try {
JSONObject obj = new JSONObject(result);
String title = obj.getString("title");
String img = obj.getString("img");
String src = new JSONObject(img).getString("src");
myTextView.append("\ntitle: "+title+"\nimgurl: "+src+"\n");
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
// We haven't found a match, break out of while loop
break;
}
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myTextView = (TextView) findViewById(R.id.myTextView);
Thread thread = new Thread(this);
thread.start();
}
@Override
public void run() {
String data = retrieve_data();
Message msg = handler.obtainMessage();
msg.obj = data;
handler.sendMessage(msg);
}
private String retrieve_data(){
String data = "";
String url = "http://pulllist.comixology.com/js/pulllist/5b467b28e73595311e02fe32c3081e4a.js?date=2013-05-15";
HttpClient httpclient = new DefaultHttpClient();
HttpGet request;
try {
request = new HttpGet(new URI(url));
request.addHeader("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0");
HttpResponse response = httpclient.execute(request);
StatusLine statusLine = response.getStatusLine();
if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
response.getEntity().writeTo(out);
out.close();
data = out.toString();
}
} catch (URISyntaxException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
}
Upvotes: 2
Reputation: 1242
If it's just for displaying you could use the WebView
with some custom styling.
Link: http://developer.android.com/reference/android/webkit/WebView.html
String html = "<script type='text/javascript' src='http://pulllist.comixology.com/js/pulllist/5b467b28e73595311e02fe32c3081e4a.js?date=2013-05-15'></script>";
String mime = "text/html";
String encoding = "utf-8";
WebView myWebView = (WebView)this.findViewById(R.id.myWebView);
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.loadDataWithBaseURL(null, html, mime, encoding, null);
Update
I wrote a quick and dirty example of how you can extract the data from that javascript file:
import java.util.*;
import java.lang.*;
import java.net.*;
import java.io.*;
public class JavascriptToUsableData {
// Method to get a string from an URL
// Thanks to http://stackoverflow.com/a/4328733/1226267
public static String getText(String url) throws Exception {
URL website = new URL(url);
URLConnection connection = website.openConnection();
BufferedReader in = new BufferedReader(
new InputStreamReader(
connection.getInputStream()));
StringBuilder response = new StringBuilder();
String inputLine;
while ((inputLine = in.readLine()) != null)
response.append(inputLine);
in.close();
return response.toString();
}
public static void main (String args[]) throws Exception {
// Get the data
String source = JavascriptToUsableData.getText("http://pulllist.comixology.com/js/pulllist/5b467b28e73595311e02fe32c3081e4a.js?date=2013-05-15");
// The index of the item
int i = 0;
// We search the data-string from the start
int position1 = 0;
// While there are items found, continue
while(true) {
// Look for the pattern a[index]={json data};
String lookFor1 = "a[" + String.valueOf(i) + "]={";
String lookFor2 = "};";
position1 = source.indexOf(lookFor1, position1+1);
// Check if we have a match
if(position1 > -1) {
// Find the end of the match
int position2 = source.indexOf(lookFor2, position1);
// Get the result
String result = source.substring(position1 + lookFor1.length() - 1, position2 + 1);
// Increase the index an check if we can find a next item
i++;
// Print out this row, which is a JSON representation of the data you want
System.out.println(result);
// I'm not in an Android environment right now, but there is a JSON reader you can use in Android
// I think it works somthing like this:
// resultObj = new JSONObject(result);
// And then access the data like this:
// resultObj.getString("title");
// resultObj.getString("guid");
// resultObj.getString("img");
// etc
} else {
// We haven't found a match, break out of while loop
break;
}
}
}
}
It can be optimized a lot and probably isn't fail-safe in it's current state, but it might give you some hints on how to start.
Upvotes: 1