Toc
  1. 前言
  2. b站API
  3. QQ机器人
  4. 开发
    1. 创建项目
    2. 导包
    3. 创建程序文件
    4. 测试
    5. 打包成jar包
Toc
0 results found
Dark
基于miraiQQ的b站直播通知机器人

前言

2020-08-04 更新:由于腾讯封禁第三方机器人,mirai项目有可能会被关闭或停止更新(市面上大部分机器人都跑路了),且用且珍惜吧~

2020-07-28 更新:修复Maven配置不正确的问题,请放心复制

熟悉我的人都知道我是某直播间的房管,最近闲来无聊,决定做一个开播通知机器人,这样开播通知就能交给程序来做了,解放双手岂不美哉~

本项目基于:
mirai https://github.com/mamoe/mirai/tree/master
b站API大全 https://github.com/SocialSisterYi/bilibili-API-collect





b站API

哔哩哔哩-API收集整理



我们需要获取直播间的信息

示例:

查询我的直播间信息,我的UID为:295904819

只需要打开URL:http://api.live.bilibili.com/room/v1/Room/getRoomInfoOld?mid=295904819
(URL的mid=填写主播的UID,不是直播间号!!!)



这时候我们看到是数据如图:



乱七八糟的看不清,这个时候我们需要用到一款Chrome插件:
JSONView



这个时候我们就能很清晰的看清楚字段数据了

  • 我们所需要的就是data对象里的liveStatus字段的数据了
  • liveStatus为”1”时,就是直播中,为”0”时就是未开播




QQ机器人

其实我做的这个还算不上机器人,只能说是个程序,毕竟它一点也不智能2333~



mirai

(这个形象图一看就是老二刺猿了hhh)

  • Mirai是由QQ Android 和 TIM PC 协议支持的
  • 是由纯 Kotlin 实现协议和支持库
  • 常用于项目中的 QQ 协议支持库, 也可以作为单独的应用程序与插件承载 QQ 机器人服务

快速开始

网上找到的一份参考手册



开发要求有一定的kotlin基础,其实也不一定,为什么呢?下面再说~





开发

mirai推荐用Gradle导包,但是我习惯Maven,就用Maven来做吧~



创建项目

  • 选择Maven,然后下一步完成就完事了


导包

打开pom.xml

我们需要用到的包有kotlin,mirai和打包插件
这里直接把配置代码直接复制上去即可

<properties>
<kotlin.version>1.3.72</kotlin.version>
</properties>

<repositories>
<repository>
<id>jcenter</id>
<url>https://jcenter.bintray.com/</url>
</repository>
</repositories>

<build>
<sourceDirectory>src/main/kotlin</sourceDirectory>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<configuration>
<jvmTarget>1.8</jvmTarget>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.test.app</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<!--下面是为了使用 mvn package命令,如果不加则使用mvn assembly-->
<executions>
<execution>
<id>make-assemble</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>





</plugins>
</build>


<dependencies>
<dependency>
<groupId>net.mamoe</groupId>
<artifactId>mirai-core-qqandroid</artifactId>
<version>1.0.4</version> <!-- 替换版本为最新版本 -->
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-test</artifactId>
<version>${kotlin.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>


</dependencies>


  • 运行install等待包文件全部下载完成

(下载速度慢请自行换源,这里不做详细讲解)

创建程序文件

在src/main/java/里新建一个*.kt文件

代码如下:

package net.mamoe.mirai.simpleloader

import com.alibaba.fastjson.JSONException
import net.mamoe.mirai.Bot
import net.mamoe.mirai.alsoLogin
import net.mamoe.mirai.event.subscribeMessages
import net.mamoe.mirai.join
import net.mamoe.mirai.message.data.AtAll
import net.sf.json.JSONObject
import java.io.BufferedReader
import java.io.IOException
import java.io.InputStreamReader
import java.net.MalformedURLException
import java.net.URL

@Throws(JSONException::class)
fun loadJson(url: String?): String {//创建获取api json信息方法
val json = StringBuilder()
try {
val urlObject = URL(url)
val uc = urlObject.openConnection()
val `in` = BufferedReader(InputStreamReader(uc.getInputStream(), "utf-8"))
var inputLine: String? = null
while (`in`.readLine().also { inputLine = it } != null) {
json.append(inputLine)
}
`in`.close()
} catch (e: MalformedURLException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
}
return json.toString()
}

@Throws(InterruptedException::class)
suspend fun Ask() {//创建判断是否开播方法
//约每两分钟查询一次是否开播
val i = 0
while (i < i + 1) {//死循环
val uid = "***"//主播UID(非直播间号)
val url = "http://api.live.bilibili.com/room/v1/Room/getRoomInfoOld?mid=$uid"//直播信息api
var json = loadJson(url)
var jsonObject = JSONObject.fromObject(json)
var status = jsonObject.getJSONObject("data")["liveStatus"] as Int//获取liveStatus字段,0为未开播,1为开播
if (status >= 1) {//判断开播
println("开播啦")//输出开播日志
//机器人发送消息,getInstance(机器人qq账号),getGroup(发送消息到群号),不要删除大写L,AtAll是艾特全体成员
Bot.getInstance(***L).getGroup(***L).sendMessage(AtAll+"开播")

//开播后判断是否下播,约每二十分钟判断一次
val j = 0
while (j < j + 1) {//第二个死循环
json = loadJson(url)
jsonObject = JSONObject.fromObject(json)
status = jsonObject.getJSONObject("data")["liveStatus"] as Int
//判断是否在直播
if (status >= 1) {
println("直播中")
Thread.sleep(1200000)
continue//直播中则休眠二十分钟,再次判断
} else {
println("第一次检查到下播")
Thread.sleep(1200000)
json = loadJson(url)
jsonObject = JSONObject.fromObject(json)
status = jsonObject.getJSONObject("data")["liveStatus"] as Int
//第一次检测到下播,休眠二十分钟再次检查
if (status >= 1) {
continue
//没下播则继续???
} else {
println("第二次检查到下播")
Thread.sleep(1200000)
json = loadJson(url)
jsonObject = JSONObject.fromObject(json)
status = jsonObject.getJSONObject("data")["liveStatus"] as Int
//第二次检测到下播,休眠二十分钟再次检查
if (status >= 1) {
continue
// ???
} else {
println("第三次检查到下播")
break
//第三次检测到下播,退出第二个死循环,回到第一个死循环
}
}
}
}
} else {
println("没有开播")
Thread.sleep(120000)
continue
//判断没有开播,休眠两分钟后重试
}
}
}

@Throws(InterruptedException::class)
suspend fun main(args: Array<String>) {//主程序
val qqId = ***L //Bot的QQ号,需为Long类型,在结尾处添加大写L
val password = "***" //Bot的密码
val miraiBot = Bot(qqId, password).alsoLogin() //新建Bot并登录
miraiBot.subscribeMessages{
"测试***" reply "running"//创建测试方法,当其他账户发送"测试***",返回"running"则表示程序正在运行
}
Ask()//启动直播查询
miraiBot.join() // 等待 Bot 离线, 避免主线程退出
}


  • 代码中所有***的地方都有备注,请自行修改
  • kotlin的写法跟java其实很相似,其实只要会写java就可以了
  • 为什么呢?因为在IDEA里kotlin支持无缝转换,即:把写好的java代码复制到.kt文件里,IDEA可以一键转换为kotlin写法,我就是这么写出来的~


测试

运行时会需要验证QQ

打开URL进行验证,验证完之后关闭窗口即可



打包成jar包

由于我上面的Maven配置已有打包配置,直接运行package即可
生成jar文件在target文件夹里

现在把jar包扔到服务器上运行就可以啦~
运行命令java -jar ***.jar





本文作者:Dark
版权声明:本文首发于Dark的博客,转载请注明出处!