package com.github.catvod.api; import com.github.catvod.bean.tianyi.Cache; import com.github.catvod.bean.tianyi.User; import com.github.catvod.crawler.SpiderDebug; import com.github.catvod.utils.Json; import com.github.catvod.utils.Path; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import org.apache.commons.lang3.StringUtils; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import okhttp3.HttpUrl; public class SimpleCookieJar { private Map> cookieStore = new HashMap<>(); private final Cache cache; public Map> getCookieStore() { return cookieStore; } public void setCookieStore(Map> cookieStore) { this.cookieStore = cookieStore; } public SimpleCookieJar() { this.cache = Cache.objectFrom(Path.read(getCache())); String cookieStr = cache.getUser().getCookie(); if (StringUtils.isNoneBlank(cookieStr)) { JsonObject cookieJson = Json.safeObject(cookieStr); setGlobalCookie(cookieJson); } } public File getCache() { return Path.tv("tianyi"); } public void saveFromResponse(String url, List cookies) { HttpUrl httpUrl = HttpUrl.parse(url); SpiderDebug.log(" saveFromResponse url: " + url); SpiderDebug.log(" saveFromResponse cookie : " + Json.toJson(cookies)); // 创建可修改的 Cookie 列表副本 Map oldCookies = cookieStore.get(httpUrl.host()) != null ? cookieStore.get(httpUrl.host()) : new HashMap<>(); // 更新 Cookie for (String newCookie : cookies) { String[] split = newCookie.split(";"); String cookieItem = split[0].trim(); int equalsIndex = cookieItem.indexOf('='); if (equalsIndex > 0) { String key = cookieItem.substring(0, equalsIndex); String value = equalsIndex < cookieItem.length() - 1 ? cookieItem.substring(equalsIndex + 1) : ""; oldCookies.put(key, value); } } cookieStore.put(httpUrl.host(), oldCookies); cache.setTianyiUser(User.objectFrom(Json.toJson(cookieStore))); SpiderDebug.log(" cookieStore now: " + Json.toJson(cookieStore)); } public void setGlobalCookie(JsonObject jsonObject) { for (Map.Entry entry : jsonObject.entrySet()) { String key = entry.getKey(); JsonObject value = entry.getValue().getAsJsonObject(); Map cookiesForHost = new HashMap<>(); for (String k : value.keySet()) { String cookieobj = value.get(k).getAsString(); cookiesForHost.put(k, cookieobj); } cookieStore.put(key, cookiesForHost); } } /** * 根据请求URl获取cookie * * @param url * @return */ public String loadForRequest(String url) { HttpUrl httpUrl = HttpUrl.parse(url); Map cookieMap = cookieStore.get(httpUrl.host()); List cookieList = new ArrayList<>(); if (cookieMap != null && cookieMap.size() > 0) { for (String s : cookieMap.keySet()) { cookieList.add(s + "=" + cookieMap.get(s)); } } String cookie = StringUtils.join(cookieList, ";"); SpiderDebug.log(" loadForRequest url:" + url); SpiderDebug.log(" loadForRequest cookie:" + cookie); return cookie; } }