有一个网站提供了一些javascript,它可以发出我需要的信息,是否有通过机器人API的方法,使用这个javascript发出它拥有的任何信息并通过它解析?
这是javascript:
<script type="text/javascript" src="http://pulllist.comixology.com/js/pulllist/5b467b28e73595311e02fe32c3081e4a.js?date=2013-05-15"></script>
如果你在一个html文件中运行它,你会注意到它显示了从网站上检索的图像和文本,我想在Android应用程序中获取所有这些信息。
答案 0 :(得分:2)
我不知道你是否可以直接运行javascript代码,但你可以在webview中运行它(可能是一个隐藏的?)并使用javascript界面拦截javascript调用,结合注入webview我认为你应该能够做你想要的几乎所有事情。 如果您需要它,您也可以下载js源代码,根据需要解析它,然后将其提供给webview。如果您想了解更多信息,请告诉我^^
无论如何,网页上都充满了示例,这里有example和another one 修改的
好吧你不需要实际运行那个javascript,解析它就足够了,这里有一个在Android实现@T.S的工作示例。解析方法,要运行它,您只需要将android.permission.INTERNET
添加到清单文件并设置带有myTextView id的textview。
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;
}
}
答案 1 :(得分:1)
如果它仅用于显示,您可以使用WebView
一些自定义样式。
链接: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);
<强>更新强>
我写了一个快速而又脏的例子,说明如何从该javascript文件中提取数据:
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;
}
}
}
}
它可以进行大量优化,并且可能在当前状态下不是故障安全的,但它可能会给你一些如何启动的提示。