17 10 2019

前言

最近遇到项目需求,要求通过微信公众号文章url地址一键采取文章内容,包括标题、内容、图片等。而直接复制黏贴的话,无法获取微信的图片。

分析

一般文章都是由特定格式,所以先分析微信文章的html。
以文章《Spring Boot 2.X(八):Spring AOP 实现简单的日志切面》 https://mp.weixin.qq.com/s/0NaaRMs0G-xWIsDoPViOLw 为例:
标题标签:

  <h2 class="rich_media_title" id="activity-name">
            Spring Boot 2.X(八):Spring AOP 实现简单的日志切面
  </h2>

内容标签:

<div class="rich_media_content " id="js_content">
    文章内容....包含图片...
</div>

我们可以通过Java后台操做DOM获取页面来获取内容。而图片需要通过后台处理后改为自己的链接才能展示。

实现

添加相关依赖

<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.10.2</version>
        </dependency>

Controller实现

/**
     * 根据微信文章url获取内容
     * @param url
     * @throws Exception 
     */
    @ApiOperation(value = "根据微信文章url获取内容",notes = "")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "url", value = "微信文章url", required = true, dataType = "String", paramType = "query")
    })    
    @GetMapping("/getContenByWechatUrl")
    public void getContenByWechatUrl(String url) throws Exception {
        if(url==null||url=="") {
            outJsonFailure(CommonErrors.MISSING_PARAMETER.getCode(), CommonErrors.MISSING_PARAMETER.getMessage());
            return;
        }
        try {
            Document doc= Jsoup.parse(new URL(url),5000);
            if(doc.getElementById("js_content")!=null) {
                String title = doc.getElementById("activity-name").html().toString();
                String content = doc.getElementById("js_content").html().toString();
                Elements elements=doc.getElementsByTag("img");
                for(Element element:elements){
                    if(!element.attr("data-src").isEmpty()) {
                        System.out.println(element.attr("data-src"));
                        //上传到oss并返回oss的图片url地址
                        String rurl = upImgService.uploadImg2OssByUrl(element.attr("data-src"), "article/");
                        System.out.println(rurl);
                        content=content.replace(element.attr("data-src"), rurl).replace("data-src", "src");
                    }

                }
                JSONObject data=new JSONObject();
                data.put("title", title);
                data.put("content", content);            
                if(title!=null&&content!=null) {
                    outJsonSuccess(data);
                }else {
                    outJsonFailure(CommonErrors.FAIL_OPERATOR.getCode(), "获取文章内容失败");
                }
            }else {
                outJsonFailure(CommonErrors.FAIL_OPERATOR.getCode(), "请输入正确的微信文章url");
            }

        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            outJsonFailure(CommonErrors.FAIL_OPERATOR.getCode(), "获取文章内容失败");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            outJsonFailure(CommonErrors.FAIL_OPERATOR.getCode(), "获取文章内容失败");
        }
    }

案例

https://www.socialmarketings.com/ 的发布稿件功能内。

延伸阅读
  1. Java用Freemarker完美导出word文档(带图片)
  2. QQ第三方授权登录OAuth2.0实现(Java)
  3. Markdown基本语法
  4. Java 实现微信公众号文章内容一键采取(标题+内容+图片)
发表评论