【Java】BiliBiliLeader B站全自动挂机工具(Web版)
本帖最后由 陈浩 于 2020-12-1 10:36 编辑BiliBiliLeader B站全自动挂机工具
近期看B站挂机工具火爆,利用业余时间,自己写了个Web版的挂机工具。
全程调用API ,基本上没啥难点,但凡是个程序员都能写,不过得是有时间的程序员。
源码已发布到github,大家可以下载研究一下,也可以二开加上一些没有的功能或者接口。
github:https://github.com/957153124/BiliBiliLeader
自己使用白嫖的服务器搭建了个演示地址:http://gxe.me演示账号:test,密码:123
服务器因为是白嫖的 无防御,相信各位大侠都是有武德的.
系统图片
实现也很简单.不信你看.
基本实现
/**
* 获取指定分区最新视频
* @Param SESSDATA
* @param ps //每页数量
* @return
* @throws IOException
*/
public static List<VideoList> video(String SESSDATA,int ps) throws IOException {
String videoPath = "http://api.bilibili.com/x/web-interface/dynamic/region?rid=21&ps="+ps+"&pn=1";//获取分区视频排行榜列表
String cookie = "SESSDATA="+SESSDATA+";";
JSONObject videoObject = sendHttpGet(videoPath,cookie);
VideoApi videoApi = JSON.parseObject(videoObject.toJSONString(), VideoApi.class);
List<VideoList> videoList = videoApi.getData().getArchives();
return videoList;
}
/**
* 投币接口
* @param SESSDATA
* @param csrf
* @param bvid
* @return
*/
public static String toubi(String SESSDATA, String csrf, String bvid) {
String toubiPath = "http://api.bilibili.com/x/web-interface/coin/add";//投币
String cookie = "SESSDATA="+SESSDATA+";";
HashMap<String,String> toubiMap = new HashMap<>();
toubiMap.put("bvid",bvid);
toubiMap.put("multiply","1");
toubiMap.put("csrf",csrf);
JSONObject toubiMapObject = sendHttpPost(toubiPath,toubiMap,cookie);
ToubiApi toubiApi = JSON.parseObject(toubiMapObject.toJSONString(), ToubiApi.class);
System.out.println("消息提醒:"+ toubiApi.getMessage());
return toubiApi.getMessage();
}
/**
* 登录接口
* @param SESSDATA
* @return
* @throws IOException
*/
public static LoginData login(String SESSDATA) throws IOException {
String loginPath = "http://api.bilibili.com/x/web-interface/nav";//投币
String cookie = "SESSDATA="+SESSDATA+";";
JSONObject toubiMapObject = sendHttpGet(loginPath,cookie);
LoginApi loginApi = JSON.parseObject(toubiMapObject.toJSONString(), LoginApi.class);
LoginData loginData = loginApi.getData();
return loginData;
}
/**
* 验证视频是否已经投币过一次
* @param SESSDATA
* @param bvid
* @return
* @throws IOException
*/
public static boolean verificationVideo(String SESSDATA,String bvid) throws IOException {
String verificationVideoPath = "http://api.bilibili.com/x/web-interface/archive/coins?bvid="+bvid;//投币
String cookie = "SESSDATA="+SESSDATA+";";
JSONObject verificationVideoMapObject = sendHttpGet(verificationVideoPath,cookie);
VerificationVideo verificationVideo = JSON.parseObject(verificationVideoMapObject.toJSONString(), VerificationVideo.class);
VerificationVideoData verificationVideoData = verificationVideo.getData();
if(verificationVideoData.getMultiply()==0){
return true;
}else{
return false;
}
}
/**
* 获取登录二维码链接
* @return
* @throws IOException
*/
public static UrlData bilibiliCode() throws IOException {
String bilibiliCodePath = "http://passport.bilibili.com/qrcode/getLoginUrl";//投币
JSONObject bilibiliCodeObject = sendHttpGet(bilibiliCodePath,null);
Url url = JSON.parseObject(bilibiliCodeObject.toJSONString(), Url.class);
UrlData urlData = url.getData();
return urlData;
}
/**
* 验证并接收二维码登录信息(Cookie)
* @param oauthKey
* @return
* @throws IOException
*/
public static Object bilibiliLoginInfo(String oauthKey) throws IOException {
String bilibiliCodePath = "http://passport.bilibili.com/qrcode/getLoginInfo?oauthKey="+oauthKey;//投币
HashMap<String,String> bilibiliLoginInfoMap = new HashMap<>();
bilibiliLoginInfoMap.put("oauthKey",oauthKey);
JSONObject bilibiliCodeObject = sendHttpPost(bilibiliCodePath,bilibiliLoginInfoMap,null);
LoginInfoData loginInfoData = null;
Integer num = null;
if(bilibiliCodeObject.get("data").getClass().equals(Integer.class)){
LoginInfoInteger loginInfoInteger = JSON.parseObject(bilibiliCodeObject.toJSONString(), LoginInfoInteger.class);
num = loginInfoInteger.getData();
}else{
LoginInfo loginInfo = JSON.parseObject(bilibiliCodeObject.toJSONString(), LoginInfo.class);
loginInfoData = loginInfo.getData();
}
if(null!=num){
return num;
}else{
return loginInfoData;
}
}
/**
* 观看视频接口
* @param SESSDATA
* @param bvid
* @return
* @throws IOException
*/
public static VideoPlay videoPlay(String SESSDATA,String bvid) throws IOException {
String videoPlayPath = "https://api.bilibili.com/x/click-interface/web/heartbeat?played_time=16&bvid="+bvid;//投币
HashMap<String,String> videoPlayPathMap = new HashMap<>();
videoPlayPathMap.put("played_time","16");
videoPlayPathMap.put("bvid",bvid);
String cookie = "SESSDATA="+SESSDATA+";";
JSONObject bilibiliCodeObject = sendHttpPost(videoPlayPath,videoPlayPathMap,cookie);
VideoPlay videoPlay= JSON.parseObject(bilibiliCodeObject.toJSONString(), VideoPlay.class);
return videoPlay;
}
/**
* 分享视频接口
* @param csrf
* @param SESSDATA
* @param bvid
* @return
* @throws IOException
*/
public static VideoShare videoShare(String csrf,String SESSDATA,String bvid) throws IOException {
String videoSharePath = "https://api.bilibili.com/x/web-interface/share/add";//投币
HashMap<String,String> videoShareMap = new HashMap<>();
videoShareMap.put("csrf",csrf);
videoShareMap.put("bvid",bvid);
String cookie = "SESSDATA="+SESSDATA+";";
JSONObject bilibiliCodeObject = sendHttpPost(videoSharePath,videoShareMap,cookie);
VideoShare videoShare= JSON.parseObject(bilibiliCodeObject.toJSONString(), VideoShare.class);
return videoShare;
}
/**
* 直播中心签到接口
* @param SESSDATA
* @return
* @throws IOException
*/
public static Sign sign(String SESSDATA) throws IOException {
String videoSharePath = "https://api.live.bilibili.com/xlive/web-ucenter/v1/sign/DoSign";//投币
String cookie = "SESSDATA="+SESSDATA+";";
JSONObject bilibiliCodeObject = sendHttpGet(videoSharePath,cookie);
Sign sign= JSON.parseObject(bilibiliCodeObject.toJSONString(), Sign.class);
return sign;
}
/**
* 查看当日投了几个币(上限5个)
* @param SESSDATA
* @return
* @throws IOException
*/
public static ToubiVerification toubiVerification(String SESSDATA) throws IOException {
String videoSharePath = "https://api.bilibili.com/x/web-interface/coin/today/exp";//投币
String cookie = "SESSDATA="+SESSDATA+";";
JSONObject bilibiliCodeObject = sendHttpGet(videoSharePath,cookie);
ToubiVerification toubiVerification= JSON.parseObject(bilibiliCodeObject.toJSONString(), ToubiVerification.class);
return toubiVerification;
}
/**
* server酱 还没写
* @param SCKEY
* @param list
* @throws IOException
*/
public static void serverJ(String SCKEY,List<String> list) throws IOException {
String desp= "";
for(String serverJ :list){
desp+=serverJ;
}
String serverJPath = "https://sc.ftqq.com/"+SCKEY+".send?text=BiliBili每日任务日报 -gxe.me&desp="+desp;
sendHttpGet(serverJPath,null);
}
/**
* post请求
* @param url
* @param params
* @param cookie
* @return
*/
public static JSONObject sendHttpPost(String url, HashMap<String, String> params, String cookie){
URL realUrl = null;
InputStream in = null;
HttpURLConnection conn = null;
StringBuffer sb = new StringBuffer();
if(params != null){
//将哈希表参数转化为字符串
for(Map.Entry<String,String>e :params.entrySet()){
sb.append(e.getKey());
sb.append("=");
sb.append(e.getValue());
sb.append("&");
}
sb=sb.deleteCharAt(sb.length() - 1);
}
String stringParams = sb.toString();
//发送请求
try{
realUrl = new URL(url);
conn = (HttpURLConnection)realUrl.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Cookie", cookie);
conn.setRequestProperty("User-Agent", "BiLiBiLiLeader/1.0.0 (957153124@qq.com)");
PrintWriter pw = new PrintWriter(conn.getOutputStream());
pw.print(stringParams);
pw.flush();
pw.close();
in = conn.getInputStream();//获得返回的输入流
}catch(Exception e){
e.printStackTrace();
}
BufferedReader br = new BufferedReader(new InputStreamReader(in));
StringBuffer buffer = new StringBuffer();
String line = "";
try {
while ((line = br.readLine()) != null) {
buffer.append(line);
}
}catch(Exception e){
e.printStackTrace();
}
String result = buffer.toString();//返回低字符串
JSONObject josonResult = null;
try{
josonResult = JSONObject.parseObject(result);
}catch (Exception e){
e.printStackTrace();
}
return josonResult;
}
/**
* get请求
* @param url
* @param cookie
* @return
* @throws IOException
*/
public static JSONObject sendHttpGet(String url, String cookie) throws IOException {
URL urlGet = new URL(url);
HttpURLConnection conn =(HttpURLConnection) urlGet.openConnection();
conn.setRequestMethod("GET");
if(cookie!=null){
conn.setRequestProperty("Cookie", cookie);
}
conn.setRequestProperty("User-Agent", "BiLiBiLiLeader/1.0.0 (957153124@qq.com)");
conn.setDoInput(true);
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder buffer = new StringBuilder();
String line = "";
try {
while ((line = br.readLine()) != null) {
buffer.append(line);
}
}catch(Exception e){
e.printStackTrace();
}
String result = buffer.toString();//返回低字符串
JSONObject josonResult = null;
try{
josonResult = JSONObject.parseObject(result);
}catch (Exception e){
e.printStackTrace();
}
return josonResult;
}
//每日24点01分触发
@Scheduled(cron="0 1 0 * * ?")
public void bilibiliTasks() throws IOException {
List<Admin> adminList = adminService.selectAll();
for(Admin admin:adminList){
List<String> strings = new ArrayList<>();
if(admin.getUserId() !=null && admin.getSESSDATA()!=null && admin.getCsrf()!=null){
strings.add("运行开始时间:"+new Date());
strings.add("---开始【登录】---");
LoginData loginData = ApiUtil.login(admin.getSESSDATA());
Level level = loginData.getLevel_info();
strings.add("登录成功,用户名: "+loginData.getUname());
strings.add("硬币余额: "+loginData.getMoney());
strings.add("当前等级: "+level.getCurrent_level());
List<VideoList> videoDataListPlay = ApiUtil.video(admin.getSESSDATA(),1);
VideoList videoDataPlay = videoDataListPlay.get(0);
strings.add("---结束【登录】---");
strings.add("");
strings.add("---开始【观看&分享视频】---");
strings.add("获取随机视频:《"+videoDataPlay.getTitle()+"》");
strings.add("---开始观看视频---");
ApiUtil.videoPlay(admin.getSESSDATA(),videoDataPlay.getBvid());
strings.add("---视频观看完毕---");
strings.add("---开始分享视频---");
ApiUtil.videoShare(admin.getCsrf(),admin.getSESSDATA(),videoDataPlay.getBvid());
strings.add("---开始分享完毕---");
strings.add("");
strings.add("---开始【投币】---");
if(loginData.getMoney()>0){
ToubiVerification toubiVerification = ApiUtil.toubiVerification(admin.getSESSDATA());
if(toubiVerification.getData()==50){
strings.add("---今日已投5枚硬币,再投也不会有经验啦!!---");
}else{
List<VideoList> videoDataList = ApiUtil.video(admin.getSESSDATA(),50);
for(int i=0;i<5;i++){
VideoList videoData = videoDataList.get(i);
boolean flag = ApiUtil.verificationVideo(admin.getSESSDATA(),videoData.getBvid());
if(flag== true){
ApiUtil.toubi(admin.getSESSDATA(),admin.getCsrf(),videoData.getBvid());
strings.add("为《"+videoData.getTitle()+"》投币成功");
}else{
i--;
}
}
}
}else{
strings.add("---投币结束,原因:硬币余额不足!---");
}
strings.add("---结束【投币】---");
strings.add("---开始【直播中心签到】---");
Sign sign = ApiUtil.sign(admin.getSESSDATA());
if(sign.getMessage().equals("0")){
strings.add("直播中心签到成功!");
}else{
strings.add(sign.getMessage());
}
strings.add("---结束【直播中心签到】---");
strings.add("");
strings.add("");
strings.add("---全部任务已完成---");
String json = JSONUtil.toJsonStr(strings);
BilibiliLog bilibiliLog = new BilibiliLog();
bilibiliLog.setCreateTime(new Date());
bilibiliLog.setAid(admin.getId());
bilibiliLog.setText(json);
bilibiliLogService.BilibiliLogAdd(bilibiliLog);
}
}
}
本帖最后由 祈LHL 于 2021-8-20 08:23 编辑
我部署上去了,可是后台登陆不上。。。怎么办?显示登陆失败
使用的账号密码分别是admin和123,但是显示登陆失败,一切按照GitHub仓库提示操作的,请问是怎么回事呢?
没事了。。。原来是数据库名得改成manager_system。。。
还是有报错,运行程序出现
```
2021-08-20 08:18:16.599 ERROR 1836298 --- o.a.c.c.C.[.[.[/]. : Servlet.service() for servlet in context with path [] threw exception [Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException:
### Error querying database.Cause: java.sql.SQLSyntaxErrorException: Table 'manager_system.Bilibili_Log' doesn't exist
### The error may exist in file
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: select id,aid,text,create_time from Bilibili_Log where TO_DAYS(create_time) = TO_DAYS(NOW()) and aid=? order by create_time desc limit 1
### Cause: java.sql.SQLSyntaxErrorException: Table 'manager_system.Bilibili_Log' doesn't exist
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Table 'manager_system.Bilibili_Log' doesn't exist] with root cause
```
请问如何解决呢? 系统繁忙了楼主 branch518 发表于 2020-12-1 10:29
系统繁忙了楼主
那是因为没有Cookie 你可以扫描二维码获取一下,然后删除掉,毕竟是演示地址。 陈浩 发表于 2020-12-1 10:33
那是因为没有Cookie 你可以扫描二维码获取一下,然后删除掉,毕竟是演示地址。
好的,感谢楼主 楼主大圣。谢谢分享。
楼主大圣。谢谢分享。 用了BilibiliTask这个两天今天系统提示账号异常使用,看样子是有封号的风险 乔生 发表于 2020-12-1 20:27
用了BilibiliTask这个两天今天系统提示账号异常使用,看样子是有封号的风险
大家都是调用同一个API 没办法啦 我用了十来天,今天 也提示异常了!先停两天再说{:1_937:} 乔生 发表于 2020-12-1 20:27
用了BilibiliTask这个两天今天系统提示账号异常使用,看样子是有封号的风险
我已经被警告了