如何用Python按日期自动下载Viber每日发送的照片?
用Python按日期下载Viber发送的照片
方法一:读取Viber本地数据库(推荐,稳定高效)
Viber PC版会把所有聊天记录(包括图片的本地存储路径)存在SQLite数据库里,直接读取这个数据库是最靠谱的方式,不需要API权限。
步骤:
找到Viber的本地数据库文件
- Windows:
C:\Users\<你的用户名>\AppData\Roaming\ViberPC\<你的手机号>\viber.db - macOS:
~/Library/Application Support/ViberPC/<你的手机号>/viber.db
(替换掉<你的用户名>和<你的手机号>为实际内容)
- Windows:
Python脚本示例
这个脚本会查询指定日期的图片消息,然后把图片复制到你指定的文件夹:import sqlite3 import shutil import os from datetime import datetime # 配置参数 DB_PATH = r"C:\Users\YourName\AppData\Roaming\ViberPC\1234567890\viber.db" # 替换成你的数据库路径 TARGET_FOLDER = "./viber_photos_20240520" # 保存图片的目标文件夹 TARGET_DATE = "2024-05-20" # 要下载的日期,格式YYYY-MM-DD # 创建目标文件夹 if not os.path.exists(TARGET_FOLDER): os.makedirs(TARGET_FOLDER) # 连接数据库(运行前请关闭Viber,否则数据库会被锁定) conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() # 查询指定日期的图片消息:type=3表示图片消息,timestamp是毫秒级时间戳 query = """ SELECT body FROM messages WHERE type = 3 AND datetime(timestamp/1000, 'unixepoch', 'localtime') LIKE ? """ cursor.execute(query, (f"{TARGET_DATE}%",)) results = cursor.fetchall() # 复制图片到目标文件夹 for idx, result in enumerate(results): img_path = result[0] if os.path.exists(img_path): # 生成新文件名避免重复 new_filename = f"photo_{idx+1}_{os.path.basename(img_path)}" shutil.copy2(img_path, os.path.join(TARGET_FOLDER, new_filename)) print(f"已复制:{img_path} -> {new_filename}") else: print(f"文件不存在:{img_path}") # 关闭数据库连接 conn.close() print("下载完成!")
注意:
- 运行脚本前必须关闭Viber,否则数据库会被程序锁定无法读取。
messages表的body字段直接存储了图片在本地的完整路径,直接复制即可。
方法二:用PyAutoGUI模拟手动下载(适合不想碰数据库的情况)
如果不想操作数据库,可以用自动化工具模拟手动点击下载,缺点是依赖屏幕坐标,稳定性不如读取数据库。
步骤:
安装依赖:
pip install pyautogui简单脚本示例(需根据你的Viber界面调整坐标):
import pyautogui import time # 配置参数 TARGET_DATE = "2024-05-20" # 打开Viber(替换为你的Viber任务栏图标坐标,可通过pyautogui.position()获取) pyautogui.click(x=100, y=1000) time.sleep(2) # 点击搜索框并输入日期 pyautogui.click(x=500, y=50) pyautogui.typewrite(f"{TARGET_DATE}") time.sleep(1) # 模拟右键保存图片(需根据你的界面调整图片和菜单坐标) for i in range(10): # 假设下载10张图片 pyautogui.rightClick(x=600, y=200 + i*150) time.sleep(0.5) pyautogui.click(x=650, y=250 + i*150) # "保存图片"选项的坐标 time.sleep(1) print("模拟下载完成!")
注意:
- 用
pyautogui.position()可以获取当前鼠标位置的坐标,用来调整脚本里的x、y值。 - 运行时不要操作鼠标键盘,否则会干扰自动化流程。
内容的提问来源于stack exchange,提问作者Skye
相关产品推荐
相关产品推荐

