Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 39 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
39
Dung lượng
182,83 KB
Nội dung
1 MỤC LỤC Giới thiệu tổng quát Wordpress Wordpress Content Management ( Hệ th ống quản trị nội dung) vi ết tắt CMS Được phát triển dựa PHP MySQL Wordpress cung c ấp m ột WebService dựa XML/RPC cho phép quản trị trangweb người dùngtừ xa 1.1 WordPress Web service XML-RPC WordPress sử dụng xmlrpc làm web service mặc định cho h ệ th ống mã ngu ồn wordpress Xmlrpc cài đặt RPC (Remote Procedure Call) n ền giao thưc HTTP, sử dụng xml để mã hóa trao đổi liệu XML-RPC giao th ức sử dụng dịch vụ web SOAP sử dụng rộng rãi nhiều ngơn ngữ lập trình java, android, php, Các gói/namespace sử dụng với wordpress xml-rpc là: Blogger API, metaWeblog API, Movable Type API, Pingback API Vì XML-RPC web server có phần: XML-RPC server XML-RPC client Về bản, client sử dụng XML để mã hóa tham số, gửi XML vào XML-RPC server, dùng để gọi hàm từ xa trả cho XML-RPC client vói n ội dung XML mã hóa 1.2 Kích hoạt XML-RPC wordpress Tính XML-RPC wordpress bị ẩn mặc định, để kích hoạt xmlrpc lên bạn truy cập: Settings->Writing->remote publishing N ếu option ch ưa bật bạn cài plugin “Control XML-RPC publishing” Truy cập lại Settings->Write->Remote publishing with XML-RPC ch ọn vào Enabled -> nhấn Save changes Ok tính xmlrpc kích ho ạt s ẵn sàng sử dụng Địa endpoint cho https:///xmlrpc.php website wordpress là: Test kết nối xmlrpc lệnh curl Cách làm việc giống giao thức xmpp Thực thi công việc thông qua việc truyền tải đoạn xml lên server b ằng ph ương thức POST, nguyên lý gọi hàm Trong ví dụ sau gửi n ội dung xml chứa thông tin gọi hàm vào xmlrpc wordpress server system.listMethods Thẻ methodName xác định tên phương thức thu ộc namespace system WordPress xmlrpc cung cấp sẵn namespace: system, demo, pingback, mt, metaWeblog, blogger, wp Tham số sử dụng hàm, xác định thẻ params, hàm listMethods khơng có đối số cung cấp thẻ trống Hàm Kết trả danh sách cách hàm sử dụng 1.3 WordPress XMLRPC Server Đăng ký hàm xmlrpc Wordpress xmlrpc api có filter xmlrpc_methods giúp bạn tạo phương thức riêng Đăng ký hàm rpc với đoạn code sau, copy vào theme functions.php add_filter( 'xmlrpc_methods', 'add_xml_rpc_methods' ); function add_xml_rpc_methods( $methods ) { $methods['frs.helloWorld'] = 'hello_world'; //Where frs.helloWorld is the XML-RPC method name, and hello_world is the callback, namespace 'frs' for any you want return $methods; } Ở ví dụ trên, đăng ký hàm helloWorld thuộc namespace frs, khai báo lời gọi hàm callback hello_worldcho hàm helloWorld Phần định nghĩa hàm callback Xem ví dụ mẫu: function hello_world($params){ global $wp_xmlrpc_server; $arg1 = $params[1]; return "Hello ".$wp_xmlrpc_server->escape( $arg1 ); } *Chú ý: Hàm cần trả giá trị, giá trị lấy gọi hàm Không s dụng echo, print để xuất chuỗi hình Xóa hàm rpc Tương tự cách tạo hàm, sử dụng xmlrpc_methods để xóa hàm khơng mong muốn Thêm vào functions.php function mynamespace_remove_xmlrpc_methods( $methods ) { unset( $methods['demo.addTwoNumbers'] ); unset( $methods['frs.helloWorld'] ); return $methods; } add_filter( 'xmlrpc_methods', 'mynamespace_remove_xmlrpc_methods'); 1.4 XMLRPC Client 1.4.1 Tạo lớp sử lý gọi hàm từ XMLRPC Server Tạo lớpXMLRPC_Client với nội dung sau: /*create XML-RPC PHP client*/ class XMLRPC_Client { private $url; function construct( $url ) { $this->url = $url; } /** * Call the XML-RPC method named $method and return * the results, or die trying! * * @param string $method XML-RPC method name * @param mixed optional variable list of parameters * to pass to XML-RPC call * * @return array result of XML-RPC call */ public function call() { // get arguments $params = func_get_args(); $method = array_shift( $params ); $post = xmlrpc_encode_request( $method, $params ); $ch = curl_init(); // set URL and other appropriate options curl_setopt( $ch, CURLOPT_URL, $this->url ); curl_setopt( $ch, CURLOPT_POST, true ); curl_setopt( $ch, CURLOPT_POSTFIELDS, $post ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); // issue the request $response = curl_exec( $ch ); $response_code = curl_getinfo( $ch, CURLINFO_HTTP_CODE ); $curl_errorno = curl_errno( $ch ); $curl_error = curl_error( $ch ); curl_close( $ch ); // check for curl errors if ( $curl_errorno != ) { die( "Curl ERROR: {$curl_errorno} - {$curl_error}n" ); } // check for server errors if ( $response_code != 200 ) { die( "ERROR: non-200 response from server: {$response_code} - {$response}n" ); } return xmlrpc_decode( $response ); } } 1.4.2 Gọi hàm rpc Kết nối tới XMLRPC Server sử dụng class XMLRPC_Client Tạo instance classXMLRPC_Client gọi hàm rpc XMLRPC Server phương thức call //call method $client = new XMLRPC_Client( "http://127.0.0.1:81/wordpress/xmlrpc.php" ); $available_methods = $client->call( 'system.listMethods' ); print_r( $available_methods ); Lợi ích XMLRPC bạn gọi nhiều hàm m ột k ết n ối XMPRPC, nh gọi tiếp hàm demo.sayHello $test= $client->call( 'demo.sayHello' ); print_r($test); 1.4.3 Xâydựng hàm RPC Lấy giá trị tham số truyền vào hàm function hello_world( $params ) { global $wp_xmlrpc_server; $blog_id = (int) $params[0]; // tham số không sử dụng, tham số trả id blog wordpress (built in XML-RPC actions) //tham số $username = $params[1]; $password = $params[2]; //tham số $args = $params[3]; //tham số } Truyền tương tương tham số vào phương thức $client->call $client->call( 'frs.helloWorld', 1, 'xmlrpc-user', 'xmlrpc-pass', array( 'name' => 'Justin' ) ); Như $params[1] có giá $params[3] mảng lại trị ‘xmlrpc-user’, $params[2] = ‘xmlrpc-pass’ Escape giá trị tham số chuỗi $params[1]=$wp_xmlrpc_server->escape( $params[1] ); 1.4.4 Xử lý lỗi Một ví dụ cách sử lý lỗi hàm rpc, đoạn code ki ểm tra ng ười dùng khơng có quyền chỉnh sửa viết, xuất lỗi 403 kèm theo tin nhắn function hello_world( $params ) { // check for edit_posts capability (requires contributor role) // (obviously not required for this simple example, but just for demonstration purposes) if ( ! current_user_can( 'edit_posts' ) ) return new IXR_Error( 403, ( 'You are not allowed access to details about orders.' ) ); } Ví dụ khác sử lý lỗi 500 (thiếu tham số) function hello_world( $params ) { $args = $params[3]; //giả sử tham số mảng // required parameter if ( ! isset( $args['name'] ) ) return new IXR_Error( 500, ( "Missing parameter 'name'" ) ); } Ví dụ: $client->call( 'frs.helloWorld', 1, 'xx', 'yy', array( 'age' => '23' ) ); Ví dụ truyền thiếu tham số ‘name’ vào hàm helloWorld, ->gặp lỗi 500 1.4.5 Tạo phiên làm việc user (verify credentials) WordPress RPC API có đối tượng global $wp_xmlrpc_server giúp hàm sử dụng kết nối vào hệ thống wordpress api Đăng nhập tài khoản user với phương thức login function hello_world( $params ) { global $wp_xmlrpc_server; $username = $params[1]; $password = $params[2]; // verify credentials if ( ! $wp_xmlrpc_server->login( $username, $password ) ) { return $wp_xmlrpc_server->error; } } Các tin nhắn lỗi trình sử dụng wordpress api lưu biến $wp_xmlrpc_server->error Ví dụ gọi hàm wp.getCommentCount để đếm comments user Như cần sử dụng phiên làm việc user //requires a WordPress username and password to execute $client = new XMLRPC_Client( "http://localhost/wordpress/xmlrpc.php" ); $comment_count = $client->call( 'wp.getCommentCount', 1, 'user1', '123456' ); print_r( $comment_count ); 1.4.6 Gọi hàm RPC khác từ hàm RPC Thực thi action xmlrpc_call với tên hàm cần gọi Bằng cách cho phép gọi hàm rpc hàm rpc, không cần gọi thêm phương th ức $client->call Điều hữu ích đơi bạn cần gọi hàm trước sử lý đến lệnh function hello_world( $params ) { do_action( 'xmlrpc_call', 'system.listMethods' ); } 1.5 Jwordpress Trong tập này, ta không sử dụng trực tiếp XML/PRC Java mà thông qua thư viện API nhỏ, mã nguồn mở gọi Jwordpress API cung c ấp t ại https://code.google.com/p/wordpress-java/ Giải thích API cung cấp đường dẫn: http://wordpressjava.googlecode.com/svn/trunk/doc/index.html Framework Jena Trong xâydựngứngdụng dựa cơng nghệ Semantic web, đ ể có th ể th ực thao tác đọc/xuất, hay thực hi ện truy v ấn m ột tài li ệu có mơ tả ngữ nghĩa dạng RDF ta sử dụng cơng cụ Jena Sesame M ặc dù Sesame đẩy mạnh phát triển ngày quan tâm t phía người sử dụng, theo chúng tơi, với tính tốt tài li ệu API rõ ràng, Jena thích hợp triển khai ứngdụng hướng đến cơng ngh ệ web ngữ nghĩa mẻ Jena (http://jena.sourceforge.net) công cụ mã nguồn mở hàng đ ầu đ ể triển khai Web ngữ nghĩa cho lập trình viên Java, phát tri ển b ởi HP Labs Semantic Web Research (http://www.hpl.hp.com/semweb) Jena Java Framework dùng để xâydựngứngdụngWeb ngữ nghĩa Jena cung cấp môi trường lập trình cho RDF, RDFS, OWL SPARQL - ngơn ngữ truy v ấn cho RDF Jena bao gồm thành phần tính sau: - - RDF API: Giao diện lập trình cho RDF OWL API: Giao diện lập trình cho OWL Xuất đọc file RDF theo dạng RDF/XML, N3 N-Tribles Cho phép lưu trữ nhớ, lưu trữ cố định tập tin đ ơn hay hệ quản trị sở liệu (MySQL, HSQLDB, PostgreSQL, Oracle, Microsoft SQL Server) Hệ truy vấn SPARQL 2.1 RDF API RDF API: Jena API ngơn ngữ l ập trình Java, t ạo x lý bi ểu đ RDF, tạo chỉnh sửa từ mơ hình có Jena có l ớp đ ối tượng biểu diễn đồ thị, tài nguyên thuộc tính, literal gói chứa interface t ạo đồ thị, dùng tạo mơ hình liệu RDF, đọc ghi file RDF, truy xu ất, li ệt kê phát biểu mơ hình liệu RDF 10 2.2 OWL API OWL API: OWL mở rộng RDF OWL liên quan tới l ớp giao di ện ho ặc sử dụng lớp, giao diện RDF API - Properties phân thành: Datatype properties, Object properties, Symmetric, Functional, InverseFunctional… - Các tài nguyên ontology: lớp thể - Quan hệ lớp cha lớp - Quan hệ tương đương, tách rời (Equivalency/Disjointness) - Ràng buôc restrictions,…) - OWL API cung cấp lớp giao diện thể tất lĩnh v ực c ngôn ngữ OWL.Các lớp giao diện nằm package com.hp.hpl.jena.ontology - OntModel interface phổ biến sử dụng để quản lý ontology OntModel chứa ontology statement, sử dụng đ ể lấy tài nguyên t ồn (Class, individual, properties) tạo ontology statement m ới - Các Class thể OntClass Ở đó, phương th ức OntClass có th ể sử dụng để xem thể hiện, lớp con, lớp cha, quan h ệ gi ữa class v ới th ể lớp để xác nhận quan hệ lớp cha lớp Các class có th ể gán nhãn thể phân loại: UnionClass, IntersectionClass, EnumeratedClass, ComplementClass OWL API cung cấp cách xác đ ịnh xem m ột lớp thuộc phân loại nhóm OntModel cung cấp ph ương th ức để xâydựng định nghĩa phức tạp - Các properties thể OntProperty OntProperty cung cấp phương thức xác định domain range properties xác đ ịnh loại property: DatatypeProperty, ObjectProperty, SymmetricProperty, FunctionProperty properties (AllValuesFrom, Cardinality Ví dụ Class: // Create an empty ontology model OntModel ontModel = ModelFactory.createOntologyModel(); 25 while (iter.hasNext()) { Resource rs = iter.nextResource(); String value[] = new String[PROPERTY_SUFFIX.length]; // check information of author Property propURL = model.getProperty(PROPERTY_PREFFIX + HOMEPAGE); StmtIterator iterator = rs.listProperties(propURL); if (iterator.hasNext()) { String url = iterator.nextStatement().getObject().toString(); if (url != null) { author[count].setURL(url); } } Property propFullname = model.getProperty(PROPERTY_PREFFIX + FULLNAME); iterator = rs.listProperties(propFullname); if (iterator.hasNext()) { String fullname = iterator.nextStatement().getObject() toString(); if (fullname != null) { author[count].setFullname(fullname); } } Property propUsername = model getProperty(PROPERTY_PREFFIX + AUTHOR); iterator = rs.listProperties(propUsername); 26 if (iterator.hasNext()) { String username = iterator.nextStatement().getObject() toString(); if (username != null) { author[count].setUsername(username); } } // get news resource for (int i = 0; i < value.length; i++) { Property prop = model.getProperty(PROPERTY_PREFFIX + PROPERTY_SUFFIX[i]); StmtIterator iterator1 = rs.listProperties(prop); if (iterator1.hasNext()) { value[i] = iterator1.nextStatement().getObject().toString(); } } buildTableBody(table, value); } // build author information Element head = doc.head(); head.append("" + author[count].getFullname() + ""); body.prepend("" + "username : " + author[count].getUsername() + "" + "homepage"); 27 try { BufferedWriter writer = new BufferedWriter(new FileWriter(file)); writer.write(doc.html()); writer.flush(); writer.close(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String args[]) throws FileNotFoundException { RDF2HTML a = new RDF2HTML(); a.convert(); System.out.println("Hoàn thành"); } } Lớp Account: package dark.wordpress; public class Account { private String fullname; private String username; private String password; 28 private String url; private String aboutURL; public Account(String username, String password, String url) { this.username=username; this.password=password; this.url=url; } public Account() { // TODO Auto-generated constructor stub } public String getPageId() { return aboutURL; } public void setPageId(String pageId) { this.aboutURL = pageId; } public void setFullname(String fullname) { this.fullname = fullname; } 29 public String getFullname() { return fullname; } public void setURL(String url){ this.url = url; } public void setUsername(String username){ this.username = username; } public String getPassword() { return password; } // trang chủ trang wordpress ví dụ https://studyandshare.wordpress.com public String getHomeUrl() { return url; } public String getUsername() { return username; 30 } // địa cổng dịch vụ wordpress để sử dụng jwordpress // ví dụ https://studyandshare.wordpress.com/xmlrpc.php public String getXMLUrl(){ return url+"/xmlrpc.php"; } } Lớp: WordpressModel: package dark.wordpress; import java.io.FileOutputStream; import net.bican.wordpress.Page; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.Property; import com.hp.hpl.jena.rdf.model.Resource; import dark.rdf.RDFType; public class WordpressModel { public static Property TITLE; 31 public static Property DESC; public static Property DATE; public static Property LINK; public static Property PAGE_ID; public static Property POST_ID; public static Property AUTHOR; public static Property TYPE; public static Property PAGE; public static Property USERNAME; public static Property HOMEPAGE; public static Property FULLNAME; private Model m; public WordpressModel() { String wp = "https://wordpress.com/wp#"; m = ModelFactory.createDefaultModel(); m.setNsPrefix("wp", wp); TITLE = m.createProperty(wp + "title"); DESC = m.createProperty(wp + "description"); DATE = m.createProperty(wp + "date"); LINK = m.createProperty(wp + "link"); PAGE_ID = m.createProperty(wp + "page-id"); POST_ID = m.createProperty(wp + "post-id"); AUTHOR = m.createProperty(wp + "author"); 32 // type có ba loại: author, page, post TYPE = m.createProperty(wp + "type"); PAGE = m.createProperty(wp + "page"); USERNAME = m.createProperty(wp + "username"); HOMEPAGE = m.createProperty(wp + "homepage"); FULLNAME = m.createProperty(wp + "fullname"); } public Model getModel() { return m; } // Thêm trang vào model public void addPage(Page p) { String title = p.getTitle(); String desc = p.getDescription(); String date = p.getDate_created_gmt().toString(); String link = p.getLink(); String pageid = p.getPage_id().toString(); String author = p.getWp_author(); Resource r = m.createResource(); r.addProperty(AUTHOR, author); r.addProperty(PAGE_ID, pageid); r.addProperty(TITLE, m.createLiteral(title)); 33 r.addProperty(DATE, m.createLiteral(date)); r.addProperty(LINK, m.createLiteral(link)); r.addProperty(TYPE, "page"); } // Thêm post vào model public void addPost(Page p) { String title = p.getTitle(); String desc = p.getDescription(); String date = p.getDate_created_gmt().toString(); String link = p.getLink(); String postid = p.getPostid().toString(); String author = p.getWp_author(); Resource r = m.createResource(); r.addProperty(POST_ID, postid); r.addProperty(TITLE, m.createLiteral(title)); r.addProperty(DATE, m.createLiteral(date)); r.addProperty(LINK, m.createLiteral(link)); r.addProperty(TYPE, "post"); } // Thêm thông tin tài khoản vào model public void addAcountInfo(Account acc) { Resource r = m.createResource(); 34 r.addProperty(TYPE, "author"); r.addProperty(HOMEPAGE, m.createLiteral(acc.getHomeUrl())); r.addProperty(FULLNAME, m.createLiteral(acc.getFullname())); } // Lưu file public void writeRDF(String path, RDFType type) { String rdfType; String filename; switch (type) { case N_TRIPLE: rdfType = "N-TRIPLE"; filename = "3N"; break; case TURTLE: rdfType = "TURTLE"; filename = "turtle"; break; default: rdfType = "RDF/XML"; filename = "xml"; } try { FileOutputStream file; file = new FileOutputStream(path + filename + ".rdf"); 35 m.write(file, rdfType); file.close(); } catch (Exception e) { e.printStackTrace(); } } } Lớp WordpressToRDF: package dark.wordpress; import java.net.MalformedURLException; import java.util.List; import dark.rdf.RDFType; import redstone.xmlrpc.XmlRpcFault; import net.bican.wordpress.Page; import net.bican.wordpress.Wordpress; public class WordpressToRdf { String username; String password; String url; 36 List listPage; List listPost; Account account; public WordpressToRdf(Account acc) { this.username = acc.getUsername(); this.password = acc.getPassword(); this.url = acc.getXMLUrl(); this.account = acc; } // Kết nối tới máy chủ lấy liệu public void getData() { try { Wordpress wp = new Wordpress(username, password, url); listPage = wp.getPages(); listPost = wp.getRecentPosts(100); } catch (MalformedURLException | XmlRpcFault e) { e.printStackTrace(); } } 37 // Lưu file public void writeToRdf(String path) { WordpressModel wpm = new WordpressModel(); for (Page e : listPage) { wpm.addPage(e); } for (Page e : listPost) { wpm.addPost(e); } wpm.addAcountInfo(account); //wpm.writeRDF(path + "/" + username + "_", RDFType.TURTLE); //wpm.writeRDF(path + "/" + username + "_", RDFType.N_TRIPLE); wpm.writeRDF(path + "/" + username + "_", RDFType.RDFXML); } } Hàm main cho việc lấy liệu từ wordpress: public static void main(String[] args) { String dusername = "ducdepzai"; String dpassword = "duc123456789"; String durl = "https://ducdepzaiptit.wordpress.com"; 38 Account duc = new Account(dusername, dpassword, durl); duc.setFullname("Bùi Minh Đức"); String husername = "dauhaiptit@gmail.com"; String hpassword = "dauhai12"; String hurl = "https://dauhaiptit.wordpress.com"; Account hai = new Account(husername, hpassword, hurl); hai.setFullname("Đậu Thanh Hải"); String tusername = "tuanda35.viettel@gmail.com"; String tpassword = "taoday123"; String turl = "https://tuanda35viettel.wordpress.com"; Account tuan = new Account(tusername, tpassword, turl); tuan.setFullname("Đặng Anh Tuấn"); WordpressToRdf wtr = new WordpressToRdf(tuan); wtr.getData(); wtr.writeToRdf("rdf/"); wtr = new WordpressToRdf(hai); wtr.getData(); wtr.writeToRdf("rdf/"); wtr = new WordpressToRdf(duc); wtr.getData(); wtr.writeToRdf("rdf/"); 39 System.out.println("DONE"); } ... di ện l ập trình phù hợp cho việc phát triển ứng dụng ontology độc lập với ngôn ngữ ontology mà b ạn sử dụng ngơn ngữ lập trình bạn Một lý xây dựng ứng dụng dựa ontology sử dụng b ộ suy di ễn đ... đ ể triển khai Web ngữ nghĩa cho lập trình viên Java, phát tri ển b ởi HP Labs Semantic Web Research (http://www.hpl.hp.com/semweb) Jena Java Framework dùng để xây dựng ứng dụng Web ngữ nghĩa... phép nhiều người sử dụng chu ẩn XML v ới nhiều ngơn ngữ lập trình, nhiều hệ thống khác Để trực quan, nhóm trích liệu file định dạng XML d ạng HTML s dụng web ứng dụng web thông dụng Trong ph ần