ZBLOG远程发布文章API改进实现兼容WORDPRESS XMLRPC

  • A+
所属分类:WordPress技巧

最近有个zblog自动发布文章需求,大致看了一下,发现并没有wordpress方便,特别是我还有对接python的要求,大概有几种办法

  1. 1. 直接读取/zb_users/c_option.php,暴力写入数据
  2. 2. 直接开发一个插件使用zblog内部代码接口
  3. 3. 使用zblog本身的xmlrpc

第一种方案为了安全还得自己写鉴权,第二种方案通用性强但是需要对zblog比较了解,第三种方案最方便了,python可以直接使用xmlrpc库对接,由于我已经有wordpress自动发布的python脚本,我想复用这个,因此对zblog的xmlrpc进行改造。

兼容wordpress xmlrpc

找到zb_system/xml-rpc/index.php文件,先在入口判断出增加’mt.supportedMethods’支持,再增加’wp.newPost’支持

  1. case 'mt.supportedMethods':
  2. $strXML = '<methodResponse><params><param><value><array><data>$%#1#%$</data></array></value></param></params></methodResponse>';
  3. $strAll = '<value><string>wp.newPost</string></value>';
  4. echo str_replace("$%#1#%$", $strAll, $strXML);
  5. break;
  6. case 'wp.newPost':
  7. $username = (string)$xml->params->param[1]->value->string;
  8. $password = (string)$xml->params->param[2]->value->string;
  9. xmlrpc_Verify($username, $password);
  10. if ($zbp->CheckRights('ArticlePst')) {
  11. xmlrpc_newPost_as_wp($xml->params->param[3]->value->struct->asXML());
  12. } else {
  13. xmlrpc_ShowError(6, __FILE__, __LINE__);
  14. }
  15. break;

转化wordpress xmlrpc支持函数如下

  1. function xmlrpc_newPost_as_wp($xmlstring)
  2. {
  3. global $zbp;
  4. $xml = simplexml_load_string($xmlstring);
  5. if ($xml) {
  6. $post = array();
  7. foreach ($xml->children() as $x) {
  8. $a = (string)$x->name;
  9. if ($a == 'terms_names') {
  10. $struct = $x->value->struct;
  11. foreach ($struct->children() as $y) {
  12. $a = (string)$y->name;
  13. $b = $y->value->children()->asXML();
  14. $b = str_replace(array('<array>', '</array>', '<data>', '</data>', '<string>', '</string>', '<value>', '</value>', PHP_EOL), array(''), $b);
  15. $post[$a] = $b;
  16. }
  17. } else {
  18. $b = $x->value->children();
  19. $b = str_replace(array('<array>', '</array>', '<data>', '</data>', '<string>', '</string>'), array(''), $b);
  20. $post[$a] = $b;
  21. }
  22. }
  23. $_POST['ID'] = 0;
  24. $_POST['Title'] = $post['post_title'];
  25. if (strcmp('publish', $post['post_status']) != 0) {
  26. $_POST['Status'] = 0;
  27. } else {
  28. $_POST['Status'] = 1;
  29. }
  30. if (isset($post['mt_basename'])) {
  31. $_POST['Alias'] = $post['mt_basename'];
  32. }
  33. if (isset($post['dateCreated'])) {
  34. date_default_timezone_set('GMT');
  35. $_POST['PostTime'] = strtotime($post['dateCreated']);
  36. date_default_timezone_set($zbp->option['ZC_TIME_ZONE_NAME']);
  37. $_POST['PostTime'] = date('c', $_POST['PostTime']);
  38. }
  39. if (isset($post['wp_author_id'])) {
  40. $_POST['AuthorID'] = $post['wp_author_id'];
  41. } else {
  42. $_POST['AuthorID'] = $zbp->user->ID;
  43. }
  44. if (isset($post['post_tag'])) {
  45. $_POST['Tag'] = $post['post_tag'];
  46. }
  47. if (isset($post['category'])) {
  48. $post['category'] = str_replace('<value>', '', $post['category']);
  49. $catename = trim(GetValueInArray(explode('</value>', $post['category']), 0));
  50. $_POST['CateID'] = $zbp->GetCategoryByName($catename)->ID;
  51. }
  52. if (isset($post['mt_excerpt'])) {
  53. $_POST['Intro'] = $post['mt_excerpt'];
  54. }
  55. if (isset($post['mt_text_more']) || isset($post['post_content'])) {
  56. if (isset($post['mt_text_more'])) {
  57. if ($post['mt_text_more'] != '') {
  58. $_POST['Content'] = $post['post_content'] . '<!--more-->' . $post['mt_text_more'];
  59. } else {
  60. $_POST['Content'] = $post['post_content'];
  61. }
  62. } else {
  63. $_POST['Content'] = $post['post_content'];
  64. }
  65. }
  66. $strXML = '<methodResponse><params><param><value><boolean>$%#1#%$</boolean></value></param></params></methodResponse>';
  67. if (PostArticle() == true) {
  68. $strXML = str_replace("$%#1#%$", 1, $strXML);
  69. echo $strXML;
  70. } else {
  71. xmlrpc_ShowError(0, __FILE__, __LINE__);
  72. }
  73. }
  74. }

最后python端使用wordpress_xmlrpc库就行了

ZBLOG远程发布文章API改进实现兼容WORDPRESS XMLRPC

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin