Користувач:TohaomgBot
Версія від 23:27, 28 серпня 2018, створена Tohaomg (обговорення | внесок)
![]() |
Цей користувач є ботом, оператором якого є Tohaomg (обговорення). Це автомат, чи, радше, напівавтомат для виконання повторюваних редагувань, які зазвичай нерозумно робити вручну.
|
|
Цей бот створено для автоматичного проставлення шаблонів-навбоксів в кінець кожної статті, на яку цей шаблон посилається, а також для перенесення зображень дня та їх описів з Вікісховища до Української Вікіпедії.
Наведені нижче коди програм є суспільним надбанням. Будь хто може їх використовувати, поширювати або змінювати.
Код[ред. | ред. код]
Бот написано на мові C# з використанням бібліотеки DotNetWikiBot.
Заміна растрових зображень векторними[ред. | ред. код]
Підстановка шаблонів[ред. | ред. код]
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;
}
}