User:Wikibot

出自Ubuntu中文

机器人,自动将 http://help.ubuntu.comhttp://wiki.ubuntu.com 由 monimoni 格式转换到 mediawiki 格式,并自动更新和发布的小程序。 由java写成。


/*
 * Main.java
 *
 * Created on 2007年5月12日, 下午1:31
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
 
package wiki;
 
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.security.GeneralSecurityException;
import java.security.Security;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.X509TrustManager;
 
/**
 *
 * @author oneleaf
 */
public class Main {
    List <String> addDict= new Vector<String>();
    List <String> oldDict= new Vector<String>();
    String cookie=getCookie();
 
    private String getCookie(){
        String cookie = "";
        try{
            URL httpurl = new URL("http://wiki.ubuntu.org.cn/index.php?title=Special:Userlogin");
            HttpURLConnection httpConn = (HttpURLConnection)httpurl.openConnection();
            httpConn.addRequestProperty("Cookie",cookie);
            httpConn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)");
            httpConn.setRequestProperty("Content-Type",   "application/x-www-form-urlencoded");
            httpConn.setRequestProperty("Connection", "Keep-Alive");
            httpConn.setUseCaches(false);
            cookie=httpConn.getHeaderField("Set-Cookie");
 
            String data="wpName=wikibot&wpPassword=********&wpRemember=1";
            httpurl = new URL("http://wiki.ubuntu.org.cn/index.php?title=Special:Userlogin&action=submitlogin&type=login");
            httpConn = (HttpURLConnection)httpurl.openConnection();
            httpConn.setRequestMethod("POST");
            httpConn.addRequestProperty("Cookie",cookie);
            httpConn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)");
            httpConn.setRequestProperty("Content-Type",   "application/x-www-form-urlencoded");
            httpConn.setRequestProperty("Content-Language","UTF-8" );
            httpConn.setRequestProperty("Content-Length", ""+data.getBytes().length);
            httpConn.setRequestProperty("Connection", "Keep-Alive");
            httpConn.setDoOutput(true);
            httpConn.setDoInput(true);
            httpConn.setUseCaches(false);
 
            DataOutputStream outStream = new DataOutputStream(httpConn.getOutputStream());
            outStream.writeBytes(data);
            outStream.flush();
            outStream.close();
 
            List <String> list=httpConn.getHeaderFields().get("Set-Cookie");
            for (int i=0;i<list.size();i++){
                cookie=cookie+"; "+list.get(i);
            }
        } catch (Exception ex){
            ex.printStackTrace();
        }
        return cookie;
    }
 
    private void addDict(String dict){
        String str=dict.trim();
 
        if (dict.startsWith("/")){
            str=dict.substring(1);
        }else if (dict.indexOf("#")>0){
            str=dict.substring(0,dict.indexOf("#"));
        }else if (dict.indexOf("?")>0){
            str=dict.substring(0,dict.indexOf("?"));
        }else if (dict.startsWith("./") || dict.startsWith("//")){
            str=dict.substring(2);
        }else if (dict.startsWith("../")){
            str=dict.substring(3);
        }
        if (str.toLowerCase().indexOf("team")>0) return;
        if (str.trim().length()==0) return;
        if (str.trim().length()>=256) return;
        //../CommandLine
 
        if (oldDict.contains(str)) return;
        if (addDict.contains(str)) return;
 
        addDict.add(str);
    }
 
    private void delDict(int dictindex){
        oldDict.add(addDict.get(dictindex));
        addDict.remove(dictindex);
    }
 
    private void clearDict(){
        addDict.clear();
        oldDict.clear();
    }
 
    private void getDicts(String html){
        Pattern pattern= Pattern.compile("\\[UbuntuHelp:(.*?)\\]");
        Matcher matcher=pattern.matcher(html);
        while(matcher.find()) {
            String line=matcher.group(1);
            if (line.indexOf("|")>0){
                addDict(line.substring(0,line.indexOf("|")));
            }else{
                addDict(line);
            }
        }
        pattern= Pattern.compile("\\[UbuntuWiki:(.*?)\\]");
        matcher=pattern.matcher(html);
        while(matcher.find()) {
            String line=matcher.group(1);
            if (line.indexOf("|")>0){
                addDict(line.substring(0,line.indexOf("|")));
            }else{
                addDict(line);
            }
        }
    }
 
    /** Creates a new instance of Main */
    public Main() {
        SSLContext sslContext = null;
        try {
            sslContext = SSLContext.getInstance("TLS");
            X509TrustManager[] xtmArray = new X509TrustManager[] { xtm };
            sslContext.init(null, xtmArray, new java.security.SecureRandom());
        } catch(GeneralSecurityException gse) {
        }
        if(sslContext != null) {
            HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
        }
        HttpsURLConnection.setDefaultHostnameVerifier(hnv);
    }
 
 
    private X509TrustManager xtm = new X509TrustManager() {
        public void checkClientTrusted(X509Certificate[] chain, String authType) {}
        public void checkServerTrusted(X509Certificate[] chain, String authType) {}
 
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    };
 
    private HostnameVerifier hnv = new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };
 
    public String getUrl(String urladdress,String dict) throws IOException{
        URL url=new URL(urladdress);
        HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
        httpConn.setReadTimeout(60000);
        httpConn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)");
        httpConn.setRequestProperty("Content-Language","UTF-8" );
        httpConn.setRequestProperty("Connection", "Keep-Alive");
        InputStream in=httpConn.getInputStream();
        BufferedReader read=new BufferedReader(new InputStreamReader(in));
        StringBuffer sb=new StringBuffer();
        while (true){
            String line=read.readLine();
            if (line==null) break;
            sb.append(line+"\r\n");
        }
        return moin2wm(sb.toString(),urladdress,dict);
    }
 
    public String moin2wm(String html,String url,String dict) throws UnsupportedEncodingException{
        String text=html;
        String ex="UbuntuHelp";
        String turl="https://help.ubuntu.com/community/";
        if (url.startsWith("https://wiki")){
            ex="UbuntuWiki";
            turl="https://wiki.ubuntu.com/";
        }
 
        String head="{{From|"+url.substring(0,url.indexOf("?"))+"}}\r\n{{Languages|"+ex+":"+dict+"}}\r\n";
 
        //删除注释
        text=text.replaceAll("\r\n##(.*)","");
        text=text.replaceAll("\r\n#format(.*)","");
        text=text.replaceAll("\r\n#language(.*)","");
        text=text.replaceAll("\r\n#pragma(.*)","");
        text=text.replaceAll("\r\n#acl(.*)","");
        text=text.replaceAll("^##(.*)\r\n","");
        text=text.replaceAll("^#format(.*)\r\n","");
        text=text.replaceAll("^#language(.*)\r\n","");
        text=text.replaceAll("^#pragma(.*)\r\n","");
        text=text.replaceAll("^#acl(.*)\r\n","");
        //替换#REDIRECT PDFPrinting => #REDIRECT [[PDFPrinting]]
        text=text.replaceAll("#REDIRECT (\\S*)","#REDIRECT "+"[["+ex+":$1]]");
        text=text.replaceAll("#redirect (\\S*)","#REDIRECT "+"[["+ex+":$1]]");
        //#refresh 0 https://wiki.ubuntu.com/ASUS_A3H_5010_Laptop_with_Ubuntu
        text=text.replaceAll("#REFRESH (.*?) (\\S*)","#REDIRECT "+"[["+ex+":$2]]");
        text=text.replaceAll("#refresh (.*?) (\\S*)","#REDIRECT "+"[["+ex+":$2]]");
 
        //删除主题
        text=text.replaceAll(".*TableOfContents.*","");
        //标题从二开始
        text=text.replaceAll("= (.*?) =","== $1 ==");
        //转化List
        text=replaceList2(text);
        //[[BR]] -> <BR>
        text=text.replaceAll("\\[\\[BR\\]\\]","<br>");
        //link convert superscripted - ^ * ^ -> <sup> * </sup>
        text=text.replaceAll("\\^(.*)\\^","<sup>$1</sup>");
        //link convert subscripted - ,, * ,, -> <sub> * </sub>
        text=text.replaceAll(",,(.*?),,","<sub>$1</sub>");
 
        //link convert - ["/*"] -> [[ex:dict/*]]
        text=text.replaceAll("\\[//(.*?)\"\\]","[["+ex+":"+dict+"/$1]]");
        text=text.replaceAll("\\[/(.*?)\"\\]","[["+ex+":"+dict+"/$1]]");
        //link convert - [" * "] -> [[ UbuntuHelp: * ]]
        text=text.replaceAll("\\[\"(.*?)\"\\]","[["+ex+":$1]]");
        //link convert - [# * ] -> [[ * ]]
        text=text.replaceAll("\\[#(.*?)\\]","[[$1]]");
        //link convert - [: / * : * ] -> [[ UbuntuHelp:dict\ * | * ]]
        text=text.replaceAll("\\[:/(.*?):(.*?)\\]","[["+ex+":"+dict+"/$1|$2]]");
        //link convert - [: * : * ] -> [[ UbuntuHelp: * | * ]]
        text=text.replaceAll("\\[:(.*?):(.*?)\\]","[["+ex+":$1|$2]]");
        //link convert - [: / * ] -> [[ UbuntuHelp: dict * ]]
        text=text.replaceAll("\\[:/(.*?)\\]","[["+ex+":"+dict+"/$1]]");
        //link convert - [: * ] -> [[ UbuntuHelp: * ]]
        text=text.replaceAll("\\[:(.*?)\\]","[["+ex+":$1]]");
        //link convert - wiki:cat  -> [[UbuntuWiki:cat]]
        text=text.replaceAll(" wiki:(\\S*)"," [[UbuntuWiki:$1]]");
        text=text.replaceAll("\r\nwiki:(\\S*)","\r\n[[UbuntuWiki:$1]]");
        //link convert - [wiki:cat * ] -> [[UbuntuWiki:cat| * ]]
        text=text.replaceAll("\\[wiki:(.*?)\\ (.*?)\\]","[[UbuntuWiki:$1|$2]]");
        //link convert - [wiki:cat * ] -> [[UbuntuWiki:cat| * ]]
        text=text.replaceAll("\\[wiki:(.*?)\\]","[[UbuntuWiki:$1]]");
        //link convert - [UbuntuWiki:\*] -> [UbuntuWiki:dict\*]
        text=text.replaceAll("\\[UbuntuWiki:\\\\(.*?)\\]","[UbuntuWiki:"+dict+"\\$1]");
        //link convert - [UbuntuHelp:\*] -> [UbuntuHelp:dict\*]
        text=text.replaceAll("\\[UbuntuHelp:\\\\(.*?)\\]","[UbuntuHelp:"+dict+"\\$1]");
 
        //link convert - __ * __ -> <u> * </u>
        text=text.replaceAll("__(.*?)__","<u>$1</u>");
 
        //link convert - {{{ * }}} -> <code><nowiki> * </nowiki></code>
        text=text.replaceAll("\\{\\{\\{(.*?)\\}\\}\\}","<code><nowiki>$1</nowiki></code>");
 
        //link convert - \r\n {{{ *  -> \r\n<pre><nowiki> *
        text=text.replaceAll("\r\n([ \\.]*?)\\{\\{\\{(.*)","\r\n<pre><nowiki>$2");
 
        //link convert - {{{ *  -> <pre><nowiki> *
        text=text.replaceAll("\\{\\{\\{(.*)","\r\n<pre><nowiki>$1");
 
        //link convert -  * }}} ->  * <\pre><\nowiki>
        text=text.replaceAll("(.*?)\\}\\}\\}","$1</nowiki></pre>");
        //CategoryHomepage =>[[category:"+ex+"]];
        text=text.replaceAll("Category(\\S*)","[[category:Category$1]]");
 
        text=text.replaceAll("\r\n( *)","\r\n");
        text=replaceUrl(text,turl,dict);
        text=tableConv(text);
        //[[xxx:http]] => [[http:]]
        text=text.replaceAll("\\[\\[(.*?):http(.*?)\\]\\]","[[http$2]]");
        //[[xxx:ftp]] => [[ftp:]]
        text=text.replaceAll("\\[\\[(.*?):ftp(.*?)\\]\\]","[[ftp$2]]");
 
        //[[https://wiki.ubuntu.com/*]] => [[UbuntuWiki:]]
        text=text.replaceAll("\\[\\[https://wiki\\.ubuntu\\.com/(.*?)\\]\\]","[[UbuntuWiki:$1]]");
        //[[https://help.ubuntu.com/community/*]] => [[UbuntuHelp:]]
        text=text.replaceAll("\\[\\[https://help\\.ubuntu\\.com/community/(.*?)\\]\\]","[[UbuntuHelp:$1]]");
        //[[http://wiki.ubuntu.com/*]] => [[UbuntuWiki:]]
        text=text.replaceAll("\\[\\[http://wiki\\.ubuntu\\.com/(.*?)\\]\\]","[[UbuntuWiki:$1]]");
        //[[http://help.ubuntu.com/community/*]] => [[UbuntuHelp:]]
        text=text.replaceAll("\\[\\[http://help\\.ubuntu\\.com/community/(.*?)\\]\\]","[[UbuntuHelp:$1]]");
 
 
        String foot="\r\n[[category:"+ex+"]]";
 
        if (text.trim().startsWith("#REDIRECT")){
            System.out.print(" "+text.trim());
            Pattern pattern= Pattern.compile("\\[\\["+ex+":(.*?)\\]\\]");
            Matcher matcher=pattern.matcher(text);
            if (matcher.find()){
                //如果仅仅是大小写的重定向,就不用考虑直接忽略。
                if (matcher.group(1).toLowerCase().equals(dict.toLowerCase())){
                    System.out.println("\r\n"+dict+" redirect to "+matcher.group(1)+" , 忽略. ");
                    return "";
                }
            }
            return text+head+foot;
        }
        if (text.trim().length()<10){
            return "";
        }
        return head+text+foot;
    }
 
    public String replaceList2(String text){
        String[] lines=text.split("\r\n");
        String block = "";
        StringBuffer bf= new StringBuffer();
        boolean start=false;
        for (int i=0;i<lines.length;i++){
            String line=lines[i];
            String linetrim=line.trim();
            if (linetrim.equals("")) continue;
            if (linetrim.startsWith(". ")||linetrim.startsWith("* ")||linetrim.startsWith("1. ")
            ||linetrim.startsWith("a. ")||linetrim.startsWith("A. ")||linetrim.startsWith("i. ")
            ||linetrim.startsWith("I. ")){
                if (! start){
                    start=true;
                    block=line;
                }else{
                    block=block+"\r\n"+line;
                }
            }else{
                if (start){
                    block=formatList(block);
 
                    bf.append(block);
                    start=false;
                }
                bf.append(lines[i]+"\r\n");
            }
        }
        if (start){
            block=formatList(block);
            bf.append(block);
            start=false;
        }
        return bf.toString();
    }
 
    public String formatList(String text){
        /*
  1. one
  1. two
    1. one
         * bullet 1
         * bullet 2
    1. two
  1. three
         * bullet
      1. one
         */
        //获得步进长度
        text=text.replaceAll(" 1\\. "," # ");
        text=text.replaceAll(" a\\. "," # ");
        text=text.replaceAll(" A\\. "," # ");
        text=text.replaceAll(" i\\. "," # ");
        text=text.replaceAll(" I\\. "," # ");
        text=text.replaceAll(" \\. "," # ");
        String step="";
        for (int i=0;i<text.length();i++){
            if (text.charAt(i)==' '){
                step=step+" ";
            }else break;
        }
 
        //修改步长为" "
        if (step.length()>0)
            text=text.replaceAll(step," ");
        String[] lines=text.split("\r\n");
        for (int i=0;i<lines.length;i++){
            if (lines[i].charAt(0)!=' ')break;
            lines[i]=lines[i].substring(1);
        }
 
        StringBuffer bf= new StringBuffer();
        bf.append(lines[0]+"\r\n");
        for (int i=1;i<lines.length;i++){
            if (lines[i].startsWith(" ")){
                char[] s=lines[i].toCharArray();
                for (int j=0;j<s.length;j++){
                    if (s[j]==' '){
                        if (j>=lines[i-1].length()){
                            s[j]=0;
                        }if (lines[i-1].charAt(j)!='*' && lines[i-1].charAt(j)!='#'){
                            s[j]=0;
                        }else{
                            s[j]=lines[i-1].charAt(j);
                        }
                    }else break;
                }
                String l="";
                for (int j=0;j<s.length;j++){
                    if (s[j]==0)continue;
                    l=l+s[j];
                }
                lines[i]=l;
            }
            bf.append(lines[i]+"\r\n");
        }
 
        return bf.toString();
    }
 
    public String replaceList(String text){
        text=text.replaceAll("\r\n \\. (.*?)","\r\n* $1");
        text=text.replaceAll("\r\n  \\. (.*?)","\r\n** $1");
        text=text.replaceAll("\r\n   \\. (.*?)","\r\n*** $1");
        text=text.replaceAll("\r\n    \\. (.*?)","\r\n**** $1");
        text=text.replaceAll("\r\n     \\. (.*?)","\r\n***** $1");
        text=text.replaceAll("\r\n      \\. (.*?)","\r\n****** $1");
        text=text.replaceAll("\r\n \\*(.*?)","\r\n*$1");
        text=text.replaceAll("\r\n  \\*(.*?)","\r\n**$1");
        text=text.replaceAll("\r\n   \\*(.*?)","\r\n***$1");
        text=text.replaceAll("\r\n    \\*(.*?)","\r\n****$1");
        text=text.replaceAll("\r\n     \\*(.*?)","\r\n*****$1");
        text=text.replaceAll("\r\n      \\*(.*?)","\r\n******$1");
//        text=text.replaceAll("\r\n \\. (.*?)","\r\n#: $1");
//        text=text.replaceAll("\r\n  \\. (.*?)","\r\n##: $1");
//        text=text.replaceAll("\r\n   \\. (.*?)","\r\n###: $1");
//        text=text.replaceAll("\r\n    \\. (.*?)","\r\n####: $1");
//        text=text.replaceAll("\r\n     \\. (.*?)","\r\n#####: $1");
//        text=text.replaceAll("\r\n      \\. (.*?)","\r\n######: $1");
//        text=text.replaceAll("\r\n \\*(.*?)","\r\n#$1");
//        text=text.replaceAll("\r\n  \\*(.*?)","\r\n##$1");
//        text=text.replaceAll("\r\n   \\*(.*?)","\r\n###$1");
//        text=text.replaceAll("\r\n    \\*(.*?)","\r\n####$1");
//        text=text.replaceAll("\r\n     \\*(.*?)","\r\n#####$1");
//        text=text.replaceAll("\r\n      \\*(.*?)","\r\n######$1");
 
        for (int i=1;i<20;i++){
//            text=text.replaceAll("\r\n "+i+"\\.(.*?)","\r\n#$1");
//            text=text.replaceAll("\r\n  "+i+"\\.(.*?)","\r\n##$1");
//            text=text.replaceAll("\r\n   "+i+"\\.(.*?)","\r\n###$1");
//            text=text.replaceAll("\r\n    "+i+"\\.(.*?)","\r\n####$1");
//            text=text.replaceAll("\r\n     "+i+"\\.(.*?)","\r\n#####$1");
//            text=text.replaceAll("\r\n      "+i+"\\.(.*?)","\r\n######$1");
            text=text.replaceAll("\r\n "+i+"\\.(.*?)","\r\n*$1");
            text=text.replaceAll("\r\n  "+i+"\\.(.*?)","\r\n**$1");
            text=text.replaceAll("\r\n   "+i+"\\.(.*?)","\r\n***$1");
            text=text.replaceAll("\r\n    "+i+"\\.(.*?)","\r\n****$1");
            text=text.replaceAll("\r\n     "+i+"\\.(.*?)","\r\n*****$1");
            text=text.replaceAll("\r\n      "+i+"\\.(.*?)","\r\n******$1");
        }
        return text;
    }
 
    public String replaceUrl(String text,String baseurl,String dict) throws UnsupportedEncodingException{
        //attachment:IconsPage/info.png -> https://help.ubuntu.com/community/IconsPage?action=AttachFile&do=get&target=info.png
        while (true){
            Pattern pattern= Pattern.compile("attachment:(.*?)/(\\S*)");
            Matcher matcher=pattern.matcher(text);
            String replace;
            if (matcher.find()) {
                replace=baseurl+matcher.group(1)+"?action=AttachFile&do=get&target="+URLEncoder.encode(matcher.group(2), "UTF-8");
                text=text.substring(0,matcher.start(0))+replace+text.substring(matcher.end(0));
                continue;
            }
 
 
            pattern= Pattern.compile("attachment:(\\S*)");
            matcher=pattern.matcher(text);
            if(matcher.find()) {
                replace=baseurl+dict+"?action=AttachFile&do=get&target="+URLEncoder.encode(matcher.group(1), "UTF-8");
                text=text.substring(0,matcher.start(0))+replace+text.substring(matcher.end(0));
                continue;
            }
 
            break;
        }
        return text;
    }
 
    public String tableConv(String html){
        //||a||b||c|| -> {|
        //||d||e||f||    |a||b||c
        //               |-
        //               |d||e||f
        //               |}
 
        String[] lines=html.split("\r\n");
        String block = "";
        StringBuffer bf= new StringBuffer();
        boolean start=false;
        for (int i=0;i<lines.length;i++){
            String line=lines[i].trim();
            if (line.startsWith("||")){
                if (! start){
                    start=true;
                    String str=line.substring(1,line.length()-2);
                    str=str.replaceAll("<bgcolor.*?>","");
                    str=str.replaceAll("<style.*?>","");
                    str=str.replaceAll("<rowbgcolor.*?>","");
                    str=str.replaceAll("<tablestyle.*?>","");
                    block="{|border=\"1\" cellspacing=\"0\"\r\n"+str;
                }else{
                    String str=line.substring(1,line.length()-2);
                    str=str.replaceAll("<bgcolor.*?>","");
                    str=str.replaceAll("<style.*?>","");
                    str=str.replaceAll("<rowbgcolor.*?>","");
                    block=block+"\r\n|-\r\n"+str;
                }
            }else{
                if (start){
                    block=block+"\r\n|}\r\n";
                    bf.append(block);
                    start=false;
                }
                bf.append(lines[i]+"\r\n");
            }
        }
        if (start){
            block=block+"\r\n|}\r\n";
            bf.append(block);
            start=false;
        }
 
        return bf.toString();
    }
 
 
 
    public void putText(String dict,String html,String surl) throws MalformedURLException, IOException{
        URL url;
        URLConnection conn;
        InputStream in;
        BufferedReader read;
        StringBuffer sb;
        if (html.length()<5){
            System.out.print(" is short:"+html);
            return;
        }
//        if (html.length()<300){
//            if (html.toUpperCase().trim().indexOf("REFRESH")>0) {
//                System.out.println(dict+" is REFRESH.");
//                return;
//            }
//            if (html.toUpperCase().trim().indexOf("REDIRECT")>0) {
//                System.out.println(dict+" is REDIRECT.");
//                return;
//            }
//        }
        String ex="UbuntuHelp";
        if (surl.startsWith("https://wiki")){
            ex="UbuntuWiki";
        }
 
        try{
            url=new URL("http://wiki.ubuntu.org.cn/"+ex+":"+dict+"?action=raw");
            conn = url.openConnection();
            conn.setReadTimeout(60000);
            conn.setRequestProperty("Cookie", cookie);
            in=conn.getInputStream();
            read=new BufferedReader(new InputStreamReader(in));
            sb=new StringBuffer();
            while (true){
                String line=read.readLine();
                if (line==null) break;
                sb.append(line+"\r\n");
            }
            if (sb.toString().trim().length()==html.trim().length()) {
                System.out.print(" no changes");
                return;
            }
        }catch(Exception ex0){
            //nothing
        }
 
        url=new URL("http://wiki.ubuntu.org.cn/"+ex+":"+dict+"?action=edit");
        conn = url.openConnection();
        conn.setReadTimeout(60000);
 
        conn.setRequestProperty("Connection", "Keep-Alive");
        conn.setRequestProperty("Cookie", cookie);
        conn.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3) Gecko/20061201 Firefox/2.0.0.3 (Ubuntu-feisty)");
        conn.setRequestProperty("Accept","text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
        in=conn.getInputStream();
        read=new BufferedReader(new InputStreamReader(in));
        sb=new StringBuffer();
        while (true){
            String line=read.readLine();
            if (line==null) break;
            sb.append(line+"\r\n");
        }
        int start=sb.indexOf("<form id=\"editform\"");
        int end=sb.indexOf("<div class=\"printfooter\">");
        String from;
        try{
            from=sb.substring(start,end);
        }catch(Exception ex0){
            System.out.println(dict+" error,please set cookie!");
            System.out.println(sb);
            return;
        }
 
        Map<String,String> map=getPostDate(from);
        Iterator<String> iterator=map.keySet().iterator();
 
        url = new URL("http://wiki.ubuntu.org.cn/index.php?title="+ex+":"+URLEncoder.encode(dict, "UTF-8")+"&action=submit");
 
        HttpURLConnection conn2 = (HttpURLConnection) url.openConnection();
        String boundary="---------------------------167593640336579986891120154";
        conn2.setReadTimeout(60000);
 
        conn2.setDoOutput(true);
        conn2.setAllowUserInteraction(false);
        conn2.setRequestMethod("POST");
        conn2.setRequestProperty("Cookie", cookie);
        conn2.setRequestProperty("Content-Type", "multipart/form-data; boundary="+boundary);
        conn2.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3) Gecko/20061201 Firefox/2.0.0.3 (Ubuntu-feisty)");
        conn2.setRequestProperty("Accept","text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
        conn2.setRequestProperty("Accept-Language", "zh-cn,zh;q=0.5");
        conn2.setRequestProperty("Referer", "http://wiki.ubuntu.org.cn/index.php?title=UbuntuHelp:"+URLEncoder.encode(dict, "UTF-8")+"&action=edit");
        conn2.setRequestProperty("Accept-Charset", "UTF-8,*");
        conn2.setRequestProperty("Connection", "Keep-Alive");
 
        StringBuffer content=new StringBuffer();
 
        while (iterator.hasNext()){
            String name=iterator.next();
            if (name.equals("wpPreview")) continue;
            if (name.equals("wpDiff")) continue;
            if (name.equals("wpWatchthis")) continue;
            String value="";
 
            if (name.equals("wpTextbox1")){
                value=html;
            }else {
                value=map.get(name);
            }
            content.append("--"+boundary+"\r\n");
            content.append("Content-Disposition: form-data; name=\""+name+"\"\r\n\r\n");
            content.append(value+"\r\n");
        }
        content.append("--"+boundary+"--\r\n\r\n");
        byte[] data=content.toString().getBytes();
 
        conn2.setRequestProperty("Content-Length", String.valueOf(data.length));
 
        OutputStream out = conn2.getOutputStream();
        out.write(data);
        out.flush();
 
        // Get the response
        try{
            BufferedReader rd = new BufferedReader(new<