C#使用WordPress的XML-RPC模块批量自动发布文章

XML-RPC 的全称是 XML Remote Procedure Call,即 XML 远程过程调用。它是一套允许运行在不同操作系统、不同环境的程序实现基于网络过程调用的规范和一系列的实现。

这种远程过程调用使用 http 作为传输协议,XML 作为传送信息的编码格式。一个 XML-RPC 消息就是一个请求体为 XML 的 http-post 请求,被调用的方法在服务器端执行并将执行结果以 XML 格式编码后返回。
一个 XML-RPC 协议包括两部分:

  • RPC client,用来向 RPC 服务端调用方法,并接收方法的返回数据。
  • RPC server,用于响应 RPC 客户端的请求,执行方法,并回送方法执行结果。

WordPress 源代码中已经包含了完整的 RPC 服务端代码,它支持对文章,媒体,留言,分类,选项等等各方面数据的管理。简单说,你只要了解 XML-RPC 协议,可以使用 XML-RPC 对你的 WordPress 博客的各个方面进行操作,也就是说可以使用 XML-RPC 做 WordPress 的客户端。WordPress最新版本中该服务是默认开启的。

《C#使用WordPress的XML-RPC模块批量自动发布文章》
引用第三方库:https://github.com/abrudtkuhl/WordPressSharp。VS 可以使用 Nuget 搜索“WordPressSharp”安装。
XML-RPC WordPress API 官方介绍:http://codex.wordpress.org/XML-RPC_WordPress_API (该网站屏蔽大陆IP)

新建并发布文章

using System.Windows;
using System.IO;
using WordPressSharp;
using WordPressSharp.Models;

namespace AppGUIHET
{
    class ClassXMLRPC
    {
        private void xmlPost()
        {
            // ==== 新建文章 ==== 
            var post = new WordPressSharp.Models.Post
            {
                Title = "文章标题",
                PostType = "post",//post表示文章,page表示页面
                PublishDateTime = System.DateTime.Now,//发布时间
                Content = "黑鸟博客建立于2018年 ...",//文章内容
                Status = "publish",//private表示私密的,draft表示草稿,publish表示发布
                //Name = "blackbird",//固定链接的部分
            };
            // ==== 和服务器建立连接 ==== 
            using (var client = new WordPressClient(new WordPressSiteConfig
            {
                BaseUrl = "https://www.guihet.com/", //网站名称
                Username = "admin", //后台用户名
                Password = "000000", //后台密码
                BlogId = 1
            }))
            {
                var res = client.NewPost(post);//成功则返回文章ID
                MessageBox.Show(res.ToString());
            }
        }
    }
}

using语句,定义一个范围,在范围结束时处理对象。
场景:当在某个代码段中使用了类的实例,而希望无论因为什么原因,只要离开了这个代码段就自动调用这个类实例的 Dispose 释放资源。

上传图片

一般情况下文章至少会有一张以上图片,同样可以自动上传图片到网站服务器。

            FileStream fs = new FileStream(@"F:\TEMP\picture.jpg", FileMode.Open);
            byte[] byteData = new byte[fs.Length];
            fs.Read(byteData, 0, byteData.Length);
            fs.Close();//读取本地图片结束

            Data imgFile = new Data();
            imgFile.Bits = byteData;
            imgFile.Name = "文件名不包含后缀";
            imgFile.Type = "image/jpeg";//File MIME type 或 HTTP Content-type 

            var sr = client.UploadFile(imgFile);//上传
            string strc = sr.Url;//服务器上图片地址,可加入文章内容中

也可以这么写

          
            var url = "http://t.cn/A6ZPeiaj"; //网络图片地址
            // var name = Path.GetFileName(url);
            Data data = null;
            using (System.Net.WebClient webcPic = new System.Net.WebClient())
            {
                data = new Data()
                {
                    Name = System.IO.Path.GetFileName(url),
                    Bits = webcPic.DownloadData(url),
                    Type = webcPic.ResponseHeaders["content-type"]
                };
            }
            MessageBox.Show(client.UploadFile(data).Url);

风险

XML-RPC是使用xml文本的方式封装,以http方式传输命令和数据的协议。从本质上看,xmlRpc协议本身并不存在漏洞,但其所包装出来的API接口服务存在被滥用的可能。由于这类API大多以xmlRPC方式包装并提供,外界就普遍说是xmlRPC的漏洞并建议关闭XML-RPC。

在已经被暴露和炒作的xmlRPC相关漏洞中,wordpress的wp.getUsersBlogs可以被用来进行后台暴力破解,pingback.ping可以被用来进行DDoS(ping别人和SSRF内网),流传甚广。

Wordpress中定义xmlrpc所包装服务的地址是在./wp-includes/class-wp-xmlrpc-server.php。
禁用XML-RPC接口:

//禁用XML-RPC接口
add_filter('xmlrpc_enabled', '__return_false');

以上代码丢到主题的functions.php文件即可。

如果你还是用使用第三方客户端来管理Wordpress文章,那么可以只关闭XML-RPC的pingback 端口

//禁用XML-RPC的pingback接口
add_filter( 'xmlrpc_methods', 'remove_xmlrpc_pingback_ping' );
function remove_xmlrpc_pingback_ping( $methods ) {
    unset( $methods['pingback.ping'] );
    return $methods;
}

以上代码丢到主题的functions.php文件即可。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注