def __consultar_estado(self): #Definimos los headers para el request headers = {"PRIVATE-TOKEN": self.__configuracion_ci.get_token()} request_url = (self.__configuracion_ci.get_api_url() + "/projects/" + self.__configuracion_ci.get_usuario() + "%2F" + self.__configuracion_ci.get_repositorio() + "/pipelines?per_page=1&page=1") response = HttpRequests.get(request_url, headers=headers) return response.text
def __consultar_estado(self): #Definimos los headers para el request headers = { "Travis-API-Version": "3", "Authorization": "token " + self.__configuracion_ci.get_token() } request_url = (self.__configuracion_ci.get_api_url() + "/repo/" + self.__configuracion_ci.get_usuario() + "%2F" + self.__configuracion_ci.get_repositorio() + "/builds?limit=1&sort_by=finished_at:desc") response = HttpRequests.get(request_url, headers=headers) return response.text
class QQ: def __init__(self): self.dataFileName="data.txt" self.req = HttpRequests(); self.friend_list = {} self.data={} self.data['client_id']= int(random.uniform(111111, 888888)) self.data['ptwebqq'] = '' self.data['psessionid'] = '' self.data['selfuin']='' self.appid = 0 self.data['vfwebqq'] = '' self.qrcode_path = "./vcode.jpg" # QRCode保存路径 self.username = '' self.account = 0 def __saveData(self): with open(self.dataFileName, 'w') as f: pickle.dump(self.data,f) f.close() def login_by_qrcode(self): logging.info("Requesting the login pages...") initurl_html = self.req.get('http://w.qq.com/login.html') print initurl_html initurl = get_revalue(initurl_html, r'\.src = "(.+?)"', "Get Login Url Error.", 1) html = self.req.get(initurl + '0') appid = get_revalue(html, r'var g_appid =encodeURIComponent\("(\d+)"\);', 'Get AppId Error', 1) sign = get_revalue(html, r'var g_login_sig=encodeURIComponent\("(.*?)"\);', 'Get Login Sign Error', 0) js_ver = get_revalue(html, r'var g_pt_version=encodeURIComponent\("(\d+)"\);', 'Get g_pt_version Error', 1) mibao_css = get_revalue(html, r'var g_mibao_css=encodeURIComponent\("(.+?)"\);', 'Get g_mibao_css Error', 1) star_time = date_to_millis(datetime.datetime.utcnow()) error_times = 0 ret = [] while True: error_times += 1 vcodeUrl='https://ssl.ptlogin2.qq.com/ptqrshow?appid={0}&e=0&l=L&s=8&d=72&v=4'.format(appid) self.req.downloadFile(vcodeUrl,self.qrcode_path) print "Please scan the downloaded QRCode" while True: checkLoginUrl='https://ssl.ptlogin2.qq.com/ptqrlogin?webqq_type=10&remember_uin=1&login2qq=1&aid={0}&u1=http%3A%2F%2Fw.qq.com%2Fproxy.html%3Flogin2qq%3D1%26webqq_type%3D10&ptredirect=0&ptlang=2052&daid=164&from_ui=1&pttype=1&dumy=&fp=loginerroralert&action=0-0-{1}&mibao_css={2}&t=undefined&g=1&js_type=0&js_ver={3}&login_sig={4}'.format( appid, date_to_millis(datetime.datetime.utcnow()) - star_time, mibao_css, js_ver, sign); html = self.req.get(checkLoginUrl,{'Referer':initurl}) ret = html.split("'") print ret time.sleep(2) if ret[1] in ('0', '65'): # 65: QRCode 失效, 0: 验证成功, 66: 未失效, 67: 验证中 break if ret[1] == '0' or error_times > 10: break if ret[1] != '0': return print "QRCode scaned, now logging in." # 删除QRCode文件 if os.path.exists(self.qrcode_path): os.remove(self.qrcode_path) # 记录登陆账号的昵称 self.username = ret[11] url = get_revalue(self.req.get(ret[5]), r' src="(.+?)"', 'Get mibao_res Url Error.', 0) if url != '': html = self.req.get(url.replace('&', '&')) url = get_revalue(html, r'location\.href="(.+?)"', 'Get Redirect Url Error', 1) self.req.get(url) self.data['ptwebqq'] = self.req.getCookies()['ptwebqq'] print self.data login_error = 1 ret = {} while login_error > 0: try: html = self.req.post('http://d.web2.qq.com/channel/login2', { 'r': '{{"ptwebqq":"{0}","clientid":{1},"psessionid":"{2}","status":"online"}}'.format(self.data['ptwebqq'] , self.data['client_id'] , self.data['psessionid'] ) }, {'Referer':"http://d.web2.qq.com/proxy.html?v=20030916001&callback=1&id=2"} ) ret = json.loads(html) login_error = 0 except: login_error += 1 print "login fail, retrying..." exit() if ret['retcode'] != 0: print ret return self.data['vfwebqq'] = ret['result']['vfwebqq'] self.data['psessionid'] = ret['result']['psessionid'] self.data['selfuin'] = ret['result']['uin'] self.__saveData() #print "QQ:{0} login successfully, Username:{1}".format(self.account, self.username) print self.username def relogin(self, error_times=0): if error_times >= 10: return False try: html = self.req.post('http://d.web2.qq.com/channel/login2', { 'r': '{{"ptwebqq":"{0}","clientid":{1},"psessionid":"{2}","key":"","status":"online"}}'.format( self.data['ptwebqq'] , self.data['client_id'] , self.data['psessionid'] ) } ) ret = json.loads(html) self.data['vfwebqq'] = ret['result']['vfwebqq'] self.data['psessionid'] = ret['result']['psessionid'] return True except: logging.info("login fail, retryng..." + str(error_times)) return self.relogin(error_times + 1) def check_msg(self, error_times=0): if error_times >= 5: if not self.relogin(): raise IOError("Account offline.") else: error_times = 0 # 调用后进入单次轮询,等待服务器发回状态。 html = self.req.post('http://d.web2.qq.com/channel/poll2', { 'r': '{{"ptwebqq":"{1}","clientid":{2},"psessionid":"{0}","key":""}}'.format(self.data['psessionid'] , self.data['ptwebqq'] , self.data['client_id'] ) }) try: if html == "": return self.check_msg() ret = json.loads(html) print ret ret_code = ret['retcode'] if ret_code in (102,): logging.info("received retcode: " + str(ret_code) + ": No message.") time.sleep(1) return if ret_code in (103,): logging.warning("received retcode: " + str(ret_code) + ": Check error.retrying.." + str(error_times)) time.sleep(1) return self.check_msg(error_times + 1) if ret_code in (121,): logging.warning("received retcode: " + str(ret_code)) return self.check_msg(5) elif ret_code == 0: msg_list = [] pm_list = [] sess_list = [] group_list = [] notify_list = [] for msg in ret['result']: ret_type = msg['poll_type'] if ret_type == 'message': pm_list.append(PmMsg(msg)) elif ret_type == 'group_message': group_list.append(GroupMsg(msg)) elif ret_type == 'sess_message': sess_list.append(SessMsg(msg)) elif ret_type == 'input_notify': notify_list.append(InputNotify(msg)) elif ret_code == 'kick_message': notify_list.append(KickMessage(msg)) else: logging.warning("unknown message type: " + str(ret_type) + "details: " + str(msg)) group_list.sort(key=lambda x: x.seq) msg_list += pm_list + sess_list + group_list + notify_list if not msg_list: return return msg_list elif ret_code == 100006: print "POST data error" return elif ret_code == 116: self.data['ptwebqq'] = ret['p'] self.__saveData() return else: print "unknown retcode " + str(ret_code) return except ValueError, e: print "Check error occured: " + str(e) time.sleep(1) return self.check_msg(error_times + 1) except BaseException, e: time.sleep(1) return self.check_msg(error_times + 1)
class QQCore: def __init__(self,isLoadData=False): self.dataFileName="data.txt" self.req = HttpRequests(isLoadData); self.data={} self.data['client_id']= int(random.uniform(111111, 888888)) self.data['ptwebqq'] = '' self.data['psessionid'] = '' self.data['selfuin']='' self.appid = 0 self.data['vfwebqq'] = '' self.qrcode_path = "./vcode.jpg" # QRCode保存路径 self.username = '' self.account = 0 self.friendList={} self.uinInfo={} self.redis=redis.StrictRedis(host='localhost', port=6379, db=0) if isLoadData: self.data=self.__loadData() pass #获取相关信息 def __loadData(self): with open(self.dataFileName, 'r') as f: data=pickle.load(f) f.close() return data #保存data def __saveData(self): with open(self.dataFileName, 'w') as f: pickle.dump(self.data,f) f.close() #计算hash信息 def __hash(self,selfuin,ptwebqq): selfuin=str(selfuin) selfuin += "" N=[0,0,0,0] for T in range(len(ptwebqq)): N[T%4]=N[T%4]^ord(ptwebqq[T]) U=["EC","OK"] V=[0, 0, 0, 0] V[0]=int(selfuin) >> 24 & 255 ^ ord(U[0][0]) V[1]=int(selfuin) >> 16 & 255 ^ ord(U[0][1]) V[2]=int(selfuin) >> 8 & 255 ^ ord(U[1][0]) V[3]=int(selfuin) & 255 ^ ord(U[1][1]) U=[0,0,0,0,0,0,0,0] U[0]=N[0] U[1]=V[0] U[2]=N[1] U[3]=V[1] U[4]=N[2] U[5]=V[2] U[6]=N[3] U[7]=V[3] N=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"] V="" for T in range(len(U)): V+= N[ U[T]>>4 & 15] V+= N[ U[T] & 15] return V def login_by_qrcode(self): initurl_html = self.req.get('http://w.qq.com/login.html') initurl = get_revalue(initurl_html, r'\.src = "(.+?)"', "Get Login Url Error.", 1) html = self.req.get(initurl + '0') appid = get_revalue(html, r'var g_appid =encodeURIComponent\("(\d+)"\);', 'Get AppId Error', 1) sign = get_revalue(html, r'var g_login_sig=encodeURIComponent\("(.*?)"\);', 'Get Login Sign Error', 0) js_ver = get_revalue(html, r'var g_pt_version=encodeURIComponent\("(\d+)"\);', 'Get g_pt_version Error', 1) mibao_css = get_revalue(html, r'var g_mibao_css=encodeURIComponent\("(.+?)"\);', 'Get g_mibao_css Error', 1) star_time = date_to_millis(datetime.datetime.utcnow()) error_times = 0 ret = [] while True: error_times += 1 vcodeUrl='https://ssl.ptlogin2.qq.com/ptqrshow?appid={0}&e=0&l=L&s=8&d=72&v=4'.format(appid) self.req.downloadFile(vcodeUrl,self.qrcode_path) print "Please scan the downloaded QRCode" while True: checkLoginUrl='https://ssl.ptlogin2.qq.com/ptqrlogin?webqq_type=10&remember_uin=1&login2qq=1&aid={0}&u1=http%3A%2F%2Fw.qq.com%2Fproxy.html%3Flogin2qq%3D1%26webqq_type%3D10&ptredirect=0&ptlang=2052&daid=164&from_ui=1&pttype=1&dumy=&fp=loginerroralert&action=0-0-{1}&mibao_css={2}&t=undefined&g=1&js_type=0&js_ver={3}&login_sig={4}'.format( appid, date_to_millis(datetime.datetime.utcnow()) - star_time, mibao_css, js_ver, sign); html = self.req.get(checkLoginUrl,{'Referer':initurl}) ret = html.split("'") time.sleep(2) if ret[1] in ('0', '65'): # 65: QRCode 失效, 0: 验证成功, 66: 未失效, 67: 验证中 break if ret[1] == '0' or error_times > 10: break if ret[1] != '0': return print "QRCode scaned, now logging in." # 删除QRCode文件 if os.path.exists(self.qrcode_path): os.remove(self.qrcode_path) # 记录登陆账号的昵称 self.username = ret[11] url = get_revalue(self.req.get(ret[5]), r' src="(.+?)"', 'Get mibao_res Url Error.', 0) if url != '': html = self.req.get(url.replace('&', '&')) url = get_revalue(html, r'location\.href="(.+?)"', 'Get Redirect Url Error', 1) self.req.get(url) self.data['ptwebqq'] = self.req.getCookies()['ptwebqq'] login_error = 1 ret = {} while login_error > 0: try: html = self.req.post('http://d.web2.qq.com/channel/login2', { 'r': '{{"ptwebqq":"{0}","clientid":{1},"psessionid":"{2}","status":"online"}}'.format(self.data['ptwebqq'] , self.data['client_id'] , self.data['psessionid'] ) }, {'Referer':"http://d.web2.qq.com/proxy.html?v=20030916001&callback=1&id=2"} ) ret = json.loads(html) login_error = 0 except: login_error += 1 print "login fail, retrying..." exit() if ret['retcode'] != 0: print ret return self.data['vfwebqq'] = ret['result']['vfwebqq'] self.data['psessionid'] = ret['result']['psessionid'] self.data['selfuin'] = ret['result']['uin'] self.__saveData() def relogin(self, error_times=0): if error_times >= 10: return False try: html = self.req.post('http://d.web2.qq.com/channel/login2', { 'r': '{{"ptwebqq":"{0}","clientid":{1},"psessionid":"{2}","key":"","status":"online"}}'.format( self.req.getCookies()['ptwebqq'], self.data['client_id'] , self.data['psessionid'] ) } ) ret = json.loads(html) self.data['vfwebqq'] = ret['result']['vfwebqq'] self.data['psessionid'] = ret['result']['psessionid'] return True except: return self.relogin(error_times + 1) #处理消息 def __handleMsg(self,msgs): print msgs for msg in msgs: temp=json.dumps(msg) self.redis.rpush("message_box_in",temp) def getAccountByUin(self,uin): if uin in self.uinInfo: return self.uinInfo[uin] else: ret=self.uin_to_account(uin) if ret: return ret return False #获取好友详细信息 def getFriendInfo(self): ret=self.getFriendList() if not ret: return False friendlist={} uinInfo={} for user in ret['marknames']: if user['uin'] not in friendlist: friendlist[user['uin']]={} friendlist[user['uin']]['markname']=user['markname'] for user in ret['info']: if user['uin'] not in friendlist: friendlist[user['uin']]={} friendlist[user['uin']]['nick']=user['nick'] friendlist[user['uin']]['uin']=user['uin'] account=self.uin_to_account(user['uin']) friendlist[user['uin']]['account']=account friendlist[account]=friendlist[user['uin']] del friendlist[user['uin']] uinInfo[user['uin']]=account self.friendList=friendlist self.uinInfo=uinInfo return friendlist #获取所有用户列表,但是不含QQ号 def getFriendList(self): try : requestUrl="http://s.web2.qq.com/api/get_user_friends2" hash=self.__hash(self.data['selfuin'],self.req.getCookies()['ptwebqq']) ret=self.req.post(requestUrl,{'vfwebqq':self.data['vfwebqq'],'hash':hash}) ret=json.loads(ret) if ret['retcode'] ==0: return ret['result'] else : return False except Exception,e: print e