前一段时间想尝试一下用 Python 实现自动发一些文章到头条上,因为头条没有提供API发布文章,所以只能通过一些浏览器自动化,实现自动发布文章。但是第一道坎就是登录账号的时候弹出来的滑块验证码。

相信大家对滑块验证码比较熟悉了,就是一张有缺口的背景图,和一张缺口的图片,通过拖拽使背景图和前景图拼接成一张完整的图片。

查找了网上很多文章,基本上滑块验证码实现的方式与头条的并不一样,所以也不能成为解决方案。在 GitHub 搜索「滑块验证码」指定 Python 语言后发现了头条的字样,于是阅读了一遍代码,了解了实现原理。

核心代码分为两个步骤,一是计算需要滑动的距离,二是模拟出人手操作滑动的速度,因为匀速滑动会被认为是机器,不允许通过验证。

计算滑动距离

这里利用了 opencv-python 这个库提供的 matchTemplate 方法,从一张大图中搜索小图,计算出大图上各个区域和小图的相识度,再通过 minMaxLoc 方法找到最大值。从而计算需要滑动的距离。具体代码如下

#  传入滑块背景图片本地路径和滑块本地路径,返回滑块到缺口的距离def findPic(img_bg_path, img_slider_path):    """    找出图像中最佳匹配位置    :param img_bg_path: 滑块背景图本地路径    :param img_slider_path: 滑块图片本地路径    :return: 返回最差匹配、最佳匹配对应的x坐标    """# 读取滑块背景图片,参数是图片路径,OpenCV默认使用BGR模式    # cv.imread()是 image read的简写    # img_bg 是一个numpy库ndarray数组对象    img_bg = cv.imread(img_bg_path)# 对滑块背景图片进行处理,由BGR模式转为gray模式(即灰度模式,也就是黑白图片)    # 为什么要处理?BGR模式(彩色图片)的数据比黑白图片的数据大,处理后可以加快算法的计算    # BGR模式:常见的是RGB模式    # R代表红,red; G代表绿,green;  B代表蓝,blue。    # RGB模式就是,色彩数据模式,R在高位,G在中间,B在低位。BGR正好相反。    # 如红色:RGB模式是(255,0,0),BGR模式是(0,0,255)    img_bg_gray = cv.cvtColor(img_bg, cv.COLOR_BGR2GRAY)# 读取滑块,参数1是图片路径,参数2是使用灰度模式    img_slider_gray = cv.imread(img_slider_path, 0)# 在滑块背景图中匹配滑块。参数cv.TM_CCOEFF_NORMED是opencv中的一种算法    res = cv.matchTemplate(img_bg_gray, img_slider_gray, cv.TM_CCOEFF_NORMED)print('#' * 50)    print(type(res))  # 打印:<class 'numpy.ndarray'>    print(res)    # 打印:一个二维的ndarray数组    # [[0.05604218  0.05557462  0.06844381... - 0.1784117 - 0.1811338 - 0.18415523]    #  [0.06151756  0.04408009  0.07010461... - 0.18493137 - 0.18440475 - 0.1843424]    # [0.0643926    0.06221284  0.0719175... - 0.18742703 - 0.18535161 - 0.1823346]    # ...    # [-0.07755355 - 0.08177952 - 0.08642308... - 0.16476074 - 0.16210903 - 0.15467581]    # [-0.06975575 - 0.07566144 - 0.07783117... - 0.1412715 - 0.15145643 - 0.14800543]    # [-0.08476129 - 0.08415948 - 0.0949327... - 0.1371379 - 0.14271489 - 0.14166716]]print('#' * 50)# cv2.minMaxLoc() 从ndarray数组中找到最小值、最大值及他们的坐标    value = cv.minMaxLoc(res)    # 得到的value,如:(-0.1653602570295334, 0.6102921366691589, (144, 1), (141, 56))print(value, "#" * 30)# 获取x坐标,如上面的144、141    return value[2:][0][0], value[2:][1][0]

模拟滑动

利用匀加速和匀减速计算位移就可以大概模拟出人拖拽的行为。

大概的思路如下

模拟滑动

代码实现如下

# 返回两个数组:一个用于拖动滑块前进,一个用于拖动滑块折返def generate_tracks(distance):    # 给距离加上20,这20像素用在滑块滑过缺口后,减速折返回到缺口    distance += 20    v = 0    t = 0.2    forward_tracks = []    current = 0    mid = distance * 3 / 5  # 减速阀值    while current < distance:        if current < mid:            a = 2  # 加速度为+2        else:            a = -3  # 加速度-3        s = v * t + 0.5 * a * (t ** 2)        v = v + a * t        current += s        forward_tracks.append(round(s))back_tracks = [-3, -3, -2, -2, -2, -2, -2, -1, -1, -1, -1]    return forward_tracks, back_tracks

有了这两个核心代码,就可以使用账号密码登录头条了完整代码可以参考 https://github.com/chushiyan/slide_captcha_cracking。这里并不推荐使用这种方式短时间内进行多次登录,可以使用设置 cookie 的方式跳过登录。

最近在头条发了点搞笑动图,赚了瓶水钱,大家如果也想尝试,可以克隆我的项目 https://github.com/AD-feiben/toutiao。

登录头条后,打开控制台 -> Network 选项,将 cookie 赋值给 config.py 中的 Toutiao_cookie_str 即可。

Python实现头条自动发文章,赚点广告费!相关推荐

  1. 使用Python及Selenium自动发表文章

    本文的主要内容是使用Python及Selenium自动发表文章到思否的实现思路及方式的介绍并为读者提供参考的源代码. 目录 实现思路 在自动发表文章时,我们的实现思路大致如下: 对Markdown文章 ...

  2. Python 自动发文章到 wordpress

    如何使用Python将采集来的文章自动发表到wordpress博客呢,下面将具体操作步骤分享如下: 一.使用方法 1.将三个 模块 安装完成: 2.将代码复制成一个文件 wp.py; 3.将 md 格 ...

  3. python操作微信自动发消息(微信聊天机器人)

    前言 最近在学习python,发现一个微信自动发消息的小demo感觉很有意思,试了一下,不成功,因为demo中用的是itchat这个库来操作微信,而这个库是通过微信网页版来操作微信的,现在微信网页版已 ...

  4. python用outlook自动发邮件_python使用两种发邮件的方式smtp和outlook示例

    smtp是直接调用163邮箱的smtp服务器,需要在163邮箱中设置一下.outlook发送就是Python直接调用win32方式.调用程序outlook直接发送邮件. import win32com ...

  5. python通过代理自动发邮件脚本_python自动发送邮件脚本

    本文实例为大家分享了python自动发送邮件的具体代码,供大家参考,具体内容如下 #coding=utf8 ''''' 该模块使自动发送邮件的模块 模块初始化时需要设置: sender:发送人 rec ...

  6. python用outlook自动发邮件_python调用outlook发送exchange邮件(含附件)

    最近在解决一个问题,就是生成每日数据的报表,然后利用邮件群发给各位同事.由于主要工作不在这,为了节省时间,所以选择了使用python语言. 选择发送邮件时,有人可能会说直接使用smtp库不就行吗?为啥 ...

  7. python写代码没思路_一种用python实现的自动重写文章标题的思路与代码实现

    好几周没更新了,今天来给大家分享一个标题重写的小思路以及代码实现. 相信大家可能都用过5118的自动文章标题的功能,就是给一篇内容,然后直接帮你写个标题.这个功能我是去年的时候一个学员给我看的,目前是 ...

  8. Python 教你自动发微博,每日一句英语

    作者:周萝卜 最近在研究用 Python 来制作各个类别的机器人,今天先来分享一个自动发布新浪微博的机器人. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知 ...

  9. python 微信公众号发文章_如何使用 Python 爬取微信公众号文章

    我比较喜欢看公众号,有时遇到一个感兴趣的公众号时,都会感觉相逢恨晚,想一口气看完所有历史文章.但是微信的阅读体验挺不好的,看历史文章得一页页的往后翻,下一次再看时还得重复操作,很是麻烦. 于是便想着能 ...

最新文章

  1. linux 命令行编辑常用快捷键
  2. 阿里数据中台系列之Apsara Stack控制台用户角色权限及操作界面(一)
  3. SQLServer Always On FCI 脑裂及可疑状态修复
  4. php如何制作视频特效,用PS将bmp图片制作出漂亮的动态视频效果
  5. 【网络流】【待补】C. Heidi and Library (hard)
  6. [BUUCTF-pwn]——not_the_same_3dsctf_2016
  7. 【eoe特刊】第二十七期 OpenGL ES学习及项目解析
  8. lisp遍历表中所有顶点_三十张图片让你彻底弄明白图的两种遍历方式:DFS和BFS...
  9. 深度学习笔记(1) 深度学习简介
  10. Swift自定义Class实现Hashable
  11. android学习笔记之系统签名
  12. 韦东山freeRTOS系列教程之【第三章】任务管理
  13. python进行图像的风格转换
  14. CReFF缓解长尾数据联邦学习(IJCAI 2022)
  15. 青春散场,挚爱郭敬明(一草著)【连载二】
  16. Python动态图见得多了?Excel:亦可赛艇!我可是身经百战了
  17. 企业采用云计算的战略路线图
  18. 自然语言处理:CBOW(哈夫曼树)与Skip-Gram模型
  19. autoCaptcha谷歌浏览器扩展工具-调用api识别验证码图片
  20. 医用计算机基础考试,医用计算机基础

热门文章

  1. 基于单片机和GPS定位农田面积测量仪设计(毕业设计资料)
  2. sqlite 查找表中多余的重复记录
  3. 一元多项式加减法的C++实现
  4. Oracle 创建表空间,创建表、数据增删改
  5. 快手极速版库-----青龙面板----完整教学
  6. 利用Python脚本给图片批量添加文字水印
  7. 【C语言】函数番外篇——递归
  8. 深蓝色固体Cyanine5-Azide,Cy5-N3,Cy5 Azide,菁染料CY5叠氮
  9. .net linux 界面设计,.NET Core3.0开发Liunx桌面应用程序
  10. CeSi 进程集中管理部署