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

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

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

  • RPC client,用来向 RPC 服务端调用方法,并接收方法的返回数据。
  • RF ? T P = PC server,用于响应 RPC 客户端的请求,执行方法,并回送方法执行G 3 M C 0 P结果。

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

C#使用WordPress的XML-RPC模块批量自动发布文章
引用第三方库:https://gl 2 * X s 9 u ; }ithub.com/abrudtkuhl/O r . F : { @ Z GWordPressS~ u Q 2 ~harp。VS 可以使用 N) k H .uget 搜索“WordPreR C - y v 8ssSharp”安装。
XML-RPC WordPress API 官方介绍:http://codex.wordpres1 J 7 ) c ; O `s.org/XML-RPC_WordPrn * b T E x ^ess_API (该网站屏蔽大陆IP)

新建并发布文章

using System.Windows;
using Sy + 1 p ! ^ Rystem.IO;
using WordPressSharp;
using WordPressSharp.Models;
na4 K g u 6 . b T {mespace AppGUIHET
{
class ClassXM@ R B O [LRPC
{
private void xmlPost()
{
// ==== 新建文章 ====
var post = new WordPressSharp.Modn | ` z G a ? D Rels.Post
{
Title = "文章标题",
PostType = "post",//post示文章,page示页面
PublishDateTime = System.S ! /DateTime.Now,//发布时间
Content = "黑鸟博客建立于2018年 ...",//文章内容
Status = "publish",//private示私密的,draft表示草稿,publish表示发布
//Name = "black1 8 ! p $ I - 0bird",//固定链接的部分
};
/{ d e 1/ ==== 和服务器建立连接 ====
using (var client = new WordPressClient(new WordPressSiteConfig
{~ } B
BaseUrl = "https://www.guihet.com/", /6 7 f U d r G 1 n/网站名称
UsernameY $ v u = "admin", //后台用户名
Password = "000000", //后台密码
BlogId = 1
}))
{
var res = c4 L 5 b F :lient.NewPost(post);//成功则返回文章ID
MessageBI ; -ox.Show(res.ToString());
}
}
}
}

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

上传图片

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

FileStream fs = new FileStream(@"F:\TEMP\pictx t q % S J T .ure.jpg", FileMode.Open);
byte[] byteData = new@ p X | W m byte[fs.Length];
fs.Read(byteData, 0, byteData.Le, M Z u ; / W %ngth);
fs.Close();//读取本地图片结束
Data imgFile = new Data();
imgFile.Bitr { h C t &s = byteData;
imgFile.Name = "文件名不包含后缀";
imgFile.Type = "image/jpeg";//File MIME type 或 HTTP Content-type
var sr = client.UploadFilU A D k @ C ye(imgFile);//上传
string strc = sr.Url;//服务器上图片地址,可加入文章& D h L K = N 9内容中

也可以这么写

var url =q N U A I "http://t.cn/A6Zo [ ~ * z fPeiaj"; //网, I / a a b K L A络图片地址
// var] F _ 1  O E name = Path.GetFileName(url);
Data data = null;
using (System.Net.WebClient webcPic = new SysteB ( u 5 { : N Dm.Net.WebClient())
{
data = new Data()
{
Namy G % Ae = System.IO.Path.GetFileName(url),
Bits = webcPic.Down6 ~  U v zloadData(url),
Type = webcPic.ResponseHeaders["content-type"]
};
}
MessageBox.n ! @ * 6 L U X hShow(client.UploadFi! $ G & G / le(data).Url);

风险

XML-RPC是使用xml_ + h l本的方式封装T , 4,以http方式传输命令和数据的协议。从本质上看,xmlRpc协议本身并不存在漏洞,但其所包装出来的j 6 8 6 A h VAPI接口服务存6 v h f x在被滥用的可能。由于这类API大多以xm? m F { {lRPCm d ^ o ) E V方式包装并提供,外界就普遍说是J I K { 1 T X 7xmlRPC的漏洞并建议关闭XML-RPC。

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

Wordx , w , Y -press中定义xmlrpc所包装服务的8 d D t + O ^ Q地址是在./wp-includes/class-wp-xmlrpc-server.php。
禁用XML-RPC接口:

//禁用XML-RPH 8 Y C接口
add_filter('xmlrpc_enabled', '__return_faD R V rlse');

以上代f M 4 X ` 8 i码丢到1 J l主题的functionsa N 9 # ; V D.php文件即可。

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

//禁用XML-RPC的pingbac( 2 O B qk接口
add_filtq U - Y u Ker( 'xmlrpc_methods', 're) & = hmove_xmlrpc_pingback_ping' );
function remove_xmlrpc_pingback_ping( $methods ) {
unset( $methods['pingY W i ,back.ping'] );
return $methods;
}

以上代码丢到主题的functions.. ) 7 Z T G Xph# u y = m & g #p文件即可。