2010-09-04 44 views
2

什麼是最簡單的如何在一些Python CGI腳本(在相同的域,ofc)上使用MediaWiki cookie進行身份驗證(尤其是MW的OpenID,尤其是)?Cookie中的In-python MediaWiki身份驗證

從python到MediaWiki數據庫的訪問也是可能的。

+1

選中此項:http://stackoverflow.com/questions/2170990/how-to-check-if-a-user-is-logged-on-in-mediawiki-in-a-different-app – 2011-01-14 13:56:13

+0

謝謝,這非常相關。 – HoverHell 2011-01-17 07:04:46

+0

你想用腳本解決哪個問題? – phobie 2012-09-26 11:06:25

回答

0

您可以使用MySQLdb模塊連接並修改SQL數據庫而不使用HTTP和Cookie,但這通常是執行MediaWiki維護的錯誤解決方案。雖然只讀訪問不應該是一個問題。

通過腳本訪問MediaWiki的最佳方式是使用api.php

最着名的基於Python的MediaWiki-API-bot是Pywikibot(前Pywikipediabot)。

在Python中保存cookie最簡單的方法可能是使用http.cookiejar模塊。 其文檔包含一些簡單的例子。

我提取功能的示例代碼從我自己的鏈接到MediaWiki-BOT的:

#!/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的請求。

您也可以通過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() 
0

一個非常簡單的方法來使用cookies搭配MediaWiki如下:

from cookielib import CookieJar 
import urllib2 
import urllib 
import json 

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

現在,請求可以使用取得開門紅。例如:

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,simplemediawikiwikitools,以及python中的數百個其他mediawiki封裝器。