Moodle API
Contingut
Introducció[modifica]
El CMS Moodle disposa d'una API per accedir a les seves funcions internes i afegir funcionalitat com, per exemple, crear cursos automàticament des d'un script.
La API és accessible de diferents maneres (SOAP, REST, etc.) de les quals ens interessa REST.
Per activar-la haurem de seguir les passes (són unes quantes) que s'indica dintre del mateix moodle, a la secció:
Site Administration -> Plugins -> Web Services -> Overview
Un cop hagueu creat un rol i usuari amb els permisos adequats per a la API, finalment podeu seguir les passes descrites a la web per accedir a la API:
- Demanar token
- Executar funció
Explicat aquí:
https://docs.moodle.org/dev/Creating_a_web_service_client
Tot sembla senzill en un principi, però hi ha lio per passar els arguments. Seria d'agrair passar-los en JSON o similars, però es veu que la cosa no va així. Buscant per aquí i per allà he trobat aquestes explicacions amagades:
- https://moodle.org/mod/forum/discuss.php?d=232130 (mirar el 3r post on ho aclareix)
- http://stackoverflow.com/questions/36375380/how-to-create-a-user-in-the-moodle-rest-ws-using-the-python-requests-module (mirar la resposta)
O sigui que els paràmetres s'han de passar en URLencode a l'estil:
.....&criteria[0][key]=email&criteria[0][value]=aname@somedomain
PHP[modifica]
He utilitzat aquests recursos:
- Llibreria una mica adaptada pel Moodle per facilitar les crides CURL: https://github.com/moodlehq/sample-ws-clients/blob/master/PHP-REST/curl.php
- http://stackoverflow.com/questions/33404353/php-create-user-in-moodle-via-webservice
Aquest codi m'ha funcionat amb Moodle 2.9:
<?php
require_once("curl.php");
$courses=array("courses" =>
array(
0=>array(
"fullname" => "CURS DE TEST2",
"shortname" => "test2",
"categoryid" => 4
)
)
);
// prep url call
$token = "xxxyyyzzz";
$server = "https://el.meu.moodle.com/webservice/rest/server.php";
$getparams = "?wstoken=".$token."&wsfunction=core_course_create_courses";
$url = $server.$getparams;
$params = $courses;
// exec
$curl = new curl();
$resp = $curl->post($url, $params);
var_dump($resp);
Python[modifica]
Recursos:
- http://stackoverflow.com/questions/36375380/how-to-create-a-user-in-the-moodle-rest-ws-using-the-python-requests-module
- Utilitzem la llibreria "requests" per facilitar: http://docs.python-requests.org
import requests
import json
token = "xxxyyyzzz"
url = "https://el.meu.moodle.com/moodle/webservice/rest/server.php?wstoken=" + token + ""
# afegir aixo si vols resposta json
#url=url+"&moodlewsrestformat=json"
# dades minimes per crear un curs
data = {
'wsfunction': 'core_course_create_courses',
'courses[0][fullname]' : "CURS DE TEST 3",
'courses[0][shortname]' : "test3",
'courses[0][categoryid]' : 4
}
r = requests.post(url, params=data, verify=False)
print data
print r.text
Custom functions[modifica]
Això només cal si hem fet funcions personalitzades dins el moodle. Per la API estàndard no cal.
Típicament dóna un error.
Can not find data record in database table external_functions.
Es veu que passa quan creem una nova funció personalitzada a la API. Cal actualitzar unes taules, i això no passa automàticament.
Per forçar l'actualització de les funcions aquí suggereixen elevar la versió de version.php i així el moodle automàticament farà un upgrade.
http://stackoverflow.com/questions/38891022/moodle-custom-service-creation-issue
Un cop fet l'upgrade simulat, tindrem disponible la nova funció.