Hoppa till innehållet

Wikipedia:Projekt DotNetWikiBot Framework/Innocent bot/Wikidata

Från Wikipedia
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();
	}
}