package heufybot.utils; import heufybot.core.Logger; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathFactory; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.LinkedHashMap; public class URLUtils { public static String grab(String urlString, HashMap<String, String> headers) { try { URL url = new URL(urlString); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestProperty("User-Agent", "Mozilla/5.0"); for (String requestHeader : headers.keySet()) { connection.setRequestProperty(requestHeader, headers.get(requestHeader)); } BufferedReader bufReader = new BufferedReader(new InputStreamReader( connection.getInputStream())); String line; String data = ""; while ((line = bufReader.readLine()) != null) { data += line + " "; } bufReader.close(); return data; } catch (Exception e) { Logger.error("URL Utilities", "Couldn't grab URL \"" + urlString + "\""); return null; } } public static String grab(String urlString) { return grab(urlString, new HashMap<String, String>()); } public static String getFullHostname(String urlString) { try { HttpURLConnection connection = (HttpURLConnection) new URL(urlString).openConnection(); connection.setInstanceFollowRedirects(false); while (connection.getResponseCode() / 100 == 3) { urlString = connection.getHeaderField("location"); connection = (HttpURLConnection) new URL(urlString).openConnection(); } return urlString; } catch (Exception e) { Logger.error("URL Utilities", "Couldn't get full hostname for \"" + urlString + "\""); return null; } } public static String getHost(String urlString) { URL url; try { url = new URL(urlString); return url.getHost(); } catch (MalformedURLException e) { Logger.error("URL Utilities", "Couldn't get the host for \"" + urlString + "\""); return null; } } public static String shortenURL(String urlstring) { try { String json = ""; if (urlstring.startsWith("http:")) { json = "{\"longUrl\": \"" + urlstring + "\"}"; } else { json = "{\"longUrl\": \"http://" + urlstring + "/\"}"; } URL url = new URL("https://www.googleapis.com/urlshortener/v1/url"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/json"); connection.setDoOutput(true); OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream()); out.write(json); out.close(); BufferedReader in = new BufferedReader(new InputStreamReader( connection.getInputStream())); String decodedString; String result = ""; while ((decodedString = in.readLine()) != null) { result += decodedString; } in.close(); return result.substring(result.indexOf("http://goo.gl"), result.indexOf("\"", result.indexOf("http://goo.gl"))); } catch (Exception e) { Logger.error("URL Utilities", "Couldn't shorten URL \"" + urlstring + "\""); return null; } } public static LinkedHashMap<String, String> grabRSSFeed(String url) { try { LinkedHashMap<String, String> elements = new LinkedHashMap<String, String>(); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(url); doc.getDocumentElement().normalize(); XPathFactory factory = XPathFactory.newInstance(); XPath xpath = factory.newXPath(); XPathExpression expr = xpath.compile("//rss/channel/item/title/text()"); Object result = expr.evaluate(doc, XPathConstants.NODESET); NodeList nodes = (NodeList) result; String[] titles = new String[nodes.getLength()]; for (int i = 0; i < nodes.getLength(); i++) { titles[i] = nodes.item(i).getNodeValue(); } expr = xpath.compile("//rss/channel/item/link/text()"); result = expr.evaluate(doc, XPathConstants.NODESET); nodes = (NodeList) result; for (int i = 0; i < nodes.getLength(); i++) { elements.put(titles[i], nodes.item(i).getNodeValue()); } return elements; } catch (Exception e) { Logger.error("URL Utilities", "Couldn't grab RSS feed at " + url); return null; } } }