Как загрузить файлы в MediaWiki с помощью Python? - PullRequest
2 голосов
/ 06 июля 2010

Я пытаюсь загрузить изображение (пока что просто случайное) на мой сайт MediaWiki, но я получаю эту ошибку:

«Нераспознанное значение для параметра« действие »: загрузить»

Вот что я сделал (URL сайта и пароль изменены):


Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import wikitools
>>> import poster
>>> wiki = wikitools.wiki.Wiki("mywikiurl/api.php")
>>> wiki.login(username="admin", password="mypassword")
True
>>> screenshotPage = wikitools.wikifile.File(wiki=wiki, title="screenshot")
>>> screenshotPage.upload(fileobj=open("/Users/jeff/Pictures/02273_magensbay_1280x800.jpg", "r"), ignorewarnings=True)
Traceback (most recent call last):
  File "", line 1, in 
  File "/Library/Python/2.6/site-packages/wikitools/wikifile.py", line 228, in upload
    res = req.query()
  File "/Library/Python/2.6/site-packages/wikitools/api.py", line 143, in query
    raise APIError(data['error']['code'], data['error']['info'])
wikitools.api.APIError: (u'unknown_action', u"Unrecognized value for parameter 'action': upload")
>>> 

Из того, что я мог найти в Google, текущий MediaWiki не поддерживает загрузку файлов. Но это смешно ... должен быть какой-то путь, верно?

Я не женат на пакете wikitools - любой способ сделать это ценится.

РЕДАКТИРОВАТЬ: я установил $ wgEnableUploads = true в моем LocalSettings.php, и я могу загружать файлы вручную, но не через Python.

РЕДАКТИРОВАТЬ: Я думаю, что Wikitools получает токен редактирования автоматически. Я прикрепил метод загрузки. Перед тем, как выполнить запрос API, он вызывает self.getToken ('edit'), что, я думаю, должно позаботиться об этом? Я немного поэкспериментирую с этим, чтобы посмотреть, будет ли это добавлено вручную.

    def upload(self, fileobj=None, comment='', url=None, ignorewarnings=False, watch=False):
        """Upload a file, requires the "poster" module

        fileobj - A file object opened for reading
        comment - The log comment, used as the inital page content if the file 
        doesn't already exist on the wiki
        url - A URL to upload the file from, if allowed on the wiki
        ignorewarnings - Ignore warnings about duplicate files, etc.
        watch - Add the page to your watchlist

        """
        if not api.canupload and fileobj:
            raise UploadError("The poster module is required for file uploading")
        if not fileobj and not url:
            raise UploadError("Must give either a file object or a URL")
        if fileobj and url:
            raise UploadError("Cannot give a file and a URL")
        params = {'action':'upload',
            'comment':comment,
            'filename':self.unprefixedtitle,
            'token':self.getToken('edit') # There's no specific "upload" token
        }
        if url:
            params['url'] = url
        else:
            params['file'] = fileobj
        if ignorewarnings:
            params['ignorewarnings'] = ''
        if watch:
            params['watch'] = ''
        req = api.APIRequest(self.site, params, write=True, multipart=bool(fileobj))
        res = req.query()
        if 'upload' in res and res['upload']['result'] == 'Success':
            self.wikitext = ''
            self.links = []
            self.templates = []
            self.exists = True
        return res

Также это мой первый вопрос, так что кто-нибудь, дайте мне знать, если вы не можете опубликовать код других людей или что-то в этом роде. Спасибо!

Ответы [ 4 ]

3 голосов
/ 15 июля 2010

Вам нужно по крайней мере MediaWiki 1.16 (который в настоящее время находится в разработке), чтобы иметь возможность загружать файлы через API.Или вы можете попробовать mwclient , который автоматически возвращается к загрузке через Special: Upload, если используется более старая версия MediaWiki (с ограниченной функциональностью, например, без обработки ошибок и т. Д.)

1 голос
/ 28 октября 2011

Я так расстроился из-за всех этих неприятностей, что создал свои собственные простые подпрограммы, используя poster и стандартные python cookielib и httplib2.Находится здесь: https://github.com/gandrewstone/mediawiki_python_bot

0 голосов
/ 23 июля 2011

У меня были похожие проблемы, и я получал

повышение APIError (data ['error'] ['code'], data ['error'] ['info']) wikitools.api.APIError: (с ошибкой проверки ', этот файл не прошел проверку файла')

Однако я обнаружил, что целевая страница должна быть того же типа, что и файл, и вы должны открыть файл для двоичного файла:

testImage = wikitools.wikifile.File(wiki=site, title="Image:test_snapshot.jpg")
testImage.upload(fileobj=open("somefile.jpg", "rb"), ignorewarnings=True)

0 голосов
/ 07 июля 2010

Может быть, вам сначала нужно «получить токен»?

Для загрузки файлов требуется токен. Этот токен идентичен токену редактирования и является одинаковым независимо от целевого имени файла, но изменяется при каждом входе в систему. В отличие от других токенов, его нельзя получить напрямую, поэтому вместо него нужно получить и использовать токен редактирования.

Подробнее см. Здесь: http://www.mediawiki.org/wiki/API:Edit_-_Uploading_files

...