2014-10-14 3 views
1

새로운 비즈니스 자격 증명을 무료 사용자 API 키와 함께 사용하여 요청을 작성하는 데 사용한 Python-Requests 모듈에 통합하는 데 문제가 있습니다.파이썬 요청에 대한 비즈니스 인증 문제를위한 Google지도

Google은 (1) 기본 URL을 경로로 구문 분석하고 부분을 쿼리 (2)이 비공개 키를 디코딩하여 (3)이 개인 키와 URL을 사용하여 서명을 생성하는 인증 방법을 따라 왔습니다. 다음과 같이 내 코드는 base64로

를 사용하여 이진 서명을 인코딩 HMAC SHA1 (4)를 사용하여 인코딩 된 문자열 -

import requests 
import csv 
import json 
import urlparse 
import hashlib 
import base64 
import hmac 
from pprint import pprint 

url_raw = 'https://maps.googleapis.com/maps/api/directions/json&client=REMOVED' 
Private_Key = 'REMOVED' 

with open('./Origins.csv', 'rU') as csvfile: 
    reader = csv.DictReader(csvfile) 
    origincoords = ['{Y},{X}'.format(**row) for row in reader] 

with open('./Destinations.csv', 'rU') as csvfile: 
    reader = csv.DictReader(csvfile) 
    destinationcoords = ['{Y},{X}'.format(**row) for row in reader] 

results=[] 

url = urlparse.urlparse('url_raw') 

url_to_sign = url.path + '?' + url.query 

decodedKey = base64.urlsafe_b64decode(Private_Key) 

signature = hmac.new(decodedKey, url_to_sign, hashlib.sha1) 

encodedSignature = base64.urlsafe_b64encode(signature.digest()) 

originalUrl = url.scheme + "://" + url.netloc + url.path + '?' + url.query 

Full_URL = originalUrl + "&signature=" + encodedSignature 

for i in range(0,(len(origincoords))): 
    params ={'origin': origincoords[i], 
      'destination': destinationcoords[i], 
      'encodedSignature': encodedSignature} 

    directions = requests.get(Full_URL, params=params).json() 
    results.append(directions) 

이 시점에서 나는 내 연구에 대한 관련 정보의 결과를 분석합니다. 이전에 도움을 주신 @fredtantini에게 감사드립니다.

현재 유효한 스키마를 사용하고 있지 않다는 오류 메시지가 requests.exception과 관련되어 있습니다. 그러나, 내 코드에서 url.scheme을 originalUrl 변수에 포함 시켰습니다. originalUrl 변수는 요청 생성에 사용 된 Full_URL의 일부를 구성합니다.

답변

1

url_raw의 값을 분석하지 않습니다. 당신은 내용 'url_raw'으로 문자열을 구문 분석됩니다

url = urlparse.urlparse('url_raw') 

url_raw 주위에 따옴표를 제거, 당신은 동일 그 변수뿐 아니라 텍스트를 포함하는 일이 문자열과 관련된 값을 구문 분석 할 변수 이름.

데모 : 계획 대신 'https'로 설정되는 실제 URL을 구문 분석 할 때 동안 첫 번째 경우 scheme에 빈 문자열 얼마나

>>> import urlparse 
>>> url_raw = 'https://maps.googleapis.com/maps/api/directions/json&client=REMOVED' 
>>> urlparse.urlparse('url_raw') 
ParseResult(scheme='', netloc='', path='url_raw', params='', query='', fragment='') 
>>> urlparse.urlparse(url_raw) 
ParseResult(scheme='https', netloc='maps.googleapis.com', path='/maps/api/directions/json&client=REMOVED', params='', query='', fragment='') 

참고.

다음으로 경로 플러스 클라이언트 ID가 아닌 전체에이라는 쿼리 문자열에 대한 서명을 생성해야합니다.

당신은 최고의 쿼리 매개 변수 연결 후 작성하여 요청, 을 준비하는 것이 수행 할 수 있습니다 이것은 우리에 대한 URL을 생산하는 PreparedRequest object를 사용

session = requests.Session() 

for origin, destination in zip(origincoords, destinationcoords): 
    params ={'origin': origin, 'destination': destination} 
    request = requests.Request('GET', Full_URL, params=params).prepare() 
    parsed_url = urlparse.urlparse(request.url) 
    signature = hmac.new(decodedKey, '{}?{}'.format(parsed_url.path, parsed_url.query), 
         hashlib.sha1).digest() 
    request.prepare_url(request.url, {'signature': base64.urlsafe_b64encode(signature)}) 
    response = session.send(request) 
    directions = response.json() 

    results.append(directions) 

를, 그래서 우리는 다시 그것을 구문 분석 할 수 서명의 용이성. 그런 다음 PreparedRequest.prepare_url() method을 사용하면 해당 객체의 URL에 서명을 추가 할 수 있습니다. 그런 다음 세션 객체로 쉽게 보낼 수 있습니다.

+0

많은 감사 @Martijn. 나는 그것을 지금 본다. 불행히도 이제는 ValueError가 발생합니다 : No JSON 객체가 디코딩 될 수 있습니다 ' – LearningSlowly

+0

@LearningSlowly : 그러면 * 무엇이 반환 되었습니까? 'response = requests.get (Full_URL, params = params)'를 사용하고,'response.headers'와'response.content'를보고 Google이 당신에게 무엇을 보냈는지 확인하십시오. –

+0

불행히도, 나는 Google에서 아무것도 얻지 못한다고 생각하지 않습니다. 오류가 줄에 있음 - 방향 = requests.get (Full_URL, params = params) .json() 요청이 실제로 전송되는 곳 – LearningSlowly

관련 문제