大概看懂了登录流程,作以记录

 

主要涉及到的有三个文件,分别是SigninDialog.py,auth.py,gutil.py三个文件,SigninDialog.py提供登陆对话框和相关函数调用整合,auth.py提供一些授权的函数,gutil.py主要用到了多线程的一个函数封装。

 

先看SigninDialog.py,里面实现了两个类SigninVcodeDialogSigninDialog,前者是登陆验证码的对话框,后者是登陆的对话框,主要看后者,其初始化是在构建一些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

 

先获取到了usernamepassword,然后检查本地缓存,使用本地缓存,然而要看登陆流程,继续往下看,假如第一次登陆,那么就会执行

 

           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,传*argfunc,然后把func的返回和error作为第一第二参数传给callback

所以这句

                   gutil.async_call(auth.get_BAIDUID,callback=on_get_BAIDUID)

就是调用auth.get_BAIDUID*arg为空,回调on_get_BAIDUID

auth.get_BAIDUID,在auth.py29行,注释说的很明白,获取一个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_tokenon_get_token,给auth.get_token传入cookie,这个cookie是最早就定义了的,cookie.load_list(uid_cookie)相当于把上一步获得的返回值加进去。

整个过程都是这个样子的模式,实现了那种动态显示现在在干嘛的机制,运用了多线程。剩下的代码就是照着这个思路写的。

最后,这只是初步看了个轮廓,细节待钻研,以后补充。