Java通過(guò)URL獲取公眾號(hào)文章生成HTML的方法
說(shuō)明:通過(guò)公眾號(hào)URL獲取的內(nèi)容,文字可以正常顯示,但是圖片存在跨域訪問(wèn)的問(wèn)題,微信不允許跨域訪問(wèn)公眾號(hào)圖片,所以需要將公眾號(hào)圖片從存入本地后,再上傳至OSS,然后把HTML中的圖片全部替換為自己的OSS地址就可以了
這里就需要在后臺(tái)對(duì)HTML進(jìn)行DOM的解析,需要用的Jsoup
<dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>2.2.3</version> </dependency> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.9.2</version> </dependency>
controller
package com.iueang.controller;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.iueang.util.DownLoadImg;
import com.iueang.util.GetBody;
import com.iueang.util.OssUtil2;
import com.iueang.util.UrlUtil;
@Controller
public class TestUrl {
@RequestMapping("tohtml")
public String tohtml() {
return "html/index.html";
}
@RequestMapping("getHtml")
@ResponseBody
public Map<String,String> getHtml(String url){
//獲取url文章生成文本
String html = UrlUtil.getAccess(url);
String reg = "<html>(.*?)</html>";
String head=GetBody.getSubUtilSimple(html, reg);
String HTTPHOST="http://yueang2.oss-cn-qingdao.aliyuncs.com/testimg/";
String newsBody=head;
Document doc = Jsoup.parse(newsBody);
Elements pngs = doc.select("img[data-src]");
System.out.println(pngs);
for (Element element : pngs) {
//獲取圖片地址
String imgUrl = element.attr("data-src");
//下載圖片到本地
String filename=DownLoadImg.downloadPicture(imgUrl);
File file =new File("D:\\m2\\"+filename);
//上傳至oss
Boolean flag = OssUtil2.uploadFileToOss(file, "testimg/"+filename);
if(flag) {
file.delete();
}
String newsrc =HTTPHOST + filename;
element.attr("src", newsrc);
}
newsBody = doc.toString();
System.out.println(newsBody);
Map<String,String> map=new HashMap<String, String>();
map.put("resultHtml", newsBody);
return map;
}
}
util工具類(lèi)
GetBody類(lèi)
package com.iueang.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class GetBody {
public static String getSubUtilSimple(String html, String reg) {
Pattern pattern = Pattern.compile(reg);// 匹配的模式
Matcher m = pattern.matcher(html);
while(m.find()){
return m.group(1);
}
return "";
}
}
OssUtil類(lèi)
package com.iueang.util;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.ObjectMetadata;
public class OssUtil2 {
//以下幾個(gè)參數(shù)值必填,參考文章最后文檔
static String endpoint = "http://oss-cn-qingdao.aliyuncs.com";
static String accessKeyId = "oss獲取";
static String accessKeySecert = "oss獲取";
static String bucketName = "yueang2";
/**
* 上傳單個(gè)文件到OSS
* @param file 要上傳的文件File對(duì)象
* @param objName 上傳后的文件名,包含文件夾,比如 game/game/test.txt
* @return
*/
public static boolean uploadFileToOss(File file, String objName) {
try {
OSSClient ossClient = null;
try {
ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecert);
}catch (Exception e){
e.printStackTrace();
}
ObjectMetadata meta = new ObjectMetadata();
ossClient.putObject(bucketName, objName, file, meta);
ossClient.shutdown();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
}
DownLoadImg類(lèi)
package com.iueang.util;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.UUID;
import sun.misc.BASE64Encoder;
public class DownLoadImg {
public static String downloadPicture(String urlList) {
String filename="iueang"+UUID.randomUUID().toString()+".png";
String path="D:/m2/"+filename;
URL url = null;
try {
url = new URL(urlList);
DataInputStream dataInputStream = new DataInputStream(url.openStream());
FileOutputStream fileOutputStream = new FileOutputStream(new File(path));
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = dataInputStream.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
BASE64Encoder encoder = new BASE64Encoder();
String encode = encoder.encode(buffer);
fileOutputStream.write(output.toByteArray());
dataInputStream.close();
fileOutputStream.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Download返回的filname="+filename);
return filename;
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java經(jīng)典問(wèn)題:連個(gè)字符串互為回環(huán)變位
連個(gè)字符串互為回環(huán)變位經(jīng)常出現(xiàn)在java程序員面試中,這個(gè)是考驗(yàn)程序員的解題思路和方法的最經(jīng)典的一題,小編為大家詳細(xì)分析一下,一起來(lái)學(xué)習(xí)吧。2017-11-11
Java遞歸簡(jiǎn)單實(shí)現(xiàn)n的階乘
這篇文章主要介紹了Java遞歸簡(jiǎn)單實(shí)現(xiàn)n的階乘,遞歸(recursion)就是子程序(或函數(shù))直接調(diào)用自己或通過(guò)一系列調(diào)用語(yǔ)句間接調(diào)用自己,是一種描述問(wèn)題和解決問(wèn)題的基本方法,下面我們舉一個(gè)小小的例子詳情了解一下,需要的朋友可以參考下2021-12-12
SpringBoot框架DataSource多數(shù)據(jù)源配置方式
這篇文章主要介紹了SpringBoot框架DataSource多數(shù)據(jù)源配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Java編程實(shí)現(xiàn)統(tǒng)計(jì)一個(gè)字符串中各個(gè)字符出現(xiàn)次數(shù)的方法
這篇文章主要介紹了Java編程實(shí)現(xiàn)統(tǒng)計(jì)一個(gè)字符串中各個(gè)字符出現(xiàn)次數(shù)的方法,涉及java針對(duì)字符串的遍歷、判斷、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下2017-12-12
Mybatis通過(guò)Spring完成代理類(lèi)注入的流程分析
這篇文章主要介紹了Mybatis通過(guò)Spring完成代理類(lèi)注入的流程分析,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
MyBatis-Plus 修改和添加自動(dòng)填充時(shí)間方式
這篇文章主要介紹了MyBatis-Plus 修改和添加自動(dòng)填充時(shí)間方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
java?io文件操作從文件讀取數(shù)據(jù)的六種方法
這篇文章主要為大家介紹了java?io操作總結(jié)從文件讀取數(shù)據(jù)的六種方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-03-03

