Участник:Тихмонатор Тестбот/Java Wiki/Исправления
http[править]
Работа с библиотекой Java подразумевает, что обрабатываемый сайт использует протокол https. Тем не менее, это не всегда так, например, Anekdot.me сидит на незащищённом http, из-за чего подключение к нему требует редактирования исходного кода.
Итак, что делать, если расхождение в протоколах не позволяет подключиться к сайту. Подвох кроется в функции initVars(), вызываемой в конструкторе объекта типа Wiki, точнее, в первой же её строчке:
StringBuilder basegen = new StringBuilder("https://");
Самый простой выход — исправить "https://" на "http://", как то рекомендует автор скрипта при помощи комментариев. Также можно отредактировать функцию initVars() таким образом, чтобы в качестве параметра она получала строку-схему обращения к выбранному ресурсу String protocol и соответствующим образом изменить конструкторы.
/** Based on https://wiki-java.googlecode.com/svn/tags/0.30/src/org/wikipedia/Wiki.java
Fixed by Źmicier Dzikański
*/
/**
* Creates a new connection to the English Wikipedia.
*/
public Wiki()
{
this("en.wikipedia.org", "/w");
}
/**
* Creates a new connection to a wiki. WARNING: if the wiki uses a
* $wgScriptpath other than the default <tt>/w</tt>, you need to call
* <tt>getScriptPath()</tt> to automatically set it. Alternatively, you
* can use the constructor below if you know it in advance.
*
* @param domain the wiki domain name e.g. en.wikipedia.org (defaults to
* en.wikipedia.org)
*/
public Wiki(String domain)
{
this(domain, "/w");
}
/**
* Creates a new connection to a wiki with $wgScriptpath set to
* <tt>scriptPath</tt>.
*
* @param domain the wiki domain name
* @param scriptPath the script path
*/
public Wiki(String domain, String scriptPath)
{
this(domain, scriptPath, "https://");
}
/**
* Creates a new connection to a wiki with $wgScriptpath set to
* <tt>scriptPath</tt>.
*
* @param domain the wiki domain name
* @param scriptPath the script path
* @param protocol the scheme (e. g. "http://")
*/
public Wiki(String domain, String scriptPath, String protocol)
{
if (domain == null || domain.isEmpty())
domain = "en.wikipedia.org";
this.domain = domain;
this.scriptPath = scriptPath;
// init variables
log(Level.CONFIG, "<init>", "Using Wiki.java " + version);
initVars(protocol);
}
/**
* Init variables
*/
protected void initVars()
{
initVars("http://");
}
/**
* Edit this if you need to change the API and human interface
* url configuration of the wiki. Some example uses:
*
* *Server-side cache management (maxage and smaxage API parameters)
*
*/
protected void initVars(String protocol)
{
StringBuilder basegen = new StringBuilder(protocol);
basegen.append(domain);
basegen.append(scriptPath);
StringBuilder apigen = new StringBuilder(basegen);
apigen.append("/api.php?format=xml&");
// MediaWiki has inbuilt maxlag functionality, see [[mw:Manual:Maxlag
// parameter]]. Let's exploit it.
if (maxlag >= 0)
{
apigen.append("maxlag=");
apigen.append(maxlag);
apigen.append("&");
basegen.append("/index.php?maxlag=");
basegen.append(maxlag);
basegen.append("&title=");
}
else
basegen.append("/index.php?title=");
base = basegen.toString();
// the native API supports assertions as of MW 1.23
if ((assertion & ASSERT_BOT) == ASSERT_BOT)
apigen.append("assert=bot&");
else if ((assertion & ASSERT_USER) == ASSERT_USER)
apigen.append("assert=user&");
apiUrl = apigen.toString();
apigen.append("action=query&");
if (resolveredirect)
apigen.append("redirects&");
query = apigen.toString();
}
NullPointerException в методе upload[править]
Может получится, что при попытке загрузить файл в неанглоязычный википроект произойдёт выброс NullPointerException. Проблема может крыться в префиксах пространства имён «Файл». В методе upload() искусственно прикручивается префикс "File: ", а в вызываемом внутри upload() методе getPageInfo() (в случае русскоязычного википроекта) адрес страницы имеет кириллический префикс "Файл: ". Из-за этого расхождения два полученных имени считаются различными, что ведёт к некорректной работе программы. Чтобы это исправить, можно подкорректировать соответствующие строки метода upload():
/** Based on https://wiki-java.googlecode.com/svn/tags/0.30/src/org/wikipedia/Wiki.java
Fixed by Źmicier Dzikański
*/
filename = filename.replaceFirst("^(File|Image|Файл" + namespaceIdentifier(FILE_NAMESPACE) + "):", ""); //"Файл" was added
// protection and token
HashMap info = getPageInfo("Файл:" + filename); //not "File:"