侧边栏壁纸
博主头像
Stars-One的杂货小窝博主等级

所有的创作都是有价值的

  • 累计撰写 277 篇文章
  • 累计创建 46 个标签
  • 累计收到 27 条评论

目 录CONTENT

文章目录

关于博客园图床接口对接使用

Stars-one
2023-03-22 / 0 评论 / 0 点赞 / 258 阅读 / 7301 字

最近巧合发现一个新东西,可以通过XmlRpc调用获取博客园图床,通过这个原理,可以不用每次写博客的时候都访问博客园后台来粘贴图片了

于是也是在我的工具软件xtool里封装了这个博客园上传的功能,之后贴图片就可以直接通过xtool软件来实现了,可以更加愉快地写博客了

说明

MetaWeblog是一种博客通用的协议,可以方便我们通过调接口的方式来上传文章或编辑文章,而博客园也是提供了此项功能

虽然我有个个人博客,但里面的图片如果保存到服务器上的话,之后迁移服务器之后就要同时将文件移动过去,十分的不方便

于是就可以利用博客园的图床功能,平时写的文章图片也是上传到博客园上,之后个人博客那边也是直接引用即可

不过需要注意的是,由于图床具有防盗链,所以引用的话需要在html文件的头部加上下面这个代码,否则图片就是403,无法成功加载出图片

<!DOCTYPE html>
<html>
	<head>
        <!--这个是重点 -->
        <meta name="referrer" content="no-referrer">
        ...
    </head>
</html>    

常用的博客MetaWeblog APT地址:

下面这两个数据格式即是博客园提供的接口传参,具体可以前往博客园里的设置页面查看

下面两个主要是留个档,知道大概的请求参数结构即可,之后就知道如何去对接了

<?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
        }
    }
    }
}

参考

0

评论区