37 Commits

Author SHA1 Message Date
d4b8e58946 修复一处异常问题 2024-01-20 17:39:40 +08:00
22416227d8 更新bot测试接口 2024-01-20 10:00:07 +08:00
1705f4d752 Merge remote-tracking branch 'origin/dev_' into dev_ 2024-01-18 16:53:12 +08:00
af18663759 更新B站下载视频接口 2024-01-18 16:53:03 +08:00
e40c19016a Merge branch 'master' into dev_ 2024-01-17 17:23:32 +08:00
4dce74eaf8 提取B站API统一管理 2024-01-17 17:22:21 +08:00
68fd6efdf4 修复空字符串判断错误代码 2024-01-17 15:49:45 +08:00
2000efdd55 补充QQ发出AI内容消息 2024-01-17 15:19:25 +08:00
9ea1450066 新增B站AI总结功能 2024-01-17 15:12:40 +08:00
3437a5386f 修复B站无法登陆问题 2024-01-08 17:31:21 +08:00
177c91c370 update 2024-01-08 10:46:23 +08:00
5af58336ec update gpt 2023-10-26 14:19:18 +08:00
b177561df4 update gpt 2023-10-26 14:08:44 +08:00
126f25af81 update gpt 2023-09-20 22:21:09 +08:00
c48db62d00 update 2023-09-13 15:30:46 +08:00
e595cff31d update 2023-09-13 15:22:56 +08:00
9b70685949 update 2023-09-13 10:47:38 +08:00
a317767ae7 遥遥领先
遥遥领先
2023-09-05 01:33:23 +08:00
5846ef5016 遥遥领先 2023-09-05 01:06:00 +08:00
91a18835c3 遥遥领先 2023-09-05 00:54:07 +08:00
694239eac9 遥遥领先 2023-09-05 00:32:03 +08:00
af3f85618d 遥遥领先 2023-09-04 12:19:37 +08:00
6eedb9786e 更换百合会签到 2023-08-11 09:37:16 +08:00
d56d6edf19 更换摸鱼日历的api 2023-08-08 11:30:01 +08:00
084d8901e9 更换摸鱼日历的api 2023-08-02 09:42:53 +08:00
00816083b9 调整摸鱼图提前下载时间 2023-08-01 14:55:50 +08:00
8da7c2f572 新增QQ启动前检查签名服务器是否运行 2023-07-26 09:42:40 +08:00
e65eb62417 调整百度GPT的User为用户而不是群组 2023-07-25 17:17:42 +08:00
883f5bb820 update pom.xml 2023-07-25 16:56:48 +08:00
a34fafc39c 更新QQ机器人
修复机器人协议问题
2023-07-25 16:04:50 +08:00
9fdf670c26 新增百度文言一心GPT接口模块 2023-07-25 14:48:11 +08:00
00cdf7b96e 修复B站直播签到问题 2023-07-21 01:10:03 +08:00
2c456702d8 调整B站签到出错时输出日志 2023-07-20 13:32:30 +08:00
4aa0a53cc5 更新QQ机器人版本
新增扫码登录
2023-06-25 10:26:13 +08:00
3d3046f1d7 修复B站漫画签到的空指针错误 2023-06-25 08:40:24 +08:00
ab941e97e3 更新 'src/main/java/com/yutou/qqbot/models/setu/GetSeTu.java'
优化输出中文冒号
2023-02-14 16:42:15 +08:00
283deb3e4a tmp 2022-08-22 22:05:06 +08:00
36 changed files with 824 additions and 185 deletions

17
KFCFactory.json Normal file
View File

@@ -0,0 +1,17 @@
{
"8.9.63": {
"base_url": "http://192.168.31.88:7400",
"type": "fuqiuluo/unidbg-fetch-qsign",
"key": "114514"
},
"0.1.0": {
"base_url": "http://127.0.0.1:8888",
"type": "kiliokuara/magic-signer-guide",
"server_identity_key": "vivo50",
"authorization_key": "kfc"
},
"8.8.88": {
"base_url": "http://127.0.0.1:80",
"type": "TLV544Provider"
}
}

Binary file not shown.

16
pom.xml
View File

@@ -35,7 +35,7 @@
<dependency> <dependency>
<groupId>net.mamoe</groupId> <groupId>net.mamoe</groupId>
<artifactId>mirai-core-jvm</artifactId> <artifactId>mirai-core-jvm</artifactId>
<version>2.14.0</version> <version>2.15.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.jetbrains.kotlinx</groupId> <groupId>org.jetbrains.kotlinx</groupId>
@@ -77,6 +77,19 @@
<scope>system</scope> <scope>system</scope>
<systemPath>${project.basedir}/libs/json-jena-1.0.jar</systemPath> <systemPath>${project.basedir}/libs/json-jena-1.0.jar</systemPath>
</dependency> </dependency>
<dependency>
<groupId>com.fix-protocol-version.mirai2</groupId>
<artifactId>mirai2</artifactId>
<version>1.9.9</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/fix-protocol-version-1.9.9.mirai2.jar</systemPath>
</dependency>
<!-- QQ协议修复的依赖 -->
<dependency>
<groupId>org.asynchttpclient</groupId>
<artifactId>async-http-client</artifactId>
<version>2.12.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java --> <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency> <dependency>
<groupId>org.seleniumhq.selenium</groupId> <groupId>org.seleniumhq.selenium</groupId>
@@ -205,6 +218,7 @@
<!--使用-Dloader.path需要在打包的时候增加<layout>ZIP</layou <!--使用-Dloader.path需要在打包的时候增加<layout>ZIP</layou
t>,不指定的话-Dloader.path不生效--> t>,不指定的话-Dloader.path不生效-->
<layout>ZIP</layout> <layout>ZIP</layout>
<includeSystemScope>true</includeSystemScope>
<!-- 指定该jar包启动时的主类[建议] --> <!-- 指定该jar包启动时的主类[建议] -->
<mainClass>com.yutou.qqbot.QQBotApplication</mainClass> <mainClass>com.yutou.qqbot.QQBotApplication</mainClass>
</configuration> </configuration>

View File

@@ -0,0 +1,8 @@
package com.yutou.bilibili;
public class BaseAPI {
public static final String BASE_URL = "https://api.bilibili.com/";
public static final String MCBBS_PNG = "https://www.mcbbs.net/template/mcbbs/image/special_photo_bg.png";
public static final String ACCESS_TOKEN = "https://passport.bilibili.com/login/app/third";
}

View File

@@ -0,0 +1,9 @@
package com.yutou.bilibili.api;
public class LiveAPI {
public static final String LIVE_SEND_DANMU="https://api.live.bilibili.com/msg/send";
public static final String LIVE_ROOM_INFO = "https://api.live.bilibili.com/room/v1/Room/get_info";
public static final String LIVE_TASK_PROGRESS = "https://api.live.bilibili.com/xlive/app-ucenter/v1/userTask/GetUserTaskProgress";
public static final String LIVE_SET_TASK_PROGRESS = "https://api.live.bilibili.com/xlive/app-ucenter/v1/userTask/UserTaskReceiveRewards";
}

View File

@@ -0,0 +1,7 @@
package com.yutou.bilibili.api;
public class LoginAPI {
public static final String LOGIN_QRCODE = "https://passport.bilibili.com/x/passport-login/web/qrcode/generate";
public static final String LOGIN_QRCODE_POLL="https://passport.bilibili.com/x/passport-login/web/qrcode/poll";
}

View File

@@ -0,0 +1,9 @@
package com.yutou.bilibili.api;
public class MangaApi {
public static final String SIGN = "https://manga.bilibili.com/twirp/activity.v1.Activity/ClockIn";
public static final String LIST_PRODUCT_DATE = "https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/ListProduct";
public static final String USER_POINT = "https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetUserPoint";
public static final String PAY_MISSION = "https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/Exchange";
}

View File

@@ -0,0 +1,7 @@
package com.yutou.bilibili.api;
public class SignApi {
public static final String LIVE_SIGN_COIN = "https://api.live.bilibili.com/xlive/revenue/v1/wallet/silver2coin";
public static final String LIVE_SIGN = "https://api.live.bilibili.com/xlive/web-ucenter/v1/sign/DoSign";
public static final String VIP_SIGN = "https://api.bilibili.com/pgc/activity/score/task/sign";
}

View File

@@ -0,0 +1,10 @@
package com.yutou.bilibili.api;
public class UserApi {
@Deprecated
public static final String USER_INFO = "https://api.bilibili.com/x/space/acc/info";
public static final String USER_INFO_V2="https://api.bilibili.com/x/space/wbi/acc/info";
public static final String NAV = "https://api.bilibili.com/x/web-interface/nav";
}

View File

@@ -0,0 +1,9 @@
package com.yutou.bilibili.api;
public class VideoApi {
public static final String VIDEO_AI = "https://api.bilibili.com/x/web-interface/view/conclusion/get";
@Deprecated
public static final String VIDEO_PLAY_URL = "https://api.bilibili.com/x/player/playurl";
public static final String VIDEO_PLAY_URL_V2 = "https://api.bilibili.com/x/player/wbi/playurl";
}

View File

@@ -6,12 +6,13 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication @SpringBootApplication
public class QQBotApplication { public class QQBotApplication {
public static final String version="QQBot v.1.4b.2"; public static final String version="QQBot v.1.6.2";
public static void main(String[] args) { public static void main(String[] args) {
System.out.println("version = " + version); System.out.println("version = " + version);
SpringApplication.run(QQBotApplication.class, args); SpringApplication.run(QQBotApplication.class, args);
RedisTools.initRedisPoolSub(); RedisTools.initRedisPoolSub();
QQBotManager.getInstance(); QQBotManager.getInstance();
//1
} }
} }

View File

@@ -2,6 +2,7 @@ package com.yutou.qqbot;
import com.yutou.qqbot.utlis.AppTools; import com.yutou.qqbot.utlis.AppTools;
import com.yutou.qqbot.utlis.RedisTools; import com.yutou.qqbot.utlis.RedisTools;
import net.mamoe.mirai.Bot;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
@@ -33,4 +34,16 @@ public class QQBotController {
AppTools.sendServer(title, msg); AppTools.sendServer(title, msg);
return "ok"; return "ok";
} }
@ResponseBody
@RequestMapping("/bot/test.do")
public String testLogin(){
Bot bot = QQBotManager.getInstance().getBot();
return bot.isOnline()+"";
}
@ResponseBody
@RequestMapping("/bot/login.do")
public String login(){
QQBotManager.getInstance().reLogin();
return "ok";
}
} }

View File

@@ -11,6 +11,7 @@ import net.mamoe.mirai.message.MessageReceipt;
import net.mamoe.mirai.message.data.*; import net.mamoe.mirai.message.data.*;
import net.mamoe.mirai.utils.BotConfiguration; import net.mamoe.mirai.utils.BotConfiguration;
import net.mamoe.mirai.utils.ExternalResource; import net.mamoe.mirai.utils.ExternalResource;
import xyz.cssxsh.mirai.tool.FixProtocolVersion;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@@ -40,15 +41,43 @@ public class QQBotManager {
private void init() { private void init() {
new Thread(new Runnable() { new Thread(new Runnable() {
private void reset() {
try {
Log.i("QQBot", "签名加密服务未启动,1分钟后重试");
Thread.sleep(60 * 1000);
init();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override @Override
public void run() { public void run() {
String url=ConfigTools.load(ConfigTools.CONFIG,"sign_url",String.class);
if(StringUtils.isEmpty(url)){
url="http://192.168.31.88:7400/";
}
String test = HttpTools.get(url);
try {
JSONObject json = JSONObject.parseObject(test);
if (json.getInteger("code") != 0) {
reset();
return;
}
} catch (Exception e) {
reset();
return;
}
long qq = ConfigTools.load(ConfigTools.CONFIG, "qq_number", Long.class); long qq = ConfigTools.load(ConfigTools.CONFIG, "qq_number", Long.class);
String password = ConfigTools.load(ConfigTools.CONFIG, "qq_password", String.class); String password = ConfigTools.load(ConfigTools.CONFIG, "qq_password", String.class);
System.out.println("qq = " + qq); System.out.println("qq = " + qq);
System.out.println("password = " + password); System.out.println("password = " + password);
FixProtocolVersion.fix(); FixProtocolVersion.load(BotConfiguration.MiraiProtocol.ANDROID_PAD);
bot = BotFactory.INSTANCE.newBot(qq, password, new BotConfiguration() { bot = BotFactory.INSTANCE.newBot(qq, password, new BotConfiguration() {
{ {
setProtocol(MiraiProtocol.ANDROID_PAD); setProtocol(MiraiProtocol.ANDROID_PAD);
fileBasedDeviceInfo("qq_bot_devices_info.json"); fileBasedDeviceInfo("qq_bot_devices_info.json");
if ("nas".equals(ConfigTools.load(ConfigTools.CONFIG, "model"))) { if ("nas".equals(ConfigTools.load(ConfigTools.CONFIG, "model"))) {
@@ -75,7 +104,6 @@ public class QQBotManager {
} }
}).start(); }).start();
bot.join(); bot.join();
} }
}).start(); }).start();
@@ -93,7 +121,7 @@ public class QQBotManager {
} }
private Image getImage(File file, Long qq) { private Image getImage(File file, Long qq) {
if(file==null){ if (file == null) {
return null; return null;
} }
if (bot != null) { if (bot != null) {
@@ -148,8 +176,10 @@ public class QQBotManager {
public MessageReceipt<?> sendMessage(Long group, MessageChainBuilder builder) { public MessageReceipt<?> sendMessage(Long group, MessageChainBuilder builder) {
if (bot != null) { if (bot != null) {
if (QQNumberManager.getManager().isGroup(group)) { if (QQNumberManager.getManager().isGroup(group)) {
System.out.println("发群");
return Objects.requireNonNull(bot.getGroup(group)).sendMessage(builder.asMessageChain()); return Objects.requireNonNull(bot.getGroup(group)).sendMessage(builder.asMessageChain());
} else { } else {
System.out.println("发个人");
return Objects.requireNonNull(bot.getFriend(group)).sendMessage(builder.asMessageChain()); return Objects.requireNonNull(bot.getFriend(group)).sendMessage(builder.asMessageChain());
} }
} }
@@ -171,7 +201,7 @@ public class QQBotManager {
if (image != null) { if (image != null) {
builder.append(image); builder.append(image);
} }
List<String> list=PatternTools.getQQ(text); List<String> list = PatternTools.getQQ(text);
if (!list.isEmpty()) { if (!list.isEmpty()) {
for (String _qq : list) { for (String _qq : list) {
String[] tmp = text.split(_qq); String[] tmp = text.split(_qq);
@@ -238,4 +268,12 @@ public class QQBotManager {
public Bot getBot() { public Bot getBot() {
return bot; return bot;
} }
public void reLogin() {
isInit=false;
if(bot.isOnline()){
bot.close();
}
init();
}
} }

View File

@@ -13,56 +13,61 @@ import java.util.Set;
public class QQNumberManager { public class QQNumberManager {
private static QQNumberManager manager; private static QQNumberManager manager;
private QQNumberManager(){
private QQNumberManager() {
} }
public static QQNumberManager getManager() { public static QQNumberManager getManager() {
if(manager==null) { if (manager == null) {
manager=new QQNumberManager(); manager = new QQNumberManager();
} }
return manager; return manager;
} }
public void addNumber(Long qq,boolean isGroup){
if(RedisTools.exists(qq,null)){ public void addNumber(Long qq, boolean isGroup) {
if (RedisTools.exists(qq, null)) {
return; return;
} }
JSONObject json=new JSONObject(); JSONObject json = new JSONObject();
json.put("group",isGroup); json.put("group", isGroup);
json.put("power",new JSONArray()); json.put("power", new JSONArray());
json.put("model",new JSONArray()); json.put("model", new JSONArray());
RedisTools.set(qq,json.toJSONString()); RedisTools.set(qq, json.toJSONString());
} }
public List<Long> getNumber(){
List<Long> list =new ArrayList<>(); public List<Long> getNumber() {
Jedis jedis=RedisTools.getRedis(); List<Long> list = new ArrayList<>();
Jedis jedis = RedisTools.getRedis();
jedis.select(RedisTools.QQBOT_USER); jedis.select(RedisTools.QQBOT_USER);
Set<String> set=jedis.keys("*"); Set<String> set = jedis.keys("*");
for (String s : set) { for (String s : set) {
try { try {
list.add(Long.parseLong(s)); list.add(Long.parseLong(s));
}catch (Exception ignored){ } catch (Exception ignored) {
} }
} }
jedis.close(); jedis.close();
return list; return list;
} }
public boolean addPower(Long qq, String power){
if(RedisTools.exists(qq,null)){ public boolean addPower(Long qq, String power) {
JSONObject json=JSON.parseObject(RedisTools.get(qq)); if (RedisTools.exists(qq, null)) {
JSONArray array=json.getJSONArray("power"); JSONObject json = JSON.parseObject(RedisTools.get(qq));
JSONArray array = json.getJSONArray("power");
array.add(power); array.add(power);
json.put("power",array); json.put("power", array);
return RedisTools.set(qq,json.toJSONString()); return RedisTools.set(qq, json.toJSONString());
} }
return false; return false;
} }
public List<String> getPower(Long qq){
List<String> list=new ArrayList<>(); public List<String> getPower(Long qq) {
if(RedisTools.exists(qq,null)){ List<String> list = new ArrayList<>();
JSONObject json=JSON.parseObject(RedisTools.get(qq)); if (RedisTools.exists(qq, null)) {
JSONArray array=json.getJSONArray("power"); JSONObject json = JSON.parseObject(RedisTools.get(qq));
JSONArray array = json.getJSONArray("power");
for (Object power : array) { for (Object power : array) {
list.add((String) power); list.add((String) power);
} }
@@ -70,11 +75,12 @@ public class QQNumberManager {
} }
return list; return list;
} }
public List<String> getUseModel(long qq) { public List<String> getUseModel(long qq) {
List<String> list=new ArrayList<>(); List<String> list = new ArrayList<>();
if(RedisTools.exists(qq,null)){ if (RedisTools.exists(qq, null)) {
JSONObject json=JSON.parseObject(RedisTools.get(qq)); JSONObject json = JSON.parseObject(RedisTools.get(qq));
JSONArray array=json.getJSONArray("model"); JSONArray array = json.getJSONArray("model");
for (Object power : array) { for (Object power : array) {
list.add((String) power); list.add((String) power);
} }
@@ -82,43 +88,47 @@ public class QQNumberManager {
} }
return list; return list;
} }
public boolean delPower(Long qq, String power){
if(RedisTools.exists(qq,null)){ public boolean delPower(Long qq, String power) {
JSONObject json=JSON.parseObject(RedisTools.get(qq)); if (RedisTools.exists(qq, null)) {
JSONArray array=json.getJSONArray("power"); JSONObject json = JSON.parseObject(RedisTools.get(qq));
JSONArray array = json.getJSONArray("power");
array.remove(power); array.remove(power);
json.put("power",array); json.put("power", array);
return RedisTools.set(qq,json.toJSONString()); return RedisTools.set(qq, json.toJSONString());
} }
return false; return false;
} }
public boolean addUseModel(Long qq,Class<?> modelClass){
if(RedisTools.exists(qq,null)){ public boolean addUseModel(Long qq, Class<?> modelClass) {
JSONObject json=JSON.parseObject(RedisTools.get(qq)); if (RedisTools.exists(qq, null)) {
JSONArray array=json.getJSONArray("model"); JSONObject json = JSON.parseObject(RedisTools.get(qq));
JSONArray array = json.getJSONArray("model");
array.add(modelClass.getName()); array.add(modelClass.getName());
json.put("model",array); json.put("model", array);
return RedisTools.set(qq,json.toJSONString()); return RedisTools.set(qq, json.toJSONString());
} }
return false; return false;
} }
public boolean delUseModel(Long qq,Class<?> modelClass){
if(RedisTools.exists(qq,null)){ public boolean delUseModel(Long qq, Class<?> modelClass) {
JSONObject json=JSON.parseObject(RedisTools.get(qq)); if (RedisTools.exists(qq, null)) {
JSONArray array=json.getJSONArray("model"); JSONObject json = JSON.parseObject(RedisTools.get(qq));
JSONArray array = json.getJSONArray("model");
array.remove(modelClass.getName()); array.remove(modelClass.getName());
json.put("model",array); json.put("model", array);
return RedisTools.set(qq,json.toJSONString()); return RedisTools.set(qq, json.toJSONString());
} }
return false; return false;
} }
public boolean isExistsPower(Long qq, String... power){
public boolean isExistsPower(Long qq, String... power) {
//1 //1
if(RedisTools.exists(qq,null)){ if (RedisTools.exists(qq, null)) {
JSONObject json=JSON.parseObject(RedisTools.get(qq)); JSONObject json = JSON.parseObject(RedisTools.get(qq));
JSONArray array=json.getJSONArray("power"); JSONArray array = json.getJSONArray("power");
for (String key : power) { for (String key : power) {
if(!array.contains(key)){ if (!array.contains(key)) {
return false; return false;
} }
} }
@@ -126,19 +136,26 @@ public class QQNumberManager {
} }
return false; return false;
} }
public boolean isGroup(Long qq){
if(RedisTools.exists(qq,null)){ public boolean isGroup(Long qq) {
JSONObject json= JSON.parseObject(RedisTools.get(qq)); if (RedisTools.exists(qq, null)) {
JSONObject json = JSON.parseObject(RedisTools.get(qq));
return json.getBooleanValue("group"); return json.getBooleanValue("group");
} }
return false; return false;
} }
public boolean isUseModel(Long qq,Class<?> modelClass){
if(RedisTools.exists(qq,null)){ public boolean isUseModel(Long qq, Class<?> modelClass) {
JSONObject json=JSON.parseObject(RedisTools.get(qq)); try {
JSONArray array=json.getJSONArray("model"); if (RedisTools.exists(qq, null)) {
JSONObject json = JSON.parseObject(RedisTools.get(qq));
JSONArray array = json.getJSONArray("model");
return array.contains(modelClass.getName()); return array.contains(modelClass.getName());
} }
} catch (Exception e) {
e.printStackTrace();
Log.i("isUseModel", qq + " " + modelClass.getName());
}
return false; return false;
} }

View File

@@ -1,8 +1,13 @@
package com.yutou.qqbot.bilibili; package com.yutou.qqbot.bilibili;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.yutou.bilibili.BaseAPI;
import com.yutou.bilibili.api.LiveAPI;
import com.yutou.bilibili.api.VideoApi;
import com.yutou.qqbot.QQBotManager; import com.yutou.qqbot.QQBotManager;
import com.yutou.qqbot.models.BiliBili.BiliVideo;
import com.yutou.qqbot.utlis.AppTools; import com.yutou.qqbot.utlis.AppTools;
import com.yutou.qqbot.utlis.BiliBiliWbiSign;
import com.yutou.qqbot.utlis.HttpTools; import com.yutou.qqbot.utlis.HttpTools;
import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.HttpsURLConnection;
@@ -25,9 +30,9 @@ public class BiliBiliAppUtils {
public String getAccessToken() { public String getAccessToken() {
try { try {
String tmpUrl = "https://www.mcbbs.net/template/mcbbs/image/special_photo_bg.png"; String tmpUrl = BaseAPI.MCBBS_PNG;
String sign = AppTools.getMD5("api=" + tmpUrl + AppSec); String sign = AppTools.getMD5("api=" + tmpUrl + AppSec);
JSONObject get = biliUtils.http_get(" https://passport.bilibili.com/login/app/third?appkey=" + AppKey + "&api=" + tmpUrl + "&sign=" + sign); JSONObject get = biliUtils.http_get(BaseAPI.ACCESS_TOKEN+"?appkey=" + AppKey + "&api=" + tmpUrl + "&sign=" + sign);
assert get != null; assert get != null;
String uri = get.getJSONObject("data").getString("confirm_uri"); String uri = get.getJSONObject("data").getString("confirm_uri");
HttpsURLConnection connection = biliUtils.getBiliHttpGet(uri, biliUtils.getCookie()); HttpsURLConnection connection = biliUtils.getBiliHttpGet(uri, biliUtils.getCookie());
@@ -101,7 +106,7 @@ public class BiliBiliAppUtils {
} }
public AppUserTask getTaskProgress() { public AppUserTask getTaskProgress() {
JSONObject task = biliUtils.http_get("https://api.live.bilibili.com/xlive/app-ucenter/v1/userTask/GetUserTaskProgress"); JSONObject task = biliUtils.http_get(LiveAPI.LIVE_TASK_PROGRESS);
System.out.println("task = " + task); System.out.println("task = " + task);
assert task != null; assert task != null;
return task.getObject("data", AppUserTask.class); return task.getObject("data", AppUserTask.class);
@@ -113,7 +118,7 @@ public class BiliBiliAppUtils {
map.put("reward_index", index + ""); map.put("reward_index", index + "");
JSONObject httpGet = biliUtils.http( JSONObject httpGet = biliUtils.http(
"https://api.live.bilibili.com/xlive/app-ucenter/v1/userTask/UserTaskReceiveRewards", LiveAPI.LIVE_SET_TASK_PROGRESS,
BiliBiliUtils.HTTP.POST, BiliBiliUtils.HTTP.POST,
HttpTools.toUrlParams(sign(map)), HttpTools.toUrlParams(sign(map)),
getHeaderMap(), getHeaderMap(),
@@ -135,8 +140,52 @@ public class BiliBiliAppUtils {
}); });
return task; return task;
} }
public static String getVideoAI(String url){
if(url.startsWith("https://b23.tv")){
url=b23ToUrl(url);
}
JSONObject videoInfo = new BiliVideo().getVideoInfo(url);
if(videoInfo==null){
return null;
}
String cid = videoInfo.getJSONObject("data").getString("cid");
TreeMap<String,String> body=new TreeMap<>();
body.put("cid",cid);
body.put("up_mid",videoInfo.getJSONObject("data").getJSONObject("owner").getString("mid"));
body.put("bvid",videoInfo.getJSONObject("data").getString("bvid"));
BiliBiliWbiSign.getWbiSign(body);
JSONObject object = BiliBiliUtils.getInstance(QQBotManager.defQQ)
.http_get(VideoApi.VIDEO_AI +"?"+HttpTools.toUrlParams(body));
if(object.getInteger("code")==0){
if(object.getJSONObject("data").getInteger("code")==0) {
return object.getJSONObject("data").getJSONObject("model_result").getString("summary");
}else{
return "没得省流";
}
}
return null;
}
public static String b23ToUrl(String url){
try {
HttpsURLConnection connection = BiliBiliUtils.getInstance(QQBotManager.defQQ).getBiliHttpGet(url, BiliBiliUtils.getInstance(QQBotManager.defQQ).getCookie());
connection.setInstanceFollowRedirects(false);
connection.connect();
if(connection.getResponseCode()==302){
connection.setConnectTimeout(5000);
return connection.getHeaderField("Location");
}
return connection.getURL().toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
System.out.println(new BiliBiliAppUtils(QQBotManager.defQQ).startAppTask().toMessageFormat()); BiliBiliWbiSign.updateRawWbiKey();
String url="https://b23.tv/NtqDorB?share_medium=android&share_source=qq&bbid=XUDCA4BDD60B5853ACDC17794BFAEF91F874A&ts=1705470976484";
// url="https://www.bilibili.com/video/BV1fw411E75p/?buvid=XUDCA4BDD60B5853ACDC17794BFAEF91F874A&from_spmid=tm.recommend.0.0&is_story_h5=false&mid=7G8S%2B4e7nx6XSaU3oMQKXA%3D%3D&p=1&plat_id=116&share_from=ugc&share_medium=android&share_plat=android&share_session_id=ab27db6e-47a5-43b5-b0ec-b027bcfdeccc&share_source=QQ&share_tag=s_i&spmid=main.ugc-video-detail.0.0&timestamp=1705470976&unique_k=NtqDorB&up_id=1156809979";
String ai = getVideoAI(url);
System.out.println("ai = " + ai);
} }
} }

View File

@@ -2,6 +2,7 @@ package com.yutou.qqbot.bilibili;
import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.yutou.bilibili.api.MangaApi;
import com.yutou.qqbot.QQBotManager; import com.yutou.qqbot.QQBotManager;
import com.yutou.qqbot.interfaces.ObjectInterface; import com.yutou.qqbot.interfaces.ObjectInterface;
import com.yutou.qqbot.utlis.HttpTools; import com.yutou.qqbot.utlis.HttpTools;
@@ -20,11 +21,11 @@ public class BiliBiliManga {
public static JSONObject sign() { public static JSONObject sign() {
JSONObject body = new JSONObject(); JSONObject body = new JSONObject();
body.put("platform", "android"); body.put("platform", "android");
return BiliBiliUtils.getInstance(QQBotManager.defQQ).http_post("https://manga.bilibili.com/twirp/activity.v1.Activity/ClockIn", HttpTools.toUrlParams(body)); return BiliBiliUtils.getInstance(QQBotManager.defQQ).http_post(MangaApi.SIGN, HttpTools.toUrlParams(body));
} }
private static JSONObject getListProductDate() { private static JSONObject getListProductDate() {
return BiliBiliUtils.getInstance(QQBotManager.defQQ).http_post("https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/ListProduct", ""); return BiliBiliUtils.getInstance(QQBotManager.defQQ).http_post(MangaApi.LIST_PRODUCT_DATE, "");
} }
private static boolean isPayMission = false; private static boolean isPayMission = false;
@@ -65,7 +66,7 @@ public class BiliBiliManga {
} }
public static int getMyPoint() { public static int getMyPoint() {
JSONObject user = biliUtils.http_post("https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetUserPoint", ""); JSONObject user = biliUtils.http_post(MangaApi.USER_POINT, "");
if (user != null && user.getInteger("code") == 0) { if (user != null && user.getInteger("code") == 0) {
return user.getJSONObject("data").getInteger("point"); return user.getJSONObject("data").getInteger("point");
} }
@@ -133,7 +134,7 @@ public class BiliBiliManga {
mission.schedule(new TimerTask() { mission.schedule(new TimerTask() {
@Override @Override
public void run() { public void run() {
JSONObject post = biliUtils.http_post("https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/Exchange", HttpTools.toUrlParams(data)); JSONObject post = biliUtils.http_post(MangaApi.PAY_MISSION, HttpTools.toUrlParams(data));
if (post == null) { if (post == null) {
anInterface.out("网络请求失败,请查看日志"); anInterface.out("网络请求失败,请查看日志");
cancel(); cancel();
@@ -160,7 +161,8 @@ public class BiliBiliManga {
} }
public static void main(String[] args) { public static void main(String[] args) {
System.out.println(BiliBiliManga.sign()); // System.out.println(BiliBiliManga.sign());
BiliBiliUtils.getInstance(583819556L).sendLiveDanmu(33989,"学学这个");
} }
@Data @Data

View File

@@ -2,6 +2,10 @@ package com.yutou.qqbot.bilibili;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.yutou.bilibili.api.LiveAPI;
import com.yutou.bilibili.api.LoginAPI;
import com.yutou.bilibili.api.SignApi;
import com.yutou.bilibili.api.UserApi;
import com.yutou.qqbot.QQBotManager; import com.yutou.qqbot.QQBotManager;
import com.yutou.qqbot.interfaces.ObjectInterface; import com.yutou.qqbot.interfaces.ObjectInterface;
import com.yutou.qqbot.utlis.*; import com.yutou.qqbot.utlis.*;
@@ -16,6 +20,7 @@ import java.net.URL;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.TreeMap;
import java.util.zip.GZIPInputStream; import java.util.zip.GZIPInputStream;
public class BiliBiliUtils { public class BiliBiliUtils {
@@ -40,7 +45,7 @@ public class BiliBiliUtils {
public synchronized JSONObject http_get(String url) { public synchronized JSONObject http_get(String url) {
try { try {
// Log.i("调用url = "+url); Log.i("调用url = " + url);
HttpsURLConnection connection = getBiliHttpGet(url, getCookie()); HttpsURLConnection connection = getBiliHttpGet(url, getCookie());
BufferedInputStream stream = new BufferedInputStream(connection.getInputStream()); BufferedInputStream stream = new BufferedInputStream(connection.getInputStream());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
@@ -71,6 +76,54 @@ public class BiliBiliUtils {
return null; return null;
} }
public JSONObject http_login_getSid(String url) {
try {
Log.i("调用url = " + url);
HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection();
setConnection(null, connection);
connection.setRequestMethod("GET");
connection.connect();
BufferedInputStream stream = new BufferedInputStream(connection.getInputStream());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] bytes = new byte[1024];
int len;
while ((len = stream.read(bytes)) != -1) {
outputStream.write(bytes, 0, len);
outputStream.flush();
}
List<String> cookie = null;
if (connection.getHeaderFields().containsKey("Set-Cookie")) {
cookie = connection.getHeaderFields().get("Set-Cookie");
}
String str = outputStream.toString(StandardCharsets.UTF_8);
outputStream.close();
try {
JSONObject json = JSON.parseObject(str);
if (cookie != null) {
StringBuilder ck = new StringBuilder();
for (String key : cookie) {
ck.append(";").append(key);
}
json.put("cookie", ck.toString());
}
return json;
} catch (Exception e) {
JSONObject json = new JSONObject();
json.put("html", str);
return json;
} finally {
stream.close();
connection.disconnect();
}
} catch (IOException e) {
//com.yutou.bilibili.Tools.Log.e(e);
e.printStackTrace();
}
return null;
}
public JSONObject http_post(String url, String body) { public JSONObject http_post(String url, String body) {
return http(url, HTTP.POST, body, RET_MODEL.JSON); return http(url, HTTP.POST, body, RET_MODEL.JSON);
} }
@@ -318,12 +371,14 @@ public class BiliBiliUtils {
connection.setRequestProperty("Referer", "https://www.bilibili.com"); connection.setRequestProperty("Referer", "https://www.bilibili.com");
connection.addRequestProperty("Connection", "keep-alive"); connection.addRequestProperty("Connection", "keep-alive");
connection.addRequestProperty("Upgrade-Insecure-Requests", "1"); connection.addRequestProperty("Upgrade-Insecure-Requests", "1");
if (!StringUtils.isEmpty(cookie)) {
connection.addRequestProperty("Cookie", cookie); connection.addRequestProperty("Cookie", cookie);
}
connection.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36"); connection.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36");
} }
public JSONObject getLoginInfo() { public JSONObject getLoginInfo() {
JSONObject jsonObject = http_get("https://api.bilibili.com/x/web-interface/nav"); JSONObject jsonObject = http_get(UserApi.NAV);
if (jsonObject == null) { if (jsonObject == null) {
jsonObject = new JSONObject(); jsonObject = new JSONObject();
jsonObject.put("code", "-1"); jsonObject.put("code", "-1");
@@ -339,7 +394,7 @@ public class BiliBiliUtils {
/* System.out.println(getLiveRoom(42062)); /* System.out.println(getLiveRoom(42062));
System.out.println("--------------------------------------------"); System.out.println("--------------------------------------------");
System.out.println(getUserInfo(730732));*/ System.out.println(getUserInfo(730732));*/
String sign = new BiliBiliUtils(583819556).liveSignIn(); JSONObject sign = new BiliBiliUtils(583819556).getUserInfo(96300);
System.out.println("sign = " + sign); System.out.println("sign = " + sign);
} }
@@ -352,7 +407,7 @@ public class BiliBiliUtils {
body.put("rnd", System.currentTimeMillis() / 1000); body.put("rnd", System.currentTimeMillis() / 1000);
body.put("csrf", BiliLogin.getCookieToken(qq)); body.put("csrf", BiliLogin.getCookieToken(qq));
body.put("csrf_token", BiliLogin.getCookieToken(qq)); body.put("csrf_token", BiliLogin.getCookieToken(qq));
JSONObject post = http_post("https://api.live.bilibili.com/msg/send", HttpTools.toUrlParams(body)); JSONObject post = http_post(LiveAPI.LIVE_SEND_DANMU, HttpTools.toUrlParams(body));
return post.getInteger("code") == 0; return post.getInteger("code") == 0;
} }
@@ -361,9 +416,9 @@ public class BiliBiliUtils {
JSONObject body = new JSONObject(); JSONObject body = new JSONObject();
body.put("csrf", BiliLogin.getCookieToken(qq)); body.put("csrf", BiliLogin.getCookieToken(qq));
body.put("csrf_token", BiliLogin.getCookieToken(qq)); body.put("csrf_token", BiliLogin.getCookieToken(qq));
JSONObject toCoin = http_post("https://api.live.bilibili.com/xlive/revenue/v1/wallet/silver2coin", HttpTools.toUrlParams(body)); JSONObject toCoin = http_post(SignApi.LIVE_SIGN_COIN, HttpTools.toUrlParams(body));
JSONObject liveSign = http_get("https://api.live.bilibili.com/xlive/web-ucenter/v1/sign/DoSign"); JSONObject liveSign = http_get(SignApi.LIVE_SIGN);
JSONObject vipSign = http_post("https://api.bilibili.com/pgc/activity/score/task/sign", null); JSONObject vipSign = http_post(SignApi.VIP_SIGN, null);
return "银瓜子兑换硬币:" + toCoin.getString("message") + "|" + "直播签到:" + liveSign.getString("message") + "|大会员中心签到:" + vipSign.getString("message"); return "银瓜子兑换硬币:" + toCoin.getString("message") + "|" + "直播签到:" + liveSign.getString("message") + "|大会员中心签到:" + vipSign.getString("message");
} }
@@ -372,13 +427,14 @@ public class BiliBiliUtils {
body.put("room_id", roomId); body.put("room_id", roomId);
body.put("csrf", BiliLogin.getCookieToken(qq)); body.put("csrf", BiliLogin.getCookieToken(qq));
body.put("csrf_token", BiliLogin.getCookieToken(qq)); body.put("csrf_token", BiliLogin.getCookieToken(qq));
return http_post("https://api.live.bilibili.com/room/v1/Room/get_info", HttpTools.toUrlParams(body)); return http_post(LiveAPI.LIVE_ROOM_INFO, HttpTools.toUrlParams(body));
} }
public JSONObject getUserInfo(int mid) { public JSONObject getUserInfo(int mid) {
JSONObject body = new JSONObject(); TreeMap<String, String> body = new TreeMap<>();
body.put("mid", mid); body.put("mid", mid + "");
return http_get("https://api.bilibili.com/x/space/acc/info?" + HttpTools.toUrlParams(body)); BiliBiliWbiSign.getWbiSign(body);
return http_get(UserApi.USER_INFO_V2 + "?" + HttpTools.toUrlParams(body));
} }
public boolean checkLiveRoom(int roomId) { public boolean checkLiveRoom(int roomId) {

View File

@@ -3,17 +3,16 @@ package com.yutou.qqbot.bilibili;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.yutou.bilibili.api.LoginAPI;
import com.yutou.qqbot.QQBotManager; import com.yutou.qqbot.QQBotManager;
import com.yutou.qqbot.utlis.ConfigTools; import com.yutou.qqbot.utlis.*;
import com.yutou.qqbot.utlis.HttpTools;
import com.yutou.qqbot.utlis.QRCodeUtils;
import com.yutou.qqbot.utlis.StringUtils;
import java.io.File; import java.io.File;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.Map; import java.text.ParseException;
import java.util.Timer; import java.text.ParsePosition;
import java.util.TimerTask; import java.text.SimpleDateFormat;
import java.util.*;
public class BiliLogin { public class BiliLogin {
@@ -27,11 +26,12 @@ public class BiliLogin {
} }
public JSONObject login() { public JSONObject login() {
JSONObject login = JSON.parseObject(HttpTools.get("https://passport.bilibili.com/qrcode/getLoginUrl")); JSONObject login = JSON.parseObject(HttpTools.get(LoginAPI.LOGIN_QRCODE));
JSONObject json = new JSONObject(); JSONObject json = new JSONObject();
System.out.println("login = " + login);
json.put("code", login.getInteger("code")); json.put("code", login.getInteger("code"));
json.put("url", login.getJSONObject("data").getString("url")); json.put("url", login.getJSONObject("data").getString("url"));
new Thread(() -> waitLogin(login.getJSONObject("data").getString("oauthKey"))).start(); new Thread(() -> waitLogin(login.getJSONObject("data").getString("qrcode_key"))).start();
return json; return json;
} }
@@ -43,47 +43,39 @@ public class BiliLogin {
public void waitLogin(String oauthKey) { public void waitLogin(String oauthKey) {
long time = System.currentTimeMillis(); long time = System.currentTimeMillis();
String bd = "gourl=https%3A%2F%2Fpassport.bilibili.com%2Fajax%2FminiLogin%2Fredirect&oauthKey=" + oauthKey;
new Timer().schedule(new TimerTask() { new Timer().schedule(new TimerTask() {
@Override @Override
public void run() { public void run() {
String bd = "gourl=https%3A%2F%2Fpassport.bilibili.com%2Fajax%2FminiLogin%2Fredirect&oauthKey=" + oauthKey;
if ((System.currentTimeMillis() - time) > 5 * 60 * 1000) { if ((System.currentTimeMillis() - time) > 5 * 60 * 1000) {
cancel(); cancel();
return; return;
} }
JSONObject json = JSON.parseObject(HttpTools.post("https://passport.bilibili.com/qrcode/getLoginInfo", bd.getBytes(StandardCharsets.UTF_8))); JSONObject json = biliUtils.http_login_getSid(LoginAPI.LOGIN_QRCODE_POLL + "?qrcode_key=" + oauthKey);
if (json.containsKey("code") && json.getInteger("code") == 0) { Log.i("B站登陆", json.toJSONString());
System.out.println("json = " + json); if (json.getInteger("code") == 0 && json.getJSONObject("data").getInteger("code") == 0) {
String _url = json.getJSONObject("data").getString("url");
Map<String, String> map = HttpTools.getUrlParams(_url);
JSONObject cookie = new JSONObject(); String[] split = json.getString("cookie").split(";");
JSONArray array = new JSONArray(); JSONObject ck = new JSONObject();
for (String key : map.keySet()) { for (String string : split) {
cookie.put(key, map.get(key)); if (!ck.containsKey(string) && !StringUtils.isEmpty(string) && string.contains("=")) {
String key = string.split("=")[0].trim();
String value = string.split("=")[1].trim();
if (key.contains("Expires")) {
SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMMM yyyy HH:mm:ss z", Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getDefault());
Date date = sdf.parse(value, new ParsePosition(0));
value = String.valueOf(date.getTime() / 1000);
} }
System.out.println(array); ck.put(key, value);
if (biliUtils == null) {
biliUtils = BiliBiliUtils.getInstance(qq);
} }
assert biliUtils != null;
JSONObject tmp = biliUtils.http_post(_url, "");
System.out.println("tmp = " + tmp);
if (tmp == null) {
cancel();
return;
} }
String sid = tmp.getString("cookie"); ck.put("gourl", bd);
sid = sid.split("sid=")[1]; ConfigTools.saveFile(new File(qq + "_bilibili.cookie"), ck.toJSONString());
sid = sid.split(";")[0];
cookie.put("sid", sid);
cookie.put("Domain", ".bilibili.com");
ConfigTools.saveFile(new File(qq + "_bilibili.cookie"), cookie.toJSONString());
cancel(); cancel();
} }
} }
}, 0, 3000); }, 1000, 3000);
} }
@@ -104,11 +96,15 @@ public class BiliLogin {
} }
public static void main(String[] args) { public static void main(String[] args) throws ParseException {
String http = "{\"code\":0,\"message\":\"0\",\"ttl\":1,\"data\":{\"url\":\"https://passport.biligame.com/x/passport-login/web/crossDomain?DedeUserID=96300&DedeUserID__ckMd5=c506a12068157a3a&Expires=1720252437&SESSDATA=c383a8e0,1720252437,9ba5c*11CjCBp3_j-6zYtK27tzUVrmFZNgjyeDW6pcdfmRBJU5cVfz4OhVmujjKCZsGAkXL6ll8SVnplZ2JONlBleHdFOGgzUzNJYUxIbzJwRVhTYVM2LWVuQnJyQVQxQnRWTUFZbUYybV95Y1RELTdGeF9mNlpXV3RDTjdsMVBaYkhxZGZyblRkTUJCMGV3IIEC&bili_jct=e786885293c24eb7198dc0538b56d6d8&gourl=https%3A%2F%2Fwww.bilibili.com\",\"refresh_token\":\"347b83e7c4a1e24f4681f06f28f71b11\",\"timestamp\":1704700437058,\"code\":0,\"message\":\"\"},\"cookie\":\";SESSDATA=c383a8e0%2C1720252437%2C9ba5c%2A11CjCBp3_j-6zYtK27tzUVrmFZNgjyeDW6pcdfmRBJU5cVfz4OhVmujjKCZsGAkXL6ll8SVnplZ2JONlBleHdFOGgzUzNJYUxIbzJwRVhTYVM2LWVuQnJyQVQxQnRWTUFZbUYybV95Y1RELTdGeF9mNlpXV3RDTjdsMVBaYkhxZGZyblRkTUJCMGV3IIEC; Path=/; Domain=bilibili.com; Expires=Sat, 06 Jul 2024 07:53:57 GMT; HttpOnly; Secure;bili_jct=e786885293c24eb7198dc0538b56d6d8; Path=/; Domain=bilibili.com; Expires=Sat, 06 Jul 2024 07:53:57 GMT;DedeUserID=96300; Path=/; Domain=bilibili.com; Expires=Sat, 06 Jul 2024 07:53:57 GMT;DedeUserID__ckMd5=c506a12068157a3a; Path=/; Domain=bilibili.com; Expires=Sat, 06 Jul 2024 07:53:57 GMT;sid=ger7871m; Path=/; Domain=bilibili.com; Expires=Sat, 06 Jul 2024 07:53:57 GMT\"}";
JSONObject body = JSON.parseObject(http);
BiliLogin login = new BiliLogin(583819556L); BiliLogin login = new BiliLogin(583819556L);
boolean testLogin = login.testLogin(); boolean testLogin = login.testLogin();
System.out.println("testLogin = " + testLogin); System.out.println("testLogin = " + testLogin);
// JSONObject json = login.login(); System.out.println(BiliBiliUtils.getInstance(583819556L).getLoginInfo());
//JSONObject json = login.login();
//System.out.println("json = " + json);
// QRCodeUtils.createQRCode("bili_login", json.getString("url")); // QRCodeUtils.createQRCode("bili_login", json.getString("url"));
} }
} }

View File

@@ -0,0 +1,30 @@
package com.yutou.qqbot.data.baidu;
import lombok.Data;
@Data
public class Message {
private String role = "user";
private String content;
public Message() {
}
public boolean checkIsUser() {
return "user".equals(role);
}
public static Message create(String message) {
return create(message, false);
}
public static Message create(String message, boolean isGTP) {
Message msg = new Message();
msg.content = message;
if (isGTP) {
msg.role = "assistant";
}
return msg;
}
}

View File

@@ -0,0 +1,17 @@
package com.yutou.qqbot.data.baidu;
import lombok.Data;
@Data
public class ResponseMessage {
private String id;
private String object;
private long created;
private String result;
private boolean isTruncated;
private boolean needClearHistory;
private Message usage;
public ResponseMessage() {
}
}

View File

@@ -0,0 +1,50 @@
package com.yutou.qqbot.data.bili;
import lombok.Data;
@Data
public class EPInfo {
private int code;
private String message;
private MediaResult result;
@Data
public static class MediaResult {
private Media media;
// getters and setters
}
@Data
public static class Media {
private String cover;
private String horizontal_picture;
private int media_id;
private NewEp new_ep;
private Rating rating;
private int season_id;
private String share_url;
private String title;
private int type;
private String type_name;
// getters and setters
}
@Data
public static class NewEp {
private int id;
private String index;
private String index_show;
// getters and setters
}
@Data
public static class Rating {
private int count;
private double score;
// getters and setters
}
}

View File

@@ -271,7 +271,7 @@ public class TurnipProphet extends Model {
out.append("网页版:").append("\n").append(url).append("\n"); out.append("网页版:").append("\n").append(url).append("\n");
out.append("祝好运 :)"); out.append("祝好运 :)");
Log.i("TurnipProphet", out.toString()); Log.i("TurnipProphet", out.toString()+"\n 发送QQ"+sendQQ);
QQBotManager.getInstance().sendMessage(sendQQ, getMessage(out.toString())); QQBotManager.getInstance().sendMessage(sendQQ, getMessage(out.toString()));
return prArray.getJSONObject(0).getString(TurnipData.MODEL); return prArray.getJSONObject(0).getString(TurnipData.MODEL);
} }

View File

@@ -39,8 +39,9 @@ public class BiliBiliLive extends Model {
public synchronized void onTime(Long qq, String time) { public synchronized void onTime(Long qq, String time) {
super.onTime(qq, time); super.onTime(qq, time);
if ("00:01:00".equals(time)) { if ("00:01:00".equals(time)) {
if (!new BiliLogin(qq).testLogin()) { if (!new BiliLogin(QQBotManager.defQQ).testLogin()) {
new BiliLogin(QQBotManager.defQQ).loginAsQQ(); new BiliLogin(QQBotManager.defQQ).loginAsQQ();
System.out.println(BiliBiliUtils.getInstance(QQBotManager.defQQ).getLoginInfo());
return; return;
} }
signLive(QQBotManager.defQQ, qq); signLive(QQBotManager.defQQ, qq);
@@ -66,12 +67,12 @@ public class BiliBiliLive extends Model {
builder.append("BiliLiveSign").append(id).append(":").append(sign).append("\n"); builder.append("BiliLiveSign").append(id).append(":").append(sign).append("\n");
} }
QQBotManager.getInstance().sendMessage(sendQQ, builder.toString()); QQBotManager.getInstance().sendMessage(sendQQ, builder.toString());
BiliBiliAppUtils appUtils = new BiliBiliAppUtils(QQBotManager.defQQ); /* BiliBiliAppUtils appUtils = new BiliBiliAppUtils(QQBotManager.defQQ);
AppUserTask oldTask = appUtils.startAppTask(); AppUserTask oldTask = appUtils.startAppTask();
AppUserTask newTask = appUtils.getTaskProgress(); AppUserTask newTask = appUtils.getTaskProgress();
builder = new StringBuilder(); builder = new StringBuilder();
builder.append("执行APP任务").append("\n").append(AppUserTask.toMessageFormat(oldTask, newTask)); builder.append("执行APP任务").append("\n").append(AppUserTask.toMessageFormat(oldTask, newTask));
QQBotManager.getInstance().sendMessage(sendQQ, builder.toString()); QQBotManager.getInstance().sendMessage(sendQQ, builder.toString());*/
} }
@Override @Override

View File

@@ -2,15 +2,16 @@ package com.yutou.qqbot.models.BiliBili;
import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.yutou.bilibili.api.VideoApi;
import com.yutou.qqbot.Annotations.UseModel; import com.yutou.qqbot.Annotations.UseModel;
import com.yutou.qqbot.QQBotManager; import com.yutou.qqbot.QQBotManager;
import com.yutou.qqbot.QQNumberManager;
import com.yutou.qqbot.bilibili.*; import com.yutou.qqbot.bilibili.*;
import com.yutou.qqbot.interfaces.ObjectInterface; import com.yutou.qqbot.interfaces.ObjectInterface;
import com.yutou.qqbot.models.Model; import com.yutou.qqbot.models.Model;
import com.yutou.qqbot.utlis.AppTools; import com.yutou.qqbot.utlis.*;
import com.yutou.qqbot.utlis.ConfigTools; import net.mamoe.mirai.event.events.MessageEvent;
import com.yutou.qqbot.utlis.HttpTools; import net.mamoe.mirai.message.data.QuoteReply;
import com.yutou.qqbot.utlis.StringUtils;
import java.io.File; import java.io.File;
import java.io.FileWriter; import java.io.FileWriter;
@@ -39,7 +40,7 @@ public class BiliVideo extends Model {
@Override @Override
public boolean isUserPublic() { public boolean isUserPublic() {
return false; return true;
} }
@Override @Override
@@ -52,6 +53,56 @@ public class BiliVideo extends Model {
return "B站视频下载"; return "B站视频下载";
} }
@Override
public void onMessage(Long qq, MessageEvent event, boolean isGroup) {
super.onMessage(qq, event, isGroup);
if (event.getMessage().serializeToMiraiCode().contains("mirai:app")) {
int id = event.getSource().getIds()[0];
String json = event.getMessage().get(1).contentToString();
System.out.println("id = " + id);
System.out.println("json = " + json);
RedisTools.set("qq_msg_id_" + id, json, 60 * 60 * 2);
} else if (isAt()) {
if (event.getMessage().get(1) instanceof QuoteReply) {
int id = ((QuoteReply) event.getMessage().get(1)).getSource().getIds()[0];
if (msg.contains("省流") || msg.contains("总结")) {
String value = onAIVideo(id);
if(!StringUtils.isEmpty(value)){
QQBotManager.getInstance().sendMessage(qq,value);
}
}
}
}
}
private String onAIVideo(int id) {
String string = RedisTools.get("qq_msg_id_" + id);
//RedisTools.remove("qq_msg_id_"+id);
String url = null;
if (StringUtils.isEmpty(string)) {
url = ((QuoteReply) event.getMessage().get(1)).getSource().getOriginalMessage().contentToString();
} else {
JSONObject json = JSONObject.parseObject(string);
if (json.containsKey("ver")) {
url = json.getJSONObject("meta").getJSONObject("detail_1").getString("qqdocurl");
}
}
if (StringUtils.isEmpty(url)) {
return "地址不正确";
}
if (url.startsWith("BV")) {
url = "https://www.bilibili.com/video/" + url.trim();
}
if (!url.startsWith("https://www.bilibili.com/video/") && !url.startsWith("https://b23.tv")) {
return "这是B站吗?";
}
String ai = BiliBiliAppUtils.getVideoAI(url.trim());
if (!StringUtils.isEmpty(ai)) {
return ai;
}
return "省流失败";
}
public void downVideo(String url) { public void downVideo(String url) {
downVideo(url, true, false); downVideo(url, true, false);
} }
@@ -108,7 +159,7 @@ public class BiliVideo extends Model {
json.put("avid", infoData.getLong("aid")); json.put("avid", infoData.getLong("aid"));
if (eps.containsKey("cid")) { if (eps.containsKey("cid")) {
json.put("cid", eps.getLong("cid")); json.put("cid", eps.getLong("cid"));
json.put("qn", 127); json.put("qn", 125);
json.put("fnval", 80); json.put("fnval", 80);
json.put("fourk", 1); json.put("fourk", 1);
downVideo(json, eps); downVideo(json, eps);
@@ -122,7 +173,7 @@ public class BiliVideo extends Model {
JSONObject item = (JSONObject) o; JSONObject item = (JSONObject) o;
json.put("avid", item.getLong("aid")); json.put("avid", item.getLong("aid"));
json.put("cid", item.getLong("cid")); json.put("cid", item.getLong("cid"));
json.put("qn", 127); json.put("qn", 125);
json.put("fnval", 80); json.put("fnval", 80);
json.put("fourk", 1); json.put("fourk", 1);
item.put("title", eps.getString("title") + "$(File.separator)" + item.getString("title")); item.put("title", eps.getString("title") + "$(File.separator)" + item.getString("title"));
@@ -209,7 +260,8 @@ public class BiliVideo extends Model {
if (tmp.exists()) { if (tmp.exists()) {
return; return;
} }
JSONObject http = biliUtils.http("https://api.bilibili.com/x/player/playurl?" + HttpTools.toUrlParams(json), BiliBiliUtils.HTTP.GET, null, BiliBiliUtils.RET_MODEL.JSON); TreeMap<String,String> body=BiliBiliWbiSign.getWbiSign(json);
JSONObject http = biliUtils.http(VideoApi.VIDEO_PLAY_URL_V2+"?" + HttpTools.toUrlParams(body), BiliBiliUtils.HTTP.GET, null, BiliBiliUtils.RET_MODEL.JSON);
if (http.getInteger("code") == 0) { if (http.getInteger("code") == 0) {
JSONObject data = http.getJSONObject("data"); JSONObject data = http.getJSONObject("data");
JSONObject dash = data.getJSONObject("dash"); JSONObject dash = data.getJSONObject("dash");
@@ -347,17 +399,14 @@ public class BiliVideo extends Model {
return json; return json;
} }
public static void main(String[] args) { public static void main(String[] args) {
BiliVideo video = new BiliVideo(QQBotManager.defQQ); BiliVideo video = new BiliVideo(QQBotManager.defQQ);
JSONObject login = new BiliLogin(QQBotManager.defQQ).login();
System.out.println(login);
//岚少 480 //岚少 480
//video.downVideo("https://www.bilibili.com/video/BV1Ps411m7pt?spm_id_from=333.999.0.0"); //video.downVideo("https://www.bilibili.com/video/BV1Ps411m7pt?spm_id_from=333.999.0.0");
//唐诱 合集 //唐诱 合集
//video.downVideo("https://www.bilibili.com/video/BV1Vv4y1K7ox?spm_id_from=444.41.top_right_bar_window_default_collection.content.click"); //video.downVideo("https://www.bilibili.com/video/BV1Vv4y1K7ox?spm_id_from=444.41.top_right_bar_window_default_collection.content.click");
//邦邦 长视频 //邦邦 长视频
// video.downVideo("https://www.bilibili.com/video/BV1w5411271A?spm_id_from=444.41.list.card_archive.click"); video.downVideo("https://www.bilibili.com/video/BV1w5411271A?spm_id_from=444.41.list.card_archive.click");
//LK 超清4k hdr //LK 超清4k hdr
//video.downVideo("https://www.bilibili.com/video/BV1uZ4y1U7h8/?spm_id_from=333.788.recommend_more_video.-1"); //video.downVideo("https://www.bilibili.com/video/BV1uZ4y1U7h8/?spm_id_from=333.788.recommend_more_video.-1");
// hdr // hdr
@@ -366,7 +415,7 @@ public class BiliVideo extends Model {
//video.downVideo("https://www.bilibili.com/video/BV1qF411T7Vf?spm_id_from=444.41.list.card_archive.click"); //video.downVideo("https://www.bilibili.com/video/BV1qF411T7Vf?spm_id_from=444.41.list.card_archive.click");
//唐诱正片 //唐诱正片
//video.downVideo("https://www.bilibili.com/video/BV1L44y147zR?spm_id_from=333.999.0.0");// ep1 //video.downVideo("https://www.bilibili.com/video/BV1L44y147zR?spm_id_from=333.999.0.0");// ep1
video.downVideo("https://www.bilibili.com/video/BV18L4y1H7rz?spm_id_from=333.999.0.0", true, false);// ep5 //video.downVideo("https://www.bilibili`.com/video/BV1Zu4y1B7DU/?spm_id_from=333.337.search-card.all.click", true, false);// ep5
// video.downVideo("https://www.bilibili.com/video/BV1SL411g7FS/?spm_id_from=333.788.recommend_more_video.0"); //all ig 1\5 // video.downVideo("https://www.bilibili.com/video/BV1SL411g7FS/?spm_id_from=333.788.recommend_more_video.0"); //all ig 1\5
// video.downVideo("https://www.bilibili.com/video/BV18L4y1H7rz?spm_id_from=333.999.0.0"); // video.downVideo("https://www.bilibili.com/video/BV18L4y1H7rz?spm_id_from=333.999.0.0");
@@ -374,6 +423,7 @@ public class BiliVideo extends Model {
// int a=16|2048; // int a=16|2048;
// System.out.println("a = " + a); // System.out.println("a = " + a);
//video.downDanmu(428855000L,976216102L,"【都市_情感】《唐可可的诱惑》第一集",1); //video.downDanmu(428855000L,976216102L,"【都市_情感】《唐可可的诱惑》第一集",1);
//video.downVideo("https://www.bilibili.com/bangumi/play/ep776259", false, false);// ep5
System.out.println("事件结束"); System.out.println("事件结束");
} }
} }

View File

@@ -0,0 +1,45 @@
package com.yutou.qqbot.models.Commands;
import com.yutou.qqbot.Annotations.UseModel;
import com.yutou.qqbot.QQBotManager;
import com.yutou.qqbot.data.baidu.ResponseMessage;
import com.yutou.qqbot.models.Model;
import com.yutou.qqbot.utlis.BaiduGPTManager;
import net.mamoe.mirai.event.events.MessageEvent;
@UseModel
public class BaiduGPT extends Model {
@Override
public boolean isUserPublic() {
return true;
}
@Override
public String[] getUsePowers() {
return new String[]{
QQGroupCommands.GPT,
QQGroupCommands.GPT_CLEAR
};
}
@Override
public String getModelName() {
return "百度文言一心GPT";
}
@Override
public void onMessage(Long qq, MessageEvent event, boolean isGroup) {
super.onMessage(qq, event, isGroup);
if (msg.equals(QQGroupCommands.GPT_CLEAR)) {
BaiduGPTManager.getManager().clear();
QQBotManager.getInstance().sendMessage(qq, "已经失忆捏");
} else if (isAt()) {
if(msg.contains("省流")|| msg.contains("总结")){
return;
}
ResponseMessage message = BaiduGPTManager.getManager().sendMessage(String.valueOf(user), msg.replace("@2476945931", "").trim());
QQBotManager.getInstance().sendMessage(qq, message.getResult());
}
}
}

View File

@@ -41,7 +41,7 @@ public class Moyu extends Model {
@Override @Override
public synchronized void onTime(Long qq, String time) { public synchronized void onTime(Long qq, String time) {
super.onTime(qq, time); super.onTime(qq, time);
if ("07:00:00".equals(time)) { if ("09:50:00".equals(time)) {
downloadImage(false, qq); downloadImage(false, qq);
} }
if ("10:00:00".equals(time)) { if ("10:00:00".equals(time)) {

View File

@@ -35,15 +35,20 @@ public class WoodenFish extends Model {
@Override @Override
public void onMessage(Long qq, MessageEvent event, boolean isGroup) { public void onMessage(Long qq, MessageEvent event, boolean isGroup) {
super.onMessage(qq, event, isGroup); super.onMessage(qq, event, isGroup);
File file = null;
if(msg.contains("地狱笑话")){ if(msg.contains("地狱笑话")){
File file=new File("muyu.mp3"); file=new File("muyu.mp3");
QQBotManager.getInstance().sendMessage(qq,"功德+1");
}else if(msg.contains("遥遥领先")){
file=new File("遥遥领先.silk");
}
if(file!=null){
if(file.exists()) { if(file.exists()) {
OfflineAudio audio = Objects.requireNonNull(event.getBot().getGroup(qq)).uploadAudio(ExternalResource.create(file)); OfflineAudio audio = Objects.requireNonNull(event.getBot().getGroup(qq)).uploadAudio(ExternalResource.create(file));
MessageChainBuilder builder = new MessageChainBuilder(); MessageChainBuilder builder = new MessageChainBuilder();
builder.append(audio); builder.append(audio);
QQBotManager.getInstance().sendMessage(qq,builder); QQBotManager.getInstance().sendMessage(qq,builder);
} }
QQBotManager.getInstance().sendMessage(qq,"功德+1");
} }
} }
} }

View File

@@ -3,6 +3,7 @@ package com.yutou.qqbot.models;
import com.yutou.qqbot.QQBotManager; import com.yutou.qqbot.QQBotManager;
import com.yutou.qqbot.QQNumberManager; import com.yutou.qqbot.QQNumberManager;
import com.yutou.qqbot.interfaces.ModelInterface; import com.yutou.qqbot.interfaces.ModelInterface;
import com.yutou.qqbot.utlis.ConfigTools;
import net.mamoe.mirai.Bot; import net.mamoe.mirai.Bot;
import net.mamoe.mirai.event.events.GroupMessageEvent; import net.mamoe.mirai.event.events.GroupMessageEvent;
import net.mamoe.mirai.event.events.MessageEvent; import net.mamoe.mirai.event.events.MessageEvent;
@@ -44,6 +45,9 @@ public abstract class Model implements ModelInterface {
public final static String QQ_WOODEN = "!电子木鱼"; public final static String QQ_WOODEN = "!电子木鱼";
public final static String QQ_TIMEOUT = "!timer"; public final static String QQ_TIMEOUT = "!timer";
public final static String GPT="!百度gpt";
public final static String GPT_CLEAR="!百度失忆";
} }
public static class QQFromCommands { public static class QQFromCommands {
@@ -61,6 +65,7 @@ public abstract class Model implements ModelInterface {
public static List<Class<?>> classList; public static List<Class<?>> classList;
long group; long group;
public MessageEvent event;
static { static {
classList = new ArrayList<>(); classList = new ArrayList<>();
@@ -79,6 +84,7 @@ public abstract class Model implements ModelInterface {
public Long user; public Long user;
public void onMessage(Long qq, MessageEvent event, boolean isGroup) { public void onMessage(Long qq, MessageEvent event, boolean isGroup) {
this.event=event;
msg = event.getMessage().contentToString(); msg = event.getMessage().contentToString();
msg = msg.replace("", "!").trim(); msg = msg.replace("", "!").trim();
this.isGroup = isGroup; this.isGroup = isGroup;
@@ -117,4 +123,7 @@ public abstract class Model implements ModelInterface {
chain.add(text); chain.add(text);
return chain; return chain;
} }
public boolean isAt(){
return msg.contains("@"+ ConfigTools.load(ConfigTools.CONFIG,"qq_number",String.class));
}
} }

View File

@@ -44,7 +44,7 @@ public class BaiHeHui extends Model {
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
QQBotManager.getInstance().sendMessage(QQBotManager.defGroup, "百合会签到失败:" + AppTools.getExceptionString(e)); QQBotManager.getInstance().sendMessage(QQBotManager.defGroup, "百合会签到失败:" + AppTools.getExceptionString(e));
}finally { } finally {
WebClient.getInstance().quit(); WebClient.getInstance().quit();
} }
} }
@@ -53,7 +53,7 @@ public class BaiHeHui extends Model {
public boolean sign() { public boolean sign() {
WebDriver driver = WebClient.getInstance().getWebDriver(); WebDriver driver = WebClient.getInstance().getWebDriver();
try { try {
driver.manage().timeouts().implicitlyWait( Duration.ofSeconds(5)); driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
driver.get("https://bbs.yamibo.com/forum.php"); driver.get("https://bbs.yamibo.com/forum.php");
login(driver); login(driver);
// driver.manage().deleteAllCookies(); // driver.manage().deleteAllCookies();
@@ -69,9 +69,9 @@ public class BaiHeHui extends Model {
e.printStackTrace(); e.printStackTrace();
} }
driver.navigate().refresh(); driver.navigate().refresh();
driver.get("https://bbs.yamibo.com/forum.php"); driver.get("https://bbs.yamibo.com/plugin.php?id=zqlj_sign");
for (WebElement element : driver.findElements(By.xpath("//a"))) { for (WebElement element : driver.findElements(By.xpath("//a"))) {
if ("打卡签到".equals(element.getText())) { if ("点击打卡".equals(element.getText())) {
element.click(); element.click();
break; break;
} }

View File

@@ -35,6 +35,9 @@ public class BiliBiliMangeSign extends Model {
@Override @Override
public void onMessage(Long qq, MessageEvent event, boolean isGroup) { public void onMessage(Long qq, MessageEvent event, boolean isGroup) {
super.onMessage(qq, event, isGroup); super.onMessage(qq, event, isGroup);
if(user==null){
return;
}
BiliBiliManga manga = new BiliBiliManga(user); BiliBiliManga manga = new BiliBiliManga(user);
if (msg.equals(QQFromCommands.BILI_MANGA_SIGN)) { if (msg.equals(QQFromCommands.BILI_MANGA_SIGN)) {
String msg; String msg;

View File

@@ -195,7 +195,7 @@ public class GetSeTu extends Model {
url = url.replace("&r18=0", "&r18=2").replace("&r18=1", "&r18=2"); url = url.replace("&r18=0", "&r18=2").replace("&r18=1", "&r18=2");
} }
System.out.println("url = " + url); System.out.println("url = " + url);
String ret = HttpTools.http_get(url, null, true); String ret = HttpTools.http_get(url, null, false);
JSONObject json = JSON.parseObject(ret); JSONObject json = JSON.parseObject(ret);
if (json.getJSONArray("data").size() == 0) { if (json.getJSONArray("data").size() == 0) {
return false; return false;

View File

@@ -30,12 +30,13 @@ public class ApplicationInit implements ApplicationRunner {
if (time.equals(oldTime)) { if (time.equals(oldTime)) {
return; return;
} }
BaiduGPTManager.getManager().clear();
oldTime = time; oldTime = time;
for (Class<?> model : Model.classList) { for (Class<?> model : Model.classList) {
new Thread(() -> { new Thread(() -> {
try { try {
Bot bot = QQBotManager.getInstance().getBot(); Bot bot = QQBotManager.getInstance().getBot();
if(bot==null){ if (bot == null) {
return; return;
} }
Model useModel = (Model) model.getDeclaredConstructor().newInstance(); Model useModel = (Model) model.getDeclaredConstructor().newInstance();

View File

@@ -0,0 +1,88 @@
package com.yutou.qqbot.utlis;
import com.alibaba.fastjson2.JSONObject;
import com.yutou.qqbot.data.baidu.Message;
import com.yutou.qqbot.data.baidu.ResponseMessage;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BaiduGPTManager {
private static int MAX_MESSAGE = 5;
private static BaiduGPTManager manager;
private static final String url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions";
//4.0
//private static final String url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro";
private static final String AppID = "36668599";
private static final String ApiKey = "eyHo6K2ILBm7i378701Az1eT";
private static final String SecretKey = "U4vXt8AOTM9FgB0Omft5IOh6vwhzoDgZ";
private final Map<String, List<Message>> msgMap;
private BaiduGPTManager() {
msgMap = new HashMap<>();
}
public static BaiduGPTManager getManager() {
if (manager == null) {
manager = new BaiduGPTManager();
}
return manager;
}
public int setMaxMessageCount(int count) {
MAX_MESSAGE = count;
return MAX_MESSAGE;
}
public void clear() {
msgMap.clear();
}
private String getToken() {
String _url = String.format("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s"
, ApiKey
, SecretKey
);
String get = HttpTools.get(_url);
JSONObject response = JSONObject.parseObject(get);
return response.getString("access_token");
}
public ResponseMessage sendMessage(String user, String message) {
List<Message> messages = msgMap.getOrDefault(user, new ArrayList<>());
if (messages.size() > MAX_MESSAGE * 2) {
messages.remove(0);
messages.remove(1);
}
messages.add(Message.create(message));
JSONObject json = new JSONObject();
json.put("messages", messages);
System.out.println("json = " + json);
Map<String, String> map = new HashMap<>();
map.put("Content-Type", "application/json");
map.put("Content-Length", String.valueOf(json.toJSONString().getBytes(StandardCharsets.UTF_8).length));
String post = HttpTools.http_post(url + "?access_token=" + getToken()
, json.toJSONString().getBytes(StandardCharsets.UTF_8),0,map);
System.out.println("post = " + post);
if (StringUtils.isEmpty(post)) {
clear();
return sendMessage(user, message);
}
ResponseMessage response = JSONObject.parseObject(post, ResponseMessage.class);
messages.add(Message.create(response.getResult(), true));
msgMap.put(user, messages);
System.out.println("\n\n");
return response;
}
public static void main(String[] args) throws Exception {
ResponseMessage message = BaiduGPTManager.getManager().sendMessage("test", "2023年创业什么赚钱?");
System.out.println(message.getResult());
}
}

View File

@@ -345,12 +345,7 @@ public class BangumiTools {
} }
public static void main(String[] args) { public static void main(String[] args) {
List<String> list = BangumiTools.reportSearchBangumi("处刑少女的生存之道");
/*for (String s : list) { System.out.println(BangumiTools.reportToDayBangumi());
System.out.println(s);
}*/
JSONObject test=new JSONObject();
test.put("data",JSON.toJSON(list));
System.out.println(test);
} }
} }

View File

@@ -0,0 +1,82 @@
package com.yutou.qqbot.utlis;
import com.alibaba.fastjson2.JSONObject;
import com.yutou.qqbot.QQBotManager;
import com.yutou.qqbot.bilibili.BiliBiliUtils;
import java.nio.charset.StandardCharsets;
import java.util.TreeMap;
public class BiliBiliWbiSign {
private static final byte[] MIXIN_KEY_ENC_TAB = {
46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, 33, 9, 42,
19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60,
51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, 36, 20, 34, 44, 52
};
private static String rawWbiKey;
public static TreeMap<String, String> getWbiSign(TreeMap<String, String> body) {
if (rawWbiKey == null) {
updateRawWbiKey();
try {
Thread.sleep(300);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return getWbiSign(body);
}
body.put("wts", String.valueOf(System.currentTimeMillis() / 1000));
String params = HttpTools.toUrlParams(body);
System.out.println("params = " + params);
body.put("w_rid", AppTools.getMD5(params + genMixinKey(rawWbiKey)));
return body;
}
public static TreeMap<String, String> getWbiSign(JSONObject json) {
TreeMap<String, String> body=new TreeMap<>();
for (String key : json.keySet()) {
body.put(key, json.getString(key));
}
return getWbiSign(body);
}
private static String genMixinKey(String rawWbiKey) {
byte[] rawBytes = rawWbiKey.getBytes(StandardCharsets.UTF_8);
byte[] mixinKey = new byte[32];
for (int i = 0; i < 32; i++) {
mixinKey[i] = rawBytes[MIXIN_KEY_ENC_TAB[i]];
}
return new String(mixinKey);
}
public static void updateRawWbiKey() {
JSONObject loginInfo = new BiliBiliUtils(QQBotManager.defQQ).getLoginInfo();
if (loginInfo.getInteger("code") == -1) {
rawWbiKey = null;
return;
}
JSONObject wbi = loginInfo.getJSONObject("data").getJSONObject("wbi_img");
String imgKey = wbi.getString("img_url");
String subKey = wbi.getString("sub_url");
imgKey = imgKey.substring(imgKey.lastIndexOf("/") + 1).replace(".png", "");
subKey = subKey.substring(subKey.lastIndexOf("/") + 1).replace(".png", "");
rawWbiKey = imgKey + subKey;
System.out.println(rawWbiKey);
}
public static void main(String[] args) throws Exception {
//System.out.println(genMixinKey("7cd084941338484aae1ad9425b84077c4932caff0ff746eab6f01bf08b70ac45"));
rawWbiKey = "7cd084941338484aae1ad9425b84077c4932caff0ff746eab6f01bf08b70ac45";
TreeMap<String, String> json = new TreeMap<>();
json.put("bvid", "BV1L94y1H7CV");
json.put("cid", "1335073288");
json.put("up_mid", "297242063");
json.put("web_location", "333.788");
//updateRawWbiKey();
TreeMap<String, String> sign = getWbiSign(json);
System.out.println(sign);
//https://api.bilibili.com/x/web-interface/view/conclusion/get?bvid=BV1L94y1H7CV&cid=1335073288&up_mid=297242063&web_location=333.788&w_rid=a5d90f60ac6b6b6fc9d49be3ba3fee53&wts=1705394671
//updateRawWbiKey();
}
}

View File

@@ -17,15 +17,15 @@ public class HttpTools {
private static final int HttpRequestIndex = 3; private static final int HttpRequestIndex = 3;
public static String get(String url) { public static String get(String url) {
return http_get(url, null,false); return http_get(url, null, false);
} }
public static String post(final String url, final byte[] body) { public static String post(final String url, final byte[] body) {
return http_post(url, body, 0, null); return http_post(url, body, 0, null);
} }
public static File syncDownload(final String url, final String saveName,boolean isProxy) { public static File syncDownload(final String url, final String saveName, boolean isProxy) {
return new HttpTools().http_syncDownload(url, saveName,isProxy); return new HttpTools().http_syncDownload(url, saveName, isProxy);
} }
public static String https_get(String url, Map<String, String> header) { public static String https_get(String url, Map<String, String> header) {
@@ -40,7 +40,7 @@ public class HttpTools {
return null; return null;
} }
public static String http_get(String url, Map<String, String> header,boolean isProxy) { public static String http_get(String url, Map<String, String> header, boolean isProxy) {
try { try {
HttpURLConnection connection; HttpURLConnection connection;
Proxy proxy = null; Proxy proxy = null;
@@ -48,9 +48,9 @@ public class HttpTools {
proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 7890)); proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 7890));
} }
if(proxy==null) { if (proxy == null) {
connection = (HttpURLConnection) new URL(url).openConnection(); connection = (HttpURLConnection) new URL(url).openConnection();
}else{ } else {
connection = (HttpURLConnection) new URL(url).openConnection(proxy); connection = (HttpURLConnection) new URL(url).openConnection(proxy);
} }
return urlConnection(header, connection); return urlConnection(header, connection);
@@ -95,8 +95,8 @@ public class HttpTools {
connection.setDoOutput(true); connection.setDoOutput(true);
connection.setDoInput(true); connection.setDoInput(true);
connection.addRequestProperty("User-Agent", getExtUa()); connection.addRequestProperty("User-Agent", getExtUa());
connection.setConnectTimeout(5 * 1000); // connection.setConnectTimeout(5 * 1000);
connection.setReadTimeout(10 * 1000); // connection.setReadTimeout(10 * 1000);
//connection.addRequestProperty("Connection", "keep-alive"); //connection.addRequestProperty("Connection", "keep-alive");
//connection.addRequestProperty("User-Agent", getExtUa()); //connection.addRequestProperty("User-Agent", getExtUa());
//connection.addRequestProperty("content-type", "application/json"); //connection.addRequestProperty("content-type", "application/json");
@@ -119,10 +119,10 @@ public class HttpTools {
reader.close(); reader.close();
return finalStr; return finalStr;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace();
if (index < HttpRequestIndex) { if (index < HttpRequestIndex) {
return http_post(url, body, index + 1, headers); return http_post(url, body, index + 1, headers);
} else { } else {
e.printStackTrace();
return null; return null;
} }
} }
@@ -153,8 +153,9 @@ public class HttpTools {
string = new StringBuilder(string.substring(1, string.length()).replaceAll(" ", "")); string = new StringBuilder(string.substring(1, string.length()).replaceAll(" ", ""));
return string.toString(); return string.toString();
} }
public static String toUrlParams(Map<String,String> map) {
StringBuilder builder=new StringBuilder(); public static String toUrlParams(Map<String, String> map) {
StringBuilder builder = new StringBuilder();
for (String key : map.keySet()) { for (String key : map.keySet()) {
builder.append(key).append("=").append(map.get(key)).append("&"); builder.append(key).append("=").append(map.get(key)).append("&");
} }
@@ -174,7 +175,7 @@ public class HttpTools {
} }
public static void main(String[] args) { public static void main(String[] args) {
File file = syncDownload("https://lain.bgm.tv/pic/cover/l/6c/2a/302128_qQIjG.jpg", "12345.jpg",false); File file = syncDownload("https://lain.bgm.tv/pic/cover/l/6c/2a/302128_qQIjG.jpg", "12345.jpg", false);
System.out.println("file.length() = " + file.length()); System.out.println("file.length() = " + file.length());
} }
@@ -246,8 +247,8 @@ public class HttpTools {
if (downloadInterface != null) { if (downloadInterface != null) {
if (oldJar.exists()) { if (oldJar.exists()) {
downloadInterface.onDownload(oldJar); downloadInterface.onDownload(oldJar);
}else{ } else {
downloadInterface.onError(new FileNotFoundException("文件下载失败, 网络大小 = "+fileSize+" 本地大小 = "+oldJar.length())); downloadInterface.onError(new FileNotFoundException("文件下载失败, 网络大小 = " + fileSize + " 本地大小 = " + oldJar.length()));
} }
} }
@@ -265,7 +266,7 @@ public class HttpTools {
}).start(); }).start();
} }
public synchronized File http_syncDownload(final String url, final String saveName,boolean isProxy) { public synchronized File http_syncDownload(final String url, final String saveName, boolean isProxy) {
if (StringUtils.isEmpty(url)) { if (StringUtils.isEmpty(url)) {
return null; return null;
} }
@@ -282,9 +283,9 @@ public class HttpTools {
Log.i("DOWNLOAD", "下载文件:" + url + " 保存文件:" + saveName); Log.i("DOWNLOAD", "下载文件:" + url + " 保存文件:" + saveName);
HttpURLConnection connection; HttpURLConnection connection;
if(proxy==null) { if (proxy == null) {
connection = (HttpURLConnection) new URL(url).openConnection(); connection = (HttpURLConnection) new URL(url).openConnection();
}else{ } else {
connection = (HttpURLConnection) new URL(url).openConnection(proxy); connection = (HttpURLConnection) new URL(url).openConnection(proxy);
} }
connection.addRequestProperty("User-Agent", getExtUa()); connection.addRequestProperty("User-Agent", getExtUa());