Compare commits

...

5 Commits

Author SHA1 Message Date
512928c8ad 修复大头菜数据未被记录的问题 2021-12-09 22:23:25 +08:00
95141649dc 大头菜改为只允许私聊设置
修复涩图功能
2021-12-09 13:45:48 +08:00
191a1fc6ed 新增同步百度云功能 2021-12-09 13:22:50 +08:00
90b9718471 新增天使动漫下载以及自动签到 2021-12-09 12:39:41 +08:00
4c2f4abaa5 新增显示大头菜预测
修复定时器重复触发问题
2021-12-09 10:37:17 +08:00
8 changed files with 284 additions and 60 deletions

View File

@ -2,8 +2,10 @@ package com.yutou.qqbot;
import com.yutou.qqbot.Listeners.QQMessageListener;
import com.yutou.qqbot.models.Animal.TurnipProphet;
import com.yutou.qqbot.models.Commands.BaiduDown;
import com.yutou.qqbot.models.Commands.Bangumi;
import com.yutou.qqbot.models.Commands.System.*;
import com.yutou.qqbot.models.Commands.Tsdm;
import com.yutou.qqbot.models.Model;
import com.yutou.qqbot.models.setu.QQSetu;
import com.yutou.qqbot.utlis.*;
@ -38,6 +40,8 @@ public class QQBotManager {
Model.classList.add(Bangumi.class);
Model.classList.add(TurnipProphet.class);
Model.classList.add(Tsdm.class);
Model.classList.add(BaiduDown.class);
}
private static QQBotManager botManager = null;
private Bot bot;

View File

@ -36,7 +36,7 @@ public class TurnipProphet extends Model {
}
int nowTime;
static int nowTime;
@Override
public boolean isUserPublic() {
@ -53,15 +53,56 @@ public class TurnipProphet extends Model {
@Override
public void onMessage(Long qq, MessageEvent event, boolean isGroup) {
super.onMessage(qq, event, isGroup);
if (isGroup) {
return;
}
int money = -1;
try {
money = Integer.parseInt(msg.trim());
} catch (Exception e) {
if (msg.equals(QQFromCommands.TURNIP_PROPHET)) {
showData(event.getSource().getFromId());
}
return;
}
setData(money, event.getSource().getFromId());
}
private void showData(long qq) {
String redisKey = qq + "_turnip";
String data = RedisTools.get(redisKey);
if (StringUtils.isEmpty(data)) {
QQBotManager.getInstance().sendMessage(qq, "没有本周数据,无法预测");
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<String, String> map = null;
try {
map = WebClient.getInstance().openTurnip(prices, pattern);
sendQQ(map, prices, pattern, qq);
} catch (Exception e) {
e.printStackTrace();
showData(qq);
}
}
private void setData(int money, long qq) {
String redisKey = qq + "_turnip";
String data = RedisTools.get(redisKey);
@ -139,62 +180,73 @@ public class TurnipProphet extends Model {
}
}
QQBotManager.getInstance().sendMessage(qq, "已记录,正在预测本周走势...");
Map<String, String> map = WebClient.getInstance().openTurnip(prices, pattern);
if (map == null) {
String url = String.format("https://turnipprophet.io?prices=%s%s",
prices,
pattern == null ? "" : "&pattern=" + pattern
);
QQBotManager.getInstance().sendMessage(qq, "没有结果,请检查数据是否有误。 \n网页预览" + url);
return;
String tmp_pattern = sendQQ(map, prices, pattern, qq);
if (!StringUtils.isEmpty(tmp_pattern)) {
json.put("pattern", tmp_pattern);
}
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(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("祝好运 :)");
json.put("pattern", prArray.getJSONObject(0).getString(TurnipData.MODEL));
RedisTools.set(redisKey, json.toJSONString());
Log.i("TurnipProphet", out.toString());
QQBotManager.getInstance().sendMessage(qq, out.toString());
} catch (Exception e) {
setData(money, qq);
setData(money, qq);
e.printStackTrace();
}
}
private String sendQQ(Map<String, String> map, String prices, String pattern, long qq) {
if (map == null) {
String url = String.format("https://turnipprophet.io?prices=%s%s",
prices,
pattern == null ? "" : "&pattern=" + pattern
);
QQBotManager.getInstance().sendMessage(qq, "没有结果,请检查数据是否有误。 \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(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("祝好运 :)");
Log.i("TurnipProphet", out.toString());
QQBotManager.getInstance().sendMessage(qq, out.toString());
return prArray.getJSONObject(0).getString(TurnipData.MODEL);
}
@Override
public void onTime(String time) {
super.onTime(time);

View File

@ -0,0 +1,40 @@
package com.yutou.qqbot.models.Commands;
import com.yutou.qqbot.QQBotManager;
import com.yutou.qqbot.interfaces.ObjectInterface;
import com.yutou.qqbot.models.Model;
import com.yutou.qqbot.utlis.AppTools;
import com.yutou.qqbot.utlis.Log;
import net.mamoe.mirai.event.events.MessageEvent;
import java.io.File;
public class BaiduDown extends Model {
@Override
public boolean isUserPublic() {
return false;
}
@Override
public String[] getUsePowers() {
return new String[]{
QQFromCommands.BAIDU_DOWN
};
}
@Override
public void onMessage(Long qq, MessageEvent event, boolean isGroup) {
super.onMessage(qq, event, isGroup);
if(msg.startsWith(QQFromCommands.BAIDU_DOWN)){
QQBotManager.getInstance().sendMessage(qq,"开始同步百度云");
AppTools.exec("cd "+new File("baidupan").getAbsolutePath()+" && bypy downdir -v", new ObjectInterface() {
@Override
public void out(String data) {
super.out(data);
Log.i(data);
QQBotManager.getInstance().sendMessage(qq,"任务完成");
}
},true,true);
}
}
}

View File

@ -0,0 +1,44 @@
package com.yutou.qqbot.models.Commands;
import com.yutou.qqbot.QQBotManager;
import com.yutou.qqbot.models.Model;
import com.yutou.qqbot.utlis.StringUtils;
import com.yutou.qqbot.utlis.WebClient;
import net.mamoe.mirai.event.events.MessageEvent;
public class Tsdm extends Model {
@Override
public boolean isUserPublic() {
return false;
}
@Override
public String[] getUsePowers() {
return new String[]{
QQFromCommands.TSDM_PAY
};
}
@Override
public void onMessage(Long qq, MessageEvent event, boolean isGroup) {
super.onMessage(qq, event, isGroup);
if(msg.startsWith(QQFromCommands.TSDM_PAY)){
String url=msg.replace(QQFromCommands.TSDM_PAY,"").trim();
if(StringUtils.isEmpty(url)){
QQBotManager.getInstance().sendMessage(qq,"使用说明:!tsdm [url]");
return;
}
QQBotManager.getInstance().sendMessage(qq,"正在获取,请稍等...");
QQBotManager.getInstance().sendMessage(qq,WebClient.getInstance().tsdm(url));
}
}
@Override
public void onTime(String time) {
super.onTime(time);
if("08:00".equals(time)){
WebClient.getInstance().tsdmSign();
QQBotManager.getInstance().sendMessage(QQBotManager.defGroup,"已完成天使动漫的签到");
}
}
}

View File

@ -36,6 +36,9 @@ public abstract class Model implements ModelInterface {
public static class QQFromCommands {
public static final String TURNIP_PROPHET = "大头菜";
public static final String TSDM_PAY = "!tsdm";
public static final String TSDM_SIGN = "!tsdm签到";
public static final String BAIDU_DOWN = "!bd";
}

View File

@ -28,7 +28,7 @@ public class QQSetu extends Model {
private int db_user =3;//当次数据
private long group;
private Timer timer;
private final Map<String, Float> setuScore = new HashMap<>();
private static final Map<String, Float> setuScore = new HashMap<>();
public void printTodaySetu() {
String redisKey= AppTools.getToDayTime() + "_setu";
@ -121,6 +121,7 @@ public class QQSetu extends Model {
if(!setuScore.isEmpty()){
printSetu(group);
}
timer.cancel();
timer = null;
}
}, (long) (0.9 * 60 * 1000));

View File

@ -23,6 +23,7 @@ public class ApplicationInit implements ApplicationRunner {
if (time.equals(oldTime)) {
return;
}
oldTime=time;
for (Class<?> model : Model.classList) {
try {
Model useModel= (Model) model.getDeclaredConstructor().newInstance();

View File

@ -3,17 +3,16 @@ package com.yutou.qqbot.utlis;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.yutou.qqbot.models.Animal.TurnipProphet;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.io.File;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
public class WebClient {
private static WebClient client;
@ -28,12 +27,12 @@ public class WebClient {
private WebClient() {
System.setProperty("webdriver.chrome.driver",
ConfigTools.load(ConfigTools.CONFIG,"chrome",String.class));
// java.util.logging.Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF);
ConfigTools.load(ConfigTools.CONFIG, "chrome", String.class));
// java.util.logging.Logger.getLogger("org.openqa.selenium").setLevel(Level.OFF);
}
public Map<String, String> openTurnip(String prices, String pattern) throws Exception {
String url=String.format("https://turnipprophet.io?prices=%s%s",
String url = String.format("https://turnipprophet.io?prices=%s%s",
prices,
pattern == null ? "" : "&pattern=" + pattern
);
@ -48,7 +47,7 @@ public class WebClient {
List<WebElement> list = element.findElements(By.tagName("tr"));
JSONObject pr = new JSONObject();
JSONArray array = new JSONArray();
if(list.size()==0){
if (list.size() == 0) {
return null;
}
@ -86,7 +85,7 @@ public class WebClient {
}
}
for (String key : map.keySet()) {
System.err.println("记录最高日:"+map.get(key)+" > "+key);
System.err.println("记录最高日:" + map.get(key) + " > " + key);
if (!key.equals(TurnipProphet.TurnipData.MAX) &&
map.get(key).contains(map.get(TurnipProphet.TurnipData.MAX))) {
map.put(TurnipProphet.TurnipData.DAY, key);
@ -96,20 +95,100 @@ public class WebClient {
pr.put(TurnipProphet.TurnipData.MODEL, array);
map.put(TurnipProphet.TurnipData.MODEL, pr.toJSONString());
webDriver.close();
webDriver.quit();
return map;
}
public String tsdm(String url) {
JSONArray array = JSONArray.parseArray(ConfigTools.readFile(new File("cookie.json")));
if (array == null) {
System.err.println("array is null");
return null;
}
WebDriver driver = new ChromeDriver(getOptions());
driver.get(url);
getTsdm(array, driver);
try {
((JavascriptExecutor) driver).executeScript("document.getElementsByClassName('y viewpay')[0].click()");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.id("payform")).submit();
} catch (Exception ignored) {
}
String body = driver.findElement(By.name("tsdmlz")).getText();
driver.close();
driver.quit();
return body;
}
public void tsdmSign(){
JSONArray array = JSONArray.parseArray(ConfigTools.readFile(new File("cookie.json")));
if (array == null) {
System.err.println("array is null");
return;
}
WebDriver driver = new ChromeDriver(getOptions());
driver.get("https://www.tsdm39.net/forum.php");
getTsdm(array, driver);
try {
((JavascriptExecutor) driver).executeScript("showWindow('dsu_paulsign', 'plugin.php?id=dsu_paulsign:sign&9b5e8da2')");
}catch (Exception ignored){
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.id("wl")).click();
driver.findElement(By.xpath("//input[@value='3']")).click();
driver.findElement(By.id("qiandao")).submit();
driver.close();
driver.quit();
}
private void getTsdm(JSONArray array, WebDriver driver) {
driver.manage().timeouts().implicitlyWait(10000, TimeUnit.SECONDS);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (Object o : array) {
JSONObject json = (JSONObject) o;
long t = Long.parseLong(json.getString("expirationDate").replace(".", "")) / 1000;
Cookie cookie = new Cookie(json.getString("name"),
json.getString("value"),
json.getString("domain"),
json.getString("path"),
new Date(t),
json.getBoolean("secure"),
json.getBoolean("httpOnly")
);
driver.manage().addCookie(cookie);
}
driver.navigate().refresh();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private ChromeOptions getOptions() {
ChromeOptions options = new ChromeOptions();
options.addArguments("disable-infobars");
options.addArguments("blink-settings=imagesEnabled=false");
options.addArguments("--headless");
options.addArguments("disable-infobars");
options.addArguments("blink-settings=imagesEnabled=false");
options.addArguments("--headless");
options.addArguments("--no-sandbox");
return options;
}
public static void main(String[] args) {
WebClient.getInstance().tsdmSign();
}
}