User:Gracenotes/Java code
From Wikipedia, the free encyclopedia
Contents |
[edit] Java classes
The following classes would be useful for making a bot in java.
[edit] WikiSessionManager.java
import java.io.IOException; import java.io.OutputStreamWriter; import java.util.Arrays; import java.net.URL; import java.net.URLEncoder; import java.net.URLConnection; /** * WikiSessionManager is a utility class that logs into the English * Wikipedia and facilitates making HTTP requests with cookies. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * @author Gracenotes * @version 0.1 **/ public class WikiSessionManager { private String cookie, sessionData, username; private boolean loggedIn; public WikiSessionManager() { this.loggedIn = false; this.sessionData = ""; this.cookie = ""; } public void userLogin(String username, char[] password) throws IOException { username = username.trim(); if (username.length() == 0 || password.length == 0) throw new IllegalArgumentException("Blank parameter"); URL url = new URL("http://en.wikipedia.org/w/api.php"); URLConnection connection = url.openConnection(); connection.setDoOutput(true); connection.setUseCaches(false); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); connection.connect(); OutputStreamWriter output = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); output.write("action=login" + "&lgname=" + URLEncoder.encode(username, "UTF-8") + "&lgpassword=" + URLEncoder.encode(new String(password).trim(), "UTF-8")); output.flush(); output.close(); Arrays.fill(password, ' '); String headerName; StringBuffer receivedCookie = new StringBuffer(); int i = 0; while ((headerName = connection.getHeaderFieldKey(++i)) != null) { headerName = connection.getHeaderFieldKey(i); if (headerName != null && headerName.equalsIgnoreCase("Set-Cookie")) { receivedCookie.append("; " + connection.getHeaderField(i).split(";")[0]); } } receivedCookie.delete(0, 2); this.cookie = receivedCookie.toString(); this.loggedIn = this.cookie.indexOf("Token=") != -1; this.username = this.loggedIn ? username : null; } public void userLogout() throws IOException { if (!this.loggedIn) return; URL url = new URL("http://en.wikipedia.org/w/index.php?title=Special:Userlogout"); URLConnection connection = url.openConnection(); this.addCookies(connection); connection.connect(); this.loggedIn = false; this.cookie = ""; this.sessionData = ""; } /** * Indicates whether a user is logged in or not * * @return A boolean showing whether a user is logged in or not */ public boolean isLoggedIn() { return this.loggedIn; } public void addCookies(URLConnection connection) { if (!this.loggedIn) return; connection.setRequestProperty("Cookie", this.cookie + (this.sessionData != null ? "; " + this.sessionData : "")); connection.setRequestProperty("User-Agent", this.username); } public boolean findSessionData(URLConnection connection) { sessionData = ""; String headerName; int i = 0; while ((headerName = connection.getHeaderFieldKey(++i)) != null) { if (headerName.equals("Set-Cookie") && connection.getHeaderField(i).indexOf("_session") != -1) this.sessionData = connection.getHeaderField(i).split(";")[0]; } return this.sessionData.length() != 0; } }
[edit] WikiEdit
import java.io.*; import java.util.regex.Pattern; import java.util.regex.Matcher; import java.net.URL; import java.net.URLEncoder; import java.net.URLConnection; /** * WikiEdit is a class that depends on WikiSessionManager. It gets wikitext * of articles and edits them * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * @author Gracenotes * @version 0.1 **/ public class WikiEdit { private WikiSessionManager session; private boolean maxlagDo; //TODO: implement MaxLag stuff private int maxlagLimit, maxlagTime; public WikiEdit(WikiSessionManager session) throws IOException { this.session = session; this.maxlagDo = false; this.maxlagLimit = 0; this.maxlagTime = 5; } public boolean isLoggedIn() { return session.isLoggedIn(); } public String getWikitext(String page) throws IOException { URL url = new URL("http://en.wikipedia.org/w/api.php?titles=" + URLEncoder.encode(page, "UTF-8") + "&action=query&prop=revisions&rvprop=content&format=xml"); URLConnection connection = url.openConnection(); session.addCookies(connection); BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); StringBuffer responseText = new StringBuffer(); String line; while ((line = reader.readLine()) != null) { responseText.append(line + "\n"); } line = responseText.toString(); int pos = line.indexOf("<rev>"); if (pos == -1) line = null; else line = line.substring(pos + 5, line.lastIndexOf("</rev>")).replace("<", "<").replace(">", ">").replace(""", "\"").replace("'", "'").replace("&", "&"); reader.close(); return line; } public void editPage(String page, String wikitext, String editsum, boolean minor) throws IOException { if (!this.isLoggedIn()) { System.err.println("Not logged in."); return; } String pageURL = "http://en.wikipedia.org/w/index.php?title=" + URLEncoder.encode(page, "UTF-8"); int i = 0; URL url = new URL(pageURL + "&action=edit"); URLConnection connection = url.openConnection(); session.addCookies(connection); connection.connect(); session.findSessionData(connection); BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); StringBuffer textToSend = new StringBuffer(); String line, name, value, wait; Pattern pattern = Pattern.compile("<input type='hidden' value=\"(.*?)\" name=\"(.*?)\" />"); Matcher matcher; while ((line = reader.readLine()) != null) { if (line.indexOf("<input type='hidden'") != -1) { matcher = pattern.matcher(line); matcher.find(); name = matcher.group(2); value = matcher.group(1); if (name.equals("wpStarttime")) textToSend.append("&wpStarttime=" + value); if (name.equals("wpEdittime")) textToSend.append("&wpEdittime=" + value); if (name.equals("wpEditToken")) textToSend.append("&wpEditToken=" + URLEncoder.encode(value, "UTF-8")); } } reader.close(); textToSend.append("&wpTextbox1=" + URLEncoder.encode(wikitext, "UTF-8")); textToSend.append("&wpSummary=" + URLEncoder.encode(editsum, "UTF-8")); if (minor) textToSend.append("&wpMinoredit=0"); textToSend.deleteCharAt(0); //now, send the data url = new URL(pageURL + "&action=submit"); connection = url.openConnection(); connection.setDoInput(true); connection.setDoOutput(true); connection.setUseCaches(false); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); session.addCookies(connection); OutputStreamWriter output = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); output.write(textToSend.toString()); output.flush(); output.close(); BufferedReader input = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); line = input.readLine(); /* StringBuffer responseText = new StringBuffer(); while ((line = input.readLine()) != null) { responseText.append(line + "\n"); } //this code can be used to read the response */ } }
[edit] WikiEditTest
import java.net.*; import java.io.*; public class WikiEditTest { public static void main() throws IOException { WikiSessionManager sessionMgr = new WikiSessionManager(); sessionMgr.userLogin("Gracenotes", "password".toCharArray()); WikiEdit edit = new WikiEdit(sessionMgr); if (!edit.isLoggedIn()) { System.out.println("Not logged in"); return; } edit.editPage("User:Gracenotes/Sandbox", edit.getWikitext("User:Gracenotes/Sandbox") + "\nAddendum", "minor test edit", true); } }
The above code would result in this.