이 글은 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 로그인을 시뮬레이션하는 방법 소개(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!