Користувач:TohaomgBot

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
115 000+

Цей бот створено для автоматичного проставлення шаблонів-навбоксів в кінець кожної статті, на яку цей шаблон посилається, а також для перенесення зображень дня та їх описів з Вікісховища до Української Вікіпедії.

Наведені нижче коди програм є суспільним надбанням. Будь хто може їх використовувати, поширювати або змінювати.

Код[ред.ред. код]

Бот написано на мові C# з використанням бібліотеки DotNetWikiBot.

Заміна растрових зображень векторними[ред.ред. код]

Докладніше: :meta:User:TohaomgBot

Підстановка шаблонів[ред.ред. код]

using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections;
using System.Xml;
using DotNetWikiBot;
using System.Threading;

class MyBot : Bot
{
 public static void Main()
 {
  Console.WriteLine("Template name: ");
  string name = Console.ReadLine();

  Site ukwiki = new Site("https://uk.wikipedia.org", "TohaomgBot", "****");
  Page lol = new Page(ukwiki, "Шаблон:" + name);
  lol.Load();
  PageList links = lol.GetLinks();
  Console.WriteLine("Processing pages:\n");
  int z = 0;

  foreach (Page a in links)
  {
   Console.Write(z + ".  ");
   Console.WriteLine(a.title);
   a.Load();
   if (a.Exists())
   {
    if (a.IsRedirect())
    {
     Console.WriteLine("\n" + "WARNING: " + a.title + " is redirect!");
     Console.ReadKey();
     Console.Write("\n");
     a.ResolveRedirect();
     Console.Write(a.title);
    }
    if (a.text.Contains("{{" + name))
    {Console.WriteLine("Skipped because template already present");}
    else
    {
     a.AddTemplate("{{" + name + "}}");
     a.Save("додано шаблон " + name, true);
    }
   }
   else
   {Console.WriteLine("Skipped because page does not exist");}
   Console.WriteLine("\n");
   z++;
  }

  System.IO.StreamWriter outfile = new System.IO.StreamWriter("log.txt", true);
  outfile.Write("\r\n" + name);
  int tabs = (name.Length)/8;
  tabs = 7 - tabs;
  while (tabs!=0) {outfile.Write("\t"); tabs--;}
  outfile.Write(DateTime.Now.ToString("dd.MM.yyyy (HH:mm)"));
  outfile.Close();
  Console.WriteLine("DONE!");
  Console.ReadKey();
 }
}
з поясненнями
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections;
using System.Xml;
using DotNetWikiBot;
using System.Threading;

class MyBot : Bot
{
 public static void Main()
 {
  Console.WriteLine("Template name: ");
  string name = Console.ReadLine();   //вводимо назву шаблону, який треба обробити

  Site ukwiki = new Site("https://uk.wikipedia.org", "TohaomgBot", "****");   //логінимось в укрвікі
  Page lol = new Page(ukwiki, "Шаблон:" + name);
  lol.Load();   //завантажуємо шаблон
  PageList links = lol.GetLinks();   //створюємо список посилань знайдених в шаблоні
  Console.WriteLine("Processing pages:\n");
  int z = 0;

  foreach (Page a in links)   //оброблюємо кожну сторінку із списку посилань по одній
  {
   Console.Write(z + ".  ");   //виводимо на екран порядковий номер на назву сторінки
   Console.WriteLine(a.title);
   a.Load();   //завантажуємо сторінку
   if (a.Exists())   //перевіряємо чи існує сторінка
   {
    if (a.IsRedirect())   //перевіряємо чи є сторінка перенаправленням
    {
     Console.WriteLine("\n" + "WARNING: " + a.title + " is redirect!");   //у випадку, якщо сторінка є перенаправлення, про це виводиться повідомленя
     Console.ReadKey();   //програма зупиняється поки не буде нажата будь-яка клавіша
     Console.Write("\n");
     a.ResolveRedirect();   //назва сторінки-перенаправлення замінюється на сторінку, на яку вона посилається
     Console.Write(a.title);   //виводиться назва кінцевої сторінки
    }
    if (a.text.Contains("{{" + name))   //перевіряється чи присутній вже шаблон на сторінці
    {Console.WriteLine("Skipped because template already present");}
    else   //якщо сторінка існує і на ній ще нема шаблону, то додаємо шаблон
    {
     a.AddTemplate("{{" + name + "}}");   //додаємо шаблон в кінець сторінки прямо перед категоріями
     a.Save("додано шаблон " + name, true);   //зберігаємо сторінку
    }
   }
   else   //у випадку якщо сторінка не існує, про це виводиться повідомлення
   {Console.WriteLine("Skipped because page does not exist");}
   Console.WriteLine("\n");
   z++;
  }

  //всі запуски бота записуються в журнал
  System.IO.StreamWriter outfile = new System.IO.StreamWriter("log.txt", true);   //відкриваємо файл для запису
  outfile.Write("\r\n" + name);   //записуємо назву сторінки
  int tabs = (name.Length)/8;
  tabs = 7 - tabs;
  while (tabs!=0) {outfile.Write("\t"); tabs--;}   //вставляємо необхідну кількість табуляцій
  outfile.Write(DateTime.Now.ToString("dd.MM.yyyy (HH:mm)"));   //записуємо час
  outfile.Close();   //закриваємо файл
  Console.WriteLine("DONE!");   //виводимо повідомлення про завершення роботи
  Console.ReadKey();
 }
}

Перенесення зображень дня з Вікісховища[ред.ред. код]

using System;
using System.Linq;
using System.Threading;
using System.Text.RegularExpressions;
using DotNetWikiBot;

class podt_transfer:Bot
{
 public static void Main()
 {
 Site commons = new Site("https://commons.wikimedia.org", "TohaomgBot", "****");
 Site ukwiki = new Site("https://uk.wikipedia.org", "TohaomgBot", "****");
 Page comm, ukw;
 string curr_date, curr_date_uk;
 MatchCollection mc;
 
 Console.WriteLine("\nStart date:");
 string start_date_str = Console.ReadLine();
 int[] start_date = (from i in start_date_str.Split('.') select Int32.Parse(i)).ToArray();
 
 Console.WriteLine("\nEnd date:");
 string end_date_str = Console.ReadLine();
 int[] end_date = (from i in end_date_str.Split('.') select Int32.Parse(i)).ToArray();
 
 Console.WriteLine("\n");
 
 while(true)
 {
  Console.WriteLine(start_date[0] + "." + start_date[1] + "." + start_date[2]);
  curr_date = start_date[2] + "-" + ((start_date[1]<=9)?"0":"") + start_date[1] + "-" + 
   ((start_date[0]<=9)?"0":"") + start_date[0];
  curr_date_uk = start_date[2] + "-" + start_date[1] + "-" + start_date[0];

  comm = new Page(commons, "Template:Potd/" + curr_date);
  comm.Load();
  if(comm.Exists())
  {
   ukw = new Page(ukwiki, "Шаблон:Potd/" + curr_date_uk);
   ukw.Load();
   if(ukw.Exists() && !ukw.text.StartsWith("<noin")) {Console.WriteLine("\tImage for this date is already set in ukwiki.");}
   else
   {
    ukw.text = comm.text.Replace("|1=", "|").Split('|')[1]
		+ "<noinclude>\n[[Категорія:Шаблони:Зображення дня]]\n[[Категорія:Підшаблони шаблонів]]\n</noinclude>";
	ukw.Save("Перенесено зображення дня з Wikimedia Commons ([[:commons:Template:Potd/" + curr_date + "]])", false);
   }
  }
  else {Console.WriteLine("\tImage is not set for this date."); goto next_date;}
  
  Console.WriteLine("\t--------");
	
  comm = new Page(commons, "Template:Potd/" + curr_date + " (uk)");
  comm.Load();
  if(comm.Exists())
  {
   ukw = new Page(ukwiki, "Шаблон:Potd/" + curr_date_uk + " (uk)");
   ukw.Load();
   if(ukw.Exists() && !ukw.text.StartsWith(".<noin")) {Console.WriteLine("\tDescription for this image is already present in ukwiki.");}
   else
   {
    ukw.text = comm.text.Replace("{{Potd description|1=", "");
	ukw.text = ukw.text.Substring(0, ukw.text.IndexOf("|2="));
	ukw.text = ukw.text.Replace("[[:uk:", "[[");
	mc = Regex.Matches(ukw.text, @"\'\'\[\[((.)+?)\]\]\'\'");
		foreach (Match m in mc) {ukw.text = ukw.text.Replace(m.Groups[1].Value, ":commons:" + m.Groups[1].Value + "|" + m.Groups[1].Value);}
	mc = Regex.Matches(ukw.text, @"\[\[" + @"(((.)+?))\|\1" + @"\]\]");
		foreach (Match m in mc) {ukw.text = ukw.text.Replace(m.Groups[0].Value, "[[" + m.Groups[1].Value + "]]");}
	ukw.text += "<noinclude>\n[[Категорія:Шаблони:Підписи зображенням дня]]\n[[Категорія:Підшаблони шаблонів]]\n</noinclude>";
	ukw.Save("Перенесено опис зображення дня з Wikimedia Commons ([[:commons:Template:Potd/" + curr_date + " (uk)]])", false);
   }
  }
  else {Console.WriteLine("\tNo ukrainian description for this image."); goto next_date;}
  
  
  next_date:
  if(Enumerable.SequenceEqual(start_date, end_date)) {break;}
  else
  {
   if(start_date[0]>=28 && IsLastOfMonth(start_date))
   {
    start_date[0] = 1;
    if(start_date[1]==12)
    {
     start_date[1] = 1;
     start_date[2]++;
    }
    else {start_date[1]++;}
   }
   else {start_date[0]++;}
  }
  Thread.Sleep(2000);
 }
 
 Console.WriteLine("DONE!");
 Console.ReadKey();
 }
 
 public static bool IsLastOfMonth(int[] date)
 {
  bool is31 = (date[1]==1 || date[1]==3 || date[1]==5 || date[1]==7
	|| date[1]==8 || date[1]==10 || date[1]==12) && date[0]==31;
  bool is30 = (date[1]==4 || date[1]==6 || date[1]==9 || date[1]==11) && date[0]==30;
  bool is28 = date[1]==2 && ((date[2]%4!=0 && date[0]==28) || (date[2]%4==0 && date[0]==29));
  return is31 || is30 || is28;
 }
}