最近巧合发现一个新东西,可以通过XmlRpc调用获取博客园图床,通过这个原理,可以不用每次写博客的时候都访问博客园后台来粘贴图片了
于是也是在我的工具软件xtool里封装了这个博客园上传的功能,之后贴图片就可以直接通过xtool软件来实现了,可以更加愉快地写博客了
说明
MetaWeblog是一种博客通用的协议,可以方便我们通过调接口的方式来上传文章或编辑文章,而博客园也是提供了此项功能
虽然我有个个人博客,但里面的图片如果保存到服务器上的话,之后迁移服务器之后就要同时将文件移动过去,十分的不方便
于是就可以利用博客园的图床功能,平时写的文章图片也是上传到博客园上,之后个人博客那边也是直接引用即可
不过需要注意的是,由于图床具有防盗链,所以引用的话需要在html文件的头部加上下面这个代码,否则图片就是403,无法成功加载出图片
<!DOCTYPE html>
<html>
<head>
<!--这个是重点 -->
<meta name="referrer" content="no-referrer">
...
</head>
</html>
常用的博客MetaWeblog APT地址:
- 博客园:https://rpc.cnblogs.com/metaweblog/账号名
- 开源中国(oschina): https:/7my. oschina.net/action/xmlrpc
- 自建WordPress站点:http://你的博客地址/xmlrpc.php
下面这两个数据格式即是博客园提供的接口传参,具体可以前往博客园里的设置页面查看
下面两个主要是留个档,知道大概的请求参数结构即可,之后就知道如何去对接了
<?xml version="1.0"?>
<methodCall>
<methodName>blogger.getUsersBlogs</methodName>
<params>
<param>
<value>
<string></string>
</value>
</param>
<param>
<value>
<string>登录名</string>
</value>
</param>
<param>
<value>
<string>访问令牌</string>
</value>
</param>
</params>
</methodCall>
<?xml version="1.0"?>
<methodCall>
<methodName>metaWeblog.getRecentPosts</methodName>
<params>
<param>
<value>
<string>370729</string>
</value>
</param>
<param>
<value>
<string>登录名</string>
</value>
</param>
<param>
<value>
<string>访问令牌</string>
</value>
</param>
<param>
<value>
<int>1</int>
</value>
</param>
</params>
</methodCall>
直接访问地址就是进入到一个类似接口文档的网页,里面都要具体的参数,之后对接一下即可
使用
这里演示使用Kotlin来实现图片上传到图床的功能,封装了个工具类
先引用一个rpc的依赖
<!-- https://github.com/gturri/aXMLRPC-->
<dependency>
<groupId>fr.turri</groupId>
<artifactId>aXMLRPC</artifactId>
<version>1.11.0</version>
</dependency>
代码如下:
object CnblogImgUtil {
val username = "用户名"
val pwd = "你的访问令牌"
val url = "https://rpc.cnblogs.com/metaweblog/stars-one"
/**
* 接收一个imgFile的文件对象,实现上传并返回结果
* @param type 1:输出为md图片链接 0:普通图片链接
*/
fun uploadImgToCnblog(imgFile: File, type: Int = 1): String {
val client = XMLRPCClient(URL(url))
val base64 = Base64Encoder.encode(imgFile.readBytes()).toByteArray()
val imgName = imgFile.name
val imgType = imgFile.extension
val file = hashMapOf<String, Any>("bits" to base64, "name" to imgName, "type" to imgType)
try {
val result = client.call("metaWeblog.newMediaObject", "", username, pwd, file) as HashMap<String, String>
val url = result["url"] ?: return ""
if (type == 1) {
return "![]($url)"
}else{
return url
}
} catch (e: Exception) {
e.printStackTrace()
return ""
}
//传图片的二进制数据上传到图床
fun uploadImgToCnblog(bytes: ByteArray, type: Int = 1): String {
val base64 = bytes
val client = XMLRPCClient(URL(url))
val imgName = "name.png"
val imgType = "png"
val file = hashMapOf<String, Any>("bits" to base64, "name" to imgName, "type" to imgType)
try {
val result = client.call("metaWeblog.newMediaObject", "", username, pwd, file) as HashMap<String, String>
val resultUrl = result["url"] ?: return ""
if (resultUrl.isBlank()) {
LogUtil.info("----博客园图床数据取回的url为空白------")
}
return if (type == 1) {
"![]($resultUrl)"
} else {
resultUrl
}
} catch (e: Exception) {
throw e
}
}
}
}
评论区