def GetToken(self, useCache=True): key = 'HelloTrue_Token_%s' % (hash(self.serial) % 10) # 根据手机串码的hash值尾号共用token, 每10个手机共用一个token if useCache: tokenCache = cache.get(key) if tokenCache: return tokenCache user = self.username.encode("utf-8") pwd = self.password.encode("utf-8") path = "/api/do.php?action=loginIn&name=" + user + "&password="******"&Developer=apFsnhXLxQG5W0AWiDhr%2fg%3d%3d" conn = httplib.HTTPConnection(self.domain, self.port, timeout=30) conn.request("GET", path) time.sleep(1) response = conn.getresponse() if response.status == 200: data = response.read() if data.startswith("1|"): token = data.split('|')[1]; cache.set(key, token, None) return token elif u"密码" in data: if not cache.get("HELLOTRUE_ERROR_PASS"): cache.set("HELLOTRUE_ERROR_PASS", True) dbapi.log_error("", u"开放云登录失败了", u"开放云用户密码错误,请修改") return self.GetToken()
def GetCode(self, number, itemId, length=6): key = 'hellotrue_verify_code_%s_%s' % (itemId, number) code = cache.get(key) if code: return code token = self.GetToken() try: itemcode = self.im_type_list[itemId] path = "/api/do.php?action=getMessage&token=%s&sid=%s&phone=%s&author=%s" % (token, itemcode, number, self.author) conn = httplib.HTTPConnection(self.domain, self.port, timeout=30) conn.request("GET", path) response = conn.getresponse() if response.status == 200: data = response.read()#.decode('GBK') if data.startswith("0|"): return None res = re.findall("\d{%s}" % length, data) code = res[0] sms_number_key = 'hellotrue_verify_code_%s_%s' % (itemId, number) cache.set(sms_number_key, code) else: data = response.read()#.decode('GBK') util.logger.error(data) except Exception: return None
def GetCode(self, number, itemId, length=6): itemcode = self.im_type_list[itemId] key = 'verify_code_%s_%s' % (itemcode, number) code = cache.get(key) if code: return code token = self.GetToken() try: path = "/getMessage?token=%s&itemId=%s&phone=%s" % ( token, itemcode, number) conn = httplib.HTTPConnection(self.domain, self.port, timeout=30) conn.request("GET", path) response = conn.getresponse() if response.status == 200: data = response.read().decode('GBK') print(data) if u'Session 过期' in data or u'Session过期' in data: self.GetToken(False) return None except Exception: self.logger.error(traceback.format_exc()) return None smsList = self.ExtractSMS(data, length) for sms in smsList: if 'phone' in sms and 'code' in sms: sms_number_key = 'verify_code_%s_%s' % (sms['itemid'], sms['phone']) self.logger.info("KEY: %s, Code: %s" % (sms_number_key, sms['code'])) cache.set(sms_number_key, sms['code']) #cache.set(sms['phone'], sms['code']) '''
def getCode(self, im, im_type, timeout=60): """ im: 图片字节 im_type: 题目类型 """ params = { 'typeid': self.im_type_list[im_type], 'timeout': timeout, } params.update(self.base_params) files = {'image': ('a.jpg', im.read())} requests.adapters.DEFAULT_RETRIES = 10 r = requests.post('http://api.ruokuai.com/create.json', data=params, files=files, headers=self.headers) #{"Result":"答题结果","Id":"题目Id(报错使用)"} result = r.json() if "Error_Code" in result: if result["Error_Code"] == "10202": if not cache.get("RK_ERROR_PASS"): cache.set("RK_ERROR_PASS", True) dbapi.log_error("", "若快用户密码错误", "若快打码用户密码错误,请修改") return None return {"Result": result["Result"], "Id": result["Id"]}
def GetToken(self, useCache=True): key = 'XunMa_Token_%s' % (hash(self.serial) % 10 ) # 根据手机串码的hash值尾号共用token, 每10个手机共用一个token if useCache: tokenCache = cache.get(key) if tokenCache: return tokenCache user = self.username.encode("utf-8") pwd = self.password.encode("utf-8") path = "/Login?uName=" + user + "&pWord=" + pwd + "&Developer=apFsnhXLxQG5W0AWiDhr%2fg%3d%3d" conn = httplib.HTTPConnection(self.domain, self.port, timeout=30) conn.request("GET", path) time.sleep(1) response = conn.getresponse() if response.status == 200: data = response.read() if data.startswith("False"): # Token以False开头,嵌套调用 return self.GetToken() token = data.split('&')[0] cache.set(key, token, None) return token else: return self.GetToken()
def run(self): while True: cache.set("ztask_virtual_active_time", datetime.datetime.now()) try: devicelist = self.finddevices() for device in devicelist: deviceid = device["serial"] taskid = device["task_id"] if taskid: task = dbapi.GetTask(taskid) if task and task.get("status") and task["status"] == "running": if deviceid not in self.processDict: # 进程从未启动 self.startProcess(deviceid) else: p = self.processDict[deviceid] if not p.is_alive(): # 进程已退出,从新启动进程 self.startProcess(deviceid) else: # 检查进程心跳是否超过3分钟 key = 'timeout_%s' % deviceid activeTime = cache.get(key) if activeTime: checkTime = (datetime.datetime.now() - datetime.datetime(2017, 1, 1)).seconds if (checkTime - int(activeTime)) > 180: # 进程心跳时间超过3分种,重启进程 self.processDict[deviceid].terminate() self.startProcess(deviceid) else: if self.processDict.has_key(deviceid) and self.processDict.get(deviceid).is_alive(): self.processDict[deviceid].terminate() del self.processDict[deviceid] elif deviceid in self.processDict: self.processDict[device].terminate() del self.processDict[deviceid] except Exception: logger.error(traceback.format_exc()) time.sleep(10)
def timeinterval(self, z, args): now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string logging.info('现在的时间%s' % nowtime) gettime = cache.get('WeiXinMoments_time') logging.info('以前的时间%s' % gettime) d1 = datetime.datetime.strptime(nowtime, '%Y-%m-%d %H:%M:%S') if gettime != None: d2 = datetime.datetime.strptime(gettime, '%Y-%m-%d %H:%M:%S') delta1 = (d1 - d2) # print( delta1 ) delta = re.findall(r"\d+\.?\d*", str(delta1)) # 将天小时等数字拆开 day1 = int(delta[0]) hours1 = int(delta[1]) minutes1 = 0 if 'days' in str(delta1): minutes1 = int(delta[2]) allminutes = day1 * 24 * 60 + hours1 * 60 + minutes1 else: allminutes = day1 * 60 + hours1 # 当时间不超过天时此时天数变量成为小时变量 logging.info("day=%s,hours=%s,minutes=%s" % (day1, hours1, minutes1)) logging.info('两个时间的时间差%s' % allminutes) set_time = int(args['set_time']) # 得到设定的时间 if allminutes < set_time: # 由外界设定 z.toast('该模块未满足指定时间间隔,程序结束') return 'end' else: cache.set('WeiXinMoments_time', nowtime) else: cache.set('WeiXinMoments_time', nowtime)
def action(self,d,z,args): z.toast("开始执行:检测手机IP模块") while True: # 开关飞行模式 d.server.adb.cmd( "shell", "settings put global airplane_mode_on 1" ).communicate( ) d.server.adb.cmd( "shell", "am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true" ).communicate( ) z.sleep( 6 ) d.server.adb.cmd( "shell", "settings put global airplane_mode_on 0" ).communicate( ) d.server.adb.cmd( "shell", "am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false" ).communicate( ) while True: ping = d.server.adb.cmd("shell", "ping -c 3 baidu.com").communicate() print(ping) if 'icmp_seq'and 'bytes from'and'time' in ping[0]: break z.sleep(2) # 获取手机IP IPList = d.server.adb.cmd( "shell", "curl http://ipecho.net/plain" ).communicate( ) IP = IPList[0] print( IP ) # IP添加到缓存 ip = cache.get( IP ) print(ip) if ip is None: timeoutStr = args['time_out'] timeout = int( timeoutStr ) * 60 cache.set( IP, IP, timeout ) break else: continue
def GetToken(self, useCache=True): key = 'jyzszp_Token_%s' % (hash(self.serial) % 10) # 根据手机串码的hash值尾号共用token, 每10个手机共用一个token if useCache: tokenCache = cache.get(key) if tokenCache: return tokenCache user = self.username.encode("utf-8") pwd = self.password.encode("utf-8") path = "/Api/index/loginIn?uid=%s&pwd=%s"%(user, pwd ) conn = httplib.HTTPConnection(self.domain, self.port, timeout=30) conn.request("GET", path) time.sleep(1) response = conn.getresponse() if response.status == 200: data = response.read() token = data.split('|'); if len(token) == 3: token = token[2] cache.set(key, token, None) return token elif len(token) == 1: if not cache.get("HELLOTRUE_ERROR_PASS"): cache.set("HELLOTRUE_ERROR_PASS", True) dbapi.log_error("", "菜众享登录失败了", "菜众享登录失败,错误码:%s"%data) time.sleep(3) return self.GetToken()
def GetCode(self, number, itemId, length=6): key = 'verify_code_%s_%s' % (itemId, number) code = cache.get(key) if code: return code token = self.GetToken() try: itemcode = self.im_type_list[itemId] path = "/Api/index/getVcodeAndReleaseMobile?uid=%s&token=%s&mobile=%s&pid=%s&author_uid=%s" % (self.username,token, number,itemcode, self.author) conn = httplib.HTTPConnection(self.domain, self.port, timeout=30) conn.request("GET", path) response = conn.getresponse() if response.status == 200: data = response.read()#.decode('GBK') dataObj = data.split('|'); if len(dataObj) >=3 : targetNumber = re.findall(r'1\d{10}', data) targetNumber = targetNumber[0] if len(dataObj[1]) == int(length): code = dataObj[1] sms_number_key = 'verify_code_%s_%s' % (itemId, targetNumber) cache.set(sms_number_key, code) else: data = response.read()#.decode('GBK') util.logger.error(data) except Exception: return None
def IPCheckRepitition(self, z, d, args): z.toast("正在检测IP...") while True: # 开关飞行模式 d.server.adb.cmd( "shell", "settings put global airplane_mode_on 1").communicate() d.server.adb.cmd( "shell", "am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true" ).communicate() z.sleep(3) d.server.adb.cmd( "shell", "settings put global airplane_mode_on 0").communicate() d.server.adb.cmd( "shell", "am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false" ).communicate() t = 0 while t < 6: ping = d.server.adb.cmd("shell", "ping -c 3 baidu.com").communicate() print(ping) if 'icmp_seq' and 'bytes from' and 'time' in ping[0]: break z.sleep(10) z.heartbeat() z.sleep(10) t = t + 1 if t >= 6: z.toast("网络无法ping通,重新开关飞行模式") continue # 获取手机IP IPList = d.server.adb.cmd( "shell", "curl http://ipecho.net/plain").communicate() IP = IPList[0] print(IP) # IP添加到缓存 ip = cache.get(IP) print(ip) if ip is None: timeoutStr = args['time_out'] timeout = int(timeoutStr) * 60 cache.set(IP, IP, timeout) z.toast("IP检测完成") break else: continue
def __init__(self, serial): self.platform = dbapi.GetSetting("sms_platform") # self.platform = "xunma" if self.platform == 'xunma': self.platform = "xunma"; elif self.platform == 'hellotrue': #爱乐赞 self.platform = "hellotrue"; else: self.platform = "jyzszp"; #玉米 self.username = dbapi.GetSetting("%s_user"%self.platform); self.password = dbapi.GetSetting("%s_password" % self.platform); if self.username is None or self.password is None: if not cache.get("EMPTY_SMS_CODE_USER_PASS"): cache.set("EMPTY_SMS_CODE_USER_PASS", True) dbapi.log_error("", "没有设置接码帐号密码","没有设置接码帐号密码") return self.WECHAT_REGISTER = "wechat_register"; self.QQ_CONTACT_BIND = "qq_contact_bind"; self.QQ_REGISTER = "qq_register"; self.QQ_TOKEN_BIND = "qq_token_bind"; self.ALIPAY_REGISTER = "alipay_register"; self.WECHAT_MAIL_BIND = "wechat_mail_bind"; self.im_type_list={} self.im_type_list[self.WECHAT_REGISTER] = dbapi.GetSetting("%s_%s" % (self.platform,self.WECHAT_REGISTER)); self.im_type_list[self.QQ_CONTACT_BIND] = dbapi.GetSetting("%s_%s" % (self.platform,self.QQ_CONTACT_BIND)); self.im_type_list[self.QQ_REGISTER] = dbapi.GetSetting("%s_%s" % (self.platform,self.QQ_REGISTER)); self.im_type_list[self.QQ_TOKEN_BIND] = dbapi.GetSetting("%s_%s" % (self.platform,self.QQ_TOKEN_BIND)); self.im_type_list[self.ALIPAY_REGISTER] = dbapi.GetSetting("%s_%s" % (self.platform,self.ALIPAY_REGISTER)); self.im_type_list[self.WECHAT_MAIL_BIND] = dbapi.GetSetting( "%s_%s" % (self.platform, self.WECHAT_MAIL_BIND) ); if self.platform == 'xunma': self.client = client_xunma(serial, self.username, self.password,self.im_type_list) elif self.platform == 'hellotrue': #爱乐赞 self.client = client_hellotrue(serial , self.username, self.password,self.im_type_list) else: self.client = client_jyzszp(serial, self.username, self.password,self.im_type_list) #玉米
def GetWebItemId(self, opener, itemname): key = 'itemname_' + itemname val = cache.get(key) if val: return val url = 'http://www.xunma.net/userManage/Category.aspx?selectItem=' + itemname response = opener.open(url) data = response.read() soup = BeautifulSoup(data) tables = soup.findAll('table') for tab in tables: if u'项目名' not in tab.text or u'单价' not in tab.text: continue for tr in tab.findAll('tr'): tds = tr.findAll('td') if len(tds) > 3: if tds[1].getText() == itemname: cache.set(key, tds[0].getText(), 60 * 60 * 24) return tds[0].getText()
def GetAllWebSms(self): filename = '/tmp/cookie_xunma.txt' # 声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件 cookie = cookielib.MozillaCookieJar(filename) # 利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器 handler = urllib2.HTTPCookieProcessor(cookie) # 通过handler来构建opener opener = urllib2.build_opener(handler) if os.path.exists(filename): cookie.load(filename, ignore_discard=True, ignore_expires=True) loginurl = "http://www.xunma.net/userManage/Message.aspx" opener.addheaders = [( "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36" )] # 登陆前准备:获取lt和exection response = opener.open(loginurl) data = response.read() if '<div class="title">用户登录<span>' in data: self.LoginWeb(opener) cookie.save(ignore_discard=True, ignore_expires=True) return self.GetAllWebSms() soup = BeautifulSoup(data) tables = soup.findAll('table') for tab in tables: if '短信内容' not in tab.text or '手机号码' not in tab.text: continue for tr in tab.findAll('tr'): tds = tr.findAll('td') if len(tds) > 7: number = tds[1].getText() if len(number) != 11: continue itemcode = self.GetWebItemId(opener, tds[4].getText()) key = 'verify_code_%s_%s' % (itemcode, number) if not cache.get(key): res = re.findall("\d+", tds[2].getText()) for code in res: if len(code) >= 4: cache.set(key, code) break
def __init__(self): self.platform = dbapi.GetSetting("image_platform") if self.platform == 'lianzong': self.platform = "lianzong" else: self.platform = "ruokuai" self.username = dbapi.GetSetting("%s_user" % self.platform) self.password = dbapi.GetSetting("%s_password" % self.platform) if self.username is None or self.password is None: if not cache.get("EMPTY_IMAGE_CODE_USER_PASS"): cache.set("EMPTY_IMAGE_CODE_USER_PASS", True) dbapi.log_error("", "没有设置打码帐号密码", "没有设置打码帐号密码") return if self.platform == 'lianzong': self.client = client_lianzong(self.username, self.password) else: self.client = client_ruokuai(self.username, self.password) self.CODE_TYPE_4_NUMBER_CHAR = "4_number_char"
def action(self, d, z, args): startTime = args["startTime"] endTime = args["endTime"] try: if self.repo.timeCompare(startTime, endTime): z.toast("该时间段不允许运行") return except: z.toast("输入的时间格式错误,请检查后再试") return set_timeStart = int(args['set_timeStart']) # 得到设定的时间 set_timeEnd = int(args["set_timeEnd"]) run_time = float(random.randint(set_timeStart, set_timeEnd)) run_interval = z.getModuleRunInterval(self.mid) if run_interval is not None and run_interval < run_time: z.toast(u'锁定时间还差:%d分钟' % int(run_time - run_interval)) z.sleep(2) return z.toast("准备执行MMS版QQ搜索加好友模块") z.sleep(1) z.toast("正在ping网络是否通畅") z.heartbeat() i = 0 while i < 200: i += 1 ping = d.server.adb.cmd("shell", "ping -c 3 baidu.com").communicate() print(ping) if 'icmp_seq' and 'bytes from' and 'time' in ping[0]: z.toast("网络通畅。开始执行:QQ加好友(搜索查找)") break z.sleep(2) if i > 200: z.toast("网络不通,请检查网络状态") if (args["time_delay"]): z.sleep(int(args["time_delay"])) return # self.scode = smsCode( d.server.adb.device_serial( ) ) z.heartbeat() d.server.adb.cmd( "shell", "am force-stop com.tencent.mobileqq").communicate() # 强制停止 d.server.adb.cmd( "shell", "am start -n com.tencent.mobileqq/com.tencent.mobileqq.activity.SplashActivity" ).communicate() # 拉起来 z.sleep(10) z.heartbeat() # loginStatusList = z.qq_getLoginStatus( d ) # if loginStatusList is None: # z.toast( "登陆新场景,现无法判断登陆状态" ) # now = datetime.datetime.now( ) # nowtime = now.strftime( '%Y-%m-%d %H:%M:%S' ) # 将日期转化为字符串 datetime => string # cache.set( '%s_MMCQQAddfriendsByNumber_time' % d.server.adb.device_serial( ), nowtime, # None ) # z.toast( '模块结束,保存的时间是%s' % nowtime ) # return # loginStatus = loginStatusList['success'] # if loginStatus: # z.toast( "卡槽QQ状态正常,继续执行" ) # else: # z.toast( "卡槽QQ状态异常,跳过此模块" ) # now = datetime.datetime.now( ) # nowtime = now.strftime( '%Y-%m-%d %H:%M:%S' ) # 将日期转化为字符串 datetime => string # cache.set( '%s_MMCQQAddfriendsByNumber_time' % d.server.adb.device_serial( ), nowtime, # None ) # z.toast( '模块结束,保存的时间是%s' % nowtime ) # return if d(text="消息", resourceId="com.tencent.mobileqq:id/ivTitleName", className="android.widget.TextView").exists: z.toast("登录状态正常") elif d(text='绑定手机号码').exists: while d(text='关闭').exists: d(text='关闭').click() z.sleep(0.5) z.sleep(1) elif d(text='主题装扮').exists: while d(text='关闭').exists: d(text='关闭').click() z.sleep(0.5) elif d(text='马上绑定').exists: while d(text='关闭').exists: d(text='关闭').click() z.sleep(0.5) else: z.toast("登录状态异常,停止模块") now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return d(description='快捷入口').click() z.sleep(2) if not d(text='扫一扫').exists: d(description='快捷入口').click() z.sleep(1) z.heartbeat() if d(textContains='加好友').exists: d(textContains='加好友').click() else: d(resourceId='com.tencent.mobileqq:id/name', description='快捷入口').click() d(textContains='加好友').click() z.sleep(1) d(className='android.widget.EditText', index=0).click() # 刚进来时点击 QQ号/手机号/群/公众号 z.sleep(1) # d(className='android.widget.EditText',index=0).click() #QQ号/手机号/群/公众号 # d(className='android.widget.EditText').set_text(list[0]['number']) # 第一次添加的帐号 list[0] cate_id = int(args["repo_number_cate_id"]) # 得到取号码的仓库号 numbers = self.repo.GetNumber(cate_id, 120, 1) # 取出add_count条两小时内没有用过的号码 if len(numbers) == 0: d.server.adb.cmd( "shell", "am broadcast -a com.zunyun.zime.toast --es msg \"QQ号码库%s号仓库为空,等待中\"" % cate_id).communicate() z.sleep(10) if (args["time_delay"]): z.sleep(int(args["time_delay"])) now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return z.heartbeat() numbers = numbers[0]['number'] z.input(numbers) time.sleep(0.5) d(text='找人:', resourceId='com.tencent.mobileqq:id/name').click() z.sleep(3) add_count = int(args["add_count"]) cate_id1 = args["repo_material_cate_id"] z.heartbeat() for i in range(1, add_count + 1, +1): # 给多少人发消息 Material = self.repo.GetMaterial(cate_id1, 0, 1) if len(Material) == 0: d.server.adb.cmd( "shell", "am broadcast -a com.zunyun.zime.toast --es msg \"消息素材%s号仓库为空,没有取到消息\"" % cate_id1).communicate() z.sleep(10) if (args["time_delay"]): z.sleep(int(args["time_delay"])) now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return message = Material[0]['content'] # 取出验证消息的内容 cate_id = int(args["repo_number_cate_id"]) # 得到取号码的仓库号 numbers = self.repo.GetNumber(cate_id, 120, 1) # 取出add_count条两小时内没有用过的号码 if len(numbers) == 0: d.server.adb.cmd( "shell", "am broadcast -a com.zunyun.zime.toast --es msg \"QQ号码库%s号仓库为空,等待中\"" % cate_id).communicate() z.sleep(10) if (args["time_delay"]): z.sleep(int(args["time_delay"])) now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return z.heartbeat() numbers = numbers[0]['number'] print(numbers) z.sleep(1) if d(text='没有找到相关结果', className='android.widget.TextView').exists: # 没有这个人的情况 time.sleep(0.5) d(resourceId='com.tencent.mobileqq:id/ib_clear_text', description='清空').click() obj = d(className='android.widget.EditText', index=0) # QQ号/手机号/群/公众号 if obj.exists: obj.set_text(numbers) # 下次要添加的号码 obj = d(text='网络查找人', resourceId='com.tencent.mobileqq:id/et_search_keyword') if obj.exists: obj.set_text(numbers) # 下次要添加的号码 d(textContains='找人').click() while d(text='正在搜索…', index=1).exists: # 网速不行的情况,让它不停等待 z.sleep(1) continue z.sleep(1) z.heartbeat() # d.swipe(width / 2, height * 4 / 6, width / 2, height / 6); d(text='加好友').click() z.sleep(3) if d(text="风险提示").exists: # 风险提示 d(text="取消").click() z.sleep(1) d(text='返回', resourceId='com.tencent.mobileqq:id/ivTitleBtnLeft').click() d(resourceId='com.tencent.mobileqq:id/ib_clear_text', description='清空').click() obj = d(className='android.widget.EditText', index=0) if obj.exists: obj.set_text( numbers) # 要改为从库里取------------------------------ obj = d(text='网络查找人', resourceId='com.tencent.mobileqq:id/et_search_keyword') if obj.exists: obj.set_text(numbers) z.sleep(1) d(textContains='找人').click() while d(text='正在搜索…', index=1).exists: z.sleep(1) continue if d(text='加好友').exists: # 拒绝被添加为好友的情况 z.sleep(1) d(text='返回', resourceId='com.tencent.mobileqq:id/ivTitleBtnLeft').click() d(resourceId='com.tencent.mobileqq:id/ib_clear_text', description='清空').click() obj = d(className='android.widget.EditText', index=0) if obj.exists: obj.set_text( numbers) # 要改为从库里取------------------------------ obj = d(text='网络查找人', resourceId='com.tencent.mobileqq:id/et_search_keyword') if obj.exists: obj.set_text(numbers) z.sleep(1) d(textContains='找人').click() while d(text='正在搜索…', index=1).exists: z.sleep(1) continue time.sleep(0.5) z.heartbeat() if d(text='必填', resourceId='com.tencent.mobileqq:id/name').exists: # 要回答问题的情况 d(text='返回', resourceId='com.tencent.mobileqq:id/ivTitleBtnLeft').click() z.sleep(1) d(text='返回', resourceId='com.tencent.mobileqq:id/ivTitleBtnLeft').click() d(resourceId='com.tencent.mobileqq:id/ib_clear_text', description='清空').click() obj = d(className='android.widget.EditText', index=0) if obj.exists: obj.set_text(numbers) # 下次要添加的号码- obj = d(text='网络查找人', resourceId='com.tencent.mobileqq:id/et_search_keyword') if obj.exists: obj.set_text(numbers) z.sleep(1) d(textContains='找人').click() while d(text='正在搜索…', index=1).exists: z.sleep(1) continue z.heartbeat() if d(textContains='问题').exists: # 要回答问题的情况 d(text='取消').click() z.sleep(0.5) d(text='返回').click() d(resourceId='com.tencent.mobileqq:id/ib_clear_text', description='清空').click() obj = d(className='android.widget.EditText', index=0) if obj.exists: obj.set_text(numbers) # 下次要添加的号码- obj = d(text='网络查找人', resourceId='com.tencent.mobileqq:id/et_search_keyword') if obj.exists: obj.click() z.input(numbers) z.sleep(1) d(textContains='找人').click() while d(text='正在搜索…', index=1).exists: z.sleep(1) continue z.heartbeat() z.sleep(0.5) obj = d( className='android.widget.EditText', resourceId='com.tencent.mobileqq:id/name').info # 将之前消息框的内容删除 obj = obj['text'] lenth = len(obj) t = 0 while t < lenth: d.press.delete() t = t + 1 if d(className='android.widget.EditText', index=4).exists: z.input(message) obj = d(text='发送') # 不需要验证可直接添加为好友的情况 if obj.exists: z.heartbeat() obj.click() if d(text='添加失败,请勿频繁操作', resourceId='com.tencent.mobileqq:id/name').exists: if (args["time_delay"]): z.sleep(int(args["time_delay"])) now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string cache.set( '%s_MMCQQAddfriendsByNumber_time' % d.server.adb.device_serial(), nowtime, None) z.toast('模块结束,保存的时间是%s' % nowtime) return d(text='返回').click() if add_count == i + 1: if (args["time_delay"]): z.sleep(int(args["time_delay"])) now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return d(description='清空').click() obj = d(className='android.widget.EditText', index=0) if obj.exists: obj.set_text( numbers) # 要改为从库里取------------------------------- obj = d(text='网络查找人', resourceId='com.tencent.mobileqq:id/et_search_keyword') if obj.exists: obj.set_text(numbers) d(textContains='找人').click() while d(text='正在搜索…', index=1).exists: z.sleep(1) continue now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return if (args["time_delay"]): time.sleep(int(args["time_delay"]))
def action(self, d, z, args): condition = self.timeinterval(d, z, args) if condition == 'end': z.sleep(2) return z.heartbeat() add_count = int(args['add_count']) cate_id = args["repo_material_id"] Material = self.repo.GetMaterial(cate_id, 0, 1) if len(Material) == 0: d.server.adb.cmd( "shell", "am broadcast -a com.zunyun.zime.toast --es msg \"消息素材%s号仓库为空,等待中……\"" % cate_id).communicate() z.sleep(10) return message = Material[0]['content'] # 取出验证消息的内容 d.press.home() if d(text='微信').exists: d(text='微信').click() else: # d.swipe( width - 20, height / 2, 0, height / 2, 5 ) z.toast('该页面没有微信') z.sleep(2) return z.sleep(5) while True: if d(text='发现') and d(text='我') and d(text='通讯录').exists: break else: d(descriptionContains='返回', className='android.widget.ImageView').click() d(description='更多功能按钮', className='android.widget.RelativeLayout').click() z.sleep(1) if d(text='添加朋友').exists: d(text='添加朋友').click() else: d(description='更多功能按钮', className='android.widget.RelativeLayout').click() z.sleep(1) d(text='添加朋友').click() z.heartbeat() d(index='1', className='android.widget.TextView').click() #点击搜索好友的输入框 account = 0 while True: if account < add_count: cate_id = int(args["repo_number_id"]) # 得到取号码的仓库号 number_count = 1 #每次取一个号码 while True: exist_numbers = self.repo.GetNumber( cate_id, 0, number_count, 'exist') print(exist_numbers) remain = number_count - len(exist_numbers) normal_numbers = self.repo.GetNumber( cate_id, 0, remain, 'normal') numbers = exist_numbers + normal_numbers if len(numbers) > 0: break d.server.adb.cmd( "shell", "am broadcast -a com.zunyun.zime.toast --es msg \"电话号码%s号仓库为空,等待中\"" % cate_id).communicate() z.sleep(30) WXnumber = numbers[0]['number'] z.input(WXnumber) z.heartbeat() d(textContains='搜索:').click() while d(textContains='正在查找').exists: z.sleep(2) if d(textContains='操作过于频繁').exists: now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => stringk cache.set( '%s_WXSearchAddDepostII_time' % d.server.adb.device_serial(), nowtime, None) z.toast('模块结束,保存的时间是%s' % nowtime) return z.sleep(2) if d(textContains='用户不存在').exists: d(descriptionContains='清除', index=2).click() z.sleep(1) continue if d(textContains='状态异常').exists: d(descriptionContains='清除', index=2).click() continue z.heartbeat() Gender = d(className='android.widget.LinearLayout', index=1).child( className='android.widget.LinearLayout').child( className='android.widget.ImageView', index=1) # 看性别是否有显示 if Gender.exists: Gender = Gender.info Gender = Gender['contentDescription'] else: Gender = '空' z.heartbeat() nickname = d( className='android.widget.ListView' ).child( className='android.widget.LinearLayout', index=1 ) \ .child( className='android.widget.LinearLayout', index=1 ).child( className='android.widget.TextView' ) if nickname.exists: nickname = nickname.info['text'] else: nickname = '空' z.heartbeat() if d(text='地区').exists: for k in range(3, 10): if d(className='android.widget.ListView').child( className='android.widget.LinearLayout', index=k).child( className='android.widget.LinearLayout', index=0).child(text='地区').exists: break area = d( className='android.widget.ListView' ).child( className='android.widget.LinearLayout', index=k ).child( className='android.widget.LinearLayout', index=0 ). \ child( className='android.widget.LinearLayout', index=1 ).child( className='android.widget.TextView' ).info['text'] else: area = '空' z.heartbeat() if d(text='个性签名').exists: for k in range(3, 10): if d(className='android.widget.ListView').child( className='android.widget.LinearLayout', index=k).child( className='android.widget.LinearLayout', index=0).child(text='个性签名').exists: break sign = d( className='android.widget.ListView' ).child( className='android.widget.LinearLayout', index=k ).child( className='android.widget.LinearLayout', index=0 ). \ child( className='android.widget.LinearLayout', index=1 ).child( className='android.widget.TextView' ).info['text'] else: sign = '空' z.heartbeat() ''' 得到搜索人的v1值 ''' serial = z.wx_userList() ids = list(json.loads(serial))[0] # 将字符串改为list样式 print(ids) onlyInfo = args['onlyInfo'] if onlyInfo == '是': para = {"phoneNumber": WXnumber, 'x_20': ids} self.repo.PostInformation(args["repo_cate_id"], para) z.toast("%s入库完成" % WXnumber) d(descriptionContains='返回').click() d(descriptionContains='清除').click() continue z.heartbeat() z.sleep(1) if d(text='添加到通讯录').exists: #存在联系人的情况 d(text='添加到通讯录').click() if d(textContains='正在添加').exists: z.sleep(1) if d(text='发消息').exists: seltype = '单向' else: seltype = '混合' para = { "phoneNumber": WXnumber, 'x_01': nickname, 'x_02': Gender, "x_03": area, "x_04": sign, 'x_05': seltype, 'x_20': ids } print('--%s--%s--%s--%s--%s' % (WXnumber, nickname, Gender, area, sign)) self.repo.PostInformation(args["repo_cate_id"], para) z.toast("%s入库完成" % WXnumber) gender = args['gender'] if gender != '不限': if Gender != gender: # 看性别是否满足条件 d(description='返回').click() d(description='返回').click() d(descriptionContains='清除').click() para = { "phoneNumber": WXnumber, 'x_01': nickname, 'x_02': Gender, "x_03": area, "x_04": sign, 'x_05': seltype, 'x_20': ids } print('--%s--%s--%s--%s--%s' % (WXnumber, nickname, Gender, area, sign)) self.repo.PostInformation(args["repo_cate_id"], para) z.toast("%s入库完成" % WXnumber) continue if d(text='发消息').exists: d(descriptionContains='返回').click() d(descriptionContains='清除').click() continue else: continue z.sleep(2) obj = d( className='android.widget.EditText').info # 将之前消息框的内容删除 obj = obj['text'] lenth = len(obj) t = 0 while t < lenth: d.press.delete() t = t + 1 d(className='android.widget.EditText').click() z.input(message) d(text='发送').click() z.heartbeat() d(descriptionContains='返回').click() d(descriptionContains='清除').click() z.sleep(1) account = account + 1 continue else: break now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => stringk cache.set('%s_WXSearchAddDepostII_time' % d.server.adb.device_serial(), nowtime, None) #z.toast('模块结束,保存的时间是%s'%nowtime) if (args["time_delay"]): z.sleep(int(args["time_delay"]))
def action(self, d,z, args): condition = self.timeinterval( d, z, args ) if condition == 'end': z.sleep( 2 ) return z.heartbeat() base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__),os.path.pardir, "tmp")) if not os.path.isdir(base_dir): os.mkdir(base_dir) filename = os.path.join(base_dir, "%s.txt"%(self.GetUnique()) ) number_count = int(args['number_count']) cate_id = args["repo_cate_id"] while True: exist_numbers = self.repo.GetNumber(cate_id, 0, number_count, 'exist') print(exist_numbers) remain = number_count - len(exist_numbers) normal_numbers = self.repo.GetNumber(cate_id, 0, remain, 'normal') numbers = exist_numbers + normal_numbers if len(numbers)> 0: break d.server.adb.cmd("shell", "am broadcast -a com.zunyun.zime.toast --es msg \"电话号码%s号仓库为空,等待中\""%cate_id).communicate() z.sleep(30) if numbers: file_object = open(filename, 'w') lines = "" pname = "" for number in numbers: if number["name"] is None: pname = number["number"] else: pname = number["name"] lines = "%s%s----%s\r" %(lines, pname, number["number"]) file_object.writelines(lines) file_object.close() isclear = args['clear'] if isclear=='是': d.server.adb.cmd("shell", "pm clear com.android.providers.contacts").communicate() #d.server.adb.cmd("shell", "am", "start", "-a", "zime.clear.contacts").communicate() d.server.adb.cmd("push", filename, "/data/local/tmp/contacts.txt").communicate() d.server.adb.cmd("shell", "am", "start", "-n", "com.zunyun.zime/.ImportActivity", "-t", "text/plain", "-d", "file:////data/local/tmp/contacts.txt").communicate() #d.server.adb.cmd("shell", "am broadcast -a com.zunyun.import.contact --es file \"file:///data/local/tmp/contacts.txt\"").communicate() os.remove(filename) out = d.server.adb.cmd("shell", "dumpsys activity top | grep ACTIVITY").communicate()[0].decode('utf-8') while out.find("com.zunyun.zime/.ImportActivity") > -1: z.heartbeat() out = d.server.adb.cmd("shell", "dumpsys activity top | grep ACTIVITY").communicate()[0].decode('utf-8') z.sleep(5) now = datetime.datetime.now( ) nowtime = now.strftime( '%Y-%m-%d %H:%M:%S' ) # 将日期转化为字符串 datetime => string cache.set( '%s_WXImpContact_time' % d.server.adb.device_serial( ), nowtime,None ) z.toast('模块结束,保存的时间是%s'%nowtime) if (args["time_delay"]): z.sleep(int(args["time_delay"]))
def getCode(self, im, im_type, timeout=60): import base64 #f = open(r'c:\jb51.gif', 'rb') # 二进制方式打开图文件 if isinstance(im, str): ls_f = base64.b64encode(im) else: ls_f = base64.b64encode(im.read()) # 读取文件内容,转换为base64编码 im.close() #f.close() params = { "ts": int(time.time()), "softwareId": self.soft_id, "software": self.soft_name, "sdk": "PYTHON/1.0", "username": self.username, "userPassword": self.password, "captchaData": ls_f, "captchaType": 1, "captchaMinLength": 4, "captchaMaxLength": 8 } params = json.dumps(params) sign = params + "|" + self.soft_secret import hashlib m2 = hashlib.md5() m2.update(sign) sign = m2.hexdigest() headers = {'L-Request-Signature': sign} headers.update(self.headers) requests.adapters.DEFAULT_RETRIES = 5 request = urllib2.Request(url='https://api.jsdama.com/upload', headers=headers, data=params) response = urllib2.urlopen(request) r = response.read() #r = requests.post('https://api.jsdama.com/upload', data=params, headers=self.headers) result = json.loads(r) if result["errorCode"] == 0: params = { "ts": int(time.time()), "softwareId": self.soft_id, "software": self.soft_name, "sdk": "PYTHON/1.0", "username": self.username, "userPassword": self.password, "captchaId": result["data"]["captchaId"] } params = json.dumps(params) sign = params + "|" + self.soft_secret import hashlib m2 = hashlib.md5() m2.update(sign) sign = m2.hexdigest() headers = {'L-Request-Signature': sign} headers.update(self.headers) requests.adapters.DEFAULT_RETRIES = 5 request = urllib2.Request(url='https://api.jsdama.com/recognition', headers=headers, data=params) response = urllib2.urlopen(request) r = response.read() result = json.loads(r) if result["errorCode"] == 0: return { "Result": result["data"]["recognition"], "Id": result["data"]["captchaId"] } else: if not cache.get("LIANZONG_CODE_ERROR"): cache.set("LIANZONG_CODE_ERROR", True) dbapi.log_error("", "联众打码异常", result["errorMessage"]) return
def action(self, d, z, args): condition = self.timeinterval(d, z, args) if condition == 'end': z.toast('时间间隔不满足') z.sleep(2) return z.heartbeat() d.server.adb.cmd( "shell", "am force-stop com.tencent.mm").communicate() # 将微信强制停止 d.server.adb.cmd( "shell", "am start -n com.tencent.mm/com.tencent.mm.ui.LauncherUI" ).communicate() # 将微信拉起来 z.sleep(7) cate_id = args['repo_wxcade_id'] d(text='发现').click() d(textContains='附近的人').click() z.sleep(1) if d(text='开始查看').exists: d(text='开始查看').click() d(text='下次不提示').click() d(text='确定').click() z.sleep(2) if d(text='查看附近的人').exists: d(text='查看附近的人').click() while True: if d(description='更多').exists: break else: z.sleep(2) d(description='更多').click() gender = args['gender'] if gender == '男': d(text='只看男生').click() z.sleep(5) elif gender == "女": d(text='只看女生').click() z.sleep(5) else: d(text='查看全部').click() z.sleep(5) serial = z.wx_action("opennearui") # 得到微信id,unicode样式 serial1 = z.wx_userList() #print(serial) ids = json.loads(serial) # 将unicode转换为idct allwxid = (list(ids)) #将所有的微信id由dict转换为list #print(allwxid) lenth = len(allwxid) z.heartbeat() for i in range(lenth): z.heartbeat() wxid = allwxid[i] #得到key值,也就是微信v1值 logging.info(wxid) if 'v1_' not in wxid: continue self.repo.uploadPhoneNumber(wxid, cate_id) now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string cache.set('%s_WXSaveId_time' % d.server.adb.device_serial(), nowtime, None) z.toast('模块结束,保存的时间是%s' % nowtime) if (args["time_delay"]): z.sleep(int(args["time_delay"]))
def action(self, d, z, args): condition = self.timeinterval(d, z, args) if condition == 'end': z.sleep(2) return z.heartbeat() str = d.info # 获取屏幕大小等信息 height = str["displayHeight"] width = str["displayWidth"] d.press.home() if d(text='微信').exists: d(text='微信').click() else: #d.swipe( width - 20, height / 2, 0, height / 2, 5 ) z.toast('该页面没有微信') z.sleep(2) return z.sleep(5) while True: if d(text='发现') and d(text='我') and d(text='通讯录').exists: break else: d(descriptionContains='返回', className='android.widget.ImageView').click() d(description='更多功能按钮').click() d(textContains='添加朋友').click() d(textContains='手机联系人').click() d(text='添加手机联系人').click() while d(textContains='正在获取').exists: z.sleep(3) z.heartbeat() set1 = set() change = 0 i = 0 t = 0 endcon = 0 EndIndex = int(args['EndIndex']) #------------------ while True: cate_id = args["repo_material_id"] #------------------ Material = self.repo.GetMaterial(cate_id, 0, 1) if len(Material) == 0: d.server.adb.cmd( "shell", "am broadcast -a com.zunyun.zime.toast --es msg \"消息素材%s号仓库为空,没有取到消息\"" % cate_id).communicate() z.sleep(10) return message = Material[0]['content'] # 从素材库取出的要发的材料 z.sleep(1) wxname = d(className='android.widget.ListView').child(className='android.widget.LinearLayout', index=i)\ .child(className='android.widget.LinearLayout').child(className='android.widget.LinearLayout',index=1).child(textContains='微信:') #得到微信名 if wxname.exists: ''' 得到电话号 ''' phone = d(className='android.widget.ListView').child( className='android.widget.LinearLayout', index=i).child( className='android.widget.LinearLayout').child( className='android.widget.LinearLayout', index=1).child(className='android.widget.TextView', index=0) phonenumber = phone.info['text'] z.heartbeat() alreadyAdd = d(className='android.widget.ListView').child( className='android.widget.LinearLayout', index=i).child(className='android.widget.LinearLayout', index=0).child( className='android.widget.FrameLayout', index=2).child( text='已添加') # 该编号好友已经被添加的情况 if alreadyAdd.exists: i = i + 1 continue change = 1 #好友存在且未被添加的情况出现,change值改变 ''' 微信名 ''' wxname = wxname.info name = wxname['text'] z.heartbeat() if name in set1: #判断是否已经给该人发过消息 i = i + 1 continue else: set1.add(name) print(name) endcon = 1 d(className='android.widget.ListView',index=0).child(className='android.widget.LinearLayout',index=i).\ child(className='android.widget.LinearLayout').child(className='android.widget.LinearLayout',index=1).click() #点击第i个人 ''' 得到性别 ''' Gender = d(className='android.widget.LinearLayout', index=1).child( className='android.widget.LinearLayout').child( className='android.widget.ImageView', index=1) # 看性别是否有显示 if Gender.exists: z.heartbeat() Gender = Gender.info Gender = Gender['contentDescription'] else: Gender = '空' z.heartbeat() if d(text='地区').exists: for k in range(3, 10): if d(className='android.widget.ListView').child( className='android.widget.LinearLayout', index=k).child( className='android.widget.LinearLayout', index=0).child(text='地区').exists: break area = d( className='android.widget.ListView' ).child( className='android.widget.LinearLayout', index=k ).child( className='android.widget.LinearLayout', index=0 ). \ child( className='android.widget.LinearLayout', index=1 ).child( className='android.widget.TextView' ).info['text'] else: area = '空' z.heartbeat() if d(text='个性签名').exists: for k in range(3, 10): if d(className='android.widget.ListView').child( className='android.widget.LinearLayout', index=k).child( className='android.widget.LinearLayout', index=0).child(text='个性签名').exists: break sign = d( className='android.widget.ListView' ).child( className='android.widget.LinearLayout', index=k ).child( className='android.widget.LinearLayout', index=0 ). \ child( className='android.widget.LinearLayout', index=1 ).child( className='android.widget.TextView' ).info['text'] else: sign = '空' print('%s--%s--%s--%s--%s' % (phonenumber, name, Gender, sign, area)) z.heartbeat() if d(text='添加到通讯录').exists: d(text='添加到通讯录').click() if d(textContains='正在添加').exists: z.sleep(1) time.sleep(1) if d(text='发消息').exists: danxiang = '单向' para = { "phoneNumber": phonenumber, 'x_01': name, 'x_02': Gender, "x_03": area, "x_04": sign, "x_05": danxiang } self.repo.PostInformation(args["repo_cate_id"], para) z.toast("%s入库完成" % phonenumber) d(description='返回').click() i = i + 1 continue elif d(text='通过验证').exists: d(text='通过验证').click() d(description='返回').click() danxiang = '未知' para = { "phoneNumber": phonenumber, 'x_01': name, 'x_02': Gender, "x_03": area, "x_04": sign, "x_05": danxiang } self.repo.PostInformation(args["repo_cate_id"], para) z.toast("%s入库完成" % phonenumber) d(description='返回').click() i = i + 1 continue else: danxiang = '未知' para = { "phoneNumber": phonenumber, 'x_01': name, 'x_02': Gender, "x_03": area, "x_04": sign, "x_05": danxiang } self.repo.PostInformation(args["repo_cate_id"], para) z.toast("%s入库完成" % phonenumber) d(description='返回').click() i = i + 1 continue danxiang = '非单项' #有添加到通讯录且非单项的情况 GenderFrom = args[ 'gender'] # -------------------------------外界设定的性别 if GenderFrom != '不限': if Gender != GenderFrom: #如果性别不符号的情况 para = { "phoneNumber": phonenumber, 'x_01': name, 'x_02': Gender, "x_03": area, "x_04": sign, "x_05": danxiang } self.repo.PostInformation(args["repo_cate_id"], para) z.toast("%s入库完成" % phonenumber) d(description='返回').click() d(description='返回').click() i = i + 1 continue para = { "phoneNumber": phonenumber, 'x_01': name, 'x_02': Gender, "x_03": area, "x_04": sign, "x_05": danxiang } self.repo.PostInformation(args["repo_cate_id"], para) z.toast("%s入库完成" % phonenumber) z.sleep(1) if t < EndIndex: deltext = d(className='android.widget.EditText', index=1).info # 将之前消息框的内容删除 deltext = deltext['text'] lenth = len(deltext) m = 0 while m < lenth: d.press.delete() m = m + 1 z.heartbeat() d(className='android.widget.EditText', index=1).click() z.input(message) #---------------------------------------- d(text='发送').click() z.sleep(1) d(description='返回').click() i = i + 1 t = t + 1 continue else: d(description='返回').click() d(description='返回').click() i = i + 1 continue else: if change == 0: #一次还没有点击到人 if i == 1: #通讯录没有人的情况 now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S' ) # 将日期转化为字符串 datetime => string cache.set( '%s_WXAddAddressList_time' % d.server.adb.device_serial(), nowtime, None) z.toast('模块结束,保存的时间是%s' % nowtime) return d.swipe(width / 2, height * 6 / 7, width / 2, height / 7) i = 1 continue else: if endcon == 0: z.toast('全部发送完成') now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S' ) # 将日期转化为字符串 datetime => string cache.set( '%s_WXAddAddressList_time' % d.server.adb.device_serial(), nowtime, None) z.toast('模块结束,保存的时间是%s' % nowtime) if (args["time_delay"]): z.sleep(int(args["time_delay"])) return d.swipe(width / 2, height * 6 / 7, width / 2, height / 7) i = 1 endcon = 0
def action(self, d, z, args): startTime = args["startTime"] endTime = args["endTime"] try: if self.repo.timeCompare(startTime, endTime): z.toast("该时间段不允许运行") return except: z.toast("输入的时间格式错误,请检查后再试") return set_timeStart = int(args['set_timeStart']) # 得到设定的时间 set_timeEnd = int(args["set_timeEnd"]) run_time = float(random.randint(set_timeStart, set_timeEnd)) run_interval = z.getModuleRunInterval(self.mid) if run_interval is not None and run_interval < run_time: z.toast(u'锁定时间还差:%d分钟' % int(run_time - run_interval)) z.sleep(2) return z.toast("准备执行MMS版QQ关注我赞的人模块") z.sleep(1) z.toast("正在ping网络是否通畅") z.heartbeat() i = 0 while i < 200: i += 1 ping = d.server.adb.cmd("shell", "ping -c 3 baidu.com").communicate() print(ping) if 'icmp_seq' and 'bytes from' and 'time' in ping[0]: z.toast("网络通畅。开始执行:MMS版QQ关注我赞的人模块") break z.sleep(2) if i > 200: z.toast("网络不通,请检查网络状态") if (args["time_delay"]): z.sleep(int(args["time_delay"])) return self.scode = smsCode(d.server.adb.device_serial()) z.heartbeat() d.server.adb.cmd( "shell", "am force-stop com.tencent.mobileqq").communicate() # 强制停止 d.server.adb.cmd( "shell", "am start -n com.tencent.mobileqq/com.tencent.mobileqq.activity.SplashActivity" ).communicate() # 拉起来 z.sleep(10) z.heartbeat() if d(text="消息", resourceId="com.tencent.mobileqq:id/ivTitleName", className="android.widget.TextView").exists: z.toast("登录状态正常") elif d(text='绑定手机号码').exists: while d(text='关闭').exists: d(text='关闭').click() z.sleep(0.5) z.sleep(1) elif d(text='主题装扮').exists: while d(text='关闭').exists: d(text='关闭').click() z.sleep(0.5) elif d(text='马上绑定').exists: while d(text='关闭').exists: d(text='关闭').click() z.sleep(0.5) else: z.toast("登录状态异常,停止模块") now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return str = d.info # 获取屏幕大小等信息 height = str["displayHeight"] width = str["displayWidth"] z.heartbeat() if d(text='绑定手机号码').exists: d(text='关闭').click() if d(textContains='匹配').exists: d.press.back() z.heartbeat() while not d(text='附近的人', className="android.widget.TextView").exists: if d(index=2, text="动态", className="android.widget.TextView").exists: d(index=2, text="动态", className="android.widget.TextView").click() z.sleep(1) z.heartbeat() if d(index=1, text="附近", className="android.widget.TextView").exists: z.sleep(1) z.heartbeat() d(index=1, text="附近", className="android.widget.TextView").click() # d(text='附近的人',className="android.widget.TextView").click() z.sleep(8) x = 0 while (not d(text="去领心", className="android.widget.Button").exists ) or (not d(text="附近的人", className="android.widget.TextView").exists): z.sleep(2) if x == 4: break x = x + 1 if d(text="去领心", className="android.widget.Button").exists: d(index=0, className="android.widget.LinearLayout").child( index="2", className="android.widget.ImageView", resourceId="com.tencent.mobileqq:id/name").click() z.sleep(1) tempnum = 0 objtemp = d(index=2, className="android.widget.LinearLayout").child( index=0, className="android.widget.LinearLayout", resourceId="com.tencent.mobileqq:id/name").child( index="0", className="android.widget.RelativeLayout").child( index=0, className="android.widget.ImageView", resourceId="com.tencent.mobileqq:id/icon") while True: if objtemp.exists: z.sleep(1) break else: z.sleep(2) if tempnum == 4: break else: tempnum = tempnum + 1 # d(className='android.widget.AbsListView').child(className='android.widget.LinearLayout',index=2).click() # z.sleep(5) while objtemp.exists: z.sleep(1) z.heartbeat() objtemp.click() forwait = 0 while True: if d(text='附近点赞升级啦').exists: d(text='知道了').click() break else: z.sleep(1) if forwait == 3: break else: forwait = forwait + 1 while not d(text='编辑交友资料').exists: time.sleep(2) d(descriptionContains='赞').child(className='android.view.View').click() z.sleep(3) d(text='我赞过谁').click() z.heartbeat() z.sleep(3) obj3 = d( className='android.widget.AbsListView' ).child( className='android.widget.RelativeLayout', index=1 ) \ .child( className='android.widget.RelativeLayout', index=1 ).child( className='android.widget.LinearLayout' ) # 用来点击的 if not obj3.exists: # 我没赞过好友的情况 now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return z.heartbeat() set1 = set() i = 1 t = 1 mmm = 0 add_count = int(args['add_count']) # 要添加多少人 while t < add_count + 1: obj = d( className='android.widget.AbsListView' ).child( className='android.widget.RelativeLayout', index=i ) \ .child( className='android.widget.RelativeLayout', index=1 ).child( className='android.widget.LinearLayout' ) # 用来点击的 obj1 = obj.child(className='android.widget.TextView') if obj1.exists: z.heartbeat() obj1 = obj1.info name = obj1['text'] if name in set1: # 判断是否已经关注过该联系人 i = i + 1 continue else: time.sleep(0.5) set1.add(name) print(name) z.sleep(1) z.heartbeat() obj.click() while d(textContains='正在加载').exists: z.sleep(2) z.heartbeat() if d(text='关注').exists: d(text='关注').click() z.sleep(3) if d(textContains='取消').exists: d(text='取消').click() if mmm == 0: if d(text='关注').exists: # 因为第一次会有个提醒页面,需要再点一次才能关注成功 d(text='关注').click() z.sleep(1) z.heartbeat() if d(text='关注').exists: # 因为第一次会有个提醒页面,需要再点一次才能关注成功 z.toast('关注频繁,结束程序') now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S' ) # 将日期转化为字符串 datetime => string cache.set( '%s_MMCQQConecrnMyParise_time' % d.server.adb.device_serial(), nowtime, None) z.toast('模块结束,保存的时间是%s' % nowtime) return # mmm = 1 # if d(text='关注').exists: # return d.press.back() i = i + 1 t = t + 1 else: z.heartbeat() if d(text='关注').exists: z.toast('关注频繁,结束程序') now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S' ) # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return d.press.back() i = i + 1 continue else: if d(textContains='暂无更多').exists: break if d(textContains='显示更多').exists: d(textContains='显示更多').click() d.swipe(width / 2, height * 4 / 5, width / 2, height / 5) z.sleep(2) i = 1 continue now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return
def action(self, d, z, args): startTime = args["startTime"] endTime = args["endTime"] try: if self.repo.timeCompare(startTime, endTime): z.toast("该时间段不允许运行") return except: z.toast("输入的时间格式错误,请检查后再试") return set_timeStart = int(args['set_timeStart']) # 得到设定的时间 set_timeEnd = int(args["set_timeEnd"]) run_time = float(random.randint(set_timeStart, set_timeEnd)) run_interval = z.getModuleRunInterval(self.mid) if run_interval is not None and run_interval < run_time: z.toast(u'锁定时间还差:%d分钟' % int(run_time - run_interval)) z.sleep(2) return z.toast("准备执行MMS版QQ附近的人关注") z.sleep(1) z.toast("正在ping网络是否通畅") z.heartbeat() i = 0 while i < 200: i += 1 ping = d.server.adb.cmd("shell", "ping -c 3 baidu.com").communicate() print(ping) if 'icmp_seq' and 'bytes from' and 'time' in ping[0]: z.toast("网络通畅。开始执行:MMS版QQ附近的人关注") break z.sleep(2) if i > 200: z.toast("网络不通,请检查网络状态") if (args["time_delay"]): z.sleep(int(args["time_delay"])) return # self.scode = smsCode( d.server.adb.device_serial( ) ) z.heartbeat() d.server.adb.cmd( "shell", "am force-stop com.tencent.mobileqq").communicate() # 强制停止 d.server.adb.cmd( "shell", "am start -n com.tencent.mobileqq/com.tencent.mobileqq.activity.SplashActivity" ).communicate() # 拉起来 z.sleep(10) z.heartbeat() if d(text="消息", resourceId="com.tencent.mobileqq:id/ivTitleName", className="android.widget.TextView").exists: z.toast("登录状态正常") elif d(text='绑定手机号码').exists: while d(text='关闭').exists: d(text='关闭').click() z.sleep(0.5) z.sleep(1) elif d(text='主题装扮').exists: while d(text='关闭').exists: d(text='关闭').click() z.sleep(0.5) elif d(text='马上绑定').exists: while d(text='关闭').exists: d(text='关闭').click() z.sleep(0.5) else: z.toast("登录状态异常,停止模块") now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string cache.set( '%s_MMCQQConecrnNearbyPeople_time' % d.server.adb.device_serial(), nowtime, None) z.toast('模块结束,保存的时间是%s' % nowtime) return str = d.info # 获取屏幕大小等信息 height = str["displayHeight"] width = str["displayWidth"] z.heartbeat() if d(text='绑定手机号码').exists: d(text='关闭').click() if d(textContains='匹配').exists: d.press.back() # d(description='快捷入口').click() # d( descriptionContains='快捷入口' ).click( ) # d(text='加好友/群').click() z.heartbeat() while not d(text='附近的人', className="android.widget.TextView").exists: if d(index=2, text="动态", className="android.widget.TextView").exists: d(index=2, text="动态", className="android.widget.TextView").click() z.sleep(1) z.heartbeat() if d(index=1, text="附近", className="android.widget.TextView").exists: z.sleep(1) z.heartbeat() d(index=1, text="附近", className="android.widget.TextView").click() z.sleep(8) break x = 0 while (not d(text="去领心", className="android.widget.Button").exists ) or (not d(text="附近的人", className="android.widget.TextView").exists): z.sleep(2) if x == 4: break x = x + 1 if d(text="去领心", className="android.widget.Button").exists: d(index=0, className="android.widget.LinearLayout").child( index="2", className="android.widget.ImageView", resourceId="com.tencent.mobileqq:id/name").click() z.sleep(1) tempnum = 0 objtemp = d(index=2, className="android.widget.LinearLayout").child( index=0, className="android.widget.LinearLayout", resourceId="com.tencent.mobileqq:id/name").child( index="0", className="android.widget.RelativeLayout").child( index=0, className="android.widget.ImageView", resourceId="com.tencent.mobileqq:id/icon") while True: if objtemp.exists: z.sleep(1) break else: z.sleep(2) if tempnum == 4: break else: tempnum = tempnum + 1 getGender = args['gender'] selectTime = args["selectTime"] # if getGender != '不限': d(resourceId='com.tencent.mobileqq:id/ivTitleBtnRightImage').click() d(text='筛选附近的人').click() if d(text=getGender).exists: d(text=getGender).click() z.sleep(0.5) d(text=selectTime).click() d(text='完成').click() while not d(textContains='等级').exists: z.sleep(2) z.heartbeat() # prisenum = int( args['prisenum'] ) concernnum = int(args['concernnum']) # textnum = int( args['textnum'] ) # count = max( prisenum, concernnum, textnum ) t = 0 i = 3 nameList = [] while t < concernnum: forClick = d(className='android.widget.AbsListView').child( className='android.widget.LinearLayout', index=i) if forClick.exists: z.heartbeat() if forClick.child( index=0, className="android.widget.RelativeLayout").child( index=3, className="android.widget.LinearLayout").child( index=0, text='直播中').exists: i = i + 1 continue if forClick.child(index=0, resourceId="com.tencent.mobileqq:id/icon", className="android.widget.ImageView").exists: forClick.child( index=0, resourceId="com.tencent.mobileqq:id/icon", className="android.widget.ImageView").click() else: i = i + 1 continue while not d(textContains='关注').exists: z.sleep(2) if d(text='知道了').exists: d(text='知道了').click() obj = d(index=1, className="android.widget.RelativeLayout", resourceId="com.tencent.mobileqq:id/name").child( index=0, className="android.widget.LinearLayout").child( index=0, className="android.widget.LinearLayout").child( index=0, className="android.widget.TextView") if obj.exists: obj = obj.info["text"].encode("utf-8") if obj in nameList: i = i + 1 d.press.back() continue else: nameList.append(obj) z.sleep(2) if t < concernnum: if d(text='关注').exists: d(text='关注').click() if d(text='关注').exists: d(text='关注').click() if d(text='关注').exists: z.toast("关注频繁,进行其他操作") now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S' ) # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return while d(text="返回", resourceId= "com.tencent.mobileqq:id/ivTitleBtnLeft" ).exists: d(text="返回", resourceId="com.tencent.mobileqq:id/ivTitleBtnLeft" ).click() i = i + 1 continue # if d( index=1, resourceId='com.tencent.mobileqq:id/rlCommenTitle', # className="android.widget.RelativeLayout" ).child( index=0, # className="android.widget.LinearLayout" ).child( # index=0, className="android.widget.ImageView" ).exists: # d( index=1, resourceId='com.tencent.mobileqq:id/rlCommenTitle', # className="android.widget.RelativeLayout" ).child( index=0, # className="android.widget.LinearLayout" ).child( # index=0, # className="android.widget.ImageView" ).click( ) i = i + 1 t = t + 1 elif d(className='android.widget.AbsListView').child( className='android.widget.RelativeLayout', index=i).child( index=2, className="android.widget.RelativeLayout").child( text="广告", className="android.widget.TextView").exists: i = i + 1 continue else: d.swipe(width / 2, height * 5 / 6, width / 2, height / 6) z.sleep(2) i = 1 now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return
def heartbeat(self): key = 'timeout_%s' % self.server.adb.device_serial() cache.set(key, (datetime.datetime.now() - datetime.datetime(2017, 1, 1)).seconds)
def setModuleLastRun(self, mid): key = '%s_%s' % (self.server.adb.device_serial(), mid) cache.set(key, int(time.time()), None)
def action(self, d, z, args): startTime = args["startTime"] endTime = args["endTime"] try: if self.repo.timeCompare(startTime, endTime): z.toast("该时间段不允许运行") return except: z.toast("输入的时间格式错误,请检查后再试") return set_timeStart = int(args['set_timeStart']) # 得到设定的时间 set_timeEnd = int(args["set_timeEnd"]) run_time = float(random.randint(set_timeStart, set_timeEnd)) run_interval = z.getModuleRunInterval(self.mid) if run_interval is not None and run_interval < run_time: z.toast(u'锁定时间还差:%d分钟' % int(run_time - run_interval)) z.sleep(2) return z.heartbeat() z.toast("准备执行TIM通讯录加好友+导入通讯录 MMS版") z.toast("开始导入通讯录") self.getAddressList(d, z, args) z.toast("正在ping网络是否通畅") z.heartbeat() i = 0 while i < 200: i += 1 ping = d.server.adb.cmd("shell", "ping -c 3 baidu.com").communicate() print(ping) if 'icmp_seq' and 'bytes from' and 'time' in ping[0]: z.toast("网络通畅。开始执行:TIM通讯录加好友") break z.sleep(2) if i > 200: z.toast("网络不通,请检查网络状态") if (args["time_delay"]): z.sleep(int(args["time_delay"])) return self.scode = smsCode(d.server.adb.device_serial()) z.heartbeat() str = d.info # 获取屏幕大小等信息 height = str["displayHeight"] width = str["displayWidth"] cate_id1 = args["repo_material_id"] Material = self.repo.GetMaterial(cate_id1, 0, 1) message = Material[0]['content'] # 取出验证消息的内容 d.server.adb.cmd("shell", "am force-stop com.tencent.tim").communicate() # 强制停止 d.server.adb.cmd( "shell", "am start -n com.tencent.tim/com.tencent.mobileqq.activity.SplashActivity" ).communicate() # 拉起来 z.sleep(10) z.heartbeat() if d(text="消息", resourceId="com.tencent.tim:id/ivTitleName").exists and not d( text="马上绑定", className="android.widget.Button").exists: z.toast("登录状态正常,继续执行") else: if d(text="关闭", resourceId="com.tencent.tim:id/ivTitleBtnLeftButton").exists: d(text="关闭", resourceId="com.tencent.tim:id/ivTitleBtnLeftButton").click( ) z.sleep(1) elif d(text="消息", className="android.widget.TextView").exists and d( text="马上绑定", className="android.widget.Button").exists: d(text="消息", className="android.widget.TextView").click() z.sleep(1) elif d(text="返回").exists: d(text="返回").click() z.sleep(1) else: z.toast("登录状态异常,跳过此模块") now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return if d(text='马上绑定').exists: result = self.bindPhoneNumber(z, d) if result == "nothing": now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return if d(text='通讯录').exists: d(text='关闭').click() d(description='快捷入口').click() d(textContains='加好友').click() d(text='添加手机联系人').click() z.heartbeat() while d(text='验证手机号码').exists: PhoneNumber = None j = 0 while PhoneNumber is None: j += 1 PhoneNumber = self.scode.GetPhoneNumber( self.scode.QQ_CONTACT_BIND) # 获取接码平台手机号码 z.heartbeat() if j > 2: z.toast('取不到手机号码') if (args["time_delay"]): z.sleep(int(args["time_delay"])) now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return obj = d(className="android.view.View", description="删除 按钮") if obj.exists: z.heartbeat() z.sleep(1) obj.click() z.sleep(2) z.input(PhoneNumber) z.sleep(1.5) if d(text='下一步').exists: d(text='下一步').click() z.sleep(3) if d(text='确定').exists: d(text='确定').click() z.sleep(2) code = self.scode.GetVertifyCode(PhoneNumber, self.scode.QQ_CONTACT_BIND, '4') # 获取接码验证码 self.scode.defriendPhoneNumber(PhoneNumber, self.scode.QQ_CONTACT_BIND) if code == '': z.toast(PhoneNumber + '手机号,获取不到验证码') if d(text='返回').exists: d(text='返回').click() if not d(textContains='中国').exists: if d(text='返回').exists: d(text='返回').click() if d(className='android.view.View', descriptionContains='删除').exists: d(className='android.view.View', descriptionContains='删除').click() continue z.heartbeat() z.input(code) if d(text='完成').exists: d(text='完成').click() z.sleep(5) break # if d( resourceId='com.tencent.mobileqq:id/name', className='android.widget.EditText', # index=2 ).exists: # 检查到尚未 启用通讯录 if d(text="启用").exists: # 检查到尚未 启用通讯录 d(text="启用").click() if not d(textContains='+86').exists: d(description='点击选择国家和地区').click() if d(text='中国').exists: d(text='中国').click() else: str = d.info # 获取屏幕大小等信息 height = str["displayHeight"] width = str["displayWidth"] d.click(width * 5 / 12, height * 5 / 32) z.sleep(1.5) z.input('中国') z.sleep(2) d(text='+86').click() z.heartbeat() text = self.Bind(d, z) # 未开启通讯录的,现绑定通讯录 z.heartbeat() if text == 'false': # 操作过于频繁的情况 if (args["time_delay"]): z.sleep(int(args["time_delay"])) now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return z.sleep(7) if d(textContains='没有可匹配的').exists: if (args["time_delay"]): z.sleep(int(args["time_delay"])) now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return if d(text='匹配手机通讯录').exists: d(text='匹配手机通讯录').click() z.heartbeat() z.sleep(5) obj1 = d( className='android.widget.AbsListView' ).child( className='android.widget.LinearLayout', index=2 ) \ .child( className='android.widget.ImageView', index=0 ) # 判断第一次进通讯录是否有人 if not obj1.exists: d(text='返回').click() z.sleep(1.5) d(text='添加手机联系人').click() if not obj1.exists: z.toast("该手机上没有联系人") if (args["time_delay"]): z.sleep(int(args["time_delay"])) now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return count = 0 index = 2 EndIndex = int(args['EndIndex']) switch_card = args["switch_card"] # while index < EndIndex + 1: # for index in range(2,EndIndex+3): # cate_id = args["repo_material_id"] # time.sleep(2) num = 0 obj = d(index=0, resourceId='com.tencent.tim:id/name', className='android.widget.AbsListView').child( className="android.widget.LinearLayout", index=index).child(text="添加", index=2) while obj.exists: obj.click() # if gender != '不限': # gender2 = self.Gender(d) # if gender == gender2: # gender是外界设定的,gender2是读取到的 # time.sleep(1) # else: # d(textContains='返回').click() # i = i + 1 z.sleep(1) z.heartbeat() if obj.exists: # 拒绝被添加的轻况或请求失败 num = num + 1 index = index + 1 obj = d(index=0, resourceId='com.tencent.tim:id/name', className='android.widget.AbsListView').child( className="android.widget.LinearLayout", index=index).child(text="添加", index=2) continue if d(text='必填', resourceId='com.tencent.tim:id/name').exists: # 要回答问题的情况 z.heartbeat() objtext = d(textContains="问题", index=0, resourceId="com.tencent.tim:id/textView1", className="android.widget.TextView") objnum = d(index=1, resourceId="com.tencent.tim:id/name", className="android.widget.FrameLayout").child( index=0, className="android.widget.RelativeLayout", resourceId="com.tencent.tim:id/name").child( index=2, resourceId="com.tencent.tim:id/name", className="android.widget.TextView") if objtext.exists: objtext = objtext.info["text"] if "电话" in objtext or "手机" in objtext or "号码" in objtext: if objnum.exists: objnum = objnum.info["text"][3:] z.input(objnum) z.sleep(1) z.heartbeat() d(text="下一步").click() z.sleep(1) z.heartbeat() if d(text="下一步").exists: z.sleep(1) z.heartbeat() d(text="手机联系人").click() z.sleep(1) z.heartbeat() else: z.sleep(1) z.heartbeat() if d(text="发送").exists: d(text="发送").click() z.sleep(3) if d(text="发送").exists: now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S' ) # 将日期转化为字符串 datetime => string cache.set( '%s_MMCTIMAdressAddfriends_time' % d.server.adb.device_serial(), nowtime, None) z.toast('模块结束,保存的时间是%s' % nowtime) return if d(text='添加失败,请勿频繁操作').exists: z.heartbeat() z.toast("频繁操作,跳出模块") now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S' ) # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return else: d(text="手机联系人", resourceId="com.tencent.tim:id/ivTitleBtnLeft", className="android.widget.TextView").click() index = index + 1 obj = d(index=0, resourceId='com.tencent.tim:id/name', className='android.widget.AbsListView').child( className="android.widget.LinearLayout", index=index).child(text="添加", index=2) num = 0 continue d.dump(compressed=False) if d(text="风险提示").exists: # 风险提示 d(text="取消").click() z.sleep(1) d(text="手机联系人", resourceId="com.tencent.tim:id/ivTitleBtnLeft").click() index = index + 1 obj = d(index=0, resourceId='com.tencent.tim:id/name', className='android.widget.AbsListView').child( className="android.widget.LinearLayout", index=index).child(text="添加", index=2) z.heartbeat() num = 0 continue obj = d(text='发送', resourceId='com.tencent.tim:id/ivTitleBtnRightText' ) # 不需要验证可直接添加为好友的情况 if obj.exists: z.sleep(2) obj.click() if d(text='添加失败,请勿频繁操作', resourceId='com.tencent.tim:id/name').exists: z.heartbeat() z.toast("频繁操作,跳出模块") now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return else: count = count + 1 print("请求发送成功") num = 0 continue d.dump(compressed=False) obj = d(index=3, className='android.widget.EditText', resourceId='com.tencent.tim:id/name' ).info # 将之前消息框的内容删除 需要发送验证信息 obj = obj['text'] lenth = len(obj) t = 0 while t < lenth: d.press.delete() t = t + 1 time.sleep(2) z.input(message) z.sleep(1) # d(index=2,className="android.widget.CompoundButton",resourceId="com.tencent.tim:id/name").click() if "是" in switch_card: if d(index=2, className="android.widget.CompoundButton", resourceId="com.tencent.tim:id/name").exists: d(index=2, className="android.widget.CompoundButton", resourceId="com.tencent.tim:id/name").click() else: if d(text="设置我的名片").exists: d(text="设置我的名片").click() while True: z.sleep(1) z.heartbeat() d(text="添加我的名片").click() d(index=3, resourceId="com.tencent.tim:id/name", className="android.widget.Button").click() z.sleep(2) obj = d( index=0, className="com.tencent.widget.GridView", resourceId="com.tencent.tim:id/photo_list_gv" ).child(index=0, className="android.widget.RelativeLayout") if obj.exists: z.sleep(1) z.heartbeat() obj.click() z.sleep(3) d(text='确定', resourceId='com.tencent.tim:id/name').click( ) time.sleep(3) z.heartbeat() d(text="完成").click() z.sleep(1) z.heartbeat() d(text="返回").click() break if d(index=0, resourceId="com.tencent.tim:id/name", className="android.widget.ImageButton" ).exists: d(index=0, resourceId="com.tencent.tim:id/name", className="android.widget.ImageButton" ).click() d(text="退出").click() z.sleep(1) z.heartbeat() objtemp = d(index=0, className="android.widget.RelativeLayout", resourceId="com.tencent.tim:id/name").child( index=2, className="android.widget.TextView", resourceId="com.tencent.tim:id/name") if objtemp.exists: objtemp = objtemp.info["text"].encode("utf-8")[3:] d(text='下一步', resourceId='com.tencent.tim:id/ivTitleBtnRightText', className="android.widget.TextView").click() try: obj = d(index=0, className="android.widget.LinearLayout", resourceId="com.tencent.tim:id/name").child( index=1, className="android.widget.EditText", resourceId="com.tencent.tim:id/name") if obj.exists: obj = obj.info["text"].encode("utf-8") obj = int(obj) except: try: a = int(objtemp) if d(index=0, className="android.view.View", description="删除 按钮").exists: d(index=0, className="android.view.View", description="删除 按钮").click() z.sleep(1) z.input(objtemp) except: z.sleep(1) z.sleep(1) if d(text='发送').exists: d(text='发送').click() z.sleep(3) if d(text='发送').exists: z.toast("无法添加") now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return if d(resourceId='com.tencent.tim:id/name', text='添加失败,请勿频繁操作').exists: # 操作过于频繁的情况 z.toast("频繁操作,跳出模块") now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return # print( QQnumber + "请求发送成功" ) num = 0 z.heartbeat() obj = d(index=0, resourceId='com.tencent.tim:id/name', className='android.widget.AbsListView').child( className="android.widget.LinearLayout", index=index).child(text="添加", index=2) count = count + 1 if count == EndIndex: z.toast("添加数量好友达到需求数量,停止模块") now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return if num > 3: z.toast("请求失败,无法添加,退出模块") now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return z.toast("已无好友可加,停止模块!") now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) if (args["time_delay"]): time.sleep(int(args["time_delay"]))
def setModuleLastRun_new(self, mid): key = '%s_%s' % (self.server.adb.device_serial(), mid) now = datetime.datetime.now() nowtime = now.strftime('%H:%M') # 将日期转化为字符串 datetime => string cache.set(key, nowtime, None)
const.MAX_SLOTS_TOKEN = int(value) if not os.path.exists('plugins/__init__.py'): f = open('plugins/__init__.py', 'w') # r只读,w可写,a追加 f.write("#init") f.close() import sys reload(sys) sys.setdefaultencoding('utf8') from dbapi import dbapi from zcache import cache cache.set("ztask_active_time", datetime.datetime.now()) try: rst = int(util.exccmd("awk -F. '{print $1}' /proc/uptime")) if rst < 500: dbapi.log_warn("", "任务暂缓%s秒后启动" % const.MAX_SLOTS_WECHAT, "系统已经成功启动,任务将在%s秒后启动,请等待..." % const.MAX_SLOTS_WECHAT) time.sleep(const.WAIT_START_TIME) else: print '系统已启动超过500秒,不再等待,直接拉起' except: # noting to do ok = 'ok' optpath = os.getcwd() # 获取当前操作目录 imgpath = os.path.join(optpath, 'img') # 截图目录
def action(self, d, z, args): condition = self.timeinterval(d, z, args) if condition == 'end': z.toast('时间间隔不满足') z.sleep(2) return z.heartbeat() d.press.home() if d(text='微信').exists: d(text='微信').click() else: # d.swipe( width - 20, height / 2, 0, height / 2, 5 ) z.toast('该页面没有微信') z.sleep(2) return z.sleep(5) while True: if d(text='发现') and d(text='我') and d(text='通讯录').exists: break else: d(descriptionContains='返回', className='android.widget.ImageView').click() cate_id = args['repo_wxcade_id'] d(text='发现').click() d(textContains='附近的人').click() z.sleep(1) if d(text='开始查看').exists: d(text='开始查看').click() d(text='下次不提示').click() d(text='确定').click() z.sleep(2) if d(text='查看附近的人').exists: d(text='查看附近的人').click() while True: if d(description='更多').exists: break else: z.sleep(2) d(description='更多').click() gender = args['gender'] if gender == '男': d(text='只看男生').click() z.sleep(5) elif gender == "女": d(text='只看女生').click() z.sleep(5) else: d(text='查看全部').click() z.sleep(5) serial = z.wx_action("opennearui") # 得到微信id,unicode样式 #print(serial) ids = json.loads(serial) # 将unicode转换为idct allwxid = (list(ids)) #将所有的微信id由dict转换为list #print(allwxid) lenth = len(allwxid) z.heartbeat() for i in range(lenth): z.heartbeat() wxid = allwxid[i] #得到key值,也就是微信v1值 logging.info(wxid) if 'v1_' not in wxid: continue self.repo.uploadPhoneNumber(wxid, cate_id) now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string cache.set('%s_WXSaveId_time' % d.server.adb.device_serial(), nowtime, None) z.toast('模块结束,保存的时间是%s' % nowtime) if (args["time_delay"]): z.sleep(int(args["time_delay"]))