2010-09-04 13 views
2

Ce qui serait plus facile comment utiliser les cookies MediaWiki dans certains scripts Python CGI (sur le même domaine, ofc) pour l'authentification (y compris OpenID de MW, en particulier)?Authentification MediaWiki In-python à partir de cookies

L'accès de python à la base de données MediaWiki est également possible.

+1

Vérifiez cela: http://stackoverflow.com/questions/2170990/how-to-check-if-a-user-is-logged-on-in-mediawiki-in-a-different-app –

+0

Merci, C'est très pertinent. – HoverHell

+0

Quel problème voulez-vous résoudre avec votre script? – phobie

Répondre

0

Vous pouvez vous connecter et modifier la base de données SQL sans HTTP ni cookies en utilisant le module MySQLdb, mais c'est souvent la mauvaise solution pour effectuer la maintenance de MediaWiki. Bien que l'accès en lecture seule ne devrait pas poser de problème. La meilleure façon d'accéder à MediaWiki avec un script est d'utiliser api.php.

Le MediaWiki-API-bot basé sur Python le plus connu est le Pywikibot (anciennement Pywikipediabot).

La méthode la plus simple pour enregistrer des cookies en Python pourrait être d'utiliser le module http.cookiejar. Sa documentation contient quelques exemples simples.

I extrait exemple de code fonctionnel de mon propre 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)) 

Classes, gestion des erreurs et des sous-fonctions ont été supprimées pour augmenter la lisibilité.

Les cookies enregistrés dans o_url_opener peuvent également être utilisés pour les demandes index.php.

Vous pouvez également vous connecter via index.php (fausse une demande de navigateur) mais cela inclurait l'analyse de la sortie HTML.


légende Nom de la variable:

# Unicode string 
s_* = 'a' 
# Bytes (raw string) 
r_* = b'a' 
# Dictionary 
d_* = {'a':1} 
# Integer number 
i_* = 4711 
# Other objects 
o_* = SomeClass() 
0

Une façon très facile à utiliser les cookies avec mediawiki est la suivante:

from cookielib import CookieJar 
import urllib2 
import urllib 
import json 

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

Maintenant, les demandes peuvent être faites en utilisant ouvre. Par exemple:

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'] 

Dans l'exemple ci-dessus, si le CookieJar n'a pas été créé, la connexion ne fonctionne pas complètement, demander un autre jeton. Cependant, il serait recommandé d'utiliser un wrapper mediawiki déjà créé tel que pywikipedia, mwhair, pytybot, simplemediawiki ou wikitools, avec des centaines d'autres wrappers mediawiki en python.