本着薅羊毛绝不花一分钱的心态,采用完全免费的方案,实现了一个用ChatGTP回答百度知道问题的脚本,采用技术如下:
- adb: 控制基本的手机动作
- adbKeyboard: 实现中文的输入
- paddle ocr: 实现手机截图的文本识别
- ahk:作为RPA方案,向chatGPT提问,并获得答案
- tampemonkey:一个简易的脚本,用来标记chatGPT页面元素(原始页面找图失败率很高)
- 手机安装
百度知道APP
- 手机安装
Answer/apk/
文件夹下的 ADBKeyboard.apk,并在输入法设置中选择启用该输入法 - 电脑配置 python 环境,在
Answer
文件夹下,执行python baidu.py
然后提示缺什么包,就安装什么包 - 浏览器安装 tampemonkey 插件,然后新建脚本,将
Answer/chatMark.user.js
内容复制到脚本编辑器,然后保存 - 使用前确保chatGPT页面处于待提问状态,并确认 tampemonkey 插件已成功加载
pip install paddlepaddle==2.3.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install paddleocr>=2.0.1
注意,paddle 安装最新版本。新版 paddle 的识别结果,比老版本多嵌套一层列表,如需要使用老版本,需要修改以下代码:
# 将 baidu.py 文件中, paddle 所有识别结果的迭代目标进行替换
# 比如 将
res = pd.ocr(filePath('title.png'), ls=True)
for item in res[0]:
# 改为
res = pd.ocr(filePath('title.png'), ls=True)
for item in res:
pip install findimage
安装完成后报错如下:
ImportError: Bindings generation error. Submodule name should always start with a parent module name. Parent name: cv2.cv2. Submodule name: cv2
解决方法:
# 将 site-packages\findimage\__init__.py 文件,第 18 行
from cv2 import cv2
# 改为
import cv2
这个包现在其实没用,可以删掉相关代码
; autoChatGPT.ahk 第30行
; if WinExist("ahk_exe firefox.exe") {
if WinExist("ahk_exe msedge.exe") {
默认 EDGE 浏览器,可选 FireFox 浏览器,其他浏览器用 SPY 工具自行抓取
# baidu.py 第12行
def filePath(fileName, path="D:/baidu"):
建议修改到内存虚拟磁盘中,以保护硬盘
# baidu.py 第172行
# if "高悬赏" in item[1][0]:
if "最新" in item[1][0]:
默认回答 “最新” 问题,可选回答“最高悬赏”问题
# baidu.py 第197行
index = 0 # 回答第一个问题
index = random.randint(0, len(btnPos)-1) # 随机回答一个问题
默认随即回答一道题问题,可选回答第一题
# baidu.py 第50行起,直至函数结束,看着修改即可
if "gpt" in checkString or "chat" in checkString:
print("钓鱼问题,拒绝回答")
return None
......
使用 --remote-debugging-port
参数启动Chrome浏览器后,chatGTP不给答案
即使有免费额度,用完还是要收钱,不确定百度知道答一道题的收益,能不能覆盖 API 的成本
刷新页面即可,如果墙不稳定可能要多刷几次
- 目前手机元素定位是通过文本识别进行的,低效,但通用性略好一点,如果自己用,可以根据流程直接点击固定坐标,稳定可靠
- 还有一种方法是通过 adb 指令获取 Activity 的元素,然后解析元素内容,不确定可不可行
- 其实可以用 python 起个 http 服务,然后直接和油猴脚本通讯,获取 chatGPT 内容,这样浏览器应该无须在前台,后面有时间可以考虑尝试一下
- 勇敢的去修改任何一行代码,这就是依托答辩
- 注意使用时长,封号了对谁都不好
- 在虚拟机中实现后台运行
祝大家玩的开心~