撸冰花 发表于 2021-3-3 16:40

关于知乎登录的反扒机制绕过

登录有许多的反扒机制,首先是登录不可以快速请求我用selenium接管打开的浏览器绕过
第二是图形滑块验证码,使用图像层次进行绕过
###在开始运行代码之前,可以去搜索一下selenium接管浏览器,文中需要用到
```
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time, requests
import cv2
import numpy as np
import re
from selenium.webdriver.chrome.options import Options


chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
zh = webdriver.Chrome(r'E:\pycharm\pythonProject\Reptile\自动化测试\chromedriver.exe', chrome_options=chrome_options)
zh.get('https://www.zhihu.com/signin?next=%2F')



#登录
def login():
    element = zh.find_element_by_css_selector('').click()

    zh.implicitly_wait(3)

    username = zh.find_element_by_css_selector('')
    zh.implicitly_wait(3)
    username.send_keys('admin') #此处键入用户名

    time.sleep(2)

    password = zh.find_element_by_css_selector('')
    zh.implicitly_wait(3)
    password.send_keys('admin') #此处键入密码

    time.sleep(2)

    loginbutton = zh.find_element_by_css_selector('').click()

#获取验证图片
def hqimage():

    zh.switch_to.frame('tcaptcha_iframe')
    time.sleep(2)
    bj_img =zh.find_element_by_xpath('/html/body/div/div/div/div/div/img').get_attribute('src') #获取背景图链接
    xhd_img = zh.find_element_by_xpath('/html/body/div/div/div/div/div/img').get_attribute('src') #获取小黑块链接
    print(bj_img)
    print(xhd_img)
    with open('./bj.jpg', mode='wb') as f: #保存背景图图片到本地
      f.write(requests.get(bj_img).content)
      f.close()
    with open('./xhd.jpg', mode='wb') as f: #保存小黑块图片到本地
      f.write(requests.get(xhd_img).content)
      f.close()

k=1
#处理验证图片
def climage():
    bj = cv2.imread('./bj.jpg') #打开待处理图片
    xhd =cv2.imread('./xhd.jpg')


    bj = cv2.cvtColor(bj, cv2.COLOR_BGR2GRAY)# 灰度处理
    xhd = cv2.cvtColor(xhd, cv2.COLOR_BGR2GRAY)

    time.sleep(3)

    # 去掉滑块黑色部分
    xhd = xhd# 0表示黑色,1表示高亮部分

    time.sleep(3)

    # 匹配->cv图像匹配算法
    result = cv2.matchTemplate(bj, xhd, cv2.TM_CCOEFF_NORMED)# match匹配,Template模板;精度高,速度慢的方法
    index_max = np.argmax(result)# 返回的是一维的位置,最大值索引


    time.sleep(3)

    # 反着推最大值的二维位置,和opencv是相反的
    x, y = np.unravel_index(index_max, result.shape)
    print("二维中坐标的位置:", x, y)
    print("正在进行第%s次滑动验证" % k)
    drop = zh.find_element_by_xpath('/html/body/div/div/div/div/div/div')
    ActionChains(zh).drag_and_drop_by_offset(drop, xoffset=x+26, yoffset=0).perform()
    time.sleep(1)

if __name__ == '__main__':
    login()

    while 1:

      hqimage()
      climage()
      zh.switch_to.default_content()
      if '首页' in zh.title:
            break
      else:
            print('第%s次验证失败...' % k, '\n')
      k = k+1
      time.sleep(5)

```

撸冰花 发表于 2021-3-4 14:42

Test_dada 发表于 2021-3-4 10:50
请问下楼主
login()函数为什么要用三个zh.implicitly_wait(3)隐式等待呢?
据我了解.implicitly_wait(tim ...

哇,这里我还没注意到,学艺不精!!!本来我想全部用time.sleep函数的,中间看到资料说这个函数发现更加灵活想试试,但是没有细究它竟然是全局的

Test_dada 发表于 2021-3-4 10:50

请问下楼主
login()函数为什么要用三个zh.implicitly_wait(3)隐式等待呢?
据我了解.implicitly_wait(time)的作用域不是全局的吗?
希望楼主解惑

ciker_li 发表于 2021-3-3 16:45

感谢分享

wsp0801 发表于 2021-3-3 16:50

感谢分享

撸冰花 发表于 2021-3-3 16:50

ciker_li 发表于 2021-3-3 16:45
感谢分享

快给个评分,嘿嘿

LL生 发表于 2021-3-3 16:53

大佬就是厉害

肥皂超人 发表于 2021-3-3 17:05

厉害了大佬

撸冰花 发表于 2021-3-3 17:09

肥皂超人 发表于 2021-3-3 17:05
厉害了大佬

卑微的我希望能够得到一个评分,涨涨知识

一如既往。 发表于 2021-3-3 17:23

大佬厉害了,这个过滑动的原理是什么呀

撸冰花 发表于 2021-3-3 17:50

一如既往。 发表于 2021-3-3 17:23
大佬厉害了,这个过滑动的原理是什么呀

识别图像戳的口子,然后进行灰度处理之后就可以找到图片的缺口位置了

麦子1995 发表于 2021-3-3 18:03

页: [1] 2 3
查看完整版本: 关于知乎登录的反扒机制绕过