最近一段时间搞了两个机器人,一个是因为我现在当助教,经常在微信群里要点名没做作业的人,总共加起来也就20来个人,分在两个群里面。但是手动点名确实很麻烦,所以我就用wxpy模块写了个机器人。

wxpy模块机器人

看到很多人都在说这个wxpy模块寄了,不过我是用的好好的。最开始的时候wxpy附带的itchat版本有点低,我电脑上得挂个梯才能加载出来登录二维码,而且没法保存二维码,导致每次登录都要扫码。后来单独更新了一下itchat的版本

python接twitch,wx,b站的简单应用_b站

现在是这个版本,只要把缓存二维码选项开了,第一次扫码登录后,以后一段时间都可以直接登录。

要实现的功能是每次晚上老师在群内发布任务后,我登陆这个脚本。然后每当学生或是学生家长在群内发作业照片的时候,记录下来,在11点点名时只点没交作业的人。要求不复杂,不过对家长,学生的检索有点麻烦,注释细说。

还有wxpy的实现是写好对于不同消息的处理函数,在接收到消息时bot会根据你的处理函数处理对应消息。

from wxpy import *
import time

bot = Bot(console_qr = True,cache_path = True)

test_group1 = ensure_one(bot.groups().search('高一背默群'))
member_list1 = test_group1.members
#找到这个群并且把所有群成员数据导出到member_list1
name_list1 = ['','','']
num1 = len(member_list1)
#name_list1是所有学生的名字,因为群里还有家长,所以得分开处理

# 高一
@bot.register(test_group1,PICTURE)
#在这里注册消息,等于告诉机器人这些消息在下面这个函数里面去处理
def gaoyi(msg):
    t = time.localtime()
    t = t.tm_hour
    #检查时间,如果到了23点就开始在群里催人交作业
    for i in range(0,num1,1):
        #逐个检索发图片的人
        if msg.member.display_name[0:2] == name_list1[i][0:2] or msg.member.display_name[0:2] == name_list1[i][1:3]:
#因为群昵称是比较好统一的,所以使用群昵称找人。
#最早想用备注名,给每个人备注后,备注名依然是none,所以还是用群昵称
#其次因为有学生是二字名字,所以我只检查两个字。
#比如群昵称ab家长发了作业图片,我要让他和群昵称ab的同学对应上
#就得检查msg.member.display_name[0:2] == name_list1[i][0:2]
#比如群昵称bc家长发了作业图片,我要让他和群昵称abc同学对应上
#就得检查msg.member.display_name[0:2] == name_list1[i][1:3]
#所以这块还是有点麻烦的,代码写的确实屎
            test_group1.send(f'恭喜{name_list1[i]}完成今日任务!')
#象征性的恭喜一下,顺便就当日志了
            name_list1.remove(f'{name_list1[i]}')
#然后是移除名单,后面催人交作业只要催名单内的人就行
            break
    if t == 23:
#到23点时,如果接收到消息,进入这个处理函数,就会触发催人的功能
        payload = f''
        for name in name_list1:
            payload += name + f','
        if not payload:
#如果所有人都交作业了,那也象征性的恭喜一下
            congratulations = f'恭喜今天全员完成哩!'
            test_group1.send(congratulations)
        else:
#否则就开始催人了
            payload += f'今日任务未完成,记得做一下哈'
            test_group1.send(payload)

这个微信的机器人就是这样,因为有网页版的微信,所以其登录和各种操作异常简单(与qqbot相比而言)

Twitch台和B站

功能需求很简单,就是检查Twitch台指定主播上播状态,然后发到b站动态。

Twitch台的检查主播上播我一开始想复杂了,后来经过RockerMadev师傅的提醒。其实我只要去get主播网页找到与上博状态的关键词就行。

代码如下

import requests
def check_online():
    response = requests.get(url = 'https://www.twitch.tv/sunshinebread',verify = False)
    response_content = response._content.decode()
    if 'isLiveBroadcast' in response_content:
        return True
    else:
        return False

接下来就是b站相关模块了

from bilibili_api import Credential,dynamic,sync,user

global credential
credential = Credential(sessdata=SESSDATA, bili_jct=bili_jct, buvid3=buvid3, dedeuserid=DedeUserID, ac_time_value=ac_time_value)

async def send_dyna(content):
    global credential
    d = dynamic.BuildDynamic()
    d.add_text(f'{content}')
    await dynamic.send_dynamic(d,credential)

credential是cookie相关内容,这个我也是跟着文档一步步查的。作用就是让你的机器人登录b站网页。

然后就是bilibili_api模块相关内容了,我就不多介绍了。

后记

最开始是想做从Twitch获取主播信息之后直接转发到QQ群的,但是QQ机器人被腾讯千方百计地打击,难度远远大于微信,Twitch或是b站。

所以我就想到了利用群内已有的DDBot,DDBot是现成的可以监控b站虎牙等平台特定账号的动态,直播状态等信息并且转发到QQ群。

所以现在的流程就是

   机器人get直播状态         发到b站动态             转发b站动态

Twitch------------------>机器人---------->群内机器人------------->QQ群

hhh感觉还挺有意思的。