Python中通过Cookies进行MediaWiki身份验证
在一些Python CGI脚本中,使用MediaWiki的cookies进行身份验证(尤其是MW的OpenID)最简单的方法是什么?(当然是在同一个域名下)
从Python访问MediaWiki数据库也是可以的。
2 个回答
0
使用Cookies和MediaWiki其实很简单,方法如下:
from cookielib import CookieJar
import urllib2
import urllib
import json
cj = CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
现在,你可以用opener来发送请求。例如:
login_data = {
'action': 'login',
'lgname': 'Example',
'lgpassword': 'Foobar',
'format': 'json'
}
data = urllib.urlencode(login_data)
request = opener.open('http://en.wikipedia.org/w/api.php',data)
content = json.load(request)
login_data['token'] = content['login']['token']
data_2 = urllib.urlencode(login_data)
request_2 = opener.open('http://en.wikipedia.org/w/api.php',data_2)
content_2 = json.load(request_2)
print content_2['login']['result']
在上面的例子中,如果没有创建Cookiejar,登录就不会完全成功,会要求你再提供一个令牌。不过,建议使用已经创建好的MediaWiki封装库,比如pywikipedia、mwhair、pytybot、simplemediawiki或者wikitools,还有成百上千个其他的Python MediaWiki封装库。
0
你可以通过 MySQLdb 模块直接连接和修改 SQL 数据库,而不需要使用 HTTP 和 cookies,但这通常不是维护 MediaWiki 的正确方法。不过,读取数据是没有问题的。
用脚本访问 MediaWiki 的最佳方式是使用 api.php。
最著名的基于 Python 的 MediaWiki API 机器人是 Pywikibot(之前叫 Pywikipediabot)。
在 Python 中保存 cookies 最简单的方法可能是使用 http.cookiejar 模块。它的文档里有一些简单的示例。
我从自己的 MediaWiki 机器人中提取了功能示例代码:
#!/usr/bin/python3
import http.cookiejar
import urllib.request
import urllib.parse
import json
s_login_name = 'example'
s_login_password = 'secret'
s_api_url = 'http://en.wikipedia.org/w/api.php'
s_user_agent = 'StackOverflowExample/0.0.1.2012.09.26.1'
def api_request(d_post_params):
d_post_params['format'] = 'json'
r_post_params = urllib.parse.urlencode(d_post_params).encode('utf-8')
o_url_request = urllib.request.Request(s_api_url, r_post_params)
o_url_request.add_header('User-Agent', s_user_agent)
o_http_response = o_url_opener.open(o_url_request)
s_reply = o_http_response.read().decode('utf-8')
d_reply = json.loads(s_reply)
return (o_http_response.code, d_reply)
o_cookie_jar = http.cookiejar.CookieJar()
o_http_cookie_processor = urllib.request.HTTPCookieProcessor(o_cookie_jar)
o_url_opener = urllib.request.build_opener(o_http_cookie_processor)
d_post_params = {'action': 'login', 'lgname': s_login_name}
i_code, d_reply = api_request(d_post_params)
print('http code: %d' % (i_code))
print('api reply: %s' % (d_reply))
s_login_token = d_reply['login']['token']
d_post_params = {
'action': 'login',
'lgname': s_login_name,
'lgpassword': s_login_password,
'lgtoken':s_login_token
}
i_code, d_reply = api_request(d_post_params)
print('http code: %d' % (i_code))
print('api reply: %s' % (d_reply))
为了提高可读性,类、错误处理和子函数都被去掉了。
保存在 o_url_opener 中的 cookies 也可以用于请求 index.php。
你也可以通过 index.php 登录(模拟浏览器请求),但这需要解析 HTML 输出。
变量名称说明:
# Unicode string
s_* = 'a'
# Bytes (raw string)
r_* = b'a'
# Dictionary
d_* = {'a':1}
# Integer number
i_* = 4711
# Other objects
o_* = SomeClass()