从cookies进行Inpython MediaWiki身份验证

2024-09-29 21:45:34 发布

您现在位置:Python中文网/ 问答频道 /正文

在一些Python CGI脚本(在同一个域中,ofc)中使用mediawikikookie进行身份验证(尤其包括MW的OpenID),哪种方式是最简单的?在

从python访问MediaWiki数据库也是可能的。在


Tags: 脚本身份验证数据库方式openidmediawikimwcgi
2条回答

在mediawiki中使用Cookie的一种非常简单的方法如下:

from cookielib import CookieJar
import urllib2
import urllib
import json

cj = CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

现在,可以使用opener提出请求。例如:

^{pr2}$

在上面的例子中,如果没有创建Cookiejar,登录将无法完全工作,请求另一个令牌。不过,建议使用已经创建的mediawiki包装器,如pywikipediamwhairpytybotsimplemediawiki或{a5},以及python中数百个其他mediawiki包装器。在

您可以使用MySQLdb模块连接和修改SQL数据库,而不使用HTTP和cookies,但这通常是进行MediaWiki维护的错误解决方案。虽然只读访问不应该是个问题。在

使用脚本访问MediaWiki的最佳方法是使用api.php。在

最著名的基于Python的mediawikiapi机器人是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中保存的cookie也可以用于对index.php的请求。在

您也可以通过索引.php(假装浏览器请求)但这将包括对HTML输出的解析。在


变量名图例:

^{pr2}$

相关问题 更多 >

    热门问题