>백엔드 개발 >파이썬 튜토리얼 >Python으로 Weibo 로그인을 시뮬레이션하는 방법 소개(코드 포함)

Python으로 Weibo 로그인을 시뮬레이션하는 방법 소개(코드 포함)

不言
不言앞으로
2019-03-18 09:15:512713검색

이 글은 Python으로 Weibo 로그인을 시뮬레이션하는 방법(코드 포함)을 소개합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

오늘 저는 몇 가지 숨겨진 비밀을 충족시키기 위해 Weibo의 개인 페이지를 크롤링하는 도구를 만들고 싶습니다. 그렇다면 꼭 해야 할 일을 먼저 하세요! 시뮬레이션된 로그인...

코드를 최적화하고 Python 3.6 버전으로 리팩터링했으며 모든 사람의 학습을 돕기 위해 많은 주석을 추가했습니다.

PC에서 Sina Weibo에 로그인할 때 사용자 이름과 비밀번호는 클라이언트에서 js를 사용하여 사전 암호화되며, 매개변수 세트는 POST 전에 GET되며 이는 POST_DATA의 일부로도 사용됩니다. 이러한 방식으로는 일반적인 간단한 방법을 사용하여 POST 로그인(예: Renren)을 시뮬레이션할 수 없습니다.

1. POST 요청을 제출하기 전에 두 개의 매개변수를 얻으려면 GET이 필요합니다.
주소는

http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.18)

얻은 데이터에는 임의의 servertime 및 nonce 값이 포함되어 있습니다. 다른 값은 쓸모가 없는 것 같습니다.

def get_servertime():
   url = 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=dW5kZWZpbmVk&client=ssologin.js(v1.3.18)&_=1329806375939'
   # 返回出来的是一个Response对象,无法直接获取,text后,可以通过正则匹配到
   # 大概长这样子的:sinaSSOController.preloginCallBack({"retcode":0,"servertime":1545606770, ...})
   data = requests.request('GET', url).text
   p = re.compile('\((.*)\)')
   try:
       json_data = p.search(data).group(1)
       data = json.loads(json_data)
       servertime = str(data['servertime'])
       nonce = data['nonce']
       return servertime, nonce
   except:
       print('获取 severtime 失败!')
       return None

2. httpfox를 통해 POST 데이터를 관찰하세요. 매개변수는 더 복잡합니다. 여기서 "su"는 암호화된 사용자 이름이고 sp는 암호화된 비밀번호입니다. servertime 및 nonce는 이전 단계에서 가져옵니다. 다른 매개변수는 변경되지 않습니다.

username은 BASE64로 계산되었습니다.

username = base64.encodestring( urllib.quote(username) )[:-1]

password는 SHA1로 3번 암호화되었으며, 방해를 위해 servertime 및 nonce 값이 추가되었습니다.
즉, SHA1 암호화를 두 번 한 후 결과에 servertime 및 nonce 값을 추가한 다음 SHA1이 이를 다시 계산합니다.

def get_pwd(pwd, servertime, nonce):
   # 第一次计算,注意Python3 的加密需要encode,使用bytes
   pwd1 = hashlib.sha1(pwd.encode()).hexdigest()
   # 使用pwd1的结果在计算第二次
   pwd2 = hashlib.sha1(pwd1.encode()).hexdigest()
   # 使用第二次的结果再加上之前计算好的servertime和nonce值,hash一次
   pwd3_ = pwd2 + servertime + nonce
   pwd3 = hashlib.sha1(pwd3_.encode()).hexdigest()
   return pwd3


def get_user(username):
   # 将@符号转换成url中能够识别的字符
   _username = urllib.request.quote(username)
   # Python3中的base64计算也是要字节
   # base64出来后,最后有一个换行符,所以用了切片去了最后一个字符
   username = base64.encodebytes(_username.encode())[:-1]
   return username

3. 매개변수를 정리하고 POST 요청을 합니다. 그 이후로는 로그인에 성공하지 못했습니다.

POST 이후에 얻은 내용에는 다음 문장이 포함되어 있습니다.

location.replace("http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&retcode=101&reason=%B5%C7%C2%BC%C3%FB%BB%F2%C3%DC%C2%EB%B4%ED%CE%F3")

로그인에 실패한 경우의 결과입니다. 로그인에 성공한 후의 결과도 비슷하지만 retcode 값은 0입니다.

다음으로 이 URL을 다시 요청하시면 성공적으로 웨이보에 로그인하실 수 있습니다.
미리 캐시를 구축하는 것을 잊지 마세요.

Python으로 Weibo 로그인을 시뮬레이션하는 방법 소개(코드 포함)

위 내용은 Python으로 Weibo 로그인을 시뮬레이션하는 방법 소개(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제