Przeglądaj źródła

更新获取公众号文章接口

liu 2 lat temu
rodzic
commit
89da8d78df

+ 188 - 0
src/main/java/com/template/common/utils/Base64Utils.java

@@ -0,0 +1,188 @@
+package com.template.common.utils;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
+import sun.net.www.protocol.http.HttpURLConnection;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.net.URL;
+
+public class Base64Utils {
+    /**
+     * 本地图片转化成base64字符串
+     * @param imgPath
+     * @return
+     */
+    public static String GetImageStr(String imgPath) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
+
+
+        String imgFile = imgPath;// 待处理的图片
+        InputStream in = null;
+        byte[] data = null;
+        String encode ="data:image/jpeg;base64,"; // 返回Base64编码过的字节数组字符串
+        // 对字节数组Base64编码
+        BASE64Encoder encoder = new BASE64Encoder();
+        try {
+            // 读取图片字节数组
+            in = new FileInputStream(imgFile);
+            data = new byte[in.available()];
+            in.read(data);
+            encode = encode+encoder.encode(data);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                in.close();
+            } catch (IOException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+        }
+
+        return encode;
+
+
+    }
+
+
+
+    /**
+     * base64字符串转化成图片
+     *
+     * @param imgData
+     *            图片编码
+     * @param imgFilePath
+     *            存放到本地路径
+     * @return
+     * @throws IOException
+     */
+
+    public static boolean GenerateImage(String imgData, String imgFilePath) throws IOException { // 对字节数组字符串进行Base64解码并生成图片
+        if (imgData == null|| StringUtils.isBlank(imgFilePath)) // 图像数据为空
+        {
+            return false;
+        }
+        BASE64Decoder decoder = new BASE64Decoder();
+//        将空格转成+
+        imgData = imgData.replaceAll(" ", "+").split("base64,")[1];
+        OutputStream out = null;
+        try {
+            out = new FileOutputStream(imgFilePath);
+            // Base64解码
+            byte[] b = decoder.decodeBuffer(imgData);
+            for (int i = 0; i < b.length; ++i) {
+                if (b[i] < 0) {// 调整异常数据
+                    b[i] += 256;
+                }
+            }
+            out.write(b);
+        } catch (FileNotFoundException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } finally {
+            out.flush();
+            out.close();
+            return true;
+        }
+    }
+
+
+    /**
+     * 将网络链接图片或者本地图片文件转换成Base64编码字符串
+     *
+     * @param imgStr 网络图片Url/本地图片目录路径
+     * @return
+     */
+    public static String getImgStrToBase64(String imgStr) {
+        InputStream inputStream = null;
+        ByteArrayOutputStream outputStream = null;
+        byte[] buffer = null;
+        try {
+            //判断网络链接图片文件/本地目录图片文件
+            if (imgStr.startsWith("http://") || imgStr.startsWith("https://")) {
+                // 创建URL
+                URL url = new URL(imgStr);
+                // 创建链接
+                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+                conn.setRequestMethod("GET");
+                conn.setConnectTimeout(5000);
+                inputStream = conn.getInputStream();
+                outputStream = new ByteArrayOutputStream();
+                // 将内容读取内存中
+                buffer = new byte[1024];
+                int len = -1;
+                while ((len = inputStream.read(buffer)) != -1) {
+                    outputStream.write(buffer, 0, len);
+                }
+                buffer = outputStream.toByteArray();
+            } else {
+                inputStream = new FileInputStream(imgStr);
+                int count = 0;
+                while (count == 0) {
+                    count = inputStream.available();
+                }
+                buffer = new byte[count];
+                inputStream.read(buffer);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (inputStream != null) {
+                try {
+                    // 关闭inputStream流
+                    inputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (outputStream != null) {
+                try {
+                    // 关闭outputStream流
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        // 对字节数组Base64编码
+        return new BASE64Encoder().encode(buffer);
+    }
+
+
+
+
+    // BufferedImage转换成base64,在这里需要设置图片格式,如下是jpg格式图片:
+    public static String imageToBase64(BufferedImage bufferedImage) {
+        Base64 encoder = new Base64();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try {
+            ImageIO.write(bufferedImage, "jpg", baos);
+        } catch (IOException e) {
+        }
+        return new String(encoder.encode((baos.toByteArray())));
+    }
+
+
+
+
+
+    public static void main(String[] args) throws IOException {
+//        String imageStr = Base64Utils.GetImageStr("E:\\image/1/0/7/1078e0f267174bbfbc7c102938fd6d0a.jpg");
+        String s="https://mmbiz.qpic.cn/mmbiz_jpg/TSfsIFZJ6gS3l0L7B1Db3u44ACC4LFju0GlAqmBHbKvMTBvYGeYHkkU99WXCfTqX357rzrSmKAicYfp3ojVyJcA/0?wx_fmt=jpeg";
+        s=s.replace("https", "http");
+        System.out.println("s = " + s);
+        String imageStr = Base64Utils.getImgStrToBase64(s);
+        System.out.println("imageStr = " + imageStr);
+//        Base64Utils.GenerateImage(imageStr, "F://2.jpg");
+    }
+
+}
+
+

+ 4 - 0
src/main/java/com/template/controller/SmartNewsController.java

@@ -37,5 +37,9 @@ public class SmartNewsController implements SmartNewsControllerAPI {
 
         return CommonResult.ok(smartNews);
     }
+
+
+
+
 }
 

+ 127 - 21
src/main/java/com/template/controller/Wx.java

@@ -3,18 +3,27 @@ package com.template.controller;
 import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
-import com.baomidou.mybatisplus.extension.api.R;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.template.config.ScheduleConfig;
+import com.template.model.pojo.SmartNews;
+import com.template.services.SmartNewsService;
 import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+import java.util.Date;
+
 
 @Validated
 @RequiredArgsConstructor
 @RestController
-@RequestMapping("/api/getWxArticle")
+@RequestMapping("/0api/getWxArticle")
 public class Wx {
     private static final String APP_ID = "wxa46ef222053a1047"; // 换成自己的公众号的AppID
     private static final String APP_SECRET = "16f74a1265c314fd79fdf90670173467"; // 换成自己的公众号的AppSecret
@@ -22,29 +31,125 @@ public class Wx {
     private static final String ACCESS_TOKEN_URL = API_URL + "token?grant_type=client_credential&appid=" + APP_ID + "&secret=" + APP_SECRET; // 获取access_token
     private static final String ARTICLELiST_URL = API_URL + "freepublish/batchget?access_token="; //获取成功发布文章的列表
 
+    @Autowired
+    SmartNewsService smartNewsService;
+
+    @Resource
+    private ScheduleConfig scheduleConfig;
+
+    @Async
+    @Scheduled(cron = "0 0 14 * * ? ")
+    public void get() {
+        if (scheduleConfig.getIsOpen().equals("1")) {
+            getArticleList();
+        }
+
+    }
+
     /**
      * 获取微信公众号发布的文章,用于互联网+作展示
      */
     @GetMapping("/get")
-    public R<JSONArray> getArticleList() {
+    public void getArticleList() {
         // 获取ACCESS_TOKEN
         String accessToken = getAccessToken();
 
         // 获取文章列表信息
-        JSONArray articles = getArticles(accessToken);
-        JSONArray articleList = new JSONArray();
-
-        articles.forEach(item -> {
-            JSONObject wz = new JSONObject();
-            JSONObject article = (JSONObject) item;
-            JSONObject content = article.getJSONObject("content");
-            JSONObject newsItem = content.getJSONArray("news_item").getJSONObject(0);
-            wz.put("title", newsItem.getStr("title"));
-            wz.put("url", newsItem.getStr("url"));
-            wz.put("createTime", content.getStr("create_time"));
-            articleList.add(wz);
-        });
-        return R.ok(articleList);
+//        JSONArray articles = getArticles(accessToken);
+
+        int size = 20;
+
+        JSONObject params = new JSONObject();
+        params.put("offset", 0);
+        params.put("count", size);
+        String response = HttpUtil.post(ARTICLELiST_URL + accessToken, params.toString());
+        JSONObject json = new JSONObject(response);
+
+//          查看是否还有第二页
+        Integer itemCount = json.getInt("item_count");
+        Integer totalCount = json.getInt("total_count");
+        int page = totalCount % size == 0 ? (totalCount / size) : (totalCount / size) + 1;
+        for (int conut = 1; conut <= page; conut++) {
+            if (1 == conut) {
+                JSONArray items = json.getJSONArray("item");
+                for (Object item : items) {
+                    JSONObject article = (JSONObject) item;
+                    JSONObject content = article.getJSONObject("content");
+                    JSONArray newsItems = content.getJSONArray("news_item");
+                    for (int i = 0; i < newsItems.size(); i++) {
+                        JSONObject newsItem = newsItems.getJSONObject(i);
+                        SmartNews nw = new SmartNews();
+                        nw.setMediaId(article.getStr("article_id"));
+                        nw.setTitle(newsItem.getStr("title"));
+                        nw.setAuthor(newsItem.getStr("author"));
+                        nw.setDigest(newsItem.getStr("digest"));
+                        nw.setContent(newsItem.getStr("content"));
+                        nw.setContentSourceUrl(newsItem.getStr("content_source_url"));
+                        nw.setUrl(newsItem.getStr("url"));
+                        String thumbUrl = newsItem.getStr("thumb_url");
+                        nw.setFirstImg(thumbUrl);
+
+                        Long updateTime = article.getLong("update_time");
+                        updateTime = updateTime * 1000;
+                        nw.setDateTime(new Date(updateTime));
+//                        判断是否已添加
+                        SmartNews smartNews = smartNewsService.getMediaId(nw.getMediaId());
+                        if (ObjectUtils.isEmpty(smartNews)) {
+                            smartNewsService.save(nw);
+                        }else {
+                            return;
+                        }
+                    }
+                }
+            }
+            if (conut != 1) {
+                int start = (page - 1) * size;
+                JSONArray articles = getArticles(accessToken, start, size);
+                for (Object article : articles) {
+                    JSONObject article2 = (JSONObject) article;
+                    JSONObject content = article2.getJSONObject("content");
+                    JSONArray newsItems = content.getJSONArray("news_item");
+                    for (int j = 0; j < newsItems.size(); j++) {
+                        JSONObject newsItem = newsItems.getJSONObject(j);
+                        SmartNews nw = new SmartNews();
+                        nw.setMediaId(article2.getStr("article_id"));
+                        nw.setTitle(newsItem.getStr("title"));
+                        nw.setAuthor(newsItem.getStr("author"));
+                        nw.setDigest(newsItem.getStr("digest"));
+                        nw.setContent(newsItem.getStr("content"));
+                        nw.setContentSourceUrl(newsItem.getStr("content_source_url"));
+                        nw.setUrl(newsItem.getStr("url"));
+                        String thumbUrl = newsItem.getStr("thumb_url");
+                        nw.setFirstImg(thumbUrl);
+
+                        Long updateTime = article2.getLong("update_time");
+                        updateTime = updateTime * 1000;
+                        nw.setDateTime(new Date(updateTime));
+//                        判断是否已添加
+                        SmartNews smartNews = smartNewsService.getMediaId(nw.getMediaId());
+                        if (ObjectUtils.isEmpty(smartNews)) {
+                            smartNewsService.save(nw);
+                        }else {
+                            return;
+                        }
+                    }
+                }
+            }
+        }
+//        JSONArray articleList = new JSONArray();
+//        articles.forEach(item -> {
+//            JSONObject wz = new JSONObject();
+//            JSONObject article = (JSONObject) item;
+//            SmartNews smartNews = new SmartNews();
+//            JSONObject content = article.getJSONObject("content");
+//            JSONObject newsItem = content.getJSONArray("news_item").getJSONObject(0);
+//            wz.put("title", newsItem.getStr("title"));
+//            wz.put("url", newsItem.getStr("url"));
+//            wz.put("createTime", content.getStr("create_time"));
+//            articleList.add(wz);
+//        });
+
+
     }
 
     private static String getAccessToken() {
@@ -53,14 +158,15 @@ public class Wx {
         return json.getStr("access_token");
     }
 
-    private static JSONArray getArticles(String accessToken) {
+    private static JSONArray getArticles(String accessToken, int start, int size) {
         JSONObject params = new JSONObject();
-        params.put("offset", 0);
-        params.put("count", 20);
+        params.put("offset", start);
+        params.put("count", size);
         String response = HttpUtil.post(ARTICLELiST_URL + accessToken, params.toString());
         JSONObject json = new JSONObject(response);
-
         return json.getJSONArray("item");
     }
 
+
+
 }

+ 3 - 0
src/main/java/com/template/model/pojo/SmartNews.java

@@ -56,6 +56,9 @@ public class SmartNews implements Serializable {
     @ApiModelProperty(value = "封面图")
     private String firstImg;
 
+    @ApiModelProperty(value = "发表时间")
+    private Date dateTime;
+
     @ApiModelProperty(value = "创建时间")
     @TableField(fill = FieldFill.INSERT)
     private Date createTime;

+ 1 - 0
src/main/java/com/template/services/SmartNewsService.java

@@ -18,4 +18,5 @@ public interface SmartNewsService extends IService<SmartNews> {
     List<SmartNews> newsList();
 
 
+    SmartNews getMediaId(String mediaId);
 }

+ 9 - 1
src/main/java/com/template/services/impl/SmartNewsServiceImpl.java

@@ -29,10 +29,18 @@ public class SmartNewsServiceImpl extends ServiceImpl<SmartNewsMapper, SmartNews
     public List<SmartNews> newsList() {
         LambdaQueryWrapper<SmartNews> wrapper=new LambdaQueryWrapper<>();
         wrapper.last("limit 3")
-                        .orderByDesc(SmartNews::getCreateTime);
+                        .orderByDesc(SmartNews::getDateTime);
         List<SmartNews> list = this.list(wrapper);
         return list;
     }
 
+    @Override
+    public SmartNews getMediaId(String mediaId) {
+        LambdaQueryWrapper<SmartNews> wrapper=new LambdaQueryWrapper<>();
+        wrapper.eq(SmartNews::getMediaId,mediaId);
+        SmartNews smartNews = this.getOne(wrapper);
+        return smartNews;
+    }
+
 
 }