本项目是我学习python操作selenium的一个🌰,也是一种京东自动退会方案,用来全自动退出京东加入的所有店铺会员
- 本项目仅限于学习研究selenium库的操作,以及一些python知识
- 有一定的电脑知识 or 有耐心爱折腾
- chrome驱动(只在chrome测试了,故只留了chrome)
- 操作系统(只在mac上测试了,非M1)
- 使用
python3.x
版本执行 - 有一定python基础知识,没有的话先去学一下,起码得会搭python环境
-
利用selenium打开退会页面
-
第一关:手机验证码
-
安卓端(以下两种任选一个用就行):
-
利用macrodroid软件 监听,一旦监听到就立即通过HTTP请求利用websocket推送过来,由
jd_wstool
工具监听并送到selenium中填写 -
利用tasker软件 监听,同上
-
使用方法:下载以上任一软件,导入相应的配置,并修改自己的IP为
main.py
程序监听的IP即可 -
关于
tasker
和macrodroid
配置均在 extra 目录下
-
-
ios端:
-
越狱机(来自@curtinlv 大佬的越狱监听短信方法,#61 )
-
像安卓端一样传验证码(基本逻辑:iOS设备通过访问短信数据库,监听最新的jd验证码并传到
jd_wstool
)-
下载 getiOSMessages.py 传到手机上(测试Pythonista 3可以,其他软件自行研究)
-
填写
jd_wstool
监听地址ip如:监听地址1: http://192.168.0.101:5201 ,填在脚本开头 ipaddr= '192.168.0.101'
-
运行脚本
-
-
-
非越狱机 (任选以下一种类型)
首先感谢tg群的朋友@millerchen 提供的思路,具体实现方案是电脑屏幕留出一个区域用来显示手机投屏的地方(如果你电脑是Mac,无需投屏,只需要打开IMessage,并保持短信同步即可,然后OCR识别IMessage),然后打开短信列表,然后找个截图工具记一下当前需要识别的的
左上角
和右下角
坐标(最好截取那一整条短信的坐标,当然截取范围越小,识别越快),然后通过ocr工具识别数字验证码注意: OCR只是处理识别短信验证码并填入,不要误解为图形验证码也可以解决。如果定位不准,看一下项目目录生成的
ios_code_pic.png
图片位置在当前屏幕的哪个位置,测试识别效果gif点我查看 , 此外,坐标和电脑分辨率有关,如果分辨是是1080P,那么qq截图识别的坐标就是刚好一比一的,比我的是4k显示器,是以百分之200显示的,那所有坐标就要乘以2了百度ocr ( 之前用过的用户还是免费500次/天的额度,新用户调整为1000次/月的额度,调整详情参考这里)
* 需要在`config.yaml`中配置如下参数: * `sms_captcha.is_ocr`设置为`true` * `sms_captcha.is_ocr.type`设置为`baidu` * `sms_captcha.is_ocr.baidu_app_id`补充完整 * `sms_captcha.is_ocr.baidu_api_key`补充完整 * `sms_captcha.is_ocr.baidu_secret_key`补充完整
阿里云ocr ( 用户新购0元500次,后续500次/0.01元,开通地址阿里云市场)
* 同上,需要在`config.yaml`中配置如下参数: * `sms_captcha.is_ocr`设置为`true` * `sms_captcha.is_ocr.type`设置为`aliyun` * `sms_captcha.is_ocr.aliyun_appcode`补充完整
easyocr (免费,本地识别)
* 同上,需要在`config.yaml`中配置如下参数: * `sms_captcha.is_ocr`设置为`true` * `sms_captcha.is_ocr.type`设置为`easyocr` * 使用时注意框选识别的范围只显示6位数字验证码(现支持一整条完整短信的区域,当然范围越大识别速度也会相应增加,区域扩大是为了优化某些用户短信验证码6位数字每次位置不一致问题)(毕竟免费开源,识别条件有点苛刻)
-
-
-
第二关:图形验证码(任选以下一种类型,默认采用本地识别)
注意: 以下关于python3
, pip3
命令只代表python3.x
环境,故如果电脑python
环境已是3.x,可直接用python
、pip
代替
-
克隆到本地或下载项目压缩包到本地
git clone https://github.com/yqchilde/JDMemberCloseAccount.git
-
在项目根目录下打开终端执行以下命令,安装所需要的包
pip3 install -r requirements.txt
如果因没有代理拉不下包,请使用国内阿里云代理,执行如下命令:
pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
-
下载必要文件
3.1 下载对应的浏览器驱动放到项目的
drivers
文件夹下面chrome
请访问chrome://version/
查看浏览器的版本,然后去 chromedriver 下载对应的版本/系统驱动(只需要保证版本号前三段一致即可,比如91.0.4472.77
只需要保证91.0.4472.x
就行),下载后解压,将其可执行文件(mac为chromedriver
,win为chromedriver.exe
放在项目的drivers
目录下即可)3.2 如果想使用yolov4识别验证码
下载权重文件 ,将
yolov4-custom.weights
解压至yolov4
文件夹下
config.yaml
文件
# 手机端cookie,是pt_key=xxx;pt_pin=xxx;
cookie: ""
debug: false
# selenium 相关
# selenium.browserType: 浏览器类型
# selenium.headless: 无头模式,建议默认设置
# selenium.binary: 可执行路径,如果驱动没有找到浏览器的话需要你手动配置
# selenium.selenium_timeout: selenium操作超时时间,超过会跳过当前店铺,进行下一个店铺,默认为30秒
selenium:
browserType: "Chrome"
headless: false
binary: ""
selenium_timeout: 30
# shop 店铺设置相关
# shop.skip_shops: 需要跳过的店铺,需要填写卡包中的完整店铺名称,为了效率没做模糊匹配,多个店铺用逗号隔开
# shop.phone_tail_number: 手机后4位尾号,若填写将会校验店铺尾号是否是规定的,不符合就跳过
# shop.member_close_max_number: 设置本次运行注销的最大店铺数,默认为0,代表不限制
shop:
skip_shops: ""
phone_tail_number: ""
member_close_max_number: 0
# sms_captcha 短信验证码相关
# sms_captcha.is_ocr: 是否开启OCR模式,IOS设备必须开启,安卓非必须
# sms_captcha.jd_wstool: 是否调用jd_wstool工具监听验证码,默认为开启,如果不想开启,设置为false会调用内置websocket监听
# sms_captcha.ws_conn_url: websocket链接地址,不用动
# sms_captcha.ws_timeout: websocket接收验证码时间超时时间,超时会跳过当前店铺,进行下一个店铺,默认为60秒
# sms_captcha.ocr.type: ocr的类型,可选:baidu、aliyun、easyocr
# sms_captcha.ocr.ocr_range: 需要截取的投屏区域的验证码左上角和右下角坐标,顺序依次是 [左x,左y,右x,右y],如[1,2,3,4]
# sms_captcha.ocr.ocr_delay_time: OCR识别的延迟时间,如果没识别到就几秒后再次尝试,默认为5
# sms_captcha.ocr.baidu_app_id: 需要在[百度智能云](https://cloud.baidu.com/) 注册个账号,搜索文字识别项目,创建应用后的`app_id`
# sms_captcha.ocr.baidu_api_key: 需要在[百度智能云](https://cloud.baidu.com/) 注册个账号,搜索文字识别项目,创建应用后的`api_key`
# sms_captcha.ocr.baidu_secret_key: 需要在[百度智能云](https://cloud.baidu.com/) 注册个账号,搜索文字识别项目,创建应用后的`secret_key`
# sms_captcha.ocr.aliyun_appcode: 需要在[阿里云市场](https://market.aliyun.com/products/57124001/cmapi028554.html?spm=5176.2020520132.101.2.608172181RzlnC#sku=yuncode2255400000) 购买后的`AppCode`
sms_captcha:
is_ocr: false
jd_wstool: true
ws_conn_url: "ws://localhost:5201/subscribe"
ws_timeout: 60
ocr:
type: ""
ocr_range: [ ]
ocr_delay_time: 10
baidu_app_id: ""
baidu_api_key: ""
baidu_secret_key: ""
aliyun_appcode: ""
# image_captcha 图形验证码相关
# image_captcha.type: 图形验证码类型,可选:local、cjy、tj、yolov4
# image_captcha.cjy_username: 超级鹰账号,仅在 image_captcha.type 为 cjy 时需要设置
# image_captcha.cjy_password: 超级鹰密码,仅在 image_captcha.type 为 cjy 时需要设置
# image_captcha.cjy_soft_id: 超级鹰软件ID,仅在 image_captcha.type 为 cjy 时需要设置
# image_captcha.cjy_kind: 超级鹰验证码类型,仅在 image_captcha.type 为 cjy 时需要设置,且该项目指定为 9101
# image_captcha.tj_username: 图鉴账号,仅在 image_captcha.type 为 tj 时需要设置
# image_captcha.tj_password: 图鉴密码,仅在 image_captcha.type 为 tj 时需要设置
# image_captcha.tj_type_id: 图鉴验证码类型,仅在 image_captcha.type 为 tj 时需要设置,且该项目指定为 19
# yolov4_weights: yolov4权重文件路径,仅在 image_captcha.type 为 yolov4 时需要设置
# yolov4_cfg: yolov4配置文件路径,仅在 image_captcha.type 为 yolov4 时需要设置
# CUDA: 尝试使用CUDA加速,据说速度可提升几倍到几十倍,需要编译安装opencv,仅在 image_captcha.type 为 yolov4 时需要设置
image_captcha:
type: "local"
cjy_username: ""
cjy_password: ""
cjy_soft_id: ""
cjy_kind: 9101
tj_username: ""
tj_password: ""
tj_type_id: 19
yolov4_weights: "yolov4/yolov4-custom.weights"
yolov4_cfg: "yolov4/yolov4-custom.cfg"
CUDA: false
# user-agent 用户代理,可自行配置
user-agent:
- Mozilla/5.0 (Linux; Android 11; M2007J3SC) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.210 Mobile Safari/537.36
- okhttp/3.12.1;jdmall;android;version/10.0.2;build/88569;screen/1080x2266;os/11;network/wifi;
-
使用
add_cookie.py
可以获取手机端Cookie
并自动配置到config.yaml
文件中 -
手动在
config.yaml
中写入cookie
项,注意是pt_key=123456;pt_pin=jd_987654的那个(请不要随意泄露你的cookie)
大体说一下,这块是关于手机端短信验证码的配置
-
安卓推荐使用tasker或macrodroid,不要用ocr,不必须,是为了你省事,IOS越狱设备也可以使用短信转发功能,IOS非越狱必须使用OCR
-
如果是使用tasker / macrodroid,is_ocr肯定是false,代表不用ocr
-
如果用ocr,is_ocr写true,能理解吧
-
ocr里面的type是三选一,baidu / aliyun / easyocr,代表你要用的ocr平台是哪个,easyocr是本地的,其他两个是线上的
-
ocr_range是你要截图的区域,不知道怎么截,往下翻,有截图
-
ocr_delay_time是ocr延迟时间,不想改就保持默认
-
下面的配置,就是type你用baidu,下面id,key啥的你就写baidu的,阿里同样原理,easyocr不用写
5. 启动 jd_wstool 工具(使用OCR的不用开)
这个步骤只需要安卓端手机用了tasker 或 macrodroid 或其他自动化工具的开启
什么意思呢?就是配置文件中你的 is_ocr
为false的,就要开启,否则不用开启
在项目目录下执行python3 main.py
,等待执行完毕即可
该工具是用来监听手机端发送HTTP请求传递验证码的,实现原理是websocket
如果不想用jd_wstool
,配置文件sms_captcha
下面的jd_wstool
设置为false,就会走内置websocket,默认为true
-
Tasker | Macrodroid 监听不到短信怎么办?
-
vivo手机和iqoo手机的验证码保护取消: 短信-设置-隐私保护-验证码安全保护关闭
-
小米手机:权限-允许读取短信 & 允许读取通知类短信
-
华为手机:短信-右上角三个点-设置-验证码安全保护关闭
-
权限没问题的,看下tasker的日志或macrodroid的日志,有错误会显示
-
-
百度OCR报错
{'error_code': 18, 'error_msg': 'Open api qps request limit reached'}
- 答案在这里 yqchilde#48
-
百度OCR报错
{'error_code': 14, 'error_msg': 'IAM Certification failed'}
- 说明从百度复制到配置文件的
baidu_app_id
,baidu_api_key
,baidu_secret_key
不正确
- 说明从百度复制到配置文件的
-
电脑端没有监听到验证码,显示等待websocket推送短信验证码超时
-
先用手机浏览器访问监听地址,确保能访问通
-
如果访问通说明IP没问题,请查看手机端MacroDroid或Tasker里main的日志,确保有监听到
-
-
websocket转发验证码
- 电脑运行
python3 test_main.py
和./jd_wstool
工具,windows记得.exe
,此时模拟启动main程序和监听验证码程序 - 手机访问
http://你的IP:5201/publish?smsCode=1234522
,之后查看电脑上jd_wstool
和test_main.py
的控制台输出信息
- 电脑运行
-
百度OCR
- 运行
python3 ./captcha/baidu_ocr.py
测试
- 运行
-
Easy OCR
- 运行
python3 ./captcha/easy_ocr.py
测试
- 运行
-
main.py
执行报错- 在
config.yaml
里设置debug: true
再次执行可以看到具体报错,如解决不了请反馈tg群
- 在
JD退会讨论群 https://t.me/jdMemberCloseAccount
感谢以下作者开源JD相关项目供我学习使用