Wikipedia:Projekt DotNetWikiBot Framework/GameOnBot/Statistik
Utseende
using System; using System.IO; using System.Text; using System.Text.RegularExpressions; using System.Collections; using System.Xml; using DotNetWikiBot; using System.Threading; using System.Net; using System.Collections.Generic; public class TableRow { public String cell1; public int cell2; public TableRow(String c1, int c2) { cell1 = c1; cell2 = c2; } } class MyBot : Bot { static StringBuilder sb = new StringBuilder(); static byte[] buf = new byte[8192]; static int count; static string tempString; private static string getNumberOfVisits(string inStr) { int pos = inStr.IndexOf(" has been viewed "); int pos2 = inStr.Substring(pos + 17).IndexOf(" times in "); if(pos > 0 && pos2 > 0) return inStr.Substring(pos + 17, pos2); return ""; } private static string getPage(string url) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream resStream = response.GetResponseStream(); sb.Length = 0; tempString = null; count = 0; do { count = resStream.Read(buf, 0, buf.Length); if (count != 0) { tempString = Encoding.UTF8.GetString(buf, 0, count); sb.Append(tempString); } } while (count > 0); return sb.ToString(); } public static void Main() { Site site = new Site("http://sv.wikipedia.org", username, password); PageList pl = new PageList(site); //date to check against (normally last month), remember to edit the text in the header as well! String date = "201106"; //Header for the page String[] headersStr = new String[4]; String[] footersStr = new String[4]; String[] catscanStr = new String[4]; String[] articlesStr = new String[4]; headersStr[0] = "{{Wikipedia:Projekt datorspel/Stat/Mest lästa stubbar/Tidigare månader}}\nDenna sida innehåller statistik över antalet visningar av respektive artikel i [[:Kategori:Datorspelsstubbar]] under juni 2011."; headersStr[1] = "{{Wikipedia:Projekt Karlstad/Stat/Mest lästa stubbar/Tidigare månader}}\nDenna sida innehåller statistik över antalet visningar av respektive artikel i [[:Kategori:Karlstad]] som är märkta som stubbar under juni 2011."; headersStr[2] = "Denna sida innehåller statistik över antalet visningar av respektive artikel i [[:Kategori:Stockholmsstubbar]] under juni 2011."; headersStr[3] = "Denna sida innehåller statistik över antalet visningar av respektive artikel i [[:Kategori:Internet i Sverige]] under juni 2011."; footersStr[0] = "[[Kategori:Wikipedia:Projekt datorspel/Stat]]"; footersStr[1] = ""; footersStr[2] = ""; footersStr[3] = "[[Kategori:Wikipedia:Projekt Internet i Sverige]]"; catscanStr[0] = "http://toolserver.org/~daniel/WikiSense/CategoryIntersect.php?wikilang=sv&wikifam=.wikipedia.org&basecat=" + "datorspelsstubbar" + "&basedeep=20&templates=&mode=al&go=Sök&format=wiki&userlang=sv"; //Special case, we don't search for specific category but all articles marked as stubs inside the category catscanStr[1] = "http://toolserver.org/~daniel/WikiSense/CategoryIntersect.php?wikilang=sv&wikifam=.wikipedia.org&basecat=Karlstad&basedeep=20&mode=cs&tagcat=stubbar&tagdeep=3&go=S%C3%B6k&format=wiki&userlang=sv"; catscanStr[2] = "http://toolserver.org/~daniel/WikiSense/CategoryIntersect.php?wikilang=sv&wikifam=.wikipedia.org&basecat=" + "Stockholmsstubbar" + "&basedeep=20&templates=&mode=al&go=Sök&format=wiki&userlang=sv"; catscanStr[3] = "http://toolserver.org/~daniel/WikiSense/CategoryIntersect.php?wikilang=sv&wikifam=.wikipedia.org&basecat=" + "Internet_i_Sverige" + "&basedeep=20&templates=&mode=al&go=Sök&format=wiki&userlang=sv"; articlesStr[0] = "Wikipedia:Projekt datorspel/Stat/Mest lästa stubbar"; articlesStr[1] = "Wikipedia:Projekt Karlstad/Stat/Mest lästa stubbar"; articlesStr[2] = "Wikipedia:Projekt Stockholm/Mest lästa stubbar"; articlesStr[3] = "Wikipedia:Projekt Internet i Sverige/Mest lästa artiklar"; String tmpStr; for(int stat = 0; stat < 4; stat++) { Page myPage2 = new Page(site); myPage2.title = articlesStr[stat]; //Add header myPage2.text += headersStr[stat] + "\n"; myPage2.text += "{| class=\"sortable wikitable\"\n! Artikel !! Antal besök\n|-\n"; //Catscan search tmpStr = getPage(catscanStr[stat]); string[] lines = Regex.Split(tmpStr, "\n"); string title; int pos; int pos2; List<TableRow> tableRow = new List<TableRow>(); foreach (string line in lines) { pos = line.IndexOf("[["); pos2 = line.IndexOf("]]"); if(pos > 0 && pos2 > 0) { title = line.Substring(pos + 2, pos2 - 4); if(!title.StartsWith("Kategori:")) { tmpStr = getPage("http://stats.grok.se/sv/" + date + "/" + title); tmpStr = getNumberOfVisits(tmpStr); if(tmpStr.Length > 0) tableRow.Add(new TableRow(title.Replace("_", " "), int.Parse(tmpStr))); } } } tableRow.Sort(delegate(TableRow r1, TableRow r2) { return r1.cell2.CompareTo(r2.cell2); } ); //descending order tableRow.Reverse(); tableRow.ForEach(delegate(TableRow r) { myPage2.text += "|-\n| [[" + r.cell1 + "]]\n| " + r.cell2.ToString() + "\n"; } ); myPage2.text += "|}\n"; //Add footer myPage2.text += footersStr[stat] + "\n"; //Save page myPage2.Save("Uppdaterar statistiken", true); } String[] kategorier = {"Windows-spel", "Macintosh-spel", "Amigaspel", "Atari-spel", "Wii-spel", "Playstation 3-spel", "Xbox 360-spel"}; foreach(string kategori in kategorier) { Page myPage = new Page(site); myPage.title = "Wikipedia:Projekt datorspel/Stat/" + kategori; myPage.text += "{| class=\"sortable wikitable\"\n! Artikel !! Antal besök\n|-\n"; //Catscan sökning tmpStr = getPage("http://toolserver.org/~daniel/WikiSense/CategoryIntersect.php?wikilang=sv&wikifam=.wikipedia.org&basecat=" + kategori + "&basedeep=20&mode=cs&tagcat=Stubbar&tagdeep=3&go=S%C3%B6k&format=wiki&userlang=sv"); string[] lines = Regex.Split(tmpStr, "\n"); string title; int pos; int pos2; List<TableRow> tableRow = new List<TableRow>(); foreach (string line in lines) { pos = line.IndexOf("[["); pos2 = line.IndexOf("]]"); if(pos > 0 && pos2 > 0) { title = line.Substring(pos + 2, pos2 - 4); tmpStr = getPage("http://stats.grok.se/sv/" + date + "/" + title); tmpStr = getNumberOfVisits(tmpStr); if(tmpStr.Length > 0) // myPage.text += "|-\n| [[" + title + "]]\n| " + tmpStr + "\n"; tableRow.Add(new TableRow(title.Replace("_", " "), int.Parse(tmpStr))); } } tableRow.Sort(delegate(TableRow r1, TableRow r2) { return r1.cell2.CompareTo(r2.cell2); } ); //descending order tableRow.Reverse(); tableRow.ForEach(delegate(TableRow r) { myPage.text += "|-\n| [[" + r.cell1 + "]]\n| " + r.cell2.ToString() + "\n"; } ); myPage.text += "|}\n"; myPage.Save("Uppdaterar statistiken", true); } double proc; int antal; int antalKat; Page myPage3 = new Page(site); myPage3.title = "Wikipedia:Projekt datorspel/Stat/Konsolkampen"; myPage3.text += "{|\n! [[:Kategori:" + kategorier[0] + "|Win]] !! [[:Kategori:" + kategorier[1] + "|Mac]] !! [[:Kategori:" + kategorier[2] + "|Amiga]] !! [[:Kategori:" + kategorier[3] + "|Atari]] !! [[:Kategori:" + kategorier[4] + "|Wii]] !! [[:Kategori:" + kategorier[5] + "|PS3]] !! [[:Kategori:" + kategorier[6] + "|Xbox360]]\n|-\n"; foreach(string kategori in kategorier) { pl.FillFromCategoryTree(kategori); antalKat = pl.Count(); tmpStr = getPage("http://toolserver.org/~daniel/WikiSense/CategoryIntersect.php?wikilang=sv&wikifam=.wikipedia.org&basecat=Datorspelsstubbar&basedeep=20&mode=cs&tagcat=" + kategori + "&tagdeep=3&go=S%C3%B6k&format=wiki&userlang=sv"); pl.Clear(); string[] lines = Regex.Split(tmpStr, "\n"); antal = 0; foreach (string line in lines) antal++; proc = Math.Round(antal * 100 / (double)antalKat, 2); myPage3.text += "| [[Wikipedia:Projekt datorspel/Stat/" + kategori + "|" + antal.ToString() + "]] (" + proc + "%)\n"; } myPage3.text += "|}\n"; myPage3.Save("Uppdaterar statistiken", true); } }