Esempio n. 1
0
def test2():
    a = db.tag.insert(name='red')
    b = db.tag.insert(name='yellow')
    c = db.tag.insert(name='green')
    e = Event(db)
    e1 = e.add('message1')
    e2 = e.add('message2')
    e3 = e.add('message3')
    id = db.product.insert(name='Toy Car',tags=[a, b])
    product = db(db.product.id==id).select().first()
    product.tags.append(c)
    if product.events==None:
        product.events=[e1,e2,e3]
    else:
        product.events.append(e1)
        product.events.append(e2)
        product.events.append(e3)
    product.update_record()
    product_new = db(db.product.id==id).select().first()
    return dict(products=product_new)
Esempio n. 2
0
class Fabuser(object):
    """Build a User object"""
    
    def __init__(self,db,auth):
        self.db = db
        self.request = current.request
        self.session = current.session
        self.auth = auth
        self.user_id = None
        self.user = None
        self.fabmanager_group_id = None
        self.event = Event(db)
        
    def get_grid(self):
        """Return a SQLFORM.smartgrid"""
        self.db.auth_user.badges.writable=True
        self.db.auth_user.UM_balance.writable=True
        self.db.auth_user.member_end_date.writable=True
        self.db.auth_user._singular = "User"
        self.db.auth_user._plural = "Users"
        grid = SQLFORM.smartgrid(self.db.auth_user,
                                linked_tables=['badges',],
                                searchable= dict(parent=True, child=True),
                                create=False, 
                                editable = self.auth.has_membership(role='Fab Manager'),
                                deletable = self.auth.has_membership(role='Fab Manager'),
                                showbuttontext=False,
                                )
        return dict(grid=grid)
        
    def get_user(self,user_id):
        """Load a user"""
        if user_id==None:
            return None
        else:
            #~ self.user = self.auth_user(self.auth_user.id==user_id)
            self.user = self.db(self.db.auth_user.id==user_id).select().first()
            if self.user !=None:
                self.user_id = user_id
            return self.user

    def is_member(self,user_id=None):
        """is_member says if user is member or not"""
        if self.user_not_loaded(user_id): return "Please select user_id"
            
    def set_fabmanager(self,enable=True,user_id=None):
        """set_fabmanager push the user in the fabmanager group (or not)"""
        if self.user_not_loaded(user_id): return "Please select user_id"
        self.get_fabmanager_group_id()
        if enable:
            """Add to FabManager group"""
            result = self.db.auth_membership.update_or_insert(user_id=self.user_id,group_id=self.fabmanager_group_id)
            event = self.push_event("User '"+self.user.first_name+" "+self.user.last_name+" is set in Fab Manager group :: "+str(result))
        else:
            """Remove from FabManger group"""
            result = self.db((self.db.auth_membership.user_id==self.user_id)&(self.db.auth_membership.group_id==self.fabmanager_group_id)).delete()
            event = self.push_event("User '"+self.user.first_name+" "+self.user.last_name+" is removed from Fab Manager group :: "+str(result))
        return dict(result=result,event=event)
        
    def get_fabmanager_group_id(self):
        """get_fabmanager_group_id get the Fab Manager group id"""
        self.fabmanager_group_id = self.db(self.db.auth_group.role=="Fab Manager").select().first().id
        
    def push_event(self,msg,m_type='log',user_id=None):
        """push_event add a event to the user"""
        if self.user_not_loaded(user_id): return "Please select user_id"
        event = self.event.add(msg)
        if self.user.history==None:
            self.user.history=[event]
        else:
            self.user.history.append(event)
        self.user.update_record()
        return event
        
    def user_not_loaded(self,user_id):
        """user_not_loaded return true id user is not loaded"""
        if self.user==None:
            if self.get_user(user_id)==None:
                return True
        else:
            return False

    def __exit__(self):
        """save user before exit"""
        if self.user!=None:
            self.user.update_record()
Esempio n. 3
0
class SmartQQ(Thread, Codes):

    def __init__(self):
        Thread.__init__(self)
        self._run = True
        self.success = 0    # 登录成功1or失败-1or正在登录中0
        self._http = HttpClient.getInstance()
        self._task = Tasks()
        self._event = Event()
        self._event.setDaemon(True)

    def stop(self):
        variable.State = False
        variable.Offine = True
        self._run = False
        self._event.stop()
        self._task.end()

    def run(self):
        # 先从数据库中查询管理员和关注的群号码(加快后面的访问速度)
        db = DBDriver(variable.DbFile)
        db.openConn()
        db.exec_(variable.Table_Admin)
        db.exec_(variable.Table_Group)
        db.exec_(variable.Table_Ask)
        # [('892768447',), ('892768447',)]
        try:
            variable.Admins = set([j for i in db.select(variable.Select_Admin) for j in i])
            variable.Groups = set([j for i in db.select(variable.Select_Group) for j in i])
            print("管理员: %s", variable.Admins)
            print("关注群: %s", variable.Groups)
        except Exception as e:
            print.error(e)
        db.closeConn()
        if self.login():
            t = 0
            self._event.start()
            while self._run:
                if variable.Exit:
                    self.stop()
                    break
                if variable.Offine:
                    break
                # 心跳包轮询
                if t > 5:
                    data = {"from":variable.Email, "to":variable.Email, "title":"QQ下线", "msg":"网络无连接"}
                    self._http.post(variable.EmailUrl, data)
                    self.stop()
                    break
                time.sleep(1)    # 1秒一轮询
                ret = self.check()
                print("ret: %s", ret)
                retcode = ret.get("retcode")
                if retcode == 100006:
                    break    # post数据有误
                if retcode == 102 or retcode == 108:
                    continue    # 无消息
                if retcode == 116:
                    variable.Ptwebqq = ret.get("p")
                    continue    # 更新ptwebqq值
                if retcode == 0:
                    # 消息广播
                    self.msg_handler(ret.get("result"))
                    continue
                if ret == "":
                    t = t + 1
                    continue    # 返回数据有误

    def date_to_millis(self, date):
        return int(time.mktime(date.timetuple())) * 1000

    def check(self):
        data = {'r' : '{{"ptwebqq":"{0}","clientid":{1},"psessionid":"{2}","key":""}}'.format(self.bytesToStr(variable.Ptwebqq), self.bytesToStr(variable.Clientid), self.bytesToStr(variable.Psessionid))}
        html = self._http.post(variable.POLL, data, referer = variable.Referer)
        try:
            ret = json.loads(self.bytesToStr(html))
        except:
            ret = {"retcode":"", "p":self.bytesToStr(variable.Ptwebqq), "result":""}
        return ret

    def msg_handler(self, msgs):
        for m in msgs:
            if type(m) == type(""):
                variable.Offine = True
                self.logout()
                break
            msg = Msg(m.get("poll_type"), m.get("value"))
            # print("data: ", msg.getData())
            # 消息类型(群消息or个人消息)
            mtype = msg.getPollType()
            # 发送者
            fuin = msg.getFromUin()
            # print("fuin: ", fuin)
            # 群消息发送者
            suin = msg.getSendUin()
            # print("suin: ", suin)
            content = msg.getContent()
            # print("content: ", content)
            content = msg.getMsg()
            # print("content: ", content)
            # 被挤下线
            if mtype == "kick_message":
                reason = msg.getReason()
                data = {"from":variable.Email, "to":variable.Email, "title":"QQ下线", "msg":reason}
                self._http.post(variable.EmailUrl, data)
            # 私聊or临时
            elif mtype in ("message", "sess_message"):
                # qq = self.uin_to_qq(msg.getFromUin())
                # print("qq: ", qq)
                # item = (函数,发送者,None,None,消息)
                if not variable.State:
                    return    # 机器人被管理员关闭
                item = (self._task.delwith, fuin, None, None, content)
                self._event.add(item)
            # 群聊
            elif mtype == "group_message":
                if not variable.State:
                    return    # 机器人被管理员关闭
                # 群号码
                iseq = msg.getInfoSeq()
                # print("iseq: ", iseq)
                # suin = msg.getSendUin()
                # print("suin: ", suin)
                # item = (函数,发送群,发送者,群号码,消息)
                print(content)
                item = (self._task.delwith, fuin, suin, iseq, content)
                self._event.add(item)

    def logout(self):
        url = variable.LogoutUrl.format(variable.Clientid, variable.Psessionid)
        self._http.get(url, referer = variable.Referer)
        self._event.stop()
        self._task.end()

    def login(self):
        print("正在获取登录页面")
        html = self._http.get(variable.LoginUrl)
        # print html

        login_url = self.getReValue(self.strToBytes(html), b'\.src\s*=\s*"(.*?)"').group(1)
        print("login_url: %s", login_url)
        html = self._http.get(self.bytesToStr(login_url) + "0")
        print(self.strToBytes(html));open('html.html','wb').write(self.strToBytes(html))

        print("获取appid")
        variable.Appid = self.getReValue(self.strToBytes(html), b'var g_appid\s*=\s*encodeURIComponent\("(\d+)"\);').group(1)
        print("appid: %s", variable.Appid)

        print("获取login_sig")
        variable.Sig = self.getReValue(self.strToBytes(html), b'var g_login_sig\s*=\s*encodeURIComponent\("(.*?)"\);').group(1)
        print("sig: %s", variable.Sig)

        print("获取pt_version")
        variable.Version = self.getReValue(self.strToBytes(html), b'var g_pt_version\s*=\s*encodeURIComponent\("(\d+)"\);').group(1)
        print("version: %s", variable.Version)

        print("获取mibao_css")
        variable.MibaoCss = self.getReValue(self.strToBytes(html), b'var g_mibao_css\s*=\s*encodeURIComponent\("(.+?)"\);').group(1)
        print("mibao_css: %s", variable.MibaoCss)

        t = 0    # 计数器
        starttime = self.date_to_millis(datetime.datetime.utcnow())
        while self._run:
            t = t + 1
            print("下载登录二维码")
            if not self._http.down(variable.QrCodeUrl.format(self.bytesToStr(variable.Appid)), variable.QrCodePath):
                continue
            print("登录二维码下载成功,请扫描")
            while self._run:
                html = self._http.get(
                    variable.QrCodeCheckUrl.format(
                        self.bytesToStr(variable.Appid),
                        self.date_to_millis(datetime.datetime.utcnow()) - starttime,
                        self.bytesToStr(variable.MibaoCss),
                        self.bytesToStr(variable.Version),
                        self.bytesToStr(variable.Sig)),
                    self.bytesToStr(login_url))
                print(html)
                ret = self.bytesToStr(html).split("'")
                print(ret)
                if len(ret) < 2:
                    self.success = -1
                    print("登录失败")
                    break
                if ret[1] == "65":
                    print("二维码失效")
                    break    # 65失效 0成功 66未失效 67验证中
                if ret[1] == "0":
                    print("二维码验证成功")
                    break
                time.sleep(2)
            if len(ret) < 2:
                self.success = -1
                print("登录失败")
                break
            if ret[1] == "0" or t > 5:
                break    # 验证成功获取超出循环次数

        if len(ret) < 2:
            self.success = -1
            print("登录失败")
            return

        if ret[1] != "0":
            self.success = -1
            print("取消登录")
            return False

        print("二维码已扫描,正在登录")
        # 删除二维码图片
        try:
            os.remove(variable.QrCodePath)
        except:
            pass
        print("ret[11]: %s", ret[11])
        print("ret[5]: %s", ret[5])
        html = self._http.get(ret[5])
        # print html
        mibao_res_url = self.getReValue(self.strToBytes(html), b'\s*src="(.*?)"')
        if mibao_res_url:
            mibao_res_url = mibao_res_url.group(1)
        print("mibao_res_url: %s", mibao_res_url)
        if mibao_res_url:
            html = self._http.get(self.bytesToStr(mibao_res_url).replace("&amp;", "&"))
            print(html)
            redirect_url = self.getReValue(self.strToBytes(html), b'location\.href\s*=\s*"(.*?)"').group(1)
            print("redirect_url: %s", redirect_url)
            html = self._http.get(self.bytesToStr(redirect_url))
            print(html)

        # variable.Ptwebqq = self.getCookie("ptwebqq")
        variable.Ptwebqq = self._http.getCookie("ptwebqq")
        print("_ptwebqq: %s", variable.Ptwebqq)
        data = {'r' : variable.LoginParam.format(self.bytesToStr(variable.Ptwebqq), self.bytesToStr(variable.Clientid), self.bytesToStr(variable.Psessionid))}
        html = self._http.post(variable.LoginUrl2, data, referer = variable.Referer)
        print(html)
        ret = json.loads(self.bytesToStr(html))
        print(ret)

        if ret.get("retcode") != 0:
            self.success = -1
            print("登录失败")
            return False

        print("登录成功")
        self.success = 1
        variable.Vfwebqq = ret.get("result").get("vfwebqq")
        variable.Psessionid = ret.get("result").get("psessionid")
        print("_vfwebqq: %s", variable.Vfwebqq)
        print("_psessionid: %s", variable.Psessionid)

        print("QQ号: {0} 登录成功".format(ret.get("result").get("uin")))
        # print(self.allCookie())
        return True