我正在尝试将图片(目前只是一张随机图片)上传到我的 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 上传(功能减少,例如没有错误处理等)
