Skip to content

Instantly share code, notes, and snippets.

@suzaku
Created December 1, 2016 08:28
Show Gist options
  • Save suzaku/87f8b0c9a69fbe9d5112cbdfba45bd17 to your computer and use it in GitHub Desktop.
Save suzaku/87f8b0c9a69fbe9d5112cbdfba45bd17 to your computer and use it in GitHub Desktop.
# -*- coding:utf-8 -*-
import time
import logging
import string
import random
import hmac
import base64
import hashlib
import requests
ssf_signature_len = 32
ssf_client_api = 'https://api.productai.cn'
ssf_client_version = '1'
logging.basicConfig(level=logging.DEBUG)
def short_uuid(length):
charset = string.ascii_lowercase + string.digits
return ''.join([random.choice(charset) for i in range(length)])
def client_headers(access_key_id, method='POST'):
timestamp = int(time.time())
headers = {
'x-ca-accesskeyid': access_key_id,
'x-ca-version': ssf_client_version,
'x-ca-timestamp': str(timestamp),
'x-ca-signaturenonce': short_uuid(ssf_signature_len),
'x-ca-signature': '',
'requestmethod': method,
}
return headers
def client_signature(headers, form, secret_key):
assert isinstance(headers, dict)
calc_params = dict(headers)
if isinstance(form, dict):
calc_params.update(form)
sort_value = []
for k in sorted(calc_params):
if k not in ['x-ca-signature']:
v = str(calc_params.get(k, '')).strip()
value = '{}={}'.format(k, v)
sort_value.append(value)
string_to_signature = '&'.join(sort_value)
signature = hmac.new(
secret_key.encode('ascii'),
string_to_signature.encode('ascii'),
hashlib.sha1
)
return base64.b64encode(signature.digest())
def submit_file_to_search(form, files):
post_form = {}
loc = form.get('loc')
if loc:
post_form['loc'] = loc
count = form.get('count')
if count:
post_form['count'] = count
url = form.get('image_url')
if url:
post_form['url'] = url
headers = client_headers(
form.get('access_key_id', ''),
form.get('request_method', 'post')
)
signature = client_signature(headers, post_form, form.get('secret_key', ''))
headers['x-ca-signature'] = signature
headers['x-ca-file-md5'] = hashlib.md5(files['search']).hexdigest()
reps = requests.request(
method=form.get('request_method', 'post'),
url='{}/{}/{}/'.format(ssf_client_api, form.get('service_type'), form.get('service_id')),
data=post_form,
files=files,
headers=headers,
verify=False,
timeout=50,
)
return reps
def submit_form_to_search(form):
post_form = {}
loc = form.get('loc', None)
if loc:
post_form.setdefault('loc', loc)
url = form.get('image_url', None)
if url:
post_form.setdefault('url', url)
headers = client_headers(form.get('access_key_id', ''), form.get('request_method', 'post'))
signature = client_signature(headers, post_form, form.get('secret_key', ''))
headers['x-ca-signature'] = signature
reps = requests.request(
method=form.get('request_method', 'post'),
url='{}/{}/{}/'.format(ssf_client_api, form.get('service_type'), form.get('service_id')),
data=post_form,
headers=headers,
verify=False,
timeout=50,
)
return reps
def add_image_to_image_set(form):
request_method = 'post'
access_key_id = form.get('access_key_id', '')
secret_key = form.get('secret_key', '')
service_type = 'image_sets'
service_id = '_0000014'
image_url = form.get('image_url')
meta = form.get('meta')
image_set_id = form.get('image_set_id')
pai_user_id = form.get('pai_user_id')
post_form = dict(image_url=image_url, meta=meta)
api_url = '/'.join([ssf_client_api, service_type, service_id, image_set_id])
headers = client_headers(access_key_id, request_method)
signature = client_signature(headers, post_form, secret_key)
headers['x-ca-signature'] = signature
# only some headers are counted into signature.
headers['pai_user_id'] = str(pai_user_id)
reps = requests.request(request_method,
api_url,
data=post_form,
headers=headers,
verify=False)
return reps
def delete_image_by_file(form):
request_method = 'post'
access_key_id = form.get('access_key_id', '')
secret_key = form.get('secret_key', '')
service_type = 'image_sets'
service_id = '_0000014'
image_set_id = form.get('image_set_id')
pai_user_id = form.get('pai_user_id')
file_path = form.get('file_path')
urls_to_delete = {'urls_to_delete': open(file_path, 'rb')}
api_url = '/'.join([ssf_client_api, service_type, service_id, image_set_id])
headers = client_headers(access_key_id, request_method)
signature = client_signature(headers, {}, secret_key)
headers['x-ca-signature'] = signature
# only some headers are counted into signature.
headers['pai_user_id'] = str(pai_user_id)
print(api_url)
reps = requests.request(request_method,
api_url,
headers=headers,
files=urls_to_delete,
verify=False)
return reps
if __name__ == '__main__':
# use url for search
resp = submit_form_to_search(
dict(
request_method='post', # 默认 的请求方法 post
service_type='', # require: 你的服务类型 可在 我的服务-测试服务 页面查看
access_key_id='', # require: 你的用户配置 access_key_id
secret_key='', # require: 你的用户配置 secret_key
service_id='', # require: 你的服务ID
image_url='', # require: 图片的url
#loc='0-0-1-1' # option: (选填) 图片标框的位置信息 log = '-'.join([ix,iy,iw,ih])
)
)
print(resp.json())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment