Ekb-oskab.ru

Прием лома металлов

Участник:ZaBOTka/Архивация рецензий до 2012 года

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 года.

© 2018–2023 ekb-oskab.ru, Россия, Челябинск, ул. Горького 53, +7 (351) 992-98-28