You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.4 KiB
Python
122 lines
3.4 KiB
Python
5 years ago
|
#### PATTERN | WEB | OAUTH #########################################################################
|
||
|
# -*- coding: utf-8 -*-
|
||
|
# Copyright (c) 2010 University of Antwerp, Belgium
|
||
|
# Author: Tom De Smedt <tom@organisms.be>
|
||
|
# License: BSD (see LICENSE.txt for details).
|
||
|
# http://www.clips.ua.ac.be/pages/pattern
|
||
|
|
||
|
####################################################################################################
|
||
|
# Naive OAuth implementation for pattern.web.Yahoo and Yahoo! BOSS v2.
|
||
|
|
||
|
from __future__ import unicode_literals
|
||
|
from __future__ import division
|
||
|
|
||
|
from builtins import str, bytes, dict, int
|
||
|
from builtins import map, zip, filter
|
||
|
from builtins import object, range
|
||
|
|
||
|
try:
|
||
|
# Python 3
|
||
|
from urllib.parse import urlencode
|
||
|
from urllib.parse import quote as urlquote
|
||
|
except ImportError:
|
||
|
from urllib import urlencode
|
||
|
from urllib import quote as urlquote
|
||
|
|
||
|
import hmac
|
||
|
import time
|
||
|
import random
|
||
|
import base64
|
||
|
|
||
|
try:
|
||
|
from hashlib import sha1
|
||
|
from hashlib import md5
|
||
|
except:
|
||
|
import sha as sha1
|
||
|
import md5
|
||
|
md5 = md5.new
|
||
|
|
||
|
_diacritics = {
|
||
|
"a": ("á", "ä", "â", "à", "å"),
|
||
|
"e": ("é", "ë", "ê", "è"),
|
||
|
"i": ("í", "ï", "î", "ì"),
|
||
|
"o": ("ó", "ö", "ô", "ò", "ō", "ø"),
|
||
|
"u": ("ú", "ü", "û", "ù", "ů"),
|
||
|
"y": ("ý", "ÿ", "ý"),
|
||
|
"s": ("š",),
|
||
|
"c": ("ç", "č"),
|
||
|
"n": ("ñ",),
|
||
|
"z": ("ž",)
|
||
|
}
|
||
|
|
||
|
####################################################################################################
|
||
|
|
||
|
|
||
|
def HMAC_SHA1(key, text):
|
||
|
return hmac.new(key.encode("utf-8"), text.encode("utf-8"), sha1).digest()
|
||
|
|
||
|
|
||
|
def nonce():
|
||
|
return md5(str(time.time()).encode("utf-8") + str(random.random()).encode("utf-8")).hexdigest()
|
||
|
|
||
|
|
||
|
def timestamp():
|
||
|
return int(time.time())
|
||
|
|
||
|
|
||
|
def escape(string):
|
||
|
return urlquote(string, safe=b"~")
|
||
|
|
||
|
|
||
|
def utf8(string):
|
||
|
return isinstance(string, str) and string.encode("utf-8") or str(string)
|
||
|
|
||
|
|
||
|
def normalize(string):
|
||
|
# Normalize accents (é => e) for services that have problems with utf-8
|
||
|
# (used to be the case with Yahoo BOSS but this appears to be fixed now).
|
||
|
string = utf8(string)
|
||
|
for k, v in _diacritics.items():
|
||
|
for v in v:
|
||
|
string = string.replace(v, k)
|
||
|
return string
|
||
|
|
||
|
|
||
|
def base(url, data={}, method="GET"):
|
||
|
# Signature base string: http://tools.ietf.org/html/rfc5849#section-3.4.1
|
||
|
base = escape(utf8(method.upper())) + "&"
|
||
|
base += escape(utf8(url.rstrip("?"))) + "&"
|
||
|
base += escape(utf8("&".join(["%s=%s" % (
|
||
|
escape(utf8(k)),
|
||
|
escape(utf8(v))) for k, v in sorted(data.items())])))
|
||
|
return base
|
||
|
|
||
|
|
||
|
def sign(url, data={}, method="GET", secret="", token="", hash=HMAC_SHA1):
|
||
|
# HMAC-SHA1 signature algorithm: http://tools.ietf.org/html/rfc5849#section-3.4.2
|
||
|
signature = escape(utf8(secret)) + "&" + escape(utf8(token))
|
||
|
signature = hash(signature, base(url, data, method))
|
||
|
signature = base64.b64encode(signature)
|
||
|
return signature.decode("utf-8")
|
||
|
|
||
|
#CONSUMER_KEY = ""
|
||
|
#CONSUMER_SECRET = ""
|
||
|
#
|
||
|
#q = "cats"
|
||
|
#url = "http://yboss.yahooapis.com/ysearch/web"
|
||
|
#data = {
|
||
|
# "q": normalize(q),
|
||
|
# "start": 0,
|
||
|
# "count": 50,
|
||
|
# "format": "json",
|
||
|
# "oauth_version": "1.0",
|
||
|
# "oauth_nonce": nonce(),
|
||
|
# "oauth_timestamp": timestamp(),
|
||
|
# "oauth_consumer_key": CONSUMER_KEY,
|
||
|
# "oauth_signature_method": "HMAC-SHA1"
|
||
|
#}
|
||
|
#data["oauth_signature"] = sign(url, data, secret=CONSUMER_SECRET)
|
||
|
#data = dict((k, utf8(v)) for k, v in data.items())
|
||
|
#
|
||
|
#print(url + "?" + urlencode(data))
|