package io.loli.sc.server.storage;
import io.loli.sc.server.util.Base64Util;
import io.loli.sc.server.util.HttpsClientFactory;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.zip.CRC32;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;
public class WeiboMobileStorageUploader extends StorageUploader {
private final String cookie;
private static final String UPLOAD_URL = "http://picupload.service.weibo.com/interface/pic_upload.php?&mime=image%2Fjpeg&data=base64&url=0&markpos=1&logo=&nick=0&marks=1&app=miniblog";
private static final HttpClient client = HttpsClientFactory.getSimpleInstance();
private static ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
private WeiboMobileStorageUploader(String cookie) {
service.schedule(() -> {
try {
client.execute(this.buildGet("http://weibo.com", cookie));
} catch (Exception e) {
e.printStackTrace();
}
}, 5, TimeUnit.MINUTES);
this.cookie = cookie;
}
private static WeiboMobileStorageUploader instance;
public static synchronized WeiboMobileStorageUploader getInstance(String cookie) {
if (instance == null) {
instance = new WeiboMobileStorageUploader(cookie);
}
return instance;
}
@Override
public String upload(File file) {
return this.upload(file, null);
}
@Override
public String upload(File file, String contentType) {
String result = "";
try {
HttpPost post = this.buildPost(UPLOAD_URL, cookie);
List<NameValuePair> list = new ArrayList<>();
list.add(new BasicNameValuePair("b64_data", Base64Util.encode(file)));
post.setEntity(new UrlEncodedFormEntity(list, "UTF-8"));
HttpResponse response = client.execute(post);
result = EntityUtils.toString(response.getEntity());
@SuppressWarnings("resource")
Scanner scanner = new Scanner(result);
scanner.nextLine();
JSONObject json = new JSONObject(scanner.nextLine());
result = json.getJSONObject("data").getJSONObject("pics").getJSONObject("pic_1").getString("pid");
} catch (IOException | JSONException e) {
e.printStackTrace();
}
return pid2url(result, "large");
}
private static String pid2url(String pid, String type) {
String url = "";
if (StringUtils.isBlank(type))
type = "bmiddle";
if (pid.charAt(9) == 'w') {
long zone = (crc32(pid) & 3) + 1;
String ext = (pid.charAt(21) == 'g') ? "gif" : "jpg";
url = "http://ww" + zone + ".sinaimg.cn/" + type + "/" + pid + "." + ext;
}
return url;
}
private static long crc32(String str) {
CRC32 crc32 = new CRC32();
crc32.update(str.getBytes());
return Long.valueOf(crc32.getValue());
}
@Override
public void delete(String file) {
}
public HttpPost buildPost(String url, String cookie) {
RequestConfig config = RequestConfig.custom().setCookieSpec(CookieSpecs.BEST_MATCH).build();
HttpPost post = new HttpPost(url);
post.setConfig(config);
post.addHeader("Cookie", cookie);
post.addHeader("Host", "picupload.service.weibo.com");
return post;
}
public HttpGet buildGet(String url, String cookie) {
HttpGet get = new HttpGet(url);
get.addHeader("Cookie", cookie);
return get;
}
}