项目设定
在本项目中,我希望实现的是自动登录 Bilibili,并获取用户的登录 token 以及相关的 cookie 信息。由于 Bilibili 对登录流程有一定的保护机制,这为我的项目带来了一些挑战。
功能需求
自动化登录 Bilibili:使用用户名和密码登录 Bilibili。
获取 Token 信息:在登录成功后,获取 token 信息及相关 cookie 数据。
配置文件更新:将获取的 token 信息写入本地配置文件,并将其移动到指定的网络路径。
技术栈
编程语言: Python
库: Selenium(用于浏览器自动化)、toml(用于读取和写入配置文件)、shutil(用于文件操作)。
开发过程
下面是整个软件的实现代码及其分步解释。
1. 环境准备
首先,我们需要安装 Chrome 浏览器及其对应的 ChromeDriver。我们通过 Selenium 来操作 Chrome 浏览器,所以在代码中配置了无痕模式,以避免遗留登录信息。
<PYTHON>
chrome_options = Options()
chrome_options.add_argument('--incognito')
chrome_options.add_argument('--disable-usb')
chrome_options.add_argument('--disable-logging')
chrome_options.add_argument('--log-level=3')
driver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
2. 检查执行频率
由于数据读取频率设定为每小时,我为程序增加了一个检查机制,确保在整点后的五分钟内程序不会执行。这是为了避免在高并发时产生的数据错误。
<PYTHON>
def is_in_post_hour_window():
current_time = datetime.now()
if current_time.minute < 5:
print("docker可能正在执行,请稍作等待")
input("按任意键退出程序...")
return True
return False
3. 自动化登录
使用 Selenium 实现自动化登录,首先访问 Bilibili 网站,然后通过构造 XPath 找到登录按钮并执行点击操作。
<PYTHON>
driver.get(url)
try:
button_xpath = '//*[@id="i_cecream"]/div[2]/div[1]/div[1]/ul[2]/li[1]/li/div/div/span'
target_button = WebDriverWait(driver, 3).until(
EC.element_to_be_clickable((By.XPATH, button_xpath))
)
target_button.click()
print("已点击登录")
except Exception as e:
print(f"发生错误:{e}")
接着,我们定位用户名和密码的输入框并进行填充,最后提交登录请求。
4. 登录成功的判断
在登录过程中,需要确保登录成功。我通过检查用户头像的变化来实现这一步。如果页面加载成功且头像出现,说明登录成功。
<PYTHON>
user_avatar_xpath = '//*[@id="i_cecream"]/div[2]/div[1]/div[1]/ul[2]/li[1]/div[1]/a[2]/div/img'
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, user_avatar_xpath))
)
print("登录成功!")
5. 获取 Token 信息
登录成功后,我们利用 JavaScript 执行命令提取用户的 localStorage 中需要的字段,以及 cookies 中的相关值。
<PYTHON>
ac_time_value = driver.execute_script("return window.localStorage.ac_time_value;")
cookies = driver.get_cookies()
sessdata = next((cookie['value'] for cookie in cookies if cookie['name'] == 'SESSDATA'), None)
bili_jct = next((cookie['value'] for cookie in cookies if cookie['name'] == 'bili_jct'), None)
6. 配置文件操作
我们使用 toml 库读取本地配置文件,并在获取到的 token 信息中进行替换,最后保存文件。
<PYTHON>
config_path = os.path.join(os.path.expanduser("~"), "Desktop", "config.toml")
try:
config_data = toml.load(config_path)
config_data['credential']['sessdata'] = sessdata
...
with open(config_path, 'w', encoding='utf-8') as f:
toml.dump(config_data, f)
print(f"配置已更新并保存到: {config_path}")
except Exception as e:
print(f"读取或写入 config.toml 文件时发生错误: {e}")
7. 移动文件到网络路径
最终一步是将本地更新的配置文件移动到指定的网络路径。此步骤确保其他服务可以使用最新的配置文件。
<PYTHON>
network_config_path = r"\\Milkmonkey\docker\bilisync\config\config.toml"
try:
shutil.copy(config_path, network_config_path)
print(f"配置文件已成功移动到网络文件夹并覆盖原文件:{network_config_path}")
except Exception as e:
print(f"移动文件时发生错误: {e}")
8. 退出浏览器及完结
在完成所有操作后,程序将关闭浏览器并退出。
<PYTHON>
driver.quit()
sys.exit(0)
结语
在整个开发过程中,我面临了多次异常与错误处理,但最终通过充分利用 Selenium 和 Python 库实现了目标。这款自动获取 Bilibili Token 的软件为我的日常操作提供了便利,也让我在自动化开发方面有了进一步的认识。希望对有需要的朋友能有所帮助!