如何使用Python将文件上传到MediaWiki?

时间:2010-07-05 20:34:27

标签: python file-upload mediawiki

我正在尝试将图片(目前只是一张随机图片)上传到我的MediaWiki网站,但我一直收到此错误:

  

“参数'操作'无法识别的值:上传”

这是我做的(网站网址和密码已更改):


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套餐结婚 - 任何表达方式都表示赞赏。

编辑:我在我的LocalSettings.php中设置$ wgEnableUploads = true,我可以手动上传文件,而不是通过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 个答案:

答案 0 :(得分:3)

您至少需要MediaWiki 1.16(目前处于begta状态)才能通过API上传文件。或者您可以尝试mwclient,它会自动回退到通过Special上传:如果使用较旧版本的MediaWiki,则会上传(功能减少,例如无错误处理等)。

答案 1 :(得分:1)

我对所有这些麻烦感到非常沮丧,我使用海报和python标准cookielib和httplib2制作了我自己的简单例程。它位于:https://github.com/gandrewstone/mediawiki_python_bot

答案 2 :(得分:0)

也许你必须先“获得一个代币”?

  

要上传文件,需要一个令牌。此令牌与编辑令牌相同,无论目标文件名如何都相同,但每次登录时都会更改。与其他令牌不同,它不能直接获取,因此必须获取并使用编辑令牌。

详情请见此处:http://www.mediawiki.org/wiki/API:Edit_-_Uploading_files

答案 3 :(得分:0)

我遇到了类似的麻烦,我得到了一个

提出APIError(data ['error'] ['code'],data ['error'] ['info']) wikitools.api.APIError :( u'verification-error',你这个文件没有通过文件验证')

但是,我发现目标页面需要与文件类型相同,您应该打开二进制文件:

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