Меню

Главная
Случайная статья
Настройки
Участник:ZaBOTka/Архивация
Материал из https://ru.wikipedia.org

using System;
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("01.09.2012 00:00:00"); 
   }
}

class Recense : Bot
{
   Site site;
   public Recense() 
   { 
      site = new Site("http://ru.wikipedia.org", login, password);
   }

   // Method that archivate recenses. 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;
      int t_begin=0;
      int t_end=0;
      String templ;

      do
      {
         r_end=p.text.IndexOf("|", ind+17);  ind=r_end;
         recense="Википедия:Рецензирование/" + p.text.Substring(r_begin+17,r_end-r_begin-17);

	 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) + " "
	              + Convert.ToString(last_d.Year)));
	       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
            t_begin = r_begin;
            t_end = p.text.IndexOf("-->",t_begin) +3;
            templ = p.text.Substring(t_begin, t_end-t_begin);

	    p.text = p.text.Replace(templ ,"");
            ind=r_begin;
	 }
   	 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("ZaBOTka\\recense.txt");
      pa.SaveToFile("ZaBOTka\\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];
   }
	
}
Downgrade Counter