| | |
| | | import java.math.BigDecimal;
|
| | | import java.net.URLEncoder;
|
| | | import java.util.ArrayList;
|
| | | import java.util.Collections;
|
| | | import java.util.Calendar;
|
| | | import java.util.Iterator;
|
| | | import java.util.List;
|
| | |
|
| | | import javax.script.Invocable;
|
| | | import javax.script.ScriptEngine;
|
| | | import javax.script.ScriptEngineManager;
|
| | |
|
| | | import org.jsoup.Jsoup;
|
| | | import org.jsoup.nodes.Document;
|
| | | import org.jsoup.nodes.Element;
|
| | | import org.jsoup.select.Elements;
|
| | |
|
| | | import com.yeshi.fanli.dto.dataoke.DingDongQiangDTO;
|
| | | import com.yeshi.fanli.dto.dataoke.DingDongTime;
|
| | | import com.yeshi.fanli.entity.bus.clazz.GoodsClass;
|
| | | import com.yeshi.fanli.entity.taobao.TaoBaoCoupon;
|
| | | import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief;
|
| | | import com.yeshi.fanli.entity.taobao.TaoBaoHead;
|
| | | import com.yeshi.fanli.entity.taobao.TaoBaoSearchResult;
|
| | | import com.yeshi.fanli.entity.taobao.dataoke.DaTaoKeDetailV2;
|
| | | import com.yeshi.fanli.tag.PageEntity;
|
| | | import com.yeshi.fanli.util.MoneyBigDecimalUtil;
|
| | | import com.yeshi.fanli.util.StringUtil;
|
| | | import com.yeshi.fanli.util.TimeUtil;
|
| | |
|
| | | import net.sf.json.JSONArray;
|
| | | import net.sf.json.JSONObject;
|
| | |
| | | *
|
| | | */
|
| | | public class DaTaoKeUtil {
|
| | |
|
| | | static final String[] commonEmojis = new String[] { "😀", // 笑嘻嘻
|
| | | "😁", // 笑嘻嘻的脸,含笑的眼睛
|
| | | "😃", // 开口笑脸
|
| | | "😄", // 开口笑脸和微笑的眼睛
|
| | | "😆", // 开口笑紧闭的眼睛
|
| | | "😉", // 眨眼表情
|
| | | "😊", // 面带微笑的眼睛
|
| | | "😋", // 品尝美味食物表情
|
| | | "😎", // 太阳镜笑脸
|
| | | "😍", // 面带心形眼睛
|
| | | "😘", // 飞吻表情
|
| | | "😗", // 亲吻表情
|
| | | "😙", // 含笑亲吻表情
|
| | | "😚", // 闭眼亲吻表情
|
| | | "☺", // 笑脸
|
| | | "😇", // 光环笑脸
|
| | | "😐", // 中性面
|
| | | "😏", // 傻笑
|
| | | "😮", // 张着嘴
|
| | | "😛", // 吐舌头
|
| | | "😜", // 吐舌头,眨眼眼
|
| | | "😝", // 闭眼吐舌头
|
| | | "👅", // 舌头
|
| | | "👄", // 口
|
| | | "👀", // 眼睛
|
| | | "❤", // 心
|
| | | "💓", // 跳动的心
|
| | | "💕", // 两颗心
|
| | | "💗", // 成长的心
|
| | | "💝", // 扎丝带的心形礼盒
|
| | | "💞", // 旋转心
|
| | | "💐", // 花束
|
| | | "🌸", // 樱花
|
| | | "🌹", // 玫瑰
|
| | | "🌺", // 槿
|
| | | "🌻", // 向日葵
|
| | | "🌼", // 开花
|
| | | "🌷", // 郁金香
|
| | | "🍇", // 葡萄
|
| | | "🍈", // 瓜
|
| | | "🍉", // 西瓜
|
| | | "🍊", // 柑橘
|
| | | "🍋", // 柠檬
|
| | | "🍌", // 香蕉
|
| | | "🍍", // 菠萝
|
| | | "🍎", // 红苹果
|
| | | "🍏", // 青苹果
|
| | | "🍐", // 梨
|
| | | "🍑", // 桃子
|
| | | "🍒", // 樱桃
|
| | | "🍓", // 草莓
|
| | | "🌿", // 枝叶
|
| | | "🍀", // 四叶草
|
| | | "🍁", // 枫叶
|
| | | "🍂", // 落叶
|
| | | "🍃", // 叶子在风中飘落
|
| | | "☘", // 三叶草(酢浆草)
|
| | | "☀", // 太阳光芒四射
|
| | | "🌞", // 太阳人脸
|
| | | "⭐", // 星星,五角星
|
| | | "🌟",// 发光的星星
|
| | | };
|
| | |
|
| | | static final String[] timeEmojis = new String[] { "🕛", // 十二点
|
| | | "🕧", // 十二点半
|
| | | "🕐", // 一点钟
|
| | | "🕜", // 一点半
|
| | | "🕑", // 两点
|
| | | "🕝", // 两点半
|
| | | "🕒", // 三点钟
|
| | | "🕞", // 三点半
|
| | | "🕓", // 四点钟
|
| | | "🕟", // 四点半
|
| | | "🕔", // 五时
|
| | | "🕠", // 五点半
|
| | | "🕕", // 六点
|
| | | "🕡", // 六点半
|
| | | "🕖", // 七点
|
| | | "🕢", // 七点半
|
| | | "🕗", // 八点
|
| | | "🕣", // 八点半
|
| | | "🕘", // 九点钟
|
| | | "🕤", // 九点半
|
| | | "🕙", // 的十点
|
| | | "🕥", // 十点半
|
| | | "🕚", // 十一点
|
| | | "🕦",// 十一点半
|
| | | };
|
| | |
|
| | | public static List<GoodsClass> goodsClasses;
|
| | | static {
|
| | | goodsClasses = new ArrayList<>();
|
| | | goodsClasses.add(new GoodsClass(4L, "居家日用"));
|
| | | goodsClasses.add(new GoodsClass(6L, "美食"));
|
| | | goodsClasses.add(new GoodsClass(2L, "母婴"));
|
| | | goodsClasses.add(new GoodsClass(3L, "美妆"));
|
| | | goodsClasses.add(new GoodsClass(1L, "女装"));
|
| | | goodsClasses.add(new GoodsClass(8L, "数码家电"));
|
| | | goodsClasses.add(new GoodsClass(7L, "文娱车品"));
|
| | | goodsClasses.add(new GoodsClass(10L, "内衣"));
|
| | | goodsClasses.add(new GoodsClass(14L, "家装家纺"));
|
| | | goodsClasses.add(new GoodsClass(5L, "鞋品"));
|
| | | goodsClasses.add(new GoodsClass(9L, "男装"));
|
| | | goodsClasses.add(new GoodsClass(12L, "配饰"));
|
| | | goodsClasses.add(new GoodsClass(13L, "户外运动"));
|
| | | goodsClasses.add(new GoodsClass(11L, "箱包"));
|
| | | }
|
| | |
|
| | | public static final String HOST = "http://dataoke.yeshitv.com";
|
| | |
|
| | |
| | | int[] ids = new int[] { 1, 9, 10, 2, 3, 4, 5, 6, 7, 8 };
|
| | | for (int i = 0; i < names.length; i++) {
|
| | | GoodsClass gc = new GoodsClass();
|
| | | gc.setId(Long.parseLong(ids[i]+""));
|
| | | gc.setId(Long.parseLong(ids[i] + ""));
|
| | | gc.setName(names[i]);
|
| | | list.add(gc);
|
| | | }
|
| | |
| | | *
|
| | | * @return
|
| | | */
|
| | | public static List<TaoBaoGoodsBrief> getDingDongQiang() {
|
| | | List<TaoBaoGoodsBrief> goodsList = new ArrayList<>();
|
| | | public static List<DingDongQiangDTO> getDingDongQiang() {
|
| | | List<DingDongQiangDTO> list = new ArrayList<>();
|
| | | Document doc = null;
|
| | | try {
|
| | | Document doc = Jsoup.connect("http://dataoke.yeshitv.com/index.php?r=ddq/wap")
|
| | | .userAgent(
|
| | | "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Mobile Safari/537.36")
|
| | | .get();
|
| | | Elements els = doc.getElementsByTag("script");
|
| | | for (int i = 0; i < els.size(); i++) {
|
| | | Element item = els.get(i);
|
| | | if (item.toString().length() > 5000) {
|
| | | String html = item.html();
|
| | | int endIndex = html.indexOf("} ;") + 1;
|
| | | int startIndex = html.indexOf("data =");
|
| | | String json = html.substring(startIndex + "data =".length(), endIndex).trim();
|
| | | JSONObject root = JSONObject.fromObject(json);
|
| | | Iterator<String> keys = root.keySet().iterator();
|
| | | List<String> ids = new ArrayList<>();
|
| | | while (keys.hasNext()) {
|
| | | String key = keys.next();
|
| | | JSONArray array = root.optJSONObject(key).optJSONArray("list");
|
| | | for (int j = 0; j < array.size(); j++) {
|
| | | if (TimeUtil.convertToTimeTemp(array.optJSONObject(j).optString("paiqi"),
|
| | | "yyyy-MM-dd HH:mm:ss") < System.currentTimeMillis())
|
| | | ids.add(array.optJSONObject(j).optString("id"));
|
| | | doc = Jsoup.connect("http://www.dataoke.com/ddq").userAgent("").get();
|
| | | } catch (IOException e1) {
|
| | | e1.printStackTrace();
|
| | | }
|
| | | if (doc == null)
|
| | | return new ArrayList<>();
|
| | | Elements els = doc.getElementsByTag("script");
|
| | | for (int i = 0; i < els.size(); i++) {
|
| | | String content = els.get(i).html();
|
| | | if (content.indexOf("var dataDef") > -1) {
|
| | | ScriptEngineManager manager = new ScriptEngineManager();
|
| | | ScriptEngine engine = manager.getEngineByName("javascript");
|
| | | try {
|
| | | String js = "function getData(){return JSON.stringify(dataDef);} var test1='--';function test2(res){};"
|
| | | + content.replace("$(window).load", "test2").replace("window.location.search.", "test1.");
|
| | | engine.eval(js);
|
| | | if (engine instanceof Invocable) {
|
| | | Invocable in = (Invocable) engine;
|
| | | String data = in.invokeFunction("getData").toString();
|
| | | System.out.println(data);
|
| | | JSONObject dataJson = JSONObject.fromObject(data);
|
| | | for (Iterator<String> its = dataJson.keys(); its.hasNext();) {
|
| | | String key = its.next();
|
| | | JSONArray array = dataJson.optJSONArray(key);
|
| | | List<DaTaoKeDetailV2> detailList = new ArrayList<>();
|
| | | for (int n = 0; n < array.size(); n++) {
|
| | | DaTaoKeDetailV2 v2 = new DaTaoKeDetailV2();
|
| | | v2.setId(array.optJSONObject(n).optLong("id"));
|
| | | detailList.add(v2);
|
| | | }
|
| | | list.add(new DingDongQiangDTO(key, detailList));
|
| | | }
|
| | | }
|
| | | Collections.shuffle(ids);
|
| | | List<Long> goodsIdList = new ArrayList<>();
|
| | | ids.parallelStream().forEach(id -> {
|
| | | try {
|
| | | long auctionId = getAuctionId(Long.parseLong(id));
|
| | | goodsIdList.add(auctionId);
|
| | | } catch (Exception e) {
|
| | | }
|
| | | });
|
| | |
|
| | | goodsIdList.parallelStream().forEach(goods -> {
|
| | | try {
|
| | | TaoBaoGoodsBrief gds = TaoKeApiUtil.searchGoodsDetail(goods);
|
| | | if (gds != null)
|
| | | goodsList.add(gds);
|
| | | } catch (Exception e) {
|
| | |
|
| | | }
|
| | |
|
| | | });
|
| | |
|
| | | } catch (Exception e) {
|
| | | e.printStackTrace();
|
| | | }
|
| | |
|
| | | }
|
| | |
|
| | | } catch (IOException e) {
|
| | | e.printStackTrace();
|
| | | }
|
| | |
|
| | | return goodsList;
|
| | |
|
| | | return list;
|
| | | }
|
| | |
|
| | | //
|
| | |
|
| | | public static List<TaoBaoCoupon> getRecommendCouple() {
|
| | | List<TaoBaoCoupon> couponList = new ArrayList<>();
|
| | |
| | | return couponList;
|
| | | }
|
| | |
|
| | | private static List<DaTaoKeDetailV2> parseCurrent(String url) {
|
| | |
|
| | | List<DaTaoKeDetailV2> list = new ArrayList<>();
|
| | | try {
|
| | | Document doc = Jsoup.connect(url)
|
| | | .userAgent(
|
| | | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36")
|
| | | .get();
|
| | | Elements items = doc.getElementsByClass("goods-list").get(0).getElementsByClass("goods-item");
|
| | | for (int i = 0; i < items.size(); i++) {
|
| | | Long id = Long.parseLong(items.get(i).attr("id").replace("goods-items_", ""));
|
| | | String currentSale = items.get(i).getElementsByClass("goods-item-content").get(0)
|
| | | .getElementsByClass("goods-info").get(0).getElementsByClass("tg-show").get(0)
|
| | | .getElementsByTag("b").get(0).text();
|
| | |
|
| | | System.out.println(id + "-" + currentSale);
|
| | | DaTaoKeDetailV2 detail = new DaTaoKeDetailV2();
|
| | | detail.setId(id);
|
| | | detail.setMonthSales(Integer.parseInt(currentSale));
|
| | | list.add(detail);
|
| | |
|
| | | }
|
| | |
|
| | | } catch (IOException e) {
|
| | | e.printStackTrace();
|
| | | }
|
| | |
|
| | | // TODO 需要返回值
|
| | | return list;
|
| | | }
|
| | |
|
| | | // 获取实时榜单
|
| | | /**
|
| | | * 获取实时销量榜
|
| | | * |
| | | * @param cid
|
| | | * @return
|
| | | */
|
| | | public static List<DaTaoKeDetailV2> getCurrentSalesRank(Integer cid) {
|
| | | String url = null;
|
| | | if (cid == null)
|
| | | url = "http://www.dataoke.com/top_sell";
|
| | | else
|
| | | url = String.format("http://www.dataoke.com/top_sell?cid=%s&type=1", cid);
|
| | | return parseCurrent(url);
|
| | | }
|
| | |
|
| | | /**
|
| | | * 全天销量榜
|
| | | * |
| | | * @param cid
|
| | | * @return
|
| | | */
|
| | | public static List<DaTaoKeDetailV2> getCurrentDaySalesRank(Integer cid) {
|
| | | String url = null;
|
| | | if (cid == null)
|
| | | url = "http://www.dataoke.com/top_all";
|
| | | else
|
| | | url = String.format("http://www.dataoke.com/top_all?cid=%s", cid);
|
| | | return parseCurrent(url);
|
| | | }
|
| | |
|
| | | /**
|
| | | * 获取热推榜
|
| | | * |
| | | * @param cid
|
| | | * @return
|
| | | */
|
| | | public static List<DaTaoKeDetailV2> getCurrentHotSalesRank() {
|
| | | String url = "http://www.dataoke.com/top_tui";
|
| | | return parseCurrent(url);
|
| | | }
|
| | |
|
| | | private static String getRandomCommonEmoji() {
|
| | | return commonEmojis[(int) (Math.random() * commonEmojis.length)];
|
| | | }
|
| | |
|
| | | public static String getDesc(DaTaoKeDetailV2 detail) {
|
| | |
|
| | | // 标题+券后价+包邮+描述
|
| | | String desc = detail.getDtitle();
|
| | | desc += "\n";
|
| | | desc += String.format("券后价%s【%s元】包邮秒杀 ", Math.random() > 0.5 ? "💰" : "",
|
| | | MoneyBigDecimalUtil.getWithNoZera(detail.getActualPrice() ).toString())
|
| | | + (Math.random() > 0.5 ? getRandomCommonEmoji() : "");
|
| | | desc += "\n";
|
| | | // desc += detail.getIntroduce();
|
| | | String introduce = detail.getDesc().replace(",", ",").replace("。", ",").replace("!", ",").replace(",",
|
| | | ",");
|
| | | introduce = introduce.replace(",,,", ",").replace(",,", ",");
|
| | |
|
| | | String[] sts = introduce.split(",");
|
| | | introduce = "";
|
| | | for (int i = 0; i < sts.length; i++) {
|
| | | if (i % 2 == 1) {// 需要换行
|
| | | introduce += sts[i] + (Math.random() > 0.5 ? getRandomCommonEmoji() : i == sts.length - 1 ? "" : ",")
|
| | | + "\n";
|
| | | } else
|
| | | introduce += sts[i] + (Math.random() > 0.5 ? getRandomCommonEmoji() : i == sts.length - 1 ? "" : ",");
|
| | | }
|
| | | desc += introduce;
|
| | | return desc;
|
| | | }
|
| | |
|
| | |
|
| | | public static TaoBaoGoodsBrief filterTaoBaoGoods(TaoBaoGoodsBrief goods, DaTaoKeDetailV2 detail) {
|
| | | if (detail != null && goods != null) {
|
| | | // 重新设置标题与券价格
|
| | | goods.setTitle(detail.getDtitle());
|
| | | if (!StringUtil.isNullOrEmpty(detail.getMainPic()))
|
| | | goods.setPictUrlWhite(detail.getMainPic());
|
| | | }
|
| | | return goods;
|
| | | }
|
| | |
|
| | | public static DaTaoKeDetailV2 filterDaTaoKe(TaoBaoGoodsBrief goods, DaTaoKeDetailV2 detail) {
|
| | | if (goods != null) {
|
| | | BigDecimal price = TaoBaoUtil.getAfterUseCouplePrice(goods);
|
| | | detail.setOriginalPrice(goods.getZkPrice());
|
| | | detail.setActualPrice(price);
|
| | | if (goods.getCouponStartFee() != null)
|
| | | detail.setCouponConditions(goods.getCouponStartFee() + "");
|
| | | detail.setCouponPrice(goods.getCouponAmount());
|
| | | return detail;
|
| | | }
|
| | |
|
| | | return detail;
|
| | | }
|
| | |
|
| | | public static List<DingDongTime> getDingDongQiangTime(Calendar nowDate) {
|
| | |
|
| | | // 获取当前的小时数
|
| | | DingDongTime[] times = new DingDongTime[] { new DingDongTime("0", "00:00"), new DingDongTime("8", "08:00"),
|
| | | new DingDongTime("10", "10:00"), new DingDongTime("13", "13:00"), new DingDongTime("15", "15:00"),
|
| | | new DingDongTime("17", "17:00"), new DingDongTime("19", "19:00"), new DingDongTime("20", "20:00"),
|
| | | new DingDongTime("21", "21:00") };
|
| | | Calendar preDate = Calendar.getInstance();
|
| | | preDate.setTimeInMillis(nowDate.getTimeInMillis() - 24 * 60 * 60 * 1000L);
|
| | |
|
| | | Calendar nextDate = Calendar.getInstance();
|
| | | nextDate.setTimeInMillis(nowDate.getTimeInMillis() + 24 * 60 * 60 * 1000L);
|
| | |
|
| | | String preDay = (preDate.get(Calendar.DAY_OF_MONTH) + "").length() < 2
|
| | | ? "0" + preDate.get(Calendar.DAY_OF_MONTH) : preDate.get(Calendar.DAY_OF_MONTH) + "";
|
| | | String nextDay = (nextDate.get(Calendar.DAY_OF_MONTH) + "").length() < 2
|
| | | ? "0" + nextDate.get(Calendar.DAY_OF_MONTH) : nextDate.get(Calendar.DAY_OF_MONTH) + "";
|
| | | String nowDay = (nowDate.get(Calendar.DAY_OF_MONTH) + "").length() < 2
|
| | | ? "0" + nowDate.get(Calendar.DAY_OF_MONTH) : nowDate.get(Calendar.DAY_OF_MONTH) + "";
|
| | |
|
| | | int hour = nowDate.get(Calendar.HOUR_OF_DAY);
|
| | | int pos = times.length - 1;
|
| | | for (int i = 0; i < times.length - 1; i++) {
|
| | | if (hour >= Integer.parseInt(times[i].getKey()) && hour < Integer.parseInt(times[i + 1].getKey())) {
|
| | | pos = i;
|
| | | break;
|
| | | }
|
| | | }
|
| | |
|
| | | List<DingDongTime> list = new ArrayList<>();
|
| | |
|
| | | // 获取当前时间之前的5个数据
|
| | | for (int i = 5; i >= 0; i--) {
|
| | | int p = pos - i < 0 ? (times.length + pos - i) : pos - i;
|
| | | DingDongTime itemData = new DingDongTime(times[p].getKey(), times[p].getValue(), -1);
|
| | | if (pos - i < 0)
|
| | | itemData.setTime(
|
| | | preDay + "" + (itemData.getKey().length() < 2 ? ("0" + itemData.getKey()) : itemData.getKey()));
|
| | | else
|
| | | itemData.setTime(
|
| | | nowDay + "" + (itemData.getKey().length() < 2 ? ("0" + itemData.getKey()) : itemData.getKey()));
|
| | |
|
| | | if (pos == p)
|
| | | itemData.setState(0);
|
| | | list.add(itemData);
|
| | | }
|
| | |
|
| | | // 向后添加剩下的
|
| | | if (pos + 1 < times.length)
|
| | | for (int i = pos + 1; i < times.length; i++) {
|
| | | DingDongTime itemData = new DingDongTime(times[i].getKey(), times[i].getValue(), 1);
|
| | | itemData.setTime(
|
| | | nowDay + "" + (itemData.getKey().length() < 2 ? ("0" + itemData.getKey()) : itemData.getKey()));
|
| | | list.add(itemData);
|
| | | }
|
| | |
|
| | | if (times.length - (pos + 1) < 2) {
|
| | | DingDongTime itemData = new DingDongTime(times[0].getKey(), times[0].getValue(), 1);
|
| | | itemData.setTime(
|
| | | nextDay + "" + (itemData.getKey().length() < 2 ? ("0" + itemData.getKey()) : itemData.getKey()));
|
| | | list.add(itemData);
|
| | | }
|
| | | return list;
|
| | | }
|
| | |
|
| | | }
|