每天手动打开B站签到、领取登录奖励、完成浏览任务,听起来简单但实际操作起来却很繁琐。作为一个B站深度用户,我发现自己经常忘记签到,错过连续登录奖励。更麻烦的是,有时候明明打开了网页,却因为忙着看视频而忘记点击签到按钮。
使用Python+pyautogui实现自动化操作可以完美解决这些问题。想象一下,每天早上起床,你的电脑已经自动完成了所有B站日常任务,而你只需要享受已经积累的硬币和经验值。这不仅节省时间,还能确保不会错过任何奖励。
pyautogui这个库特别适合这类桌面自动化任务。它不需要复杂的浏览器驱动,直接模拟鼠标键盘操作,就像真人操作一样。对于B站这种不需要处理复杂动态元素的场景,pyautogui比selenium这类工具更轻量、更容易上手。
我曾经试过手动操作和自动化脚本的对比:手动完成全套日常任务平均需要2-3分钟,而自动化脚本只需要30秒左右,而且准确率100%。长期下来,这个时间节省相当可观。
首先确保你已经安装了Python 3.6或更高版本。然后通过pip安装pyautogui:
python复制pip install pyautogui
pyautogui是跨平台的,在Windows、macOS和Linux上都能运行。不过由于不同系统的UI差异,本文示例以Windows系统为主。如果你使用其他系统,可能需要调整部分坐标参数。
我建议同时安装pillow库,用于后续的图像识别功能:
python复制pip install pillow
pyautogui操作依赖于屏幕坐标,所以我们需要一个工具来获取特定位置的坐标。Windows用户可以使用内置的"截图工具"或者第三方工具如Inspect。这里介绍一个更简单的方法 - 使用pyautogui自带的显示鼠标位置功能:
python复制import pyautogui
print(pyautogui.displayMousePosition())
运行这段代码后,屏幕上会实时显示鼠标当前位置的坐标和RGB颜色值。移动鼠标到需要操作的位置,记下坐标即可。
自动化操作有潜在风险,比如脚本运行时误触其他程序。pyautogui提供了安全措施:
python复制pyautogui.FAILSAFE = True # 启用故障安全功能
pyautogui.PAUSE = 1 # 每个操作后暂停1秒
FAILSAFE设置为True时,将鼠标移动到屏幕左上角会立即终止脚本。PAUSE设置每个操作后的暂停时间,避免操作过快导致错误。
B站的签到按钮通常位于页面右上角。首先我们需要打开B站首页并登录(登录过程可以参考原始文章的方法)。登录后,使用前面提到的坐标获取方法找到签到按钮的位置。
在我的1920×1080分辨率屏幕上,签到按钮坐标大约是(1800, 120)。但更可靠的方法是使用图像识别:
python复制sign_button = pyautogui.locateOnScreen('sign_button.png')
if sign_button:
pyautogui.click(sign_button)
你需要先截取签到按钮的图片保存为sign_button.png。这种方法比固定坐标更可靠,不受分辨率影响。
签到成功后,B站通常会显示一个提示框。我们可以通过检测特定图像来判断是否签到成功:
python复制try:
success_msg = pyautogui.locateOnScreen('sign_success.png', timeout=5)
if success_msg:
print("签到成功!")
except pyautogui.ImageNotFoundException:
print("签到失败或已签到")
记得截取签到成功时的提示图片作为sign_success.png。timeout参数设置等待时间,避免脚本卡住。
签到成功后,通常需要点击关闭弹窗。同样可以使用图像识别定位关闭按钮:
python复制close_button = pyautogui.locateOnScreen('close_button.png')
if close_button:
pyautogui.click(close_button)
B站的每日登录奖励需要在任务中心领取。从首页到任务中心的路径通常是:点击头像→点击"任务中心"。我们可以用相对坐标来操作:
python复制# 点击头像
pyautogui.click(1850, 120)
time.sleep(1)
# 点击任务中心
pyautogui.click(1750, 250)
time.sleep(3)
在任务中心页面,我们需要识别"领取"按钮。由于奖励项目可能变化,建议使用图像识别:
python复制reward_buttons = list(pyautogui.locateAllOnScreen('reward_button.png'))
for button in reward_buttons:
pyautogui.click(button)
time.sleep(1)
locateAllOnScreen会找到屏幕上所有匹配的按钮,然后我们逐个点击。记得截取"领取"按钮的图片作为reward_button.png。
有些奖励可能已经领取过,我们可以通过颜色变化来判断。比如已领取的按钮可能是灰色的:
python复制button_location = pyautogui.locateOnScreen('reward_button.png')
if button_location:
pixel_color = pyautogui.pixel(button_location.left + 10, button_location.top + 10)
if pixel_color == (220, 220, 220): # 灰色表示已领取
print("奖励已领取")
else:
pyautogui.click(button_location)
B站有时会有"观看5个视频"的任务。我们可以用以下代码实现:
python复制for _ in range(5):
# 点击第一个推荐视频
pyautogui.click(600, 400)
time.sleep(30) # 观看30秒
# 返回上一页
pyautogui.press('backspace')
time.sleep(2)
在视频播放页面,可能需要关闭弹幕和广告:
python复制# 关闭弹幕按钮通常在右下角
pyautogui.click(1850, 900)
time.sleep(1)
# 广告跳过按钮可能在右下角
skip_ad = pyautogui.locateOnScreen('skip_ad.png')
if skip_ad:
pyautogui.click(skip_ad)
为了更自然地模拟人类行为,可以添加随机滚动和暂停:
python复制import random
pyautogui.scroll(random.randint(-5, -1)) # 随机向下滚动
time.sleep(random.uniform(0.5, 2)) # 随机暂停
网络延迟或页面加载慢可能导致操作失败。我们可以添加重试逻辑:
python复制max_retries = 3
for attempt in range(max_retries):
try:
sign_button = pyautogui.locateOnScreen('sign_button.png', timeout=10)
if sign_button:
pyautogui.click(sign_button)
break
except pyautogui.ImageNotFoundException:
if attempt == max_retries - 1:
raise
time.sleep(5)
添加日志记录可以帮助调试和追踪脚本运行情况:
python复制import logging
logging.basicConfig(filename='bilibili_auto.log', level=logging.INFO)
try:
# 脚本操作...
logging.info(f"{time.strftime('%Y-%m-%d %H:%M')} 签到成功")
except Exception as e:
logging.error(f"操作失败: {str(e)}")
不同电脑分辨率可能导致坐标不匹配。我们可以使用相对坐标或屏幕比例:
python复制screen_width, screen_height = pyautogui.size()
# 使用屏幕宽度比例定位
sign_button_x = screen_width * 0.94 # 94%宽度处
sign_button_y = screen_height * 0.11 # 11%高度处
pyautogui.click(sign_button_x, sign_button_y)
结合以上所有功能,完整的脚本可能如下:
python复制import pyautogui
import time
import logging
import random
logging.basicConfig(filename='bilibili_auto.log', level=logging.INFO)
def main():
try:
# 打开浏览器并登录B站(这里简化,实际需要完整登录流程)
login_to_bilibili()
# 每日签到
perform_daily_sign()
# 领取登录奖励
claim_daily_rewards()
# 完成浏览任务
complete_watch_tasks()
logging.info(f"{time.strftime('%Y-%m-%d %H:%M')} 所有任务完成")
except Exception as e:
logging.error(f"任务失败: {str(e)}")
def login_to_bilibili():
# 这里应该包含完整的登录流程
pass
def perform_daily_sign():
max_retries = 3
for attempt in range(max_retries):
try:
sign_button = pyautogui.locateOnScreen('sign_button.png', timeout=10)
if sign_button:
pyautogui.click(sign_button)
time.sleep(2)
# 验证签到结果
success_msg = pyautogui.locateOnScreen('sign_success.png', timeout=5)
if success_msg:
logging.info("签到成功")
# 关闭弹窗
close_button = pyautogui.locateOnScreen('close_button.png')
if close_button:
pyautogui.click(close_button)
break
except pyautogui.ImageNotFoundException:
if attempt == max_retries - 1:
logging.warning("签到失败或已签到")
time.sleep(5)
def claim_daily_rewards():
# 导航到任务中心
pyautogui.click(1850, 120) # 点击头像
time.sleep(1)
pyautogui.click(1750, 250) # 点击任务中心
time.sleep(3)
# 领取所有可领取奖励
reward_buttons = list(pyautogui.locateAllOnScreen('reward_button.png'))
for button in reward_buttons:
pyautogui.click(button)
time.sleep(1)
logging.info(f"成功领取{len(reward_buttons)}个奖励")
def complete_watch_tasks():
# 观看5个推荐视频
for i in range(5):
pyautogui.click(600, 400) # 点击推荐视频
time.sleep(30)
pyautogui.press('backspace') # 返回
time.sleep(2)
# 随机滚动和暂停模拟人类行为
pyautogui.scroll(random.randint(-5, -1))
time.sleep(random.uniform(0.5, 2))
logging.info("完成观看任务")
if __name__ == "__main__":
main()
要让脚本每天自动运行,可以使用Windows的任务计划程序:
code复制@echo off
python D:\path\to\your\script.py
对于macOS用户,可以使用crontab设置定时任务:
bash复制0 9 * * * /usr/bin/python3 /path/to/your/script.py
这会在每天早上9点运行脚本。
如果你需要在不同操作系统上运行,可以添加系统检测:
python复制import platform
def click_position(x, y):
system = platform.system()
if system == "Darwin": # macOS
# macOS可能需要调整坐标
pyautogui.click(x*2, y*2) # 视网膜屏需要乘以2
else:
pyautogui.click(x, y)
在实际使用中,可能会遇到各种问题。以下是我遇到过的一些典型问题及解决方法:
问题1:脚本运行时电脑锁屏导致失败
解决方案:在Windows电源设置中,将"睡眠"设置为"从不"。或者使用以下代码防止锁屏:
python复制import ctypes
# 阻止系统休眠
ctypes.windll.kernel32.SetThreadExecutionState(0x80000002)
# 脚本结束后恢复
# ctypes.windll.kernel32.SetThreadExecutionState(0x80000000)
问题2:B站页面改版导致元素位置变化
解决方案:定期更新图像识别用的参考图片。可以编写一个检测函数,当主要元素都找不到时发送通知:
python复制def check_page_layout():
elements = ['logo.png', 'avatar.png', 'sign_button.png']
missing = []
for elem in elements:
if not pyautogui.locateOnScreen(elem, timeout=5):
missing.append(elem)
if missing:
send_alert(f"以下元素找不到: {', '.join(missing)}")
问题3:验证码出现导致脚本中断
解决方案:虽然完全自动识别验证码比较复杂,但我们可以设置脚本在发现验证码时暂停并提醒用户:
python复制if pyautogui.locateOnScreen('captcha.png', timeout=3):
pyautogui.alert("请手动完成验证码后继续")
time.sleep(30) # 给用户足够时间操作
问题4:网络延迟导致页面加载缓慢
解决方案:增加动态等待机制,而不是固定sleep时间:
python复制def wait_until_visible(image_path, timeout=30):
start = time.time()
while time.time() - start < timeout:
if pyautogui.locateOnScreen(image_path):
return True
time.sleep(2)
return False
问题5:多显示器环境坐标混乱
解决方案:明确指定在哪个显示器上操作:
python复制# 获取所有显示器信息
monitors = pyautogui.getAllMonitors()
# 在主显示器上操作
pyautogui.moveTo(100, 100, monitor=0)
当基础功能稳定运行后,可以考虑以下优化:
使用OCR识别文本
对于某些不能用图像匹配的情况,可以尝试OCR识别:
python复制import pytesseract
from PIL import Image
screenshot = pyautogui.screenshot(region=(x, y, width, height))
text = pytesseract.image_to_string(screenshot)
if "签到" in text:
pyautogui.click(x + width//2, y + height//2)
添加邮件通知功能
当任务完成或失败时发送邮件通知:
python复制import smtplib
from email.mime.text import MIMEText
def send_email(subject, body):
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = 'your_email@example.com'
msg['To'] = 'recipient@example.com'
with smtplib.SMTP('smtp.example.com', 587) as server:
server.login('username', 'password')
server.send_message(msg)
实现多账号支持
如果需要管理多个B站账号,可以这样扩展:
python复制accounts = [
{'username': 'user1', 'password': 'pass1'},
{'username': 'user2', 'password': 'pass2'}
]
for account in accounts:
login_to_bilibili(account['username'], account['password'])
perform_daily_sign()
# 其他任务...
logout()
添加性能监控
记录脚本执行时间和资源使用情况:
python复制import time
import psutil
start_time = time.time()
start_mem = psutil.Process().memory_info().rss / 1024 / 1024 # MB
# 执行脚本...
end_time = time.time()
end_mem = psutil.Process().memory_info().rss / 1024 / 1024
logging.info(f"执行时间: {end_time - start_time:.2f}秒, 内存使用: {end_mem - start_mem:.2f}MB")
创建图形界面
对于不熟悉命令行的用户,可以添加简单的GUI:
python复制import tkinter as tk
from tkinter import messagebox
def run_script():
# 在这里调用主脚本
messagebox.showinfo("完成", "所有任务执行完毕")
root = tk.Tk()
tk.Button(root, text="执行B站任务", command=run_script).pack()
root.mainloop()
自动化脚本虽然方便,但需要注意以下安全事项:
密码安全
不要在脚本中硬编码密码,建议使用环境变量或配置文件:
python复制import os
username = os.getenv('BILIBILI_USERNAME')
password = os.getenv('BILIBILI_PASSWORD')
或者使用加密存储:
python复制from cryptography.fernet import Fernet
# 加密
key = Fernet.generate_key()
cipher_suite = Fernet(key)
cipher_text = cipher_suite.encrypt(b"your_password")
# 解密
plain_text = cipher_suite.decrypt(cipher_text)
脚本权限
确保脚本文件有适当的权限限制,防止他人访问:
bash复制chmod 700 script.py
防封号策略
为避免被B站检测为机器人行为:
合规使用
确保你的自动化脚本仅用于个人用途,不进行任何违规操作,如刷量、作弊等。遵守B站用户协议,合理使用自动化工具。