Меню
Главная
Случайная статья
Настройки
|
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];
}
}
|
|