Wikipedia:Projekt DotNetWikiBot Framework/Innocent bot/Wikidata
Utseende
using System; using System.IO; using System.Text; using System.Text.RegularExpressions; using System.Collections; using System.Collections.Generic; using System.Net; using System.Xml; using System.Xml.XPath; using System.Web; using System.Threading; using DotNetWikiBot; //using DotNetDataBot; class MyBot : Bot { // Hämtar alla data om ett item // site är inloggning från DotNetWikiBot // item är id't på item tex "Q42" för "Berlin" public static string get(Site site, string item) { return get(site, item, true); } // Hämtar alla data om ett item // site är inloggning från DotNetWikiBot // item är id't på item tex "Q42" för "Berlin" // stop programmet för "halt" om det inte finns något uppslag med detta id public static string get(Site site, string item, bool stop) { string data = "&ids="+HttpUtility.UrlEncode(item); return getmeta(site, data, stop); } // Hämtar alla data om ett item // site är inloggning från DotNetWikiBot // projekt är namnet på projektet tex "svwiki" // artikel är namnet på den sökta artiklen på detta projekt public static string get(Site site, string projekt, string artikel) { return get(site, projekt, artikel, true); } // Hämtar alla data om ett item // site är inloggning från DotNetWikiBot // projekt är namnet på projektet tex "svwiki" // artikel är namnet på den sökta artiklen på detta projekt // stop programmet gör "halt" om det inte finns något uppslag med detta id och stop=true public static string get(Site site, string projekt, string artikel, bool stop) { string data = "&sites="+projekt+"&titles="+HttpUtility.UrlEncode(artikel); return getmeta(site, data, stop); } //Denna rutin hämtar data åt funktionen "get" ovan private static string getmeta(Site site, string data, bool halt) { XmlDocument doc = new XmlDocument(); string title = ""; string wiki = ""; string missing = ""; string info = ""; string url = "action=wbgetentities"+data+"&format=xml"; string tmpStr = site.PostDataAndGetResultHTM(site.site+"/w/api.php", url); doc.LoadXml(tmpStr); try{ title = doc.GetElementsByTagName("entity")[0].Attributes.GetNamedItem("title").Value; } catch(NullReferenceException){ // } try{ wiki = doc.GetElementsByTagName("entity")[0].Attributes.GetNamedItem("site").Value; } catch(NullReferenceException){ // } try{ missing = doc.GetElementsByTagName("entity")[0].Attributes.GetNamedItem("missing").Value; if(missing == "") { if(halt) { if(title != "") throw new WikiBotException( Bot.Msg("Finns inget item kopplad till artikel: "+title+" på "+wiki)); else throw new WikiBotException( Bot.Msg("Finns ingen sådant item!")); } else { if(title != "") Console.WriteLine("Finns inget item kopplad till artikel: "+title+" på "+wiki); else Console.WriteLine("Finns ingen sådant item!"); } } } catch(NullReferenceException){ // } try{ info = doc.GetElementsByTagName("error")[0].Attributes.GetNamedItem("info").Value; throw new WikiBotException( Bot.Msg("Annat fel: "+info)); } catch(NullReferenceException){ // } return tmpStr; } // Hämtar id (tex "Q42" för itemet om "Berlin") // xml är den sträng som returnerats av get-funktionen ovan public static string getid(string xml) { string r = ""; XmlDocument doc = new XmlDocument(); System.IO.File.WriteAllText("dataid.xml", xml); doc.LoadXml(xml); try{ string title = doc.GetElementsByTagName("entity")[0].Attributes.GetNamedItem("id").Value; r = title; } catch(NullReferenceException){ r = ""; } return r; } // Hämtar lastrevision för att undvika redigeringskrockar // xml är den sträng som returnerats av get-funktionen ovan public static string getlastrevid(string xml) { string r = ""; XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); try{ string title = doc.GetElementsByTagName("entity")[0].Attributes.GetNamedItem("lastrevid").Value; r = title; } catch(NullReferenceException){ r = ""; } return r; } // Hämtar Description för "svenska" // tmpStr är den sträng som returnerats av get-funktionen ovan public static string getdescription(string tmpStr) { return getdescription(tmpStr, "sv"); } // Hämtar Description för önskat språk // tmpStr är den sträng som returnerats av get-funktionen ovan // språk är det sökta språket public static string getdescription(string tmpStr, string språk) { string r = ""; XmlDocument doc = new XmlDocument(); doc.LoadXml(tmpStr); for(int i = 0; i < doc.GetElementsByTagName("description").Count; i++) { if(doc.GetElementsByTagName("description")[i].Attributes.GetNamedItem("language").Value == språk) { r = doc.GetElementsByTagName("description")[i].Attributes.GetNamedItem("value").Value; } } return r; } // Hämtar Label för svenska // tmpStr är den sträng som returnerats av get-funktionen ovan public static string getlabel(string tmpStr) { return getlabel(tmpStr, "sv"); } // Hämtar Label för önskat språk // tmpStr är den sträng som returnerats av get-funktionen ovan // språk är det sökta språket public static string getlabel(string tmpStr, string språk) { string r = ""; XmlDocument doc = new XmlDocument(); doc.LoadXml(tmpStr); for(int i = 0; i < doc.GetElementsByTagName("label").Count; i++) { if(doc.GetElementsByTagName("label")[i].Attributes.GetNamedItem("language").Value == språk) { r = doc.GetElementsByTagName("label")[i].Attributes.GetNamedItem("value").Value; } } return r; } // Hämtar sitelink för önskat projekt // tmpStr är den sträng som returnerats av get-funktionen ovan // wiki är det sökta projektet tex "svwiki" public static string getsitelink(string tmpStr, string wiki) { string r = ""; XmlDocument doc = new XmlDocument(); doc.LoadXml(tmpStr); for(int i = 0; i < doc.GetElementsByTagName("sitelink").Count; i++) { if(doc.GetElementsByTagName("sitelink")[i].Attributes.GetNamedItem("site").Value == wiki) { r = doc.GetElementsByTagName("sitelink")[i].Attributes.GetNamedItem("title").Value; } } return r; } // Hämtar Aliases för svenska // tmpStr är den sträng som returnerats av get-funktionen ovan public static List<string> getaliases(string tmpStr) { return getaliases(tmpStr, "sv"); } // Hämtar Aliases för önskat språk // tmpStr är den sträng som returnerats av get-funktionen ovan // språk är det sökta språket public static List<string> getaliases(string tmpStr, string språk) { List<string> r = new List<string>(); XmlDocument doc = new XmlDocument(); doc.LoadXml(tmpStr); for(int i = 0; i < doc.GetElementsByTagName("alias").Count; i++) { if(doc.GetElementsByTagName("alias")[i].Attributes.GetNamedItem("language").Value == språk) { r.Add(doc.GetElementsByTagName("alias")[i].Attributes.GetNamedItem("value").Value); } } return r; } //Hämtar edittoken för att kunna genomföra redigeringen, kollar att man är inloggad och att roboten itne har ngt meddelande på sin disk public static string dataedittoken(Site site, string artikel) { string url = "action=query&meta=userinfo&uiprop=blockinfo|hasmsg&format=xml"; XmlDocument doc = new XmlDocument(); string tmpStr = site.PostDataAndGetResultHTM(site.site+"/w/api.php", url); doc.LoadXml(tmpStr); System.IO.File.WriteAllText("userinfo.xml",tmpStr); string id = doc.GetElementsByTagName("userinfo")[0].Attributes.GetNamedItem("id").Value; if(id == "0") throw new WikiBotException( Bot.Msg("Inte längre inloggad!!!")); try{ string messages = doc.GetElementsByTagName("userinfo")[0].Attributes.GetNamedItem("messages").Value; if(messages == "") throw new WikiBotException( Bot.Msg("Meddelande på användardisken!")); } catch(NullReferenceException){ // } try{ string blockid = doc.GetElementsByTagName("userinfo")[0].Attributes.GetNamedItem("blockid").Value; if(blockid != "") throw new WikiBotException( Bot.Msg("Roboten är blockerad!")); } catch(NullReferenceException){ // } string r = ""; url = "action=query&prop=info&titles="+HttpUtility.UrlEncode(artikel)+"&intoken=edit&format=xml"; tmpStr = site.PostDataAndGetResultHTM(site.site+"/w/api.php", url); doc.LoadXml(tmpStr); //Console.WriteLine(tmpStr); string title = doc.GetElementsByTagName("page")[0].Attributes.GetNamedItem("edittoken").Value; r = title; return r; } // Skriver in en ny description // site inloggning // id för item (tex Q42 för Berlin // description för texten som ska in i itemet // bot redigering med botflagga satt public static void setdescription(Site site, string id, string description, bool bot) { setdescription(site, id, description, "sv", bot); } public static void setdescription(Site site, string id, string description) { setdescription(site, id, description, "sv", true); } public static void setdescription(Site site, string id, string description, string språk) { setdescription(site, id, description, språk, true); } public static void setdescription(Site site, string id, string description, string språk, bool bot) { string code = ""; XmlDocument doc = new XmlDocument(); string edittoken = dataedittoken(site, id); string url = "action=wbsetdescription&id="+HttpUtility.UrlEncode(id)+"&language="+språk+"&value="+HttpUtility.UrlEncode(description)+"&token="+HttpUtility.UrlEncode(edittoken); if(bot) url += "&bot="; url += "&formal=xml"; string tmpStr = site.PostDataAndGetResultHTM(site.site+"/w/api.php", url); System.IO.File.WriteAllText("zdesc.xml",tmpStr); doc.LoadXml(tmpStr); try{ code = doc.GetElementsByTagName("error")[0].Attributes.GetNamedItem("code").Value; throw new WikiBotException( Bot.Msg("Felmeddelande: "+code)); } catch(NullReferenceException){ Console.WriteLine("Description satt för "+id); } } public static void setlabel(Site site, string id, string description, string språk, bool bot) { string code = ""; XmlDocument doc = new XmlDocument(); string edittoken = dataedittoken(site, id); string url = "action=wbsetlabel&id="+HttpUtility.UrlEncode(id)+"&language="+språk+"&value="+HttpUtility.UrlEncode(description)+"&token="+HttpUtility.UrlEncode(edittoken); if(bot) url += "&bot="; url += "&formal=xml"; string tmpStr = site.PostDataAndGetResultHTM(site.site+"/w/api.php", url); System.IO.File.WriteAllText("zdesc.xml",tmpStr); doc.LoadXml(tmpStr); try{ code = doc.GetElementsByTagName("error")[0].Attributes.GetNamedItem("code").Value; throw new WikiBotException( Bot.Msg("Felmeddelande: "+code)); } catch(NullReferenceException){ Console.WriteLine("Label satt för "+id); } } // sätter aliases // site inloggning // id är id't för varje item (tex "Q42" för Berlin) // aliases är en lista över alla alias // språk är det valda språket, svenska (sv) är default // lastrevid är senaste revision, för att undvika editkonf // bot är uppgift om det ska sparas med botflagga, default = true public static void setaliases(Site site, string id, List<string> aliases, bool bot) { setaliases(site, id, aliases, "sv", "", bot); } public static void setaliases(Site site, string id, List<string> aliases) { setaliases(site, id, aliases, "sv", "", true); } public static void setaliases(Site site, string id, List<string> aliases, string språk, bool bot) { setaliases(site, id, aliases, språk, "", bot); } public static void setaliases(Site site, string id, List<string> aliases, string språk) { setaliases(site, id, aliases, språk, "", true); } public static void setaliases(Site site, string id, List<string> aliases, string språk, string lastrevid) { setaliases(site, id, aliases, språk, lastrevid, true); } public static void setaliases(Site site, string id, List<string> aliases, string språk, string lastrevid, bool bot) { string alia = ""; string code = ""; XmlDocument doc = new XmlDocument(); foreach(string a in aliases) alia += a+"\n"; alia=alia.Trim().Replace("\n", "|"); Console.WriteLine(alia); string edittoken = dataedittoken(site, id); string url = "action=wbsetaliases&id="+HttpUtility.UrlEncode(id)+"&language="+språk+"&set="+HttpUtility.UrlEncode(alia)+"&token="+HttpUtility.UrlEncode(edittoken)+"&format=xml"; if(lastrevid != "") url += "&baserevid="+lastrevid; if(bot) url += "&bot="; string tmpStr = site.PostDataAndGetResultHTM(site.site+"/w/api.php", url); //Console.WriteLine(tmpStr); System.IO.File.WriteAllText("hej.xml",tmpStr); doc.LoadXml(tmpStr); try{ code = doc.GetElementsByTagName("error")[0].Attributes.GetNamedItem("code").Value; throw new WikiBotException( Bot.Msg("Felmeddelande: "+code)); } catch(NullReferenceException){ Console.WriteLine("Aliases satt för "+id); } } public static void Hämta_info(string språk) { string lösenord = Console.ReadLine(); Site sitedata = new Site("www.wikidata.org", "Innocent bot", lösenord); Site sitesv = new Site("sv.wikipedia.org", "Innocent bot", lösenord); PageList plsv = new PageList(sitesv); plsv.FillFromCategory("Sveriges kommuner"); plsv.Sort(); string sheet = "article;id;label;description;föreslagen desc;lastrevid;aliases ("+språk+")...\n"; foreach(Page p in plsv) { string name = p.title; string r = get(sitedata, "svwiki", p.title, false); p.Load(); string län = ""; string id = getid(r); if(p.GetTemplateParameter("Kommunfakta", "län").Count >0) län = p.GetTemplateParameter("Kommunfakta", "län")[0]; län = län.Replace("[", ""); län = län.Replace("]", ""); string r2 = ""; string länen = ""; List<string> alias = new List<string>(); string description = ""; string label = ""; string lastrevid = ""; if(id != "") { if(län != "") { r2 = get(sitedata, "svwiki", län); länen = getsitelink(r2, "dawiki"); } description = getdescription(r, språk); label = getlabel(r, språk); lastrevid = getlastrevid(r); alias = getaliases(r, språk); } //länen = länen.Replace("s län", " len"); //länen = länen.Replace("län", "len"); string förslag = "kommune i "+länen+", Sverige"; sheet += name+";"; sheet += id+";"; sheet += label+";"; sheet += description+";"; sheet += förslag+";"; sheet += lastrevid+";"; //Console.WriteLine(lastrevid); foreach(string a in alias) { sheet += a+";"; } sheet += "\n"; } System.IO.File.WriteAllText("hej.txt",sheet); } public static void Lägg_info() { string lösenord = Console.ReadLine(); Site sitedata = new Site("www.wikidata.org", "Innocent bot", lösenord); string text = File.ReadAllText("redo.txt").Trim(); string[] texts = text.Replace("\n", "§").Split('§'); foreach(string t in texts) { string[] tv = t.Replace("\t", "§").Split('§'); string r = get(sitedata, tv[1]); string lastrevid = getlastrevid(r); setdescription(sitedata, tv[1], tv[4], "da", true); Bot.Wait(29); } } public static void Hämta_info2(string språk) { string lösenord = Console.ReadLine(); Site sitedata = new Site("www.wikidata.org", "Innocent bot", lösenord); Site sitesv = new Site("sv.wikipedia.org", "Innocent bot", lösenord); PageList plsv = new PageList(sitesv); plsv.FillFromCategory("Tätorter i Sverige"); plsv.Sort(); string sheet = "article;id;label;description;föreslagen label;lastrevid;aliases ("+språk+")...\n"; foreach(Page p in plsv) { string name = p.title; string r = get(sitedata, "svwiki", p.title, false); //p.Load(); //string län = ""; string id = getid(r); List<string> alias = new List<string>(); string description = ""; string label = ""; string lastrevid = ""; if(id != "") { description = getdescription(r, språk); label = getlabel(r, språk); lastrevid = getlastrevid(r); alias = getaliases(r, språk); } string förslag = ""; if(label.IndexOf(",") != -1) förslag = label.Substring(0,label.IndexOf(",")); if(label.IndexOf("(") != -1) förslag = label.Substring(0,label.IndexOf("(")); förslag = förslag.Trim(); sheet += name+";"; sheet += id+";"; sheet += label+";"; sheet += description+";"; sheet += förslag+";"; sheet += lastrevid+";"; //Console.WriteLine(lastrevid); foreach(string a in alias) { sheet += a+";"; } sheet += "\n"; } System.IO.File.WriteAllText("hej1.txt",sheet); } public static void Lägg_info2() { string lösenord = Console.ReadLine(); Site sitedata = new Site("www.wikidata.org", "Innocent bot", lösenord); string text = File.ReadAllText("redo.txt").Trim(); string[] texts = text.Replace("\n", "§").Split('§'); foreach(string t in texts) { string[] tv = t.Replace("\t", "§").Split('§'); string r = get(sitedata, tv[1]); string lastrevid = getlastrevid(r); setlabel(sitedata, tv[1], tv[4], "sv", false); Bot.Wait(29); } } public static void Main() { Hämta_info("da"); //Lägg_info2(); } }