标签:python 百度云
大概看懂了登录流程,作以记录
主要涉及到的有三个文件,分别是SigninDialog.py,auth.py,和gutil.py三个文件,SigninDialog.py提供登陆对话框和相关函数调用整合,auth.py提供一些授权的函数,gutil.py主要用到了多线程的一个函数封装。
先看SigninDialog.py,里面实现了两个类SigninVcodeDialog,SigninDialog,前者是登陆验证码的对话框,后者是登陆的对话框,主要看后者,其初始化是在构建一些GUI,不重要,跳到434行,这是登陆的切入点,代码摘下来
username =self.username_combo.get_child().get_text()
password = self.password_entry.get_text()
if not self.password_changed and self.signin_check.get_active():
cookie, tokens = self.load_auth(username)
if cookie and tokens:
self.update_profile(username,password, cookie, tokens)
return
cookie = RequestCookie()
tokens = {}
verifycode = ‘‘
codeString = ‘‘
password_enc = ‘‘
rsakey = ‘‘
self.signin_button.set_label(_(‘Get BAIDUID...‘))
gutil.async_call(auth.get_BAIDUID, callback=on_get_BAIDUID
先获取到了username和password,然后检查本地缓存,使用本地缓存,然而要看登陆流程,继续往下看,假如第一次登陆,那么就会执行
cookie = RequestCookie()
RequestCookie来自RequestCookie.py,这个文件也要用到,刚才忘记提了。然而这个类的具体内容不重要,只要知道它用来存Cookie就是了
然后是
tokens= {}
verifycode = ‘‘ #这是登陆时的验证码
codeString = ‘‘
password_enc = ‘‘ #这个是加密后的密码
rsakey = ‘‘
先初始化为空,后面他会赋值的。
然后
self.signin_button.set_label(_(‘GetBAIDUID...‘))
表示在获取百度ID,当然这只是改了标签上的内容,实质性的是下一句。
gutil.async_call(auth.get_BAIDUID,callback=on_get_BAIDUID)
注意到gutil.async_call这个函数,看它的调用大概可以知道是用来连接函数的,具体看到gutil.py这个文件94行,代码如下:
def async_call(func, *args, callback=None):
‘‘‘Call `func` in background thread, and then call `callback` in Gtkmain thread.
If error occurs in `func`, error will keep the traceback and passed to
`callback` as second parameter. Always check `error` is not None.
‘‘‘
def do_call():
result = None
error = None
try:
result = func(*args)
except Exception:
error = traceback.format_exc()
logger.error(error)
if callback:
GLib.idle_add(callback, result, error)
thread = threading.Thread(target=do_call)
thread.daemon = True
thread.start()
注释上说,func参数是后台线程,然后再Gtk主线程里面调用callback,若func里面有错误,他就把错误当成第二参数传给callback,特别说一下,中间那个参数*arg是传给func的
总的来说,这个函数的功能就是先执行func,传*arg给func,然后把func的返回和error作为第一第二参数传给callback。
所以这句
gutil.async_call(auth.get_BAIDUID,callback=on_get_BAIDUID)
就是调用auth.get_BAIDUID,*arg为空,回调on_get_BAIDUID
看auth.get_BAIDUID,在auth.py的29行,注释说的很明白,获取一个cookie – BAIDUID
返回一个req.headers.get_all(‘Set-Cookie‘),具体细节不了解,但不影响,知道那是个数据就是了。然后看回调的函数,是SigninDialog这个类的内建函数,在422行
defon_get_BAIDUID(uid_cookie, error=None):
if error or not uid_cookie:
logger.error(‘SigninDialog.on_get_BAIDUID: %s, %s‘ %
(uid_cookie,error))
self.signin_failed(
_(‘Failed to getBAIDUID cookie, please try again.‘))
else:
cookie.load_list(uid_cookie)
self.signin_button.set_label(_(‘GetTOKEN...‘))
gutil.async_call(auth.get_token, cookie, callback=on_get_token)
可以看到,显示一个处理错误的机制,然后没出错的话
cookie.load_list(uid_cookie)
处理一下数据
self.signin_button.set_label(_(‘GetTOKEN...‘))
更新显示的内容
gutil.async_call(auth.get_token,cookie, callback=on_get_token)
连接auth.get_token和on_get_token,给auth.get_token传入cookie,这个cookie是最早就定义了的,cookie.load_list(uid_cookie)相当于把上一步获得的返回值加进去。
整个过程都是这个样子的模式,实现了那种动态显示现在在干嘛的机制,运用了多线程。剩下的代码就是照着这个思路写的。
最后,这只是初步看了个轮廓,细节待钻研,以后补充。
本文出自 “电机系英雄” 博客,请务必保留此出处http://heroistired.blog.51cto.com/10488422/1675768
标签:python 百度云
原文地址:http://heroistired.blog.51cto.com/10488422/1675768