diff --git a/core/pom.xml b/core/pom.xml index 4ec5b84..a451dc7 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -99,6 +99,12 @@ jsoup ${jsoup.version} + + + ar.com.hjg + pngj + 2.1.0 + core diff --git a/core/src/main/java/org/pqh/gif/PixivUtil.java b/core/src/main/java/org/pqh/gif/PixivUtil.java index 1fcb967..33c6e6d 100644 --- a/core/src/main/java/org/pqh/gif/PixivUtil.java +++ b/core/src/main/java/org/pqh/gif/PixivUtil.java @@ -6,10 +6,12 @@ import org.apache.commons.io.FileUtils; import org.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; +import org.jsoup.select.Elements; import org.pqh.core.util.LogManger; import org.pqh.gif.gifmaker.AnimatedGifEncoder; import javax.imageio.ImageIO; +import javax.net.ssl.HttpsURLConnection; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; @@ -26,67 +28,84 @@ import static org.pqh.gif.PixivUtil.Image.small; */ public class PixivUtil implements LogManger{ private static final String host="http://i4.pixiv.net"; + private static final String baseUrl="https://www.pixiv.net/member_illust.php?mode=medium&illust_id="; private static final int buffer=10240; - public static void downLoadImg(String imageUrl){ + private static String phpsessid; + + + /** + * 合成动图 + * @param illust_id + */ + public static void downLoadImg(int illust_id,String phpsessid){ InputStream is = null; FileOutputStream fos = null; BufferedOutputStream bos = null; ZipFile zipFile = null; + String imageUrl=baseUrl+illust_id; try { log.info("图片链接:"+imageUrl); - Document document=Jsoup.connect(imageUrl).header("Cookie","PHPSESSID=11866657_32c3f92f0e2bf8b1607dabc04eecf787;").get(); - String script=document.select("#wrapper>script").html(); - int start=script.indexOf(small.keyword); - int end=script.indexOf(big.keyword); - if(start>-1&&end>-1) { - String json = script.substring(start, end).replaceAll(".*=", ""); - ObjectMapper objectMapper = new ObjectMapper(); - JsonNode node = objectMapper.readTree(json); - String src=node.get("src").asText().replace(small.size,big.size); - log.info("获取到图包地址:"+src); - Connection connection= Jsoup.connect(src).header("referer",host).ignoreContentType(true); - connection.request().maxBodySize(1024*1024*1024); - Connection.Response response=connection.execute(); - log.info("图包体积:"+response.header("content-length")); - String zipName=src.substring(src.lastIndexOf("/")+1); - File file=new File("tmp/images/"+zipName); - FileUtils.writeByteArrayToFile(file,response.bodyAsBytes()); - log.info("图包下载到:"+file.getAbsolutePath()); - zipFile=new ZipFile(file); - Enumeration entrys=zipFile.entries(); - - log.info("开始解压"); - - long a= System.currentTimeMillis(); - String path=file.getAbsolutePath().replace(".zip",""); - while(entrys.hasMoreElements()){ - ZipEntry zipEntry= (ZipEntry) entrys.nextElement(); - is= zipFile.getInputStream(zipEntry); - String imgPath=path+"\\"+zipEntry.getName(); - File imgFile=new File(imgPath); - FileUtils.forceMkdirParent(imgFile); - log.info("开始解压图片到:"+imgFile.getAbsolutePath()); - byte buf[]=new byte[buffer]; - fos=new FileOutputStream(imgFile); - bos=new BufferedOutputStream(fos,buffer); - int count; - while((count=is.read(buf))>-1){ - bos.write(buf,0,count); + Connection.Response response=Jsoup.connect(imageUrl).cookie("PHPSESSID",phpsessid).execute(); + if(response.statusCode()== HttpsURLConnection.HTTP_OK) { + Document document=response.parse(); + Elements imgEle=document.select("img.original-image"); + if(imgEle.size()==1){ + String src=imgEle.first().attr("data-src"); + downLoadImg(src); + return; + } + + String script = document.select("#wrapper>script").html(); + int start = script.indexOf(small.keyword); + int end = script.indexOf(big.keyword); + if (start > -1 && end > -1) { + String json = script.substring(start,end).replaceAll(".*=",""); + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode node = objectMapper.readTree(json); + String src = node.get("src").asText().replace(small.size, big.size); + log.info("获取到图包地址:" + src); + + File file=downLoadImg(src); + zipFile = new ZipFile(file); + Enumeration entrys = zipFile.entries(); + + log.info("开始解压"); + + long a = System.currentTimeMillis(); + String path = file.getAbsolutePath().replace(".zip", ""); + while (entrys.hasMoreElements()) { + ZipEntry zipEntry = (ZipEntry) entrys.nextElement(); + is = zipFile.getInputStream(zipEntry); + String imgPath = path + "\\" + zipEntry.getName(); + File imgFile = new File(imgPath); + FileUtils.forceMkdirParent(imgFile); + log.info("开始解压图片到:" + imgFile.getAbsolutePath()); + byte buf[] = new byte[buffer]; + fos = new FileOutputStream(imgFile); + bos = new BufferedOutputStream(fos, buffer); + int count; + while ((count = is.read(buf)) > -1) { + bos.write(buf, 0, count); + } + } - } + int length = new File(path).listFiles().length; + log.info(length + "张图片解压完毕,耗时:" + (System.currentTimeMillis() - a) + "ms"); - int length=new File(path).listFiles().length; - log.info(length+"张图片解压完毕,耗时:"+(System.currentTimeMillis()-a)+"ms"); + if (length > 0) { + jpgToGif(document.title().split("/")[0].replaceAll("[「,」]", ""), path, node.get("frames")); + } - if(length>0){ - jpgToGif(document.title().split("/")[0].replaceAll("[「,」]",""),path,node.get("frames")); + } else { + log.error("图包地址获取失败"); } - + }else if(response.statusCode()==HttpsURLConnection.HTTP_NOT_FOUND){ + log.info("图片链接:"+imageUrl+"不存在"); }else{ - log.error("图包地址获取失败"); + log.error("图片链接:"+imageUrl+"访问异常"); } } catch (IOException e) { e.printStackTrace(); @@ -111,6 +130,18 @@ public class PixivUtil implements LogManger{ } + public static File downLoadImg(String src) throws IOException { + Connection connection = Jsoup.connect(src).header("referer", host).ignoreContentType(true); + connection.request().maxBodySize(1024 * 1024 * 1024); + Connection.Response response = connection.execute(); + log.info("图片资源体积:" + response.header("content-length")); + String zipName = src.substring(src.lastIndexOf("/") + 1); + File file = new File("tmp/images/" + zipName); + FileUtils.writeByteArrayToFile(file, response.bodyAsBytes()); + log.info("图片资源下载到:" + file.getAbsolutePath()); + return file; + } + /** * jpg合成gif * @param gifName gif文件名 @@ -118,6 +149,7 @@ public class PixivUtil implements LogManger{ */ public static void jpgToGif(String gifName,String jpgPath,JsonNode node){ AnimatedGifEncoder animatedGifEncoder=new AnimatedGifEncoder(); + OutputStream outputStream= null; InputStream inputStream=null; File file=new File(jpgPath); @@ -142,6 +174,7 @@ public class PixivUtil implements LogManger{ //把帧添加进去合成 animatedGifEncoder.addFrame(image); animatedGifEncoder.setDelay(delay); + log.info(gifName+":正在合成第"+((index+1)+"帧")); } //添加完所有帧开始合成