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)
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()
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("&", "&")) 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