프로그래밍/Python

[파이썬] cmegroup ftp 자동 로그인 + 자동 다운로드 위한 작업

소행성왕자 2021. 10. 21. 17:12

이전까지는 ftp 로 자료 받을수 있어지만 ftp 중지되어 

이제는 웹 에서 로그인후 자료를 다운받아야 한다.

API 있을것으로 사료되지만 API 사용하기전 직접 로그인후 다운받는 작업을 공유해보기로 한다.

  1. cmegroup 로그인후
  2. https://www.cmegroup.com/ftp/btic/BTIC_Weekly_Liquidity_Report.pdf 다운로드

작업은 위와 같이 간단하지만 인증구현/다운로드  부분 많이 까다롭다.

지금까지 연구한 상황을 공유해본다.

. 로그인 부분에 대해서는 X-XSRF-TOKEN 사용하고 있어 아이디/비번 으로 바로 로그인 할수가 없다.

초기페이지나 로그인 하기전에 X-XSRF-TOKEN 가져오는 부분이 있는데 확인 할수가 없다.

fiddler, wireShark 이용한 패킷 분석해도 말이다. -,.-

 

아쉬운데로 크롬 개발자 도구로 아래 주소 접속한후 

https://login.cmegroup.com/sso/accountstatus/showAuth.action

Cookie 와 XSRF-TOKEN 값을 수동으로 가져온다.

가져온 Cookie 값을 python 소스에 입력해준다.

from bs4 import BeautifulSoup as bs
import requests

MEMBER_DATA = {
    'userName': '아이디',
    'password': '비번'
}

headers = {
    'Pragma': 'no-cache',
    'Cache-Control': 'no-cache',
    'Accept': 'application/json',
    'X-XSRF-TOKEN': 'fd99c5fc6fd51471',
    'Content-Type': 'application/json',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36',
    'sec-ch-ua-platform': "macOS",
    'Origin': 'https://login.cmegroup.com',
    'Sec-Fetch-Site': 'same-origin',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Dest': 'empty',
    'Referer': 'https://login.cmegroup.com/sso/accountstatus/showAuth.action',
    'Accept-Language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,und;q=0.6',
    'Cookie' : 'JSESSIONID=DC05516BE124BE19651A29CEC7889D49D33B8ACE063F2149B6EA5B8E2A9BB788; XSRF-TOKEN=fd99c5fc6fd51471;'
}

with requests.Session() as s:
    request = s.post('https://login.cmegroup.com/sso/authservice/authenticateCredential.action', headers=headers, json=MEMBER_DATA, verify=False)
    print(request.text);

    url2 = 'https://www.cmegroup.com/ftp/btic/BTIC_Weekly_Liquidity_Report.pdf'
    r = requests.get(url2, allow_redirects=True, verify=False)
    open('zzz.pdf', 'wb').write(r.content)

결과

로그인이 되지 않았을때에는

{"errorCode":"CSRF_MISMATCH","errorMessage":"We are unable to process your request due to CSRF token validation mismatch. Please try again. If the problem persists, please restart your browser.[ea78f35e-7466-4471-a27b-070f97660cd0]","rootErrorMessage":null,"data":null,"requestInfo":null}

로그인이 정상적이면 아래와 같은 json 얻을수 있다.

{"status":"CREDENTIAL_MATCHES","email":"zzz@msn.com","message":null,"showCaptcha":false}

위에서 보았듯이 크롬에서 접속해 있는 Cookie 를 이용하기 때문에

로그인이 정상적으로 된후 크롬에서 새로고침하면 로그인이 된 상태로 나온다.

그 이유는 같은 Cookie 내용을 사용하고 있으니까...

 

그 후 BTIC_Weekly_Liquidity_Report.pdf 다운로드 받는 부분에 대해서는 3분이상 멈춰있는 상태이다.

파일 다운로드 받는 코드는 잘 되는데 말이다.

import requests


url = 'https://www.facebook.com/favicon.ico'
r = requests.get(url, allow_redirects=True, verify=False)

open('facebook.ico', 'wb').write(r.content)

 

이슈

어느순간 아래와 같은 에러 메세지를 발생하는데 아래 링크 참고후 적용하였다.

 

 

[python] 파이썬 요청에서 보안 인증서 확인을 비활성화하는 방법 - 리뷰나라

나는 사용하고있다 import requests requests.post(url='https://foo.com', data={'bar':'baz'}) 하지만 request.exceptions.SSLError가 발생합니다. 웹 사이트의 인증서가 만료되었지만 중요한 데이터를 보내지 않으므로 중

daplus.net

raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='trytoso.tistory.com', port=443): Max retries exceeded with url: /manage/posts.json (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)')))

아래와 같이 verify=False 해주면 된다고 한다.

r = requests.get(url2, allow_redirects=True, verify=False)

 

하지만 아래 에러는 계속 난다. T.T

/usr/local/lib/python3.8/site-packages/urllib3/connectionpool.py:1013: InsecureRequestWarning: Unverified HTTPS request is being made to host 'trytoso.tistory.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(