Twitter で残りの API を使用すると、サーバーは限られた量のツイートのみを提供します。APIで提案されている方法であるmax_idでループして、ユーザー履歴を取得しようとしています。ただし、呼び出しごとに新しい xml ヘッダーを取得し、SAX パーサー エラーをスローしているため、max_id を取得できません。Transformer の Java API と OMIT_XML_DECLARATION を調べましたが、接続、印刷メソッド、またはドキュメントの処理時に xml 宣言を削除する必要があるかどうか、コードのどこに配置すればよいかわかりません。Transformer の出力を理解できませんでした...詳細に調べましたが。
public class DataGrabber {
File destFile;
int qcount = 0;
public void getRuserHx() throws ParserConfigurationException, IOException, InterruptedException, SAXException {
int downNodes = 0;
Integer statTot = 10;
String maxId = null;
File filename = new File(MyIds.hoopoeData + "/" + MyIds.rootUser + "Hx.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc;
//loop and download based on the id of the last tweet
while(downNodes < statTot){
System.out.println("Getting user status history...");
String filex = MyIds.rootUser + "Hx.xml";
String https_url = "https://twitter.com/statuses/user_timeline.xml?screen_name=" + MyIds.rootUser + "&count=300";
makeConnection(https_url, filex);
//validate the xml before you parse
doc = builder.parse(filename);
doc.getDocumentElement().normalize();
//set up for the loop
downNodes = HooUtil.nodeCount(filename, "status");
statTot = Integer.parseInt(HooUtil.nodeValue(filename, "user", "statuses_count", 0));
Long loopMax = (Long.valueOf(HooUtil.nodeValue(filename, "status", "id", downNodes - 1)) - 1);
maxId = loopMax.toString();
https_url = "https://twitter.com/statuses/user_timeline.xml?screen_name=" + MyIds.rootUser + "&count=300&max_id=" + maxId;
Thread.sleep(4000);
qcount ++;
}
System.out.println("Finished downloading user status history.");
}
//connect with the input query
public void makeConnection(String https_url, String filex){
URL url;
try {
url = new URL(https_url);
HttpsURLConnection con = (HttpsURLConnection)url.openConnection();
//dump all the content into an xml file
print_content(con, filex);
}
catch (MalformedURLException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
//the print method for the xml file
private void print_content(HttpsURLConnection con, String filex){
if(con!=null){
try {
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
destFile = new File("/" + filex);
PrintWriter out = new PrintWriter(new FileWriter(MyIds.hoopoeData + destFile, true));
String input;
while ((input = br.readLine()) != null){
out.println(input);
}
out.flush();
out.close();
br.close();
}
catch (IOException e) {
e.printStackTrace();
}
}