package com.yutou.qqbot.models.Animal; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.yutou.qqbot.QQBotManager; import com.yutou.qqbot.models.Model; import com.yutou.qqbot.utlis.*; import net.mamoe.mirai.event.events.MessageEvent; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import java.util.Calendar; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; public class TurnipProphet extends Model { public static class TurnipData { public static final String MODEL = "趋势:"; public static final String PR = "概率:"; public static final String MIX = "保底价:"; public static final String MAX = "最高价:"; public static final String DAY = "最高日:"; public static final String MONDAY_UP = "周一上"; public static final String MONDAY_DOWN = "周一下"; public static final String TUESDAY_UP = "周二上"; public static final String TUESDAY_DOWN = "周二下"; public static final String WEDNESDAY_UP = "周三上"; public static final String WEDNESDAY_DOWN = "周三下"; public static final String THURSDAY_UP = "周四上"; public static final String THURSDAY_DOWN = "周四下"; public static final String FRIDAY_UP = "周五上"; public static final String FRIDAY_DOWN = "周五下"; public static final String SATURDAY_UP = "周六上"; public static final String SATURDAY_DOWN = "周六下"; } static int nowTime = -1; @Override public boolean isUserPublic() { return true; } @Override public String[] getUsePowers() { return new String[]{ QQFromCommands.TURNIP_PROPHET }; } @Override public String getModelName() { return "大头菜"; } Long user, sendQQ; @Override public void onMessage(Long qq, MessageEvent event, boolean isGroup) { super.onMessage(qq, event, isGroup); user = qq; sendQQ = qq; if (isGroup) { if (!event.getMessage().serializeToMiraiCode().contains("[mirai:at:2476945931]")) { return; } user = event.getSource().getFromId(); } int money = -1; try { if (isGroup) { msg = msg.replace("@2476945931", ""); } money = Integer.parseInt(msg.trim()); } catch (Exception e) { if (msg.equals(QQFromCommands.TURNIP_PROPHET)) { showData(); } return; } setData(money); } private void showData() { String redisKey = user + "_turnip"; String data = RedisTools.get(redisKey); if (StringUtils.isEmpty(data)) { QQBotManager.getInstance().sendMessage(sendQQ, getMessage("没有本周数据,无法预测")); return; } JSONObject json = JSONObject.parseObject(data); String prices = json.getString("prices"); String pattern = null; if (json.containsKey("old_pattern")) { try { pattern = json.getString("old_pattern"); } catch (Exception ignored) { } } if (pattern != null) { switch (pattern) { case "波动型" -> pattern = "0"; case "大幅上涨(三期型)" -> pattern = "1"; case "递减型" -> pattern = "2"; case "小幅上涨(四期型)" -> pattern = "3"; } } Map map = null; try { map = openTurnip(prices, pattern); sendQQ(map, prices, pattern); } catch (Exception e) { e.printStackTrace(); showData(); } } private void setData(int money) { String redisKey = user + "_turnip"; String data = RedisTools.get(redisKey); String pattern = null; JSONObject json; JSONArray array; if (StringUtils.isEmpty(data) || getDay() == 0) { array = new JSONArray(); json = new JSONObject(); if (getDay() == 0 && !StringUtils.isEmpty(data)) { json = JSONObject.parseObject(data); } array.add(-1); array.add(-1); array.add(-1); array.add(-1); array.add(-1); array.add(-1); array.add(-1); array.add(-1); array.add(-1); array.add(-1); array.add(-1); array.add(-1); array.add(-1); } else { json = JSONObject.parseObject(data); array = json.getJSONArray("turnip"); } if (array.getInteger(0) == -1 && getDay() != 0) { QQBotManager.getInstance().sendMessage(sendQQ, getMessage("没有周日买入信息,本周不收录 :(")); return; } if (json.containsKey("old_pattern")) { try { pattern = json.getString("old_pattern"); } catch (Exception ignored) { } } if (getDay() == 0) { if (json.containsKey("pattern")) { if (!json.containsKey("tmp_pattern")) { json.put("old_pattern", json.getString("pattern")); pattern = json.getString("pattern"); } else { pattern = json.getString("old_pattern"); } json.put("tmp_pattern", json.getString("pattern")); } array.set(0, money); } else { json.remove("tmp_pattern"); if (getTime() < 12) { array.set(getDay() * 2 - 1, money); } else { array.set(getDay() * 2, money); } } json.put("turnip", array); StringBuilder builder = new StringBuilder(); for (Object o : array) { builder.append(o).append("."); } builder.append(".".repeat(Math.max(0, (12 - array.size())))); String prices = builder.toString(); if (prices.split("\\.").length == 13) { prices = prices.substring(0, prices.length() - 1); } prices = prices.replace("-1", ""); json.put("prices", prices); try { if (pattern != null) { switch (pattern) { case "波动型" -> pattern = "0"; case "大幅上涨(三期型)" -> pattern = "1"; case "递减型" -> pattern = "2"; case "小幅上涨(四期型)" -> pattern = "3"; } } QQBotManager.getInstance().sendMessage(sendQQ, getMessage("已记录,正在预测本周走势...")); Map map = openTurnip(prices, pattern); if (map == null) { map = openTurnip(prices, pattern); } String tmp_pattern = sendQQ(map, prices, pattern); if (!StringUtils.isEmpty(tmp_pattern)) { json.put("pattern", tmp_pattern); } RedisTools.set(redisKey, json.toJSONString()); } catch (Exception e) { e.printStackTrace(); setData(money); } } private String sendQQ(Map map, String prices, String pattern) { String url = String.format("https://turnipprophet.io?prices=%s%s", prices, pattern == null ? "" : "&pattern=" + pattern ); if (map == null) { QQBotManager.getInstance().sendMessage(sendQQ, getMessage("没有结果,请检查数据是否有误。 \n网页预览:\n" + url)); return null; } JSONObject pr = JSONObject.parseObject(map.get(TurnipData.MODEL)); JSONArray prArray = pr.getJSONArray(TurnipData.MODEL); StringBuilder out = new StringBuilder(); out.append("预测结果如下:\n"); out.append(TurnipData.MODEL).append(prArray.getJSONObject(0).getString(TurnipData.MODEL)).append("\n"); out.append(TurnipData.PR).append(prArray.getJSONObject(0).getString(TurnipData.PR)).append("\n"); out.append("购入价:").append(prices.split("\\.")[0]).append("\n"); if (getDay() == 0) { out.append("满背包(4行)购入价:").append(4000 * Integer.parseInt(prices.split("\\.")[0])).append("\n"); } out.append(TurnipData.MIX).append(map.get(TurnipData.MIX)).append("\n") .append(TurnipData.MAX).append(map.get(TurnipData.MAX)).append("\n") .append(TurnipData.DAY).append(map.get(TurnipData.DAY)).append("\n") .append("-------------").append("\n") .append(TurnipData.MONDAY_UP).append(map.get(TurnipData.MONDAY_UP)).append(" | ") .append(TurnipData.MONDAY_DOWN).append(map.get(TurnipData.MONDAY_DOWN)).append("\n") .append(TurnipData.TUESDAY_UP).append(map.get(TurnipData.TUESDAY_UP)).append(" | ") .append(TurnipData.TUESDAY_DOWN).append(map.get(TurnipData.TUESDAY_DOWN)).append("\n") .append(TurnipData.WEDNESDAY_UP).append(map.get(TurnipData.WEDNESDAY_UP)).append(" | ") .append(TurnipData.WEDNESDAY_DOWN).append(map.get(TurnipData.WEDNESDAY_DOWN)).append("\n") .append(TurnipData.THURSDAY_UP).append(map.get(TurnipData.THURSDAY_UP)).append(" | ") .append(TurnipData.THURSDAY_DOWN).append(map.get(TurnipData.THURSDAY_DOWN)).append("\n") .append(TurnipData.FRIDAY_UP).append(map.get(TurnipData.FRIDAY_UP)).append(" | ") .append(TurnipData.FRIDAY_DOWN).append(map.get(TurnipData.FRIDAY_DOWN)).append("\n") .append(TurnipData.SATURDAY_UP).append(map.get(TurnipData.SATURDAY_UP)).append(" | ") .append(TurnipData.SATURDAY_DOWN).append(map.get(TurnipData.SATURDAY_DOWN)).append("\n") ; out.append("------------").append("\n"); out.append("总概率:").append("\n"); for (Object o : prArray) { JSONObject tmp = (JSONObject) o; out.append(tmp.getString(TurnipData.MODEL)).append(":").append(tmp.getString(TurnipData.PR)).append("\n"); } out.append("------------").append("\n"); out.append("网页版:").append("\n").append(url).append("\n"); out.append("祝好运 :)"); Log.i("TurnipProphet", out.toString()); QQBotManager.getInstance().sendMessage(sendQQ, getMessage(out.toString())); return prArray.getJSONObject(0).getString(TurnipData.MODEL); } @Override public void onTime(Long qq,String time) { super.onTime(qq,time); nowTime = Integer.parseInt(time.split(":")[0]); } public int getTime() { if (nowTime == -1) { nowTime = Integer.parseInt(AppTools.getHours()); } return nowTime; } private int getDay() { return Calendar.getInstance().get(Calendar.DAY_OF_WEEK) - 1; } public static void main(String[] args) throws Exception { TurnipProphet prophet = new TurnipProphet(); String prices="108.93.89.84.79........"; String pattern="0"; Mapmap=prophet.openTurnip(prices,pattern); prophet.sendQQ(map,prices,pattern); } public Map openTurnip(String prices, String pattern) throws Exception { String url = String.format("http://127.0.0.1:7000/?prices=%s%s", prices, pattern == null ? "" : "&pattern=" + pattern ); System.out.println("url = " + url); LinkedHashMap map = new LinkedHashMap<>(); WebDriver driver = WebClient.getInstance().getWebDriver(); driver.get(url); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); Thread.sleep(500); WebElement element = driver.findElement(By.id("output")); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); List list = element.findElements(By.tagName("tr")); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); JSONObject pr = new JSONObject(); JSONArray array = new JSONArray(); if (list.size() == 0) { driver.close(); driver.quit(); return null; } for (WebElement webElement : list) { String[] tmp; try { tmp = webElement.getText().replace(" ~ ", "~").split(" "); } catch (Exception e) { //e.printStackTrace(); continue; } if ("所有趋势".equals(tmp[0])) { map.put(TurnipProphet.TurnipData.MONDAY_UP, tmp[3]); map.put(TurnipProphet.TurnipData.MONDAY_DOWN, tmp[4]); map.put(TurnipProphet.TurnipData.TUESDAY_UP, tmp[5]); map.put(TurnipProphet.TurnipData.TUESDAY_DOWN, tmp[6]); map.put(TurnipProphet.TurnipData.WEDNESDAY_UP, tmp[7]); map.put(TurnipProphet.TurnipData.WEDNESDAY_DOWN, tmp[8]); map.put(TurnipProphet.TurnipData.THURSDAY_UP, tmp[9]); map.put(TurnipProphet.TurnipData.THURSDAY_DOWN, tmp[10]); map.put(TurnipProphet.TurnipData.FRIDAY_UP, tmp[11]); map.put(TurnipProphet.TurnipData.FRIDAY_DOWN, tmp[12]); map.put(TurnipProphet.TurnipData.SATURDAY_UP, tmp[13]); map.put(TurnipProphet.TurnipData.SATURDAY_DOWN, tmp[14]); map.put(TurnipProphet.TurnipData.MIX, tmp[15]); map.put(TurnipProphet.TurnipData.MAX, tmp[16]); } else { if (!array.toJSONString().contains(tmp[0])) { JSONObject json = new JSONObject(); json.put(TurnipProphet.TurnipData.MODEL, tmp[0]); json.put(TurnipProphet.TurnipData.PR, tmp[1]); array.add(json); } } } int maxMoney = 0; String maxDay = null; for (String key : map.keySet()) { if (map.get(key).contains("~")) { for (String s : map.get(key).split("~")) { if (Integer.parseInt(s) > maxMoney) { maxMoney = Integer.parseInt(s); maxDay = key; } } } else { if (Integer.parseInt(map.get(key)) > maxMoney) { maxMoney = Integer.parseInt(map.get(key)); maxDay = key; } } } map.put(TurnipProphet.TurnipData.DAY, maxDay); pr.put(TurnipProphet.TurnipData.MODEL, array); map.put(TurnipProphet.TurnipData.MODEL, pr.toJSONString()); driver.close(); driver.quit(); return map; } } /* null.90........... null.97........... null.1!.1@.2!.2@.3!.3@.4!.4@.5!.5@.90. null.1!.1@.2!.2@.3!.3@.4!.4@.5!.5@.6!.90. */