Python을 사용하여 Lovoo API 액세스
lovoo API를 활용하고 싶지만 어떻게 시작해야 할지 잘 모르겠습니다.찰스 프록시를 실행하고 트래픽을 살펴본 결과 다음과 같은 결론에 도달했습니다.
첫번째 aGET
로.https://api.lovoo.com/oauth/requestToken?
사용자가 앱(iPhone)을 통해 로그온하는 즉시 전송됩니다.
GET /oauth/requestToken? HTTP/1.1
Host api.lovoo.com
User-Agent LOVOO/612 (iPhone; iOS 10.2; Scale/3.00)
kissapi-app-idfv 1EC7A8E5-DF16-4E14-8EC9-98DD4772F903
tz Europe/xxx
kissapi-device-model iPhone 6s Plus
kissapi-app-version 3.17.0
kissapi-new-oauth 1
kissapi-device iphone
kissapi-app lovoo
wifi true
kissapi-adv-id 00000000-0000-0000-0000-000000000000
Connection keep-alive
kissapi-app-id 7F947A460DAFCA88556B2F35A6D78A3E
Authorization OAuth oauth_callback="oob", oauth_consumer_key="an.email%40gmail.com", oauth_nonce="A32CCA91-FB7A-4AA3-8314-0A9A6E67045E", oauth_signature="Sq8KTg%2FhVIGBaWgWXprPluczOs4%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1487017515", oauth_version="1.0"
Accept-Language en-CH;q=1, de-CH;q=0.9
kissapi-adv-on false
kissapi-version 1.20.0
kissapi-update-user-hash 6ea2bd15ea41d0dc8c2615589e2d52ec
Accept */*
kissapi-device-os 10.2
Accept-Encoding gzip, deflate
kissapi-sync-enabled 1
이것은 또한 다음 토큰을 제공합니다.oauth_token=44d83e8ef50f&oauth_token_secret=37998f6c6ef2e618
그 다음에 다른 것이 나옵니다.GET
로.https://api.lovoo.com/oauth/accessToken?
:
GET /oauth/accessToken? HTTP/1.1
Host api.lovoo.com
User-Agent LOVOO/612 (iPhone; iOS 10.2; Scale/3.00)
kissapi-app-idfv 1EC7A8E5-DF16-4E14-8EC9-98DD4772F903
tz Europe/xxx
kissapi-device-model iPhone 6s Plus
kissapi-app-version 3.17.0
kissapi-new-oauth 1
kissapi-device iphone
kissapi-app lovoo
wifi true
kissapi-adv-id 00000000-0000-0000-0000-000000000000
Connection keep-alive
kissapi-app-id 7F947A460DAFCA88556B2F35A6D78A3E
Authorization OAuth oauth_consumer_key="an.email%40gmail.com", oauth_nonce="080328C9-0A53-4971-85E7-65A43F12DC09", oauth_signature="Km0vd8xtHaQmRgkrGLsiljel13o%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1487017515", oauth_token="44d83e8ef50f", oauth_version="1.0"
Accept-Language en-CH;q=1, de-CH;q=0.9
kissapi-adv-on false
kissapi-version 1.20.0
kissapi-update-user-hash 6ea2bd15ea41d0dc8c2615589e2d52ec
Accept */*
kissapi-device-os 10.2
Accept-Encoding gzip, deflate
kissapi-sync-enabled 1
다음 토큰을 제공합니다.oauth_token=60c8977c8fe9509f&oauth_token_secret=549619c0ef4c4be7d7cb898e
자, 부탁이 있습니다.https://api.lovoo.com/init
만들 수 있음:
GET /init HTTP/1.1
Host api.lovoo.com
User-Agent LOVOO/612 (iPhone; iOS 10.2; Scale/3.00)
kissapi-app-idfv 1EC7A8E5-DF16-4E14-8EC9-98DD4772F903
tz Europe/xxx
kissapi-device-model iPhone 6s Plus
kissapi-app-version 3.17.0
kissapi-new-oauth 1
kissapi-device iphone
kissapi-app lovoo
wifi true
kissapi-adv-id 00000000-0000-0000-0000-000000000000
Connection keep-alive
kissapi-app-id 7F947A460DAFCA88556B2F35A6D78A3E
Authorization OAuth oauth_consumer_key="an.email%40gmail.com", oauth_nonce="B622CE9C-DA3D-435C-939A-C58B83DBE85C", oauth_signature="0irvAsilrrdCCdLfu%2F0XSj7THlc%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1487017515", oauth_token="60c8977c8fe9509f", oauth_version="1.0"
Accept-Language en-CH;q=1, de-CH;q=0.9
kissapi-adv-on false
kissapi-version 1.20.0
kissapi-update-user-hash 6ea2bd15ea41d0dc8c2615589e2d52ec
Accept */*
kissapi-device-os 10.2
Accept-Encoding gzip, deflate
kissapi-sync-enabled 1
이것들은 제가 캡처한 헤더들입니다만, 저는 그것들을 어떻게 보내고 그것들을 얻는 방법을 모릅니다.Oauth
인증 작동, 특히oauth_nonce
.
requests-oauthlib가 지원하는 것처럼 보이지만 토큰 중 어떤 변수에 해당하는지 모르겠습니다.
from requests_oauthlib import OAuth1Session
lovoo = OAuth1Session(
'client_key',
client_secret='client_secret',
resource_owner_key='resource_owner_key',
resource_owner_secret='resource_owner_secret'
)
url = 'https://api.lovoo.com/init'
r = lovoo.get(url)
Lovoo는 OAuth 1 프로토콜(https://tools.ietf.org/html/draft-hammer-oauth-10) 을 사용하고 있습니다.
저는 이전에 Lovoo API로 작업한 적이 있습니다.제가 말할 수 있는 한 가지는 당신의 계정이 곧 그들의 BOT 탐지 알고리즘에 의해 제한될 것이라는 것입니다.HTTP 헤더의 다른 조합으로 시도하지 않았습니다.그러므로, 그것은 시도해 볼 가치가 있을지도 모릅니다.
하지만, 저는 다른 사람들이 시도해 볼 수 있도록 Github에 제 작품을 게시했습니다.아래에서 API 호출에 필요한 기능을 확인할 수 있습니다.이러한 기능을 사용하는 방법에 대한 몇 가지 예를 보려면 위에서 언급한 보고서를 참조하십시오.
import urllib.parse
# MD5 hashing of an input string
def md5(data: str):
import hashlib
return hashlib.md5(data.encode('utf-8')).hexdigest()
def normalize_params(params: dict):
# Comply with https://tools.ietf.org/html/draft-hammer-oauth-10
# params must be sorted alphabetically first by keys and then values
params = dict(sorted(params.items(), key=lambda x: (x[0], x[1]), reverse=False))
p_encoded = '&'.join(
["{}={}".format(urllib.parse.quote_plus(k), urllib.parse.quote_plus(v)) for k, v in params.items() if v != ''])
# Percent encode
p_quoted = urllib.parse.quote_plus(p_encoded)
return p_quoted
def generate_base_string(params: str, url: str, method: str = 'GET'):
# Comply with https://tools.ietf.org/html/draft-hammer-oauth-10
base_str = method + '&' + urllib.parse.quote_plus(url) + '&' + params
return base_str
# Secret hashing used in Lovoo
def secret_hash(pwd: str) -> str:
pwd = md5("SALTforPW" + pwd)
return md5("SALTforSecret" + pwd)
def sign_request(client_identifier: str, client_secret: str, token: str, token_secret: str, url: str, nounce: str,
timestamp: str, method: str = 'GET', payload: dict = None, callback_url: str = '', oauth_version: str = '1.0'):
from hashlib import sha1
import hmac
import base64
params = {
'oauth_callback': callback_url,
'oauth_consumer_key': client_identifier,
'oauth_nonce': nounce,
'oauth_signature_method': 'HMAC-SHA1',
'oauth_timestamp': timestamp,
'oauth_token': token,
'oauth_version': oauth_version
}
# Normalize parameters
if payload is not None:
params = {**params, **payload}
np = normalize_params(params)
# Generate base string
base_string = generate_base_string(np, url, method)
if token != '':
key = (f"{client_secret}&{token_secret}").encode()
else:
key = (client_secret + '&').encode()
raw = base_string.encode()
hashed = hmac.new(key, raw, sha1)
# The signature
return base64.b64encode(hashed.digest()).decode().rstrip('\n')
그 코드를 테스트한 지 시간이 좀 지났고 Lovoo의 API에 약간의 변경이 있을 수 있습니다.안 되면 알려주시면 확인해보겠습니다.
다른 접근 방식은 로그인을 위해 셀레늄을 사용하고 추가로 요청이 있는 세션을 사용하는 것입니다.
예.
def login(user, pw):
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)
driver = webdriver.Chrome(options=chrome_options)
driver.get("https://www.lovoo.com/login_check")
user_agent = driver.execute_script("return navigator.userAgent;")
iframe = driver.find_element(By.ID,"gdpr-consent-notice")
driver.switch_to.frame(iframe)
privacybutton = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH,"//b[contains(text(),'Accept All')]"))
)
privacybutton.click()
driver.switch_to.default_content()
loginbutton = WebDriverWait(driver, 4).until(
EC.presence_of_element_located((By.XPATH, "//button[contains(text(),'Log in')]"))
)
loginbutton.click()
loginbutton2=WebDriverWait(driver, 4).until(
EC.presence_of_element_located((By.XPATH, "//button[contains(@data-automation-id,'login-submit-button')]"))
)
driver.find_element(By.XPATH, '//input[@name="authEmail"]').send_keys(user)
driver.find_element(By.XPATH, '//input[@name="authPassword"]').send_keys(pw)
webdriver.ActionChains(driver).move_to_element(loginbutton2).click(loginbutton2).perform()
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "topmenu"))
)
return user_agent, driver.get_cookies()
(lat,lon)=(0.0,0.0)
with requests.Session() as session:
user_agent, cookies = login(user, pw)
session.cookies.update({c['name']: c['value'] for c in cookies})
session.headers.update({'User-Agent': user_agent})
session.get(f'https://www.lovoo.com/api_web.php/users?ageFrom=0&ageTo=2&latitude={lat}&longitude={lon}')
언급URL : https://stackoverflow.com/questions/42213153/access-lovoo-api-using-python
'programing' 카테고리의 다른 글
실행 시 "내비게이션 바"에 대한 경고 프레임이 Xcode 8 Swift 3에 나타납니다. (0) | 2023.05.27 |
---|---|
Python의 매트릭스 전치 (0) | 2023.05.27 |
Xcode 10은 com.apple.commcenter.core telephony를 손상시키는 것 같습니다.xpc (0) | 2023.05.27 |
음수 정수를 0으로 설정할 .NET Math 메서드를 찾고 있습니다. (0) | 2023.05.22 |
강력한 매개 변수를 사용하여 배열을 허용하는 방법 (0) | 2023.05.22 |