Java通過URL獲取公眾號文章生成HTML的方法
說明:通過公眾號URL獲取的內(nèi)容,文字可以正常顯示,但是圖片存在跨域訪問的問題,微信不允許跨域訪問公眾號圖片,所以需要將公眾號圖片從存入本地后,再上傳至OSS,然后把HTML中的圖片全部替換為自己的OSS地址就可以了
這里就需要在后臺對HTML進行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工具類
GetBody類
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類
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 {
//以下幾個參數(shù)值必填,參考文章最后文檔
static String endpoint = "http://oss-cn-qingdao.aliyuncs.com";
static String accessKeyId = "oss獲取";
static String accessKeySecert = "oss獲取";
static String bucketName = "yueang2";
/**
* 上傳單個文件到OSS
* @param file 要上傳的文件File對象
* @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類
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;
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java經(jīng)典問題:連個字符串互為回環(huán)變位
連個字符串互為回環(huán)變位經(jīng)常出現(xiàn)在java程序員面試中,這個是考驗程序員的解題思路和方法的最經(jīng)典的一題,小編為大家詳細分析一下,一起來學(xué)習(xí)吧。2017-11-11
SpringBoot框架DataSource多數(shù)據(jù)源配置方式
這篇文章主要介紹了SpringBoot框架DataSource多數(shù)據(jù)源配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
Java編程實現(xiàn)統(tǒng)計一個字符串中各個字符出現(xiàn)次數(shù)的方法
這篇文章主要介紹了Java編程實現(xiàn)統(tǒng)計一個字符串中各個字符出現(xiàn)次數(shù)的方法,涉及java針對字符串的遍歷、判斷、運算等相關(guān)操作技巧,需要的朋友可以參考下2017-12-12
java?io文件操作從文件讀取數(shù)據(jù)的六種方法
這篇文章主要為大家介紹了java?io操作總結(jié)從文件讀取數(shù)據(jù)的六種方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2022-03-03

