Участник:CodeMonkBot/Бот загрузки описаний для файлов постеров к фильмам

Назначение

Бот загружает новые описания для файлов постеров к фильмам, а именно ставит шаблоны "Несвободный файл" и "Несвободный файл/ОДИ" и заполняет их параметры, используя информацию из статей Википедии и с IMDb.

Реализация

Бот написан на языке C#  (Microsoft .NET 2.0) c использованием библиотеки DotNetWikiBot Framework версии 2.96.
--CodeMonk, 4 июля 2010 (UTC)

Описание алгоритма

Бот берет список файлов постеров, расположенный на странице "Участник:Alex_Spade/4CodeMonkBot", по очереди открывает описание каждого файла, затем открывает статью о фильме, к которому загружен данный постер, и пытается найти там нужную информацию о годе создания и кинокомпании в шаблоне "Фильм". Если в шаблоне "Фильм" нужной информации нет, то бот берет из статьи ссылку на IMDb, открывает страницу фильма на IMDb и находит необходимую информацию там. Затем собранная информация подставляется в виде параметров в заготовку описания из файла "\Cache\posterDescrTemplate.txt", и новое описание сохраняется в Википедии.

Исходный код

using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using DotNetWikiBot;

class PosterDescriptionBot : Bot
{
  public static void Main()
  {
    Site site = new Site("http://ru.wikipedia.org", "CodeMonkBot", "********");

    string template = File.ReadAllText("Cache\\posterDescrTemplate.txt", Encoding.UTF8);
    Page list = new Page(site, "Участник:Alex_Spade/4CodeMonkBot");
    list.Load();
    PageList images = list.GetLinks();
    string startImage = "";
    askConfirm = true;
    PageList films = new PageList(site);
    foreach (Page p in images) {
      Console.WriteLine(p.title);
      if (startImage != "" && p.title != startImage)
        continue;
      else
        startImage = "";

      p.Load();
      if (!p.text.Contains("Disputed-fairuse") && !p.text.Contains("disputed-fairuse"))
        continue;

      films.Clear();
      films.FillFromPagesUsingImage(p.title);
      if (films.Count() == 0)
        continue;
      films[0].Load();

      string type = "Обложка", source = "", year = "", imdbId = "", title = "", company = "";
      title = films[0].title + (films[0].title.EndsWith(")") ? "|" : "");
      if (p.text.Contains("Постер") || p.text.Contains("постер"))
        type = "Постер";
      year = films[0].GetFirstTemplateParameter("Фильм", "Год");
      company = films[0].GetFirstTemplateParameter("Фильм", "Компания");
      imdbId = films[0].GetFirstTemplateParameter("Фильм", "imdb_id");

      if (imdbId != "" && (company == "" || year == "")) {
        string imdbData = Bot.GetWebResource(
          new Uri ("http://www.imdb.com/title/tt" + imdbId + "/"), "");
        if (year == "")
          year = Regex.Match(imdbData,
            "(?s)Release Date:.+? ((19|20)\\d\\d) ").Groups[1].Value;
        if (company == "")
          company = Regex.Match(imdbData, "<div class=\"info-content\">" +
            "<a href=\"/company/co\\d+/\">(.+?)<").Groups[1].Value;
      }

      if (company == "") {
        company = "Правообладателем является кинокомпания.";
        source = "кинокомпания";
      }
      else
        source = company;

      p.text = string.Format(template, type, title, source, year, company, films[0].title);
      p.Save(p.text, "обоснование добросовестного использования", false);
    }
  }
}


При этом содержание файла "\Cache\posterDescrTemplate.txt" (кодировка должна быть UTF8) таково:

{{{{Несвободный файл
| описание       = {0} к фильму «[[{1}]]»
| источник       = {2}
| время создания = {3}
| автор          = {4}
| часть          = Материал используется полностью.
| разрешение     = Разрешение многократно уменьшено по сравнению с оригиналом.
}}}}
{{{{Несвободный файл/ОДИ
| статья         = {5}
| цель           = 
# Это изображение дает наглядное представление о визуальной стилистике фильма, которое невозможно получить из текстового описания, и без которого статья о фильме не может считаться полной.
# Это изображение не ограничивает обладателей авторских прав в возможности извлекать выгоду из продажи изображения в его оригинальном напечатанном виде. Разрешение изображения многократно уменьшено по сравнению с оригиналом, поэтому печать данного изображения не может сравниться с оригиналом по качеству.
# Изображение было специально предназначено правообладателем для широкого распространения в целях рекламы фильма. Использование изображения соответствует [[Википедия:Критерии добросовестного использования|принятым в Википедии критериям добросовестного использования]]. Изображение также используется на множестве других сайтов.
| заменяемость   = Все материалы непосредственно относящиеся к этому произведению защищены авторским правом.
| прочее         = нет
}}}}


Формат списка на странице "Участник:Alex_Spade/4CodeMonkBot" (сейчас страница удалена) был такой:

# [[:Файл:007CasinoRoyaleUS1sheet.jpg]]
# [[:Файл:007DAFposter.jpg]]
# [[:Файл:007DrNoposter.jpg]]
# [[:Файл:007FRWLposter.jpg]]
# [[:Файл:007FYEOposter.jpg]]
# [[:Файл:007GEposter.jpg]]
# [[:Файл:007Goldfingerposter.jpg]]
# ...

 

Prefix: a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9

Portal di Ensiklopedia Dunia