1. 程式人生 > >Pingback和Xml-RPC

Pingback和Xml-RPC

提醒:本文最後更新於 2813 天前,文中所描述的資訊可能已發生改變,請謹慎使用。

WordPress有一個功能:當有人引用本站文章時,會新增一條評論在文後,顯示引用頁面的資訊;發部落格時WordPress也會通知文章內每個連結,讓它知道自己被引用了。這個功能非常贊,讓部落格間的互動變得更容易。

改用自己的部落格系統後,還想用這麼高階的功能,只有靠自己了。搜尋得知,這個功能叫Pingback,是基於XML-RPC的一個協議。Pingback功能需要實現一個xmlprc client,在文章更新時ping對方服務;以及一個xmlrpc server,來接受其它伺服器發過來的ping。

先研究下

XML-RPC協議,走http用xml來交換資料,跟SOAP很像,但比SOAP簡單的多。Python裡有現成的庫可以方便的處理xmlrpc。

來嘗試下寫個xmlrpc客戶端:

from xmlrpclib import ServerProxy
from pprint import pprint

s = ServerProxy('http://www.aoao.org.cn/xmlrpc.php')
pprint(s.system.listMethods())

這段程式碼執行完,輸出了aoao同學提供的好多方法。那些metaWeblog、blogger、wt、wp開頭的都是跟部落格管理有關的,呼叫時需要傳帳號密碼,就先不玩了。試下addTwoNumbers和sayHello,看名字應該可以玩:

>>> s.demo.addTwoNumbers(1, 2)
3
>>> s.system.multicall([{'methodName':'demo.addTwoNumbers','params':[1,2]},{'met
hodName':'demo.sayHello','params':[]}])
[[3], ['Hello!']]

果然成功了。看起來跟本地函式一樣的呼叫形式,xmlrpclib卻在後臺把輸入引數拼裝成xml,post給遠端服務,再拿到返回的xml資料解析出返回值。也支援多個方法批量呼叫,真是太讚了~

回過頭來看Pingback協議

,更新文章時怎麼通知他人就有思路了:

  • 先找出文章中所有連結,還要找出連結對應的xmlrpc(pingback) server;
  • 呼叫該server的pingback.ping方法,把本文連結和對方連結作為引數傳過去;
  • 處理返回狀態,記錄下這次pingback的資訊,這是為了避免更新文章時多次ping。

官方文章中提供了兩種方案從一個連結找到對應的xmlrpc server:

  • 查詢該連結response header裡的X-Pingback欄位;
  • 查詢該連結頁面裡的標記。

萬能的python搭建一個xmlrpc服務也很簡單:

from SimpleXMLRPCServer import SimpleXMLRPCServer

def sayHello(name='Kitty'):
    return 'Hello %s' % name

server = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(sayHello, 'hello')
server.serve_forever()
>>> from xmlrpclib import ServerProxy
>>> s = ServerProxy('http://localhost:8000')
>>> s.hello()
'Hello Kitty'
>>> s.hello('Jerry Qu')
'Hello Jerry Qu'

沒問題。剩下的工作就是實現一個能提供pingback.ping方法的xmlrpc server了。看了wordpress的實現,感覺還是挺複雜的,記下來:

  • 從過來的xml中解析出pagelinkedfrom(來源url)和pagelinkedto(被請求url);
  • 根據pagelinkedto找出被請求頁面post_ID,wp支援多種格式的文章連結,找post_Id這部分程式碼非常糾結;
  • 抓取pagelinkedfrom網頁內容,提取標題,並找出pagelinkedfrom的位置,並提取該位置附近的文字作為摘要,這一步程式碼也非常複雜;
  • 將上一步得到的標題、摘要、和pagelinkedfrom新增到被請求頁面的評論中;
  • 上面任何一步出現異常都將終止流程並返回異常,否則記錄該pingback狀態,返回成功。

由此可見,wordpress為了實現pingback出現在評論裡,以及智慧提取摘要的功能,寫了非常多的程式碼。

最後,原理都弄明白了,就等找時間開工了。

--EOF--

提醒:本文最後更新於 2813 天前,文中所描述的資訊可能已發生改變,請謹慎使用。

相關推薦

PingbackXml-RPC

提醒:本文最後更新於 2813 天前,文中所描述的資訊可能已發生改變,請謹慎使用。 WordPress有一個功能:當有人引用本站文章時,會新增一條評論在文後,顯示引用頁面的資訊;發部落格時WordPress也會通知文章內每個連結,讓它知道自己被引用了。這個功能非常贊,讓部落格間的互動變得更容易。 改

JAVA實現XML-RPC客戶端服務端

客戶端程式碼: package test_xmlrpc.test; import java.net.URL; import java.util.ArrayList; import java.uti

開啟kbmmw 5.09 中的XML-RPC JSON-RPC 服務

需要 image src bubuko 技術 編譯 sports 設置 文件 kbmmw 5.09 裏面增加了XML-RPC和 JSON-RPC 服務支持,但是默認沒有開啟。 需要在安裝前,修改kbmMWConfig.inc文件。 加入以下定義 {$DEFI

jsonxml封裝數據、數據緩存到文件中

用戶 lena 數據緩存 完全 數據類型 lin print 函數 response 一、APP的通信格式之xml xml:擴展標記語言,可以用來標記數據,定義數據類型,是一種允許用戶對自己標記語言進行定義的源語言。XML格式統一,擴平臺語言,非常適合數據傳輸和通信,業界

XML-RPC筆記

static stream table brush 方法調用 imp property json-rpc 包裝 1.什麽是XML-RPC RPC(Remote Procedure Call)就是相當於提供了一種“遠程接口”來供外部系統調用,常用於不同平臺、不同架構的系統

快來看看Google出品的Protocol Buffer,別僅僅會用JsonXML

println 輸出流 基本數據類型 下一個 ebr sid 官網 序列 reg 前言 習慣用 Json、XML 數據存儲格式的你們,相信大多都沒聽過Protocol Buffer Protocol Buffer 事實上 是 Google出品的一種輕

數組xml的互相轉換的封裝函數

iss 數組 nbsp bsp load val urn document ray /** * 數組轉換為xml * * @param array $arr * @param int $level * @return strin

【jQuery】jQ處理xml文件xml字符串

文本 技術 字符串 處理 兼容 child nodevalue url att 1.xml文件 <?xml version="1.0" encoding="utf-8" ?> <root> <book id="1">

netconf、yangXML關系

信息 right 重要 學習 一點 proc text mod 有助於 netconf是基於xml的網絡配置協議,文檔RFC6241有詳細介紹。   yang是為netconf建模的一種數據建模語言。文檔RFC2060詳細介紹了yang1.0版本,RFC7950介

json字符串xml的 比較

讀取 def 編程語言 使用 總結 ati color ota www json是ajax前戲,在前後端傳輸數據都要用到json json是一種輕量級的數據交換格式, (JavaScript Objects Notation ,js對象標記),與JavaScript有關

ajax ---- json xml 區別

需要 pro ces 文件格式 很多 pos 使用 基本 perl 2.XML和JSON優缺點 (1).XML的優缺點<1>.XML的優點  A.格式統一,符合標準;  B.容易與其他系統進行遠程交互,數據共享比較方便。<2>.XML的缺點  A.X

java對象xml的轉換

bubuko win create leo div etc 分享圖片 input string 關於java轉對象,還有別的方法,這裏我就簡單的介紹一下這個。當然在轉對象的過程中,必須加註釋。 1.將Java對象轉換為XML public static <T&

AspectJ註解版XML

post 規範 {} spring imp sele aik update sel 什麽是AspectJ? AspectJ是一個面向切面的框架,它擴展了Java語言。AspectJ定義了AOP語法,所以它有一個專門的編譯器用來生成遵守Java字節編碼規範的Class文件。

PHP數組XML相互轉換的函數

ret val ble lib key decode 轉換 相互 simplexml //數組轉xml function ArrtoXml($arr) { if(!is_array($arr) || count($arr) == 0) ret

Python-Json字符串XML解析

all 創建 目標 有效 語言 系列化 res 組成 tag Python-json字符串和xml解析 JSON:JavaScript Object Notation(JavaScript 對象表示法) JSON是存儲和交換文本信息的語法,類似XML JSON比

htmlxml的區別

hyper TP 模式 規則 html中 可能 for 有時 都是 https://www.cnblogs.com/keyi/p/7131391.html 一、HTML HTML(HyperTextMark-upLanguage)即超文本標記語言,是WWW的

MyEclipse背景與字體大小xml文件中字體大小調整

ref 代碼 AS 需要 ML ont reference round 時間 1、打開window / Preference,彈出Preference面板 2、展開General標簽,選中Editors選項,展開。 3、選中 Text Editors,右邊出現TestEdi

eclipse添加dtd約束xml約束的方法

bean str ima bsp xml約束 cli 命名 src 位置 struts-2.3.dtd dtd 文件的位置 導入上面的 dtd 約束 spring-beans-4.2.xsd 為主配

mybatis 註解xml 優缺點

麻煩 好用 標記 tis 報錯 成功 知識 關鍵字 註入 xml: 增加了xml文件,修改麻煩,條件不確定(ifelse判斷),容易出錯,特殊轉義字符比如大於小於 註釋:   復雜sql不好用,搜集sql不方便,管理不方便,修改需重新編譯 #和$區別: 相同   都是對

異步的javascriptXML-AJAX

css 部分 sta response html range 動態性 我們 參考 AJAX = Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)。AJAX 不是新的編程語言,而是一種使用現有標準的新方法。AJAX 最