Википедия:Заявки на статус бота/TohaomgBot
Перейти к навигации
Перейти к поиску
Здесь находятся завершившиеся обсуждения. Просьба не вносить изменений.
вклад • правки • SUL • журналы • блокировать • лог блокировок • журнал изменения прав • присвоить флаг Ответственный ботовод/Botmaster: Tohaomg
Цель/Purpose
[править код]Замена растровых изображений векторными аналогами, например [1]. Работает нормально, без ошибок.
Технические подробности/Technical details
[править код]Бот написан на языке C# с использованием библиотеки DotNetWikiBot.
Код
1 using System; 2 using System.Collections.Generic; 3 using DotNetWikiBot; 4 5 class ImageReplacer:Bot 6 { 7 public static void Main() 8 { 9 string username = "TohaomgBot", password = "****"; 10 List<string> sites_list = new List<string>(); 11 Dictionary<string, string> summary = new Dictionary<string, string>(); 12 int edits = 0; 13 14 Console.WriteLine("Replace: "); 15 string old_img = Console.ReadLine(); 16 string old_img_underlined = old_img.Replace(" ", "_"); 17 Console.WriteLine("\n"+"with: "); 18 string new_img = Console.ReadLine(); 19 20 21 where_to_point: 22 Console.WriteLine("\n"+"in: "); 23 sites_list.Clear(); 24 string where_to_string = Console.ReadLine(); 25 26 if (where_to_string == "all") 27 { 28 Site meta = new Site("https://meta.wikimedia.org/", username, password); 29 sites_list = meta.GetWikimediaProjects(true); 30 } 31 else if (where_to_string == "wikis") 32 { 33 Site meta = new Site("https://meta.wikimedia.org/", username, password); 34 sites_list = meta.GetWikimediaProjects(true); 35 string[] sites_list_copy = new string[sites_list.Count]; 36 sites_list.CopyTo(sites_list_copy); 37 foreach(string s in sites_list_copy) {if(!s.Contains(".wikipedia.")) {sites_list.Remove(s);}} 38 } 39 else if (where_to_string == "biggest wikis") 40 { 41 System.IO.StreamReader biggest_wikis = new System.IO.StreamReader("biggest wikis.txt"); 42 sites_list.AddRange(biggest_wikis.ReadLine().Split(' ')); 43 for (int a=0; a<sites_list.Count; a++) {sites_list[a] += ".wikipedia.org";} 44 biggest_wikis.Close(); 45 } 46 else 47 { 48 string[] longcodes = {"be-tarask", "zh-classical", "simple", "roa-rup", "zh-min-nan", "map-bms", "cbk-zam", "roa-tara", "zh-yue"}; 49 sites_list.AddRange(where_to_string.Split(' ')); 50 for (int a=0; a<sites_list.Count; a++) 51 { 52 if(sites_list[a].Length==2 || sites_list[a].Length==3 || Array.IndexOf(longcodes, sites_list[a])>=0) {sites_list[a] += ".wikipedia.org";} 53 else if(sites_list[a].Length==1) 54 { 55 if(sites_list[a]=="c") {sites_list[a] = "commons.wikimedia.org";} 56 else if(sites_list[a]=="d") {sites_list[a] = "www.wikidata.org";} 57 else if(sites_list[a]=="m") {sites_list[a] = "meta.wikimedia.org";} 58 else {Console.WriteLine("Unknown code " + sites_list[a]); goto where_to_point;} 59 } 60 else if(sites_list[a].Contains(".wiki")) {sites_list[a] += ".org";} 61 else {Console.WriteLine("Unknown code " + sites_list[a]); goto where_to_point;} 62 } 63 } 64 65 66 summary.Add("en", "Replaced raster image with an image of format SVG."); 67 summary.Add("de", "Ersetzt das rasterbild mit einem bild des formats SVG."); 68 summary.Add("uk", "Замінено растрове зображення на зображення в форматі SVG."); 69 summary.Add("ru", "Заменено растровое изображение на изображение в формате SVG."); 70 summary.Add("be", "Заменена растравы малюнак на малюнак у фармаце SVG."); 71 72 73 74 try 75 { 76 Site wiki_site; PageList inclusions; int site_counter = 1, page_counter; string lang; 77 foreach (string st_f in sites_list) 78 { 79 string st = st_f; 80 Console.WriteLine("\n" + site_counter + ". " + st); 81 82 try_connect_again: 83 try {wiki_site = new Site("https://" + st, username, password);} 84 catch(System.Net.WebException) 85 { 86 Console.WriteLine("No internet connection or wrong sitename!"); 87 Console.WriteLine("Check the connection and type sitename again (type 'skip' to skip):"); 88 st = Console.ReadLine(); 89 if(st=="skip") {continue;} 90 st += ".wikipedia.org"; 91 goto try_connect_again; 92 } 93 catch(DotNetWikiBot.WikiBotException) 94 {Console.WriteLine("Failed to login! This site will be skipped."); continue;} 95 96 inclusions = new PageList(wiki_site); 97 inclusions.FillFromPagesUsingImage(old_img); 98 Console.WriteLine("\t" + inclusions.Count() + " inclusions found" + "\n"); 99 lang = GetLang(st); 100 101 page_counter = 1; 102 foreach (Page wiki_page in inclusions) 103 { 104 Console.WriteLine("\t" + page_counter + ". " + wiki_page.title); 105 106 Console.Write("\t"); 107 wiki_page.Load(); 108 if(wiki_page.Exists() && (wiki_page.text.Contains(old_img) || wiki_page.text.Contains(old_img_underlined))) 109 { 110 wiki_page.text = wiki_page.text.Replace(old_img, new_img); 111 wiki_page.text = wiki_page.text.Replace(old_img_underlined, new_img); 112 Console.Write("\t"); 113 try {wiki_page.Save(summary[lang], true); edits++;} 114 catch (DotNetWikiBot.WikiBotException) 115 {Console.WriteLine("\t" + "Site did not allow this edit");} 116 } 117 else {Console.WriteLine("\t\t" + "Image not present");} 118 119 page_counter++; 120 } 121 site_counter++; 122 } 123 } 124 125 catch(Exception e) 126 { 127 Console.WriteLine("Unhandled exception: " + e.GetType()); 128 Console.WriteLine(e.Message); 129 Console.ReadKey(); 130 } 131 132 finally 133 { 134 System.IO.StreamWriter outfile = new System.IO.StreamWriter("log.txt", true); 135 outfile.Write("\r\n" + old_img); 136 int tabs = (old_img.Length)/8; 137 tabs = 7 - tabs; 138 while (tabs!=0) {outfile.Write("\t"); tabs--;} 139 140 outfile.Write(new_img); 141 tabs = (new_img.Length)/8; 142 tabs = 8 - tabs; 143 while (tabs!=0) {outfile.Write("\t"); tabs--;} 144 145 outfile.Write(DateTime.Now.ToString("dd.MM.yyyy (HH:mm)")); 146 outfile.Write("\t{0,4}", edits); 147 outfile.Close(); 148 Console.WriteLine("DONE! - " + edits + " edits done"); 149 Console.ReadKey(); 150 } 151 } 152 153 public static string GetLang(string site) 154 { 155 string[] rulangs = {"ru", "kk", "hy", "uz", "ky", "tg", "crh", "gag", "tt", "av", 156 "kbd", "ab", "ba", "bxr", "os", "kv", "krc", "mrj", "lbe", "lez", 157 "mdf", "ce", "mhr", "koi", "sah", "cu", "tyv", "udm", "xal", "cv", "myv"}; 158 string[] delangs = {"de", "lb", "li", "als", "bar", "ksh"}; 159 160 if (site.StartsWith("uk") || site.StartsWith("rue")) {return "uk";} 161 else if (site.StartsWith("be") || site.StartsWith("be-tarask")) {return "be";} 162 else if(Array.IndexOf(delangs, site.Substring(0,2))>=0 || Array.IndexOf(delangs, site.Substring(0,3))>=0) {return "de";} 163 else if(Array.IndexOf(rulangs, site.Substring(0,2))>=0 || Array.IndexOf(rulangs, site.Substring(0,3))>=0) {return "ru";} 164 else {return "en";} 165 } 166 }
Имеется флаг бота в других разделах Википедии?/Already has a bot flag in other wikipedias?
[править код]Имеется флаг бота в украинской, польской, эстонской и шотландской Википедиях.
Обсуждение/Discussion
[править код]- как подбирается парное векторное изображение к растровому? rubin16 (обс.) 11:07, 1 мая 2017 (UTC)
- Вводиться вручную в начале программы. --Tohaomg (обс.) 13:31, 1 мая 2017 (UTC)
- Зачем заменять имя файла в Кременчуг? Вы же сами прописали нужное имя файла на викидате. Retired electrician (обс.)
- Только имя файла берётся не из Викидаты, а из викитекста самой страницы. Пока не заменить название файла на самой странице, будет показывать старое изображение. --Tohaomg (обс.) 11:35, 4 мая 2017 (UTC)
- Достаточно не заменять, а убрать. И шаблон подставит имя файла с ВД. Вроде бы не противоречивая и не конфликтная информация - имя герба - зачем его дублировать локально? Retired electrician (обс.) 22:50, 4 мая 2017 (UTC)
- Только имя файла берётся не из Викидаты, а из викитекста самой страницы. Пока не заменить название файла на самой странице, будет показывать старое изображение. --Tohaomg (обс.) 11:35, 4 мая 2017 (UTC)
- Ваш бот соблюдает шаблоны {{bots}}, {{nobots}}? — Алексей Копылов 15:42, 4 мая 2017 (UTC)
- Еще нет, забыл это добавить, но это легко исправить добавив между 107 и 108 строками if(wiki_page.text.Contains("{{nobots") || wiki_page.text.Contains("{{bots|allow=none")) {continue;} --Tohaomg (обс.) 17:32, 4 мая 2017 (UTC)
- А разве для данной работы не достаточно ВП:AWB? --Drakosh (обс.) 22:15, 4 мая 2017 (UTC)
- К сожалению, не умею использовать AWB. --Tohaomg (обс.) 04:43, 5 мая 2017 (UTC)
- Странные вопросы задают наши ПИ. u:Drakosh, так для полноценного использования АВБ (в полностью автоматическом режиме) и нужен флаг бота, с учётки без флага АВБ позволяет править лишь вручную подтверждая каждую правку, это не ботоводство. u:Alexei Kopylov, боты не обязаны соблюдать ноботс и например мой принципиально не соблюдает - потому, что 98% этих шаблонов поставлены от балды некомпетентными участниками, давно устарели, поставлены без указания "вредящего" бота (то есть действуют на всех), а один раз я и вовсе видел этот шаблон, установленный, чтобы интервики-боты не добавляли статье укроинтервику (!), не нравящуюся поставившему шаблон "русскому патриоту". В своё время я прошёлся по всем включениям этого шаблона и удалил их все, кроме единственного обоснованного в одной статье против бота связности (он тоже давно неактуален). MBH 10:12, 5 мая 2017 (UTC)
Итог/Summary
[править код]Флаг присвоен rubin16 (обс.) 20:09, 6 мая 2017 (UTC)