欢迎大家使用以及提 PR
原理分析
平台登录
为了快速实现这个文章多平台发送的功能,选择使用 Selenium 来实现登录和文章发布的逻辑,但在实现过程中遇到了一些问题,如知乎、CSDN 登录时都会检测到 Selenium。
在开发AutoPublish时主要使用 Chrome,这里尝试让 Selenium 通过开发者模式控制 Chrome,开发者模型下的 Chrome 在某些关键参数上会与正常使用相同,但是可惜的是依旧没有绕过检查,这说明这些 站使用了其他参数来判断你使用了 Selenium,只是这个参数我们自身无法确定,遇到这种情况,有三种解决方法
-
1. 使用中间人 mitmproxy,将请求中的参数修改,这里可以将 Selenium 中所有的参数都修改了 (推荐)
-
2. 编写 Chrome 插件,Selenium 通过插件模式加载 Chrome,让插件通过 JS 直接修改 Chrome 的参数 (编写插件难度较大,本人未使用过)
-
3. 重新编译 Selenium,替换关键变量名 (难度大,本人未使用过)
但目前支持的 3 个平台 (知乎、CSDN、豆瓣) 都没有使用上面 3 种方式,而是直接使用 requests 通过模拟请求的方式来实现登录,其中知乎的登录规则最为恶心 :(。
使用 Selenium
完成登录后,会获得对应的 Cookies,这些 Cookies 就类似于身份证一样的存在,有了正确的 Cookies 你就可以在登录状态做相应的事情了,比如在登录的账 下发表文章。
其实发表文章理论上也是可以使用 requests 的形式来实现的,但简单看一下,不同平台发送文章的逻辑不相同,图片处理、样式处理这些也比较棘手,为了最快速度的实现项目,依旧通过 Selenium 的形式去实现,简单快速。
使用 autogui
最后决定使用 autogui,autogui 可以控制计算机的鼠标与键盘,从而实现点击、输入等效果,安装 autogui 需要安装相应的依赖驱动,这也操作了一些困扰,当 autogui 控制你鼠标或键盘时,你就无法使用鼠标或键盘了,因为它是通过驱动去控制的,与通过真实鼠标去控制是类似的,所以你使用 autogui 会暂时失去对鼠标或键盘的控制。
如果不在意暂时失去鼠标或键盘的控制,autogui 就是非常好用了,直接通过控制键盘的方式,实现「键盘级」的复制粘贴,此时内容就会完全复制到不同平台相应编写内容的区域了,但这其实也隐藏着一个问题,就是操作对象必须获得了「焦点」,即浏览器要在所有窗口前,此时复制的内容才会被正确复制在浏览器对应的位置。
如果你使用 PyCharm 来运行该项目,此时代码无法完整的运行完,这是因为 PyCharm 无论是运行模式还是 Debug 模式,其实都占据了「焦点」,autogui 复制的内容会出现在 PyCharm 光标处。
代码分析
Selenium 二次封装
因为整个项目会经常使用 Selenium,为了让代码更加简洁,这里以单例模式创建浏览器实例并将 Selenium 的常用方法了二次封装。
简单看一下单例模式的实现方式,代码如下,其实就是利用了 方法,先判断实例是否存在,不存在再创建。
接着看一下对 Selenium 的二次封装,比如一些点击的操作,为了确保操作对象的存在,这里会先隐式判断元素是否存在,如果存在再点击
tkinter 编写界面
为了方便使用,我还是 tkinter 编写了一个「很丑」的界面,之所以选择 tkinter 是因为它是 Python 的内置库,使用起来也比较简单。
使用 tkinter 制作界面有个关键点,就是不能让负责界面渲染的主线程执行耗时操作,不然,界面就会出现严重的卡顿现象,常规的做法就是开启一个新线程来负责耗时逻辑,然后通过全局变量在不同的线程之间传递数据,这个全局变量通常会定义为队列。
在登录不同平台时,如果遇到验证码也需要通过 tkinter 显示并获取验证码正确的值,此时可以使用 tkinter 的弹窗机制,弹出一个新窗口来显示验证码并获取验证码的真实值,实现如下:
尾
AutoPublish 本质其实是与不同平台做对抗,如果平台登录规则变动或发送文章的规则变动,AutoPublish 的逻辑就会失去效果,这不只是 AutoPublish 会面临的问题,任何爬虫项目都会面对这样的问题。
希望感兴趣的朋友为 AutoPublish 点个星,此外也 HackPython
最后再提一下,项目地址:https://github.com/ayuLiao/AutoPublish
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!