18-04-2023
using System; // using System.Globalization; using System.IO; using System.Text; using System.Text.RegularExpressions; using System.Collections; using System.Xml; using System.Web; using System.Net; using DotNetWikiBot; class MyBot : Bot { public static void Main() { Recense recense = new Recense(); recense.Archivate("10.11.2010 00:00:00"); } } class Recense : Bot { Site site; public Recense() { site = new Site("http://ru.wikipedia.org", login, password); } // Method that archivate recences. Input parameter is strng representing date to compare with. public void Archivate(string check) { Page p = new Page(site, ":Рецензирование"); p.LoadEx(); Page pa = new Page(site, ":Рецензирование/Архив"); pa.LoadEx(); DateTime check_d = DateTime.Parse(check); try { int ind=10; int r_begin=p.text.IndexOf("{{", ind); ind=r_begin; int r_end=0; String recense; do { r_end=p.text.IndexOf("}}", ind); ind=r_end; recense=p.text.Substring(r_begin+2,r_end-r_begin-2); if (recense.Substring(0,1) == "/") recense = ":Рецензирование" + recense; Page pr = new Page(site, recense); pr.LoadEx(); string rpid = pr.lastRevisionID; DateTime last_d = pr.timestamp; int comp_num=DateTime.Compare(check_d,last_d); int arch=0; if (comp_num>0) { arch=1; CloseRecense(pr); } else { arch=CheckClosed(pr); } if (arch>0) { // find the title of article string ptitle = recense.Substring(recense.IndexOf("/")+1); // insert into Archive page if (pa.text.IndexOf(ptitle) == -1) { string arch_str = GetArchiveText(recense, ptitle, rpid, last_d.Year + "." +(Convert.ToString last_d.Month)).PadLeft(2,'0') + "." +(Convert.ToString(last_d.Day)).PadLeft(2,'0')); int fp = pa.text.IndexOf("==",pa.text.IndexOf(GetMonthTextI(last_d.Month))); pa.text = pa.text.Substring(0,fp+2) + arch_str + pa.text.Substring(fp+2); } //remove template from article Page pt = new Page(site, ptitle); pt.LoadEx(); pt.RemoveTemplate("рецензия"); pt.Save(pt.text, "- рецензия", true); //remove template from recenses page p.RemoveTemplate(recense); } r_begin=p.text.IndexOf("{{", ind); ind=r_begin; } while (ind != -1); p.Save(p.text, "архивация", true); pa.Save(pa.text, "архивация", true); } finally { p.SaveToFile("BtZanka\\recense.txt"); pa.SaveToFile("BtZanka\\archive.txt"); } } private static string GetArchiveText(string pname, string ptitle, string rid, string d_last) { // find start and finish date of recense string punder = pname.Replace(" ", "_"); HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://vs.aka-online.de/cgi-bin/wppagehiststat.pl?lang=ru.wikipedia&page=" + punder); string vs = new StreamReader(request.GetResponse().GetResponseStream()).ReadToEnd(); string d_first = vs.Substring(vs.IndexOf("<TD>", vs.IndexOf("first edit</TD>") ) + 4, 16); //vs.Substring(vs.IndexOf("<TD>", vs.IndexOf("most recent edit</TD>") ) + 4, 16); // form date_str; string date_str; if (d_first.Substring(0,7)==d_last.Substring(0,7)) { date_str = (d_first.Substring(8,2)).TrimStart('0') + " по " + (d_last.Substring(8,2)).TrimStart('0') + " " + GetMonthTextR((d_last.Substring(5,2)).TrimStart('0')) + " " + d_first.Substring(0,4) + " года"; } else { if (d_first.Substring(0,4)==d_last.Substring(0,4)) { date_str = (d_first.Substring(8,2)).TrimStart('0') + " " + GetMonthTextR((d_first.Substring(5,2)).TrimStart('0')) + " по " + (d_last.Substring(8,2)).TrimStart('0') + " " + GetMonthTextR((d_last.Substring(5,2)).TrimStart('0')) + " " + d_first.Substring(0,4) + " года"; } else { date_str = (d_first.Substring(8,2)).TrimStart('0') + " " + GetMonthTextR((d_first.Substring(5,2)).TrimStart('0')) + " " + d_first.Substring(0,4) + " года" + " по " + (d_last.Substring(8,2)).TrimStart('0') + " " + GetMonthTextR((d_last.Substring(5,2)).TrimStart('0')) + " " + d_last.Substring(0,4) + " года"; } } // form archive template string str= "\n# {{ReviewArchive " + "\n| статья = " + ptitle + "\n| url = http://ru.wikipedia.org/w/index.php?title=" + punder + "&oldid=" + rid + "\n| сообщение = Рецензия с " + date_str + "\n}}"; return(str); } private static void CloseRecense(Page cpage) { int isChange=0; if (cpage.text.IndexOf("{{закрыто}}")==-1 && cpage.text.IndexOf("{{Закрыто}}")==-1 && cpage.text.IndexOf("{{closed}}")==-1 && cpage.text.IndexOf("{{Closed}}")==-1) { cpage.text = "{{закрыто}}\n" + cpage.text; isChange = 1; } if (cpage.text.IndexOf("{{закрыто-конец}}")==-1 && cpage.text.IndexOf("{{Закрыто-конец}}")==-1 && cpage.text.IndexOf("{{esc}}")==-1 && cpage.text.IndexOf("{{Esc}}")==-1) { cpage.AddTemplate("{{закрыто-конец}}"); isChange = 1; } if (isChange == 1) cpage.Save(cpage.text, "закрыто", true); } private static int CheckClosed(Page cpage) { int ret=0; if (cpage.text.IndexOf("{{закрыто}}")==-1 && cpage.text.IndexOf("{{Закрыто}}")==-1) ret=ret+0; else { if (cpage.text.IndexOf("{{закрыто-конец}}")==-1 && cpage.text.IndexOf("{{Закрыто-конец}}")==-1) { cpage.AddTemplate("{{закрыто-конец}}"); cpage.Save(cpage.text, "закрыто", true); } ret=ret+1; } if (cpage.text.IndexOf("{{closed}}")==-1 && cpage.text.IndexOf("{{Closed}}")==-1) ret=ret+0; else { if (cpage.text.IndexOf("{{esc}}")==-1 && cpage.text.IndexOf("{{Esc}}")==-1) { cpage.AddTemplate("{{esc}}"); cpage.Save(cpage.text, "закрыто", true); } ret=ret+1; } return ret; } private static string GetMonthTextR(string mnum) { string[] mtext ={"января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"}; return mtext[Convert.ToInt16(mnum)-1]; } private static string GetMonthTextI(int mnum) { string[] mtext ={"Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"}; return mtext[mnum-1]; } }
Участник:ZaBOTka/Архивация рецензий до 2012 года.