【问题标题】:How to upload files to MediaWiki using Python?如何使用 Python 将文件上传到 MediaWiki?
【发布时间】:2011-03-12 01:17:34
【问题描述】:

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

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

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


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 上传(self,fileobj=None,comment='',url=None,ignorewarnings=False,watch=False): """上传文件,需要"海报"模块 fileobj - 为读取而打开的文件对象 评论 - 日志评论,如果文件用作初始页面内容 维基上不存在 url - 上传文件的 URL(如果 wiki 允许) ignorewarnings - 忽略有关重复文件等的警告。 观看 - 将页面添加到您的关注列表 """ 如果不是 api.canupload 和 fileobj: raise UploadError("文件上传需要海报模块") 如果不是 fileobj 而不是 url: raise UploadError("必须给出文件对象或 URL") 如果 fileobj 和 url: raise UploadError("不能给出文件和 URL") 参数 = {'动作':'上传', '评论':评论, '文件名':self.unprefixedtitle, 'token':self.getToken('edit') # 没有特定的“上传”令牌 } 如果网址: 参数 ['url'] = 网址 别的: 参数 ['文件'] = 文件对象 如果忽略警告: 参数 ['忽略警告'] = '' 如果观看: 参数['watch'] = '' req = api.APIRequest(self.site, params, write=True, multipart=bool(fileobj)) res = req.query() 如果 res 和 res['upload']['result'] == 'Success' 中的“上传”: self.wikitext = '' 自我链接 = [] self.templates = [] self.exists = True 返回资源

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

【问题讨论】:

标签: python file-upload mediawiki


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      也许您必须先“获得令牌”?

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

      详情请看这里:http://www.mediawiki.org/wiki/API:Edit_-_Uploading_files

      【讨论】:

        【解决方案4】:

        我遇到了类似的问题,我得到了一个

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-08
          相关资源
          最近更新 更多