当前位置:嗨网首页>书籍在线阅读

10-与注册功能集成

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

[toc]

7.4.3 与注册功能集成

目前我们已经拥有了一个可以运行的验证码API解决方案,下面我们可以将其与前面的表单进行集成。下面的代码对 register 函数进行了修改,现在我们使用了 CaptchaAPI 类。

from configparser import ConfigParser
import requests
from lxml.html import fromstring
from chp6.login import parse_form
from chp7.image_processing import get_captcha_img
from chp7.captcha_api import CaptchaAPI
REGISTER_URL = 'http://example.python-scraping.com/user/register'
def get_api_key():
    config = ConfigParser()
    config.read('../config/api.cfg')
    return config.get('captcha_api', 'key')
def register(first_name, last_name, email, password):
    session = requests.Session()
    html = session.get(REGISTER_URL)
    form = parse_form(html.content)
    form['first_name'] = first_name
    form['last_name'] = last_name
    form['email'] = email
    form['password'] = form['password_two'] = password
    api_key = get_api_key()
    img = get_captcha_img(html.content)
    api = CaptchaAPI(api_key)
    captcha_id, captcha = api.solve(img)
    form['recaptcha_response_field'] = captcha
    resp = session.post(html.url, form)
    success = '/user/register' not in resp.url
    if success:
        api.report(captcha_id, 1)
    else:
        form_errors = fromstring(resp.content).cssselect('div.error')
        print('Form Errors:')
        print('n'.join(
             (' {}: {}'.format(f.get('id'), f.text) for f in form_errors)))
        if 'invalid' in [f.text for f in form_errors]:
            api.report(captcha_id, 0)
    return success

从前面的代码中可以看出,我们使用了新的 CaptchaAPI 类,确保向API报告错误和成功。我们还使用了 ConfigParser ,这样我们的API key就永远不会保存在代码库当中了,而是保存在配置文件中。如果想要查看配置文件的示例,可以前往我们的代码库(位于本书源码文件的code文件夹中,其名为 example_config.cfg )。你还可以将API key存储在环境变量或是你计算机或服务器的其他安全存储中。

现在,我们可以尝试运行新的注册函数了。

>>> register(first_name, last_name, email, password)
Submitting CAPTCHA
Waiting for CAPTCHA ...
Waiting for CAPTCHA ...
Waiting for CAPTCHA ...
Waiting for CAPTCHA ...
Waiting for CAPTCHA ...
Waiting for CAPTCHA ...
Waiting for CAPTCHA ...
True

运行成功了!我们从表单中成功获取到了验证码图像,并提交给9kw的API,之后其他用户人工处理了该验证码,程序将返回结果成功提交到Web服务器端,注册了一个新账号。