先上代码
import requests
import base64
import tesserocr
from PIL import Image
import json
import random
from faker import Faker
class Tess(object):
def __init__(self):
self.fz = Faker('zh.CN')
self.headers = {
'user-agent': self.fz.user_agent(),
'content-type': 'application/json'
}
def get_yzm(self):
url = 'https://www.zhihu.com/api/v4/anticrawl/captcha_appeal'
session = requests.session()
response = session.get(url, headers=self.headers)
print(response.status_code)
print(response.text)
pic = json.loads(response.text)['img_base64']
pic_content = base64.urlsafe_b64decode(pic)
name = str(random.randint(1, 9999))
with open('{}.png'.format(name), 'wb')as f:
f.write(pic_content)
img = Image.open('{}.png'.format(name))
result = tesserocr.image_to_text(img)
data = {'captcha': result}
res = session.post(url, headers=self.headers, data=json.dumps(data))
print(res.text)
if __name__ == '__main__':
TS = Tess()
TS.get_yzm()
当触发知乎的验证码机制时,首先创建一个session,然后通过这个session下载验证码图片,知乎的验证码图片是一个base64 code,所以需要用到base64解析图片。然后使用tesserocr识别图片,最后将识别出的内容post确认。
由于没有训练过这个类型的验证码,识别的准确率会非常低。如果想要高效的识别,建议自己训练一个模型或者接入第三方打码平台。