gpt4 book ai didi

python - 使用 Python 将文件上传到最新的 MediaWiki 实例的最简单方法?

转载 作者:太空宇宙 更新时间:2023-11-03 17:13:45 25 4
gpt4 key购买 nike

最近我遇到了许多问题和文章,非常简短地介绍了使用 urllibrequestsmwapiposter 以及各种其他工具,用于执行 HTTP POST,或使用 API 将一个或多个文件上传到 MediaWiki 实例。到目前为止,还没有任何效果。

那么,有人可以提供一个简单的代码块来可靠地将文件上传到这样的 Wiki 吗?我更喜欢 Requests 和/或 Python 3,但此时我已经非常绝望,并且对几乎任何事物都持开放态度。

编辑:根据评论中的请求,下面是我尝试的最后一段代码。它完成时没有错误,但当然没有上传文件或对 Wiki 日志进行任何更改。

from urllib.parse import quote
import requests

user = 'username'
passw = quote('password')

baseurl = 'http://127.0.0.1:8020/mediawiki/'
apiurl = baseurl + 'api.php'
login_params = '?action=login&lgname=%s&lgpassword=%s&format=json'% (user, passw)

# Login request
r1 = requests.post(apiurl+login_params)
login_token = r1.json()['login']['token']

# Login confirm
login_params2 = login_params+'&lgtoken=%s'% login_token
r2 = requests.post(apiurl+login_params2, cookies=r1.cookies)

# Get edit token
params3 = '?format=json&action=query&meta=tokens&continue='
r3 = requests.get(apiurl+params3, cookies=r2.cookies)
edit_token = r3.json()['query']['tokens']['csrftoken']

edit_cookie = r2.cookies.copy()
edit_cookie.update(r3.cookies)

# Upload file
with open('91.png', 'rb') as f:
headers = {'content-type': 'multipart/form-data'}
payload = {'action': 'upload', 'filename': 'Image', 'file': '91.png', 'token': edit_token}
files = {'files': f}
r4 = requests.post(apiurl, headers=headers, data=payload, files=files, cookies=edit_cookie)

最佳答案

我很高兴您使用 mwclient 来工作,但我想我可以回答您仅使用 Python 3 和 requests 的偏好。

我在做同样的事情时遇到了很大的麻烦,最后得到了以下的工作。我也发布在https://www.mediawiki.org/wiki/API_talk:Upload#Python_with_requests但由于这是我在尝试解决问题时发现的一个问题,因此我将在下面重现...

严格来说,您可能不需要 BotPassword,但这是一个好主意。

import requests

api_url = 'https://project/w/api.php'

USER,PASS=u'BotUsername@Instancename',u'[[Special:BotPasswords]] password'
#Ensure bot instance is permissioned for createeditmovepage, uploadfile, uploadeditmovefile

FILENAME='/path/to/file'
REMOTENAME='remote_filename.ext'
USER_AGENT='Descriptive User Agent per [[:meta:User-Agent_policy]]'


# get login token and log in
payload = {'action': 'query', 'format': 'json', 'utf8': '',
'meta': 'tokens', 'type': 'login'}

r1 = requests.post(api_url, data=payload)
login_token=r1.json()['query']['tokens']['logintoken']

login_payload = {'action': 'login', 'format': 'json', 'utf8': '',
'lgname': USER, 'lgpassword': PASS, 'lgtoken': login_token}

r2 = requests.post(api_url, data=login_payload, cookies=r1.cookies)
cookies=r2.cookies.copy()

# We have now logged in and can request edit tokens thusly:

def get_edit_token(cookies):
edit_token_response=requests.post(api_url, data={'action': 'query',
'format': 'json',
'meta': 'tokens'}, cookies=cookies)
return edit_token_response.json()['query']['tokens']['csrftoken']

# Now actually perform the upload:

upload_payload={'action': 'upload',
'format':'json',
'filename':REMOTENAME,
'comment':'<MY UPLOAD COMMENT>',
'text':'Text on the File: page... description, license, etc.',
'token':get_edit_token(cookies)}

files={'file': (REMOTENAME, open(FILENAME,'rb'))}

headers={'User-Agent': USER_AGENT}

upload_response=requests.post(api_url, data=upload_payload,files=files,cookies=cookies,headers=headers)

关于python - 使用 Python 将文件上传到最新的 MediaWiki 实例的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33839706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com