Skip to main content
 首页 » 编程设计

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

2024年08月12日35kenshinobiy

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

"Unrecognized value for parameter 'action': upload"

这是我所做的(更改了网站 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") 
>>>  

根据我在谷歌上找到的信息,当前的 MediaWiki 不支持上传文件。但这太荒谬了……一定有办法,对吧?

我没有使用 wikitools 包——任何方式都值得赞赏。

编辑:我在我的 LocalSettings.php 中设置 $wgEnableUploads = true,我可以手动上传文件,而不是通过 python。

编辑:我认为 wikitools 会自动获取编辑 token 。我附上了上传方法。在执行 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 
 

这也是我的第一个问题,如果您不能发布其他人的代码或其他内容,请告诉我。谢谢!

请您参考如下方法:

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