Skip to content

python3 async version #5

@pinhopro

Description

@pinhopro

Hi guys,

I implemented a python3 async version of emailage api client.

here is the code

#!/usr/bin/env python3
from uuid import uuid4
import time
import json
import re
from six import b


import urllib
from hashlib import sha1
import hmac
import base64

import aiohttp


class AioEmailageClient(object):
    def __init__(self, secret, token):
        self.secret, self.token = secret, token
        self.hmac_key = token + '&'
        self.domain = 'https://api.emailage.com'
        self.session = aiohttp.ClientSession()

    async def request(self, endpoint, **params):
        url = self.domain + '/emailagevalidator' + endpoint + '/'
        params = dict(
            format='json',
            oauth_consumer_key=self.secret,
            oauth_nonce=str(uuid4()),
            oauth_signature_method='HMAC-SHA1',
            oauth_timestamp=int(time.time()),
            oauth_version="1.0",
            **params
        )

        def _quote(obj):
            return urllib.parse.quote(str(obj), safe='')

        def _normalize_query_parameters(params):
            return '&'.join(map(lambda pair: '='.join([_quote(pair[0]), _quote(pair[1])]), sorted(params.items())))

        def _concatenate_request_elements(method, url, query):
            return '&'.join(map(_quote, [str(method).upper(), url, query]))

        def _hmac_sha1(base_string, hmac_key):
            """9.2.  HMAC-SHA1"""
            hash = hmac.new(b(hmac_key), b(base_string), sha1)
            return hash.digest()

        def _encode(digest):
            """9.2.1.  Generating Signature"""
            return base64.b64encode(digest).decode('ascii').rstrip('\n')

        query = _normalize_query_parameters(params)
        base_string = _concatenate_request_elements('GET', url, query)
        digest = _hmac_sha1(base_string, self.hmac_key)
        params['oauth_signature'] = _encode(digest)

        async with self.session.get(url,params=params) as resp:
            # Remove any unreadable characters from response payload
            json_data = re.sub(r'^[^{]+', '', await resp.text())
            return json.loads(json_data)

    async def query(self, query, **params):
        if type(query) is tuple:
            query = '+'.join(query)
        params['query'] = query
        return await self.request('', **params)

    async def query_email(self, email, **params):
        if not re.match(r'^[^@\s]+@([^@\s]+\.)+[^@\s]+$', email):
            raise ValueError('{} is not a valid email address.'.format(email))
        return await self.query(email, **params)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions