b站任务脚本

仅供学习参考
用于自动化执行 Bilibili(哔哩哔哩)网站的一些任务,包括签到、投币、观看视频等。它通过与 Bilibili 的 API 接口进行交互来完成各种任务,并返回执行结果。
在这里插入图片描述
主要功能
get_nav(session):

获取当前登录用户的基本信息,包括用户名、UID、登录状态、硬币数、VIP 类型和当前经验值等。

get_today_exp(session):

获取当天的经验信息,包括用户参与的各种活动(如签到、投币等)所获得的经验。

live_sign(session):

执行 Bilibili 直播签到,并返回签到成功的消息。

manga_sign(session):

执行 Bilibili 漫画客户端签到,并返回签到的结果。

vip_privilege_receive(session, bili_jct, receive_type):

领取 Bilibili 大会员的权益,如 B币券或优惠券。

coin_add(session, bili_jct, aid, num):

给指定的 AV 号视频投币,可以投多个硬币。

report_task(session, bili_jct, aid, cid, progres):

上报视频观看进度,帮助完成观看视频的任务。

share_task(session, bili_jct, aid):

分享指定的 AV 号视频。

get_region(session, rid, num):

获取 Bilibili 分区的最新视频信息。

silver2coin(session, bili_jct):

将 Bilibili 的银瓜子兑换成硬币。

main():

该方法是执行任务的主入口。根据配置文件中的设定,它将执行多个操作,如签到、投币、观看视频、分享等。

任务完成后,会汇总所有任务的执行情况,返回一个包含用户信息和任务执行情况的消息。

流程:
读取配置文件获取必要的信息。

执行多个任务(签到、投币、观看视频等),并收集执行结果。

汇总结果并返回一个包含所有任务状态的消息。

细节:
Cookie 管理:代码使用 requests 会话来模拟登录状态,保持会话中的 cookies 信息。

错误处理:对于 API 请求和任务执行中的异常,代码进行了适当的错误处理,确保出现问题时能给出清晰的错误提示。

任务顺序:代码会先执行签到、投币等任务,并根据配置执行剩余的任务(如视频分享、领取大会员福利等)。

这个脚本是一个较为完整的 Bilibili 自动化任务脚本,通过与 Bilibili API 的交互,实现了签到、投币、观看视频、分享视频等一系列常见任务的自动化,适合需要每天自动完成这些任务的用户。
**

部分代码

@staticmethod
    def silver2coin(session, bili_jct) -> dict:
        """B站银瓜子换硬币"""
        url = "https://api.live.bilibili.com/xlive/revenue/v1/wallet/silver2coin"
        post_data = {"csrf": bili_jct}
        ret = session.post(url=url, data=post_data).json()
        return ret

    def main(self):
        bilibili_cookie = {
            item.split("=")[0]: item.split("=")[1]
            for item in self.check_item.get("cookie").split("; ")
        }
        bili_jct = bilibili_cookie.get("bili_jct")
        coin_num = self.check_item.get("coin_num", 0)
        coin_type = self.check_item.get("coin_type", 1)
        silver2coin = self.check_item.get("silver2coin", False)
        session = requests.session()
        requests.utils.add_dict_to_cookiejar(session.cookies, bilibili_cookie)
        session.headers.update(
            {
                "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.64",
                "Referer": "https://www.bilibili.com/",
                "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
                "Connection": "keep-alive",
            }
        )
        success_count = 0
        uname, uid, is_login, coin, vip_type, current_exp = self.get_nav(
            session=session
        )
        if is_login:
            manhua_msg = self.manga_sign(session=session)
            live_msg = self.live_sign(session=session)
            aid_list = self.get_region(session=session)
            vip_privilege_my_ret = self.vip_privilege_my(session=session)
            welfare_list = vip_privilege_my_ret.get("data", {}).get("list", [])
            for welfare in welfare_list:
                if welfare.get("state") == 0 and welfare.get("vip_type") == vip_type:
                    vip_privilege_receive_ret = self.vip_privilege_receive(
                        session=session,
                        bili_jct=bili_jct,
                        receive_type=welfare.get("type"),
                    )
                    print(vip_privilege_receive_ret)
            coins_av_count = len(
                list(
                    filter(
                        lambda x: x["reason"] == "视频投币奖励",
                        self.get_today_exp(session=session),
                    )
                )
            )
            coin_num = coin_num - coins_av_count
            coin_num = coin_num if coin_num < coin else coin
            if coin_type == 1:
                following_list = self.get_followings(session=session, uid=uid)
                count = 0
                for following in following_list.get("data", {}).get("list"):
                    mid = following.get("mid")
                    if mid:
                        tmplist, tmpcount = self.space_arc_search(
                            session=session, uid=mid
                        )
                        aid_list += tmplist
                        count += tmpcount
                        if count > coin_num:
                            print("已获取足够关注用户的视频")
                            break
                else:
                    aid_list += self.get_region(session=session)
                for one in aid_list[::-1]:
                    print(one)
            if coin_num > 0:
                for aid in aid_list[::-1]:
                    ret = self.coin_add(
                        session=session, aid=aid.get("aid"), bili_jct=bili_jct
                    )
                    if ret["code"] == 0:
                        coin_num -= 1
                        print(f'成功给{aid.get("title")}投一个币')
                        success_count += 1
                    elif ret["code"] == 34005:
                        print(f'投币{aid.get("title")}失败,原因为{ret["message"]}')
                        continue
                        # -104 硬币不够了 -111 csrf 失败 34005 投币达到上限
                    else:
                        print(f'投币{aid.get("title")}失败,原因为{ret["message"]},跳过投币')
                        break
                    if coin_num <= 0:
                        break
                coin_msg = f"今日成功投币{success_count + coins_av_count}/{self.check_item.get('coin_num', 5)}个"
            else:
                coin_msg = (
                    f"今日成功投币{coins_av_count}/{self.check_item.get('coin_num', 5)}个"
                )
            aid = aid_list[0].get("aid")
            cid = aid_list[0].get("cid")
            title = aid_list[0].get("title")
            report_ret = self.report_task(
                session=session, bili_jct=bili_jct, aid=aid, cid=cid
            )
            if report_ret.get("code") == 0:
                report_msg = f"观看《{title}》300秒"
            else:
                report_msg = "任务失败"
            share_ret = self.share_task(session=session, bili_jct=bili_jct, aid=aid)
            if share_ret.get("code") == 0:
                share_msg = f"分享《{title}》成功"
            else:
                share_msg = "分享失败"
                print(share_msg)
            s2c_msg = "不兑换硬币"
            if silver2coin:
                silver2coin_ret = self.silver2coin(session=session, bili_jct=bili_jct)
                s2c_msg = silver2coin_ret["message"]
                if silver2coin_ret["code"] != 0:
                    print(s2c_msg)
                else:
                    s2c_msg = ""
            live_stats = self.live_status(session=session)
            uname, uid, is_login, new_coin, vip_type, new_current_exp = self.get_nav(
                session=session
            )
            today_exp = sum(
                map(lambda x: x["delta"], self.get_today_exp(session=session))
            )
            update_data = (28800 - new_current_exp) // (today_exp if today_exp else 1)
            msg = [
                {"name": "帐号信息", "value": uname},
                {"name": "漫画签到", "value": manhua_msg},
                {"name": "直播签到", "value": live_msg},
                {"name": "登陆任务", "value": "今日已登陆"},
                {"name": "观看视频", "value": report_msg},
                {"name": "分享任务", "value": share_msg},
                {"name": "瓜子兑换", "value": s2c_msg},
                {"name": "投币任务", "value": coin_msg},
                {"name": "今日经验", "value": today_exp},
                {"name": "当前经验", "value": new_current_exp},
                {"name": "升级还需", "value": f"{update_data}天"},
            ] + live_stats
            msg = "\n".join([f"{one.get('name')}: {one.get('value')}" for one in msg])
            return msg


if __name__ == "__main__":
    with open(
        os.path.join(os.path.dirname(os.path.dirname(__file__)), "config.json"),
        encoding="utf-8",
    ) as f:
        datas = json.loads(f.read())
    _check_item = datas.get("BILIBILI", [])[0]
    print(BiliBili(check_item=_check_item).main())```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AALoveTouch

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值