|
|
|
@ -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)+"帧")); |
|
|
|
|
} |
|
|
|
|
//添加完所有帧开始合成
|
|
|
|
|