def Bind(self, d, z): self.scode = smsCode(d.server.adb.device_serial()) newStart = 1 while newStart == 1: GetBindNumber = self.scode.GetPhoneNumber( self.scode.QQ_CONTACT_BIND) print(GetBindNumber) z.sleep(2) d(resourceId='com.tencent.mobileqq:id/name', className='android.widget.EditText').set_text( GetBindNumber) #GetBindNumber z.heartbeat() z.sleep(1) d(text='下一步').click() z.sleep(3) if d(text='下一步').exists: #操作过于频繁的情况 return 'false' if d(text='确定').exists: #提示该号码已经与另一个qq绑定,是否改绑,如果请求失败的情况 d(text='确定', ).click() code = self.scode.GetVertifyCode(GetBindNumber, self.scode.QQ_CONTACT_BIND, '4') newStart = 0 d(resourceId='com.tencent.mobileqq:id/name', className='android.widget.EditText').set_text(code) z.heartbeat() d(text='完成', resourceId='com.tencent.mobileqq:id/name').click() z.sleep(6) if d(textContains='没有可匹配的').exists: return 'false' return 'true'
def bindPhoneNumber(self, z, d): z.toast("点击开始绑定") self.scode = smsCode(d.server.adb.device_serial()) d(text='马上绑定').click() 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 > 20: z.toast('取不到手机号码') return "nothing" 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.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 z.sleep(1)
def Bind(self, d,z): self.scode = smsCode(d.server.adb.device_serial()) newStart = 1 while newStart == 1: GetBindNumber = self.scode.GetPhoneNumber(self.scode.QQ_CONTACT_BIND) print(GetBindNumber) z.sleep(2) z.input(GetBindNumber) z.heartbeat() z.sleep(1) d(text='下一步').click() z.sleep(3) if d(text='确定').exists: # 提示该号码已经与另一个qq绑定,是否改绑,如果请求失败的情况 d(text='确定').click() if d(text='确定').exists: return 'false' code = self.scode.GetVertifyCode(GetBindNumber, self.scode.QQ_CONTACT_BIND, '4') newStart = 0 z.input(code) z.heartbeat() d(text='下一步').click() z.sleep(4) if d(textContains='访问你的通讯录').exists: d(text='好').click() z.sleep(5) if d(textContains='没有可匹配的').exists: return 'false' if d(textContains='验证短信').exists: #验证码错误的情况 return 'false' return 'true'
def action(self, d, z, args): z.heartbeat() d.press.home() self.scode = smsCode(d.server.adb.device_serial()) runLock = int(args['run_lock']) cateId = args['repo_number_id'] totalList = self.repo.GetNUmberNormalTotal(cateId) normalTotal = int(totalList[0]['total']) if normalTotal < runLock: z.toast('库内未使用号码低于' + args['run_lock'] + ',开始拉号码') else: z.toast('库内未使用号码大于' + args['run_lock'] + ',模块无法运行') count = 1 while normalTotal < runLock: if count > int(args['get_amount']): z.toast('成功拉取' + args['get_amount']) break PhoneNumber = self.scode.GetPhoneNumber( self.scode.WECHAT_REGISTER) # 获取接码平台手机号码 z.sleep(3) PhoneNumberStr = ','.join(PhoneNumber) self.scode.defriendPhoneNumber(PhoneNumberStr, self.scode.WECHAT_REGISTER) # 拉黑 self.repo.uploadPhoneNumber(PhoneNumberStr, cateId) # 入库 if args["time_delay"]: z.sleep(int(args["time_delay"])) count = count + 1
def Bind(self, d,z): self.scode = smsCode(d.server.adb.device_serial()) newStart = 1 while newStart < 3: GetBindNumber = self.scode.GetPhoneNumber(self.scode.QQ_CONTACT_BIND) print(GetBindNumber) z.sleep(2) d(text='请输入你的手机号码', className='android.widget.EditText') z.input(GetBindNumber) # GetBindNumber z.heartbeat() z.sleep(1) d(text='下一步').click() z.sleep(3) if d(text='下一步', resourceId='com.tencent.mobileqq:id/name', index=2).exists: # 操作过于频繁的情况 return 'false' if d(text='确定', resourceId='com.tencent.qqlite:id/phone_bind_changeqq_confirm_btn').exists: # 提示该号码已经与另一个qq绑定,是否改绑,如果请求失败的情况 d(text='确定', resourceId='com.tencent.qqlite:id/phone_bind_changeqq_confirm_btn').click() try: code = self.scode.GetVertifyCode(GetBindNumber, self.scode.QQ_CONTACT_BIND, '4') if d(text='启用').exists: d(resourceId='com.tencent.qqlite:id/ivTitleBtnLeft').click() except: if d(text='启用').exists: d(resourceId='com.tencent.qqlite:id/ivTitleBtnLeft').click() if d(text='验证手机号码').exists: d(text='验证手机号码').click() z.sleep(1) obj = d(resourceId='com.tencent.qqlite:id/number_edit', className='android.widget.EditText', index=2) if obj.exists: deltext = obj.info['text'] if deltext != '': for i in range(len(deltext)): d.press.delete() newStart += 1 continue d(resourceId='com.tencent.qqlite:id/code_edit').click() z.input(code) z.heartbeat() d(text='下一步').click() z.sleep(5) if d(text='“QQ”想访问你的通讯录').exists: d(text='好').click() if d(textContains='没有可匹配的').exists: return 'false' if code != '': break if newStart >= 3: return 'false' return 'true'
def Bind(self, d, z): circle = 0 self.scode = smsCode(d.server.adb.device_serial()) newStart = 1 while newStart == 1: GetBindNumber = self.scode.GetPhoneNumber( self.scode.QQ_CONTACT_BIND) if 'Session' in GetBindNumber: self.Bind(d, z) if isinstance(GetBindNumber, list) and GetBindNumber: GetBindNumber = GetBindNumber[0] elif GetBindNumber is None or GetBindNumber == []: return 'false' print(GetBindNumber) z.sleep(2) d(resourceId='com.tencent.mobileqq:id/name', className='android.widget.EditText').set_text( GetBindNumber) # GetBindNumber z.heartbeat() z.sleep(1) d(text='下一步').click() z.sleep(3) while d(text="正在发送请求").exists: time.sleep(3) if d(text='下一步').exists: # 操作过于频繁的情况 return 'false' if d(text='确定').exists: # 提示该号码已经与另一个qq绑定,是否改绑,如果请求失败的情况 d(text='确定', ).click() z.heartbeat() code = self.scode.GetVertifyCode(GetBindNumber, self.scode.QQ_CONTACT_BIND, '4') d(resourceId='com.tencent.mobileqq:id/name', className='android.widget.EditText').set_text(code) print(code) newStart = 0 if d(text='请输入短信验证码').exists: if circle < 4: z.toast('没有接收到验证码') d(textContains='返回').click() if d(text='确定').exists: d(text='返回').click() z.sleep(1) d(description='删除 按钮').click() circle = circle + 1 newStart = 1 continue else: z.toast('程序结束') print(circle) return 'false' z.heartbeat() d(text='完成', resourceId='com.tencent.mobileqq:id/name').click() z.sleep(10) if d(textContains='没有可匹配的').exists: return 'false' return 'true'
def Bind(self, d, z): circle = 0 self.scode = smsCode(d.server.adb.device_serial()) newStart = 1 while newStart == 1: GetBindNumber = self.scode.GetPhoneNumber( self.scode.QQ_CONTACT_BIND) print(GetBindNumber) z.sleep(2) z.heartbeat() obj = d(className="android.view.View", description="删除 按钮") if obj.exists: z.heartbeat() z.sleep(1) obj.click() z.sleep(2) d(resourceId='com.tencent.tim:id/name', className='android.widget.EditText').set_text( GetBindNumber) # GetBindNumber z.heartbeat() z.sleep(1) d(text='下一步').click() z.sleep(3) if d(text='下一步').exists: # 操作过于频繁的情况 return 'false' if d(text='确定').exists: # 提示该号码已经与另一个qq绑定,是否改绑,如果请求失败的情况 d(text='确定', ).click() z.heartbeat() code = self.scode.GetVertifyCode(GetBindNumber, self.scode.QQ_CONTACT_BIND, '4') d(resourceId='com.tencent.tim:id/name', className='android.widget.EditText').set_text(code) print(code) newStart = 0 if d(text='请输入短信验证码').exists: if circle < 4: z.toast('没有接收到验证码') d(textContains='返回').click() if d(text='确定').exists: d(text='返回').click() z.sleep(1) d(description='删除 按钮').click() circle = circle + 1 newStart = 1 continue else: z.toast('程序结束') print(circle) return 'false' z.heartbeat() d(text='完成', resourceId='com.tencent.tim:id/name').click() z.sleep(10) if d(textContains='没有可匹配的').exists: return 'false' return 'true'
def action(self, d, z, args): z.toast( "TIM邮件发消息" ) 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( "网络通畅。开始执行:TTIM邮件发消息" ) 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_id = args['repo_number_id'] 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="消息" ).exists: z.toast( "卡槽TIM状态正常,继续执行" ) else: z.toast( "卡槽TIM状态异常,跳过此模块" ) return d(index=2, className='android.widget.FrameLayout').click() d(text='邮件', className='android.widget.TextView').click() time.sleep(1) if d(text='开通QQ邮箱', className='android.widget.Button').exists: d(text='开通QQ邮箱', className='android.widget.Button').click() while 1: if d(text='写邮件', className='android.widget.TextView').exists: d(text='写邮件', className='android.widget.TextView').click() break else: time.sleep(1) # while 1: # if d(text='发送', className='android.widget.Button').exists: if (args["time_delay"]): time.sleep(int(args["time_delay"]))
def Bind(self, d, z): self.scode = smsCode(d.server.adb.device_serial()) z.heartbeat() newStart = 1 while newStart == 1: GetBindNumber = self.scode.GetPhoneNumber( self.scode.QQ_CONTACT_BIND) if isinstance(GetBindNumber, list) and GetBindNumber: GetBindNumber = GetBindNumber[0] elif GetBindNumber is None or GetBindNumber == []: return 'false' if 'Session' in GetBindNumber: self.Bind(d, z) print(GetBindNumber) z.sleep(2) d(resourceId='com.tencent.mobileqq:id/name', className='android.widget.EditText').set_text( GetBindNumber) # GetBindNumber z.heartbeat() z.sleep(1) d(text='下一步').click() z.sleep(3) while d(text="正在发送请求").exists: time.sleep(3) if d(text='下一步', resourceId='com.tencent.mobileqq:id/name', index=2).exists: # 操作过于频繁的情况 return 'false' if d(text='确定', resourceId='com.tencent.mobileqq:id/name', index='2').exists: # 提示该号码已经与另一个qq绑定,是否改绑,如果请求失败的情况 d(text='确定', resourceId='com.tencent.mobileqq:id/name', index='2').click() z.heartbeat() code = self.scode.GetVertifyCode(GetBindNumber, self.scode.QQ_CONTACT_BIND, '4') newStart = 0 d(resourceId='com.tencent.mobileqq:id/name', className='android.widget.EditText').set_text(code) d(text='完成', resourceId='com.tencent.mobileqq:id/name').click() z.heartbeat() z.sleep(5) if d(textContains='没有可匹配的').exists: return 'false' return 'true'
def LoginPlayCode(self, d, z): self.scode = smsCode(d.server.adb.device_serial()) 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) sourcePng = os.path.join(base_dir, "%s_s.png" % (self.GetUnique())) codePng = os.path.join(base_dir, "%s_c.png" % (self.GetUnique())) codeEditTextObj = d(resourceId='com.tencent.mobileqq:id/name', index='2', className="android.widget.EditText") if codeEditTextObj.exists: # 需要验证码的情况 icode = imageCode() im_id = "" for i in range(0, 4): # 打码循环 if i > 0: icode.reportError(im_id) obj = d(resourceId='com.tencent.mobileqq:id/name', className='android.widget.ImageView' ) # 当弹出选择QQ框的时候,定位不到验证码图片 obj = obj.info obj = obj['bounds'] # 验证码处的信息 left = obj["left"] # 验证码的位置信息 top = obj['top'] right = obj['right'] bottom = obj['bottom'] d.screenshot(sourcePng) # 截取整个输入验证码时的屏幕 img = Image.open(sourcePng) box = (left, top, right, bottom) # left top right bottom region = img.crop(box) # 截取验证码的图片 img = Image.new('RGBA', (right - left, bottom - top)) img.paste(region, (0, 0)) img.save(codePng) im = open(codePng, 'rb') codeResult = icode.getCode(im, icode.CODE_TYPE_4_NUMBER_CHAR, 60) code = codeResult["Result"] im_id = codeResult["Id"] os.remove(sourcePng) os.remove(codePng) return code
def palyCode(self, d, z, picObj): self.scode = smsCode(d.server.adb.device_serial()) 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) sourcePng = os.path.join(base_dir, "%s_s.png" % (self.GetUnique())) codePng = os.path.join(base_dir, "%s_c.png" % (self.GetUnique())) icode = imageCode() im_id = "" code = "" for i in range(0, 2): # 打码循环 if i > 0: icode.reportError(im_id) obj = picObj.info obj = obj['bounds'] # 验证码处的信息 left = obj["left"] # 验证码的位置信息 top = obj['top'] right = obj['right'] bottom = obj['bottom'] d.screenshot(sourcePng) # 截取整个输入验证码时的屏幕 img = Image.open(sourcePng) box = (left, top, right, bottom) # left top right bottom region = img.crop(box) # 截取验证码的图片 img = Image.new('RGBA', (right - left, bottom - top)) img.paste(region, (0, 0)) img.save(codePng) im = open(codePng, 'rb') codeResult = icode.getCode(im, icode.CODE_TYPE_4_NUMBER_CHAR, 60) code = codeResult["Result"] im_id = codeResult["Id"] os.remove(sourcePng) os.remove(codePng) z.heartbeat() if code.isalpha() or code.isisdigitv() or code.isalnum(): break else: continue return code
def playCode(self, codeImgObj): z.toast("非网页视图打码") self.scode = smsCode(d.server.adb.device_serial()) 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) sourcePng = os.path.join(base_dir, "%s_s.png" % (self.GetUnique())) codePng = os.path.join(base_dir, "%s_c.png" % (self.GetUnique())) icode = imageCode() im_id = "" for i in range(0, 4): # 打码循环 if i > 0: icode.reportError(im_id) obj = d(resourceId='com.tencent.mobileqqi:id/0', className='android.widget.ImageView') # 当弹出选择QQ框的时候,定位不到验证码图片 if not obj.exists: return False obj = obj.info obj = obj['bounds'] # 验证码处的信息 left = obj["left"] # 验证码的位置信息 top = obj['top'] right = obj['right'] bottom = obj['bottom'] d.screenshot(sourcePng) # 截取整个输入验证码时的屏幕 img = Image.open(sourcePng) box = (left, top, right, bottom) # left top right bottom region = img.crop(box) # 截取验证码的图片 img = Image.new('RGBA', (right - left, bottom - top)) img.paste(region, (0, 0)) img.save(codePng) with open( codePng, 'rb' ) as im: codeResult = self.codedll.QQPlayCode( im )
def action(self, d, z, args): z.toast("准备执行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(8) z.heartbeat() if d(text='消息').exists: # 到了通讯录这步后看号有没有被冻结 z.toast("卡槽状态正常,继续执行") else: z.toast("卡槽状态异常,跳过此模块") return z.heartbeat() 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() #等同于按返回键 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(random.randint(1, 3)) z.heartbeat() while not d(text="说说", className='android.widget.TextView').exists: z.sleep(1) if d(text="说说", className='android.widget.TextView').exists: d(text="说说", className='android.widget.TextView').click() # z.sleep(1) z.sleep(2) x1 = 516 / 540 y1 = 173 / 888 obj = d(index=6, className="android.widget.RelativeLayout", resourceId="com.tencent.mobileqq:id/name").child( index=2, className="android.widget.ImageView", resourceId="com.tencent.mobileqq:id/name") while obj.exists: z.sleep(1) z.heartbeat() d.click(x1 * width, y1 * height) z.sleep(2) z.heartbeat() if d(text="删除", className='android.widget.TextView'): d(text="删除", className='android.widget.TextView').click() z.sleep(1) z.heartbeat() while d(text='确认', resourceId="com.tencent.mobileqq:id/dialogRightBtn" ).exists: d(text='确认', resourceId="com.tencent.mobileqq:id/dialogRightBtn" ).click() z.sleep(2) z.toast("模块完成") if (args["time_delay"]): z.sleep(int(args["time_delay"]))
def action(self, d, z, args): z.toast( "准备执行TIM修改我的名片模块" ) 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( "网络通畅。开始执行: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( ) 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( 8 ) z.heartbeat( ) if d( text='消息' ).exists: # 到了通讯录这步后看号有没有被冻结 z.toast( "卡槽TIM状态正常,继续执行" ) else: z.toast( "卡槽TIM状态异常,跳过此模块" ) return z.heartbeat( ) while True: #由于网速慢或手机卡可能误点 if d( index=1, className='android.widget.ImageView' ).exists: # d(index=0,className="android.widget.RelativeLayout").child( index=1,resourceId="com.tencent.tim:id/name", className='android.widget.ImageView' ).click() z.heartbeat( ) d( index=2, className="android.widget.FrameLayout" ).child( index=0,className="android.widget.RelativeLayout" ).click( ) # d( index=2, className="android.widget.FrameLayout" ).child( index=0,className="android.widget.RelativeLayout" ).child( index=1, className='android.widget.ImageView' ).click() if d(text="加好友").exists: #由于网速慢或手机卡可能误点 d(text="加好友").click() d(text="返回",className="android.widget.TextView").click() d( index=2, className="android.widget.FrameLayout" ).child( index=0,className="android.widget.RelativeLayout" ).click( ) z.sleep( 3 ) if d( text='我的名片夹', resourceId='com.tencent.tim:id/name', className="android.widget.TextView" ).exists: z.heartbeat( ) d( text='我的名片夹', resourceId='com.tencent.tim:id/name' ).click( ) break z.sleep(1) if d(text="设置我的名片").exists: z.heartbeat( ) d( text="设置我的名片" ).click() z.sleep( 1 ) d(text="添加我的名片").click() z.sleep(1) else: z.heartbeat( ) d(text="我的名片").click() z.sleep( 1 ) d(index=2,text="编辑").click() z.heartbeat( ) z.sleep( 2 ) d(descriptionContains="名片图片").click() z.sleep( 2 ) d( descriptionContains="显示更多" ).click( ) z.sleep(2) if d(descriptionContains="显示更多").exists: z.toast("暂时无法更换名片") return d( text='从相册选择', resourceId='com.tencent.tim:id/action_sheet_button' ).click( ) z.sleep( 3 ) 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: obj.click( ) z.sleep( 3 ) d( text='确定', resourceId='com.tencent.tim:id/name' ).click( ) while d( text='正在识别' ).exists: time.sleep( 2 ) z.heartbeat( ) if d( text="重选" ).exists: d( text="重选" ).click( ) d( index=0, className="com.tencent.widget.GridView", resourceId="com.tencent.tim:id/photo_list_gv" ).child( index=0, className="android.widget.RelativeLayout" ).click( ) d( text='确定', resourceId='com.tencent.tim:id/name' ).click( ) while d( text='正在识别' ).exists: time.sleep( 2 ) z.sleep(2) d(text="完成").click()
def action(self, d,z, args): z.heartbeat() self.scode = smsCode( d.server.adb.device_serial( ) ) logger = util.logger runLock = int( args['run_lock'] ) cateId = args['repo_normal_number_id'] logger.info(cateId) cateType = 'information' totalList = self.repo.GetNUmberNormalTotal( cateId,cateType ) normalTotal = int( totalList[0]['total'] ) if normalTotal < runLock: z.toast( '库内未使用号码低于' + args['run_lock'] + ',开始拉号码' ) str = d.info # 获取屏幕大小等信息 height = str["displayHeight"] width = str["displayWidth"] d.press.home( ) while True: if d( text='微信' ).exists: d( text='微信' ).click( ) break d.swipe( width - 20, height / 2, 0, height / 2, 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( ) z.sleep( 1 ) if d( text='添加朋友' ).exists: d( text='添加朋友' ).click( ) else: d( description='更多功能按钮', className='android.widget.RelativeLayout' ).click( ) z.sleep( 1 ) d( text='添加朋友' ).click( ) d( index='1', className='android.widget.TextView' ).click( ) # 点击搜索好友的输入框 z.heartbeat( ) lock_count = 0 while True: lock_count = lock_count + 1 if lock_count > int( args['check_count'] ): z.toast( '成功检存' + args['check_count'] + '次,结束' ) break while True: WXnumber = self.scode.GetPhoneNumber(self.scode.WECHAT_REGISTER) # 获取接码平台手机号码 if WXnumber is not None: z.sleep(3) self.scode.defriendPhoneNumber( WXnumber, self.scode.WECHAT_REGISTER ) # 拉黑 break z.input(WXnumber) d( textContains='搜索:' ).click( ) z.heartbeat( ) while d( textContains='正在查找' ).exists: z.sleep( 2 ) z.heartbeat( ) if d( textContains='操作过于频繁' ).exists: repo_check_frequency_id = args['repo_check_frequency_id'] self.repo.uploadPhoneNumber(WXnumber, repo_check_frequency_id ) z.toast('操作过于频繁,模块停止运行') break z.sleep( 1 ) if d( textContains='用户不存在' ).exists: repo_not_exist_id = args['repo_not_exist_id'] self.repo.uploadPhoneNumber( WXnumber,repo_not_exist_id ) d( descriptionContains='清除', index=2 ).click( ) z.sleep( 1 ) continue if d( textContains='状态异常' ).exists: repo_exception_id = args['repo_exception_id'] self.repo.uploadPhoneNumber( WXnumber,repo_exception_id ) d( descriptionContains='清除', index=2 ).click( ) z.sleep(1) continue z.heartbeat( ) if d( text='详细资料' ).exists: repo_normal_number_id = args['repo_normal_number_id'] para = {"phoneNumber": WXnumber, 'x_01': "exist", 'x_02': '0','x_03': '2000-01-01 00:00:00', 'x_04': '0', 'x_05': '空', 'x_06': '2000-01-01 00:00:00', 'x_19': 'CheckXunMa','x_27': '0', 'x_28': '0'} self.repo.PostInformation( repo_normal_number_id, para ) d( descriptionContains='返回' ).click( ) d( descriptionContains='清除' ).click( ) z.sleep( 1 ) else: z.toast( '库内未使用号码大于' + args['run_lock'] + ',模块无法运行' )
def action(self, d, z, args): z.toast("准备执行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.qqlite").communicate() # 强制停止 d.server.adb.cmd( "shell", "am start -n com.tencent.qqlite/com.tencent.mobileqq.activity.SplashActivity" ).communicate() # 拉起来 z.sleep(8) z.heartbeat() if d(text='消息').exists: # 到了通讯录这步后看号有没有被冻结 z.toast("卡槽状态正常,继续执行") else: z.toast("卡槽状态异常,跳过此模块") return repo_material_cate_id = args["repo_material_cate_id"] # 得到验证语的仓库号 Material = self.repo.GetMaterial(repo_material_cate_id, 0, 1) gender1 = args['gender'] wait = 1 # 判断素材仓库里是否由素材 while wait == 1: try: material = Material[0]['content'] # 取出验证消息的内容 wait = 0 except Exception: d.server.adb.cmd( "shell", "am broadcast -a com.zunyun.zime.toast --es msg \"仓库为空,没有取到验证消息\"" ) add_count = int(args['add_count']) # 要添加多少人 repo_number_cate_id = int(args["repo_number_cate_id"]) # 得到取号码的仓库号 wait = 1 while wait == 1: numbers = self.repo.GetNumber(repo_number_cate_id, 120, add_count) # 取出add_count条两小时内没有用过的号码 if "Error" in numbers: # d.server.adb.cmd( "shell", "am broadcast -a com.zunyun.zime.toast --es msg \"仓库为空,没有取到号码\"" ) continue wait = 0 list = numbers # 将取出的号码保存到一个新的集合 # num = list[0]['number'] QQnumber = numbers[0]['number'] z.sleep(8) z.heartbeat() d(resourceId='com.tencent.qqlite:id/0', description='更多').click() z.heartbeat() z.sleep(2) if d(text='添加', resourceId='com.tencent.qqlite:id/action_sheet_button').exists: d(text='添加', resourceId='com.tencent.qqlite:id/action_sheet_button').click() else: z.heartbeat() d(resourceId='com.tencent.qqlite:id/0', description='更多').click() z.heartbeat() d(text='添加', resourceId='com.tencent.qqlite:id/action_sheet_button').click() z.sleep(3) z.heartbeat() d(text='QQ号/手机号/邮箱/群', resourceId='com.tencent.qqlite:id/0').click() z.heartbeat() d(text='QQ号/手机号/邮箱/群', resourceId='com.tencent.qqlite:id/et_search_keyword').set_text( QQnumber) # 第一次添加的帐号 list[0] z.heartbeat() d(text='找人:', resourceId='com.tencent.qqlite:id/0').click() z.sleep(2) count = 0 while count < add_count: numbers = list[i] repo_material_cate_id = args["repo_material_cate_id"] # 得到验证语的仓库号 Material = self.repo.GetMaterial(repo_material_cate_id, 0, 1) material = Material[0]['content'] # 得到验证语 numbers = self.repo.GetNumber(repo_number_cate_id, 120, add_count) # 取出两小时内没有用过的号码 list = numbers QQnumber = numbers[0]['number'] z.heartbeat() time.sleep(1) if d(text='没有找到相关结果', className='android.widget.TextView').exists: #没有这个人的情况 z.heartbeat() d(resourceId='com.tencent.qqlite:id/ib_clear_text', description='清空搜索输入').click() obj = d(text='QQ号/手机号/邮箱/群', resourceId='com.tencent.qqlite:id/et_search_keyword') if obj.exists: z.heartbeat() z.sleep(2) obj.set_text(QQnumber) # 下次要添加的号码 obj = d(text='网络查找人', resourceId='com.tencent.qqlite:id/et_search_keyword') if obj.exists: z.heartbeat() z.sleep(2) obj.set_text(QQnumber) # 下次要添加的号码 d(text='找人:', resourceId='com.tencent.qqlite:id/0').click() time.sleep(1) continue time.sleep(2) if d(className='android.view.View').child( index=1, resourceId='com.tencent.qqlite:id/0', className="android.widget.RelativeLayout" ).exists: #在同一查条件有多个人 z.heartbeat() z.sleep(2) d(className='android.view.View').child( index=1, resourceId='com.tencent.qqlite:id/0', className="android.widget.RelativeLayout").click() z.sleep(2) z.sleep(1) obj = d(index=1, resourceId="com.tencent.qqlite:id/0", className="android.widget.RelativeLayout").child( index=2, resourceId="com.tencent.qqlite:id/0", className="android.widget.TextView") if obj.exists: obj = obj.info gender2 = obj["text"][0:1] else: gender2 = "不限" z.heartbeat() if gender1 != '不限': z.heartbeat() if gender1 == gender2: # gender1是外界设定的,gender2是读取到的 z.sleep(1) else: z.sleep(1) d(text='个人资料').click() z.sleep(2) if d(resourceId='com.tencent.qqlite:id/ib_clear_text', description='清空搜索输入').exists: d(resourceId='com.tencent.qqlite:id/ib_clear_text', description='清空搜索输入').click() else: d(text='个人资料').click() obj = d( text='QQ号/手机号/邮箱/群', resourceId='com.tencent.qqlite:id/et_search_keyword') if obj.exists: z.heartbeat() z.sleep(2) obj.set_text( QQnumber) # 要改为从库里取------------------------------- obj = d( text='网络查找人', resourceId='com.tencent.qqlite:id/et_search_keyword') if obj.exists: z.sleep(2) obj.set_text(QQnumber) if d(text='找人:', resourceId='com.tencent.qqlite:id/0').exists: d(text='找人:', resourceId='com.tencent.qqlite:id/0').click() else: d(resourceId="com.tencent.qqlite:id/0", description="取消").click() if d(resourceId='com.tencent.qqlite:id/ib_clear_text', description='清空搜索输入').exists: d(resourceId='com.tencent.qqlite:id/ib_clear_text', description='清空搜索输入').click() else: d(text='个人资料').click() obj = d( text='QQ号/手机号/邮箱/群', resourceId='com.tencent.qqlite:id/et_search_keyword' ) if obj.exists: z.heartbeat() z.sleep(2) obj.set_text( QQnumber ) # 要改为从库里取------------------------------- obj = d( text='网络查找人', resourceId='com.tencent.qqlite:id/et_search_keyword' ) if obj.exists: z.sleep(2) obj.set_text(QQnumber) if d(text='找人:', resourceId='com.tencent.qqlite:id/0').exists: d(text='找人:', resourceId='com.tencent.qqlite:id/0').click() continue z.heartbeat() d(text='加好友', className="android.widget.TextView").click() time.sleep(1) if d(text='加好友').exists: #拒绝被添加为好友的情况 time.sleep(1) z.heartbeat() d(text='个人资料').click() z.sleep(2) d(resourceId='com.tencent.qqlite:id/ib_clear_text', description='清空搜索输入').click() z.sleep(2) obj = d(text='QQ号/手机号/邮箱/群', resourceId='com.tencent.qqlite:id/et_search_keyword') if obj.exists: z.heartbeat() z.sleep(2) obj.set_text( QQnumber) # 要改为从库里取------------------------------ obj = d(text='网络查找人', resourceId='com.tencent.qqlite:id/et_search_keyword') if obj.exists: z.heartbeat() z.sleep(2) obj.set_text(QQnumber) time.sleep(1) d(text='找人:', resourceId='com.tencent.qqlite:id/0').click() continue time.sleep(2) if d(text="风险提示").exists: #风险提示 z.sleep(1) z.heartbeat() d(text="取消").click() z.sleep(1) d(text='个人资料').click() z.sleep(2) d(resourceId='com.tencent.qqlite:id/ib_clear_text', description='清空搜索输入').click() obj = d(text='QQ号/手机号/邮箱/群', resourceId='com.tencent.qqlite:id/et_search_keyword') if obj.exists: z.heartbeat() z.sleep(2) obj.set_text( QQnumber) # 要改为从库里取------------------------------- obj = d(text='网络查找人', resourceId='com.tencent.qqlite:id/et_search_keyword') if obj.exists: z.sleep(2) obj.set_text(QQnumber) d(text='找人:', resourceId='com.tencent.qqlite:id/0').click() continue if d(text='必填').exists: #要回答问题的情况 z.heartbeat() z.sleep(2) d(text='身份验证').click() z.sleep(1) z.heartbeat() d(text='个人资料').click() z.sleep(2) d(resourceId='com.tencent.qqlite:id/ib_clear_text', description='清空搜索输入').click() obj = d(text='QQ号/手机号/邮箱/群', resourceId='com.tencent.qqlite:id/et_search_keyword') if obj.exists: z.sleep(2) obj.set_text(QQnumber) # 下次要添加的号码- obj = d(text='网络查找人', resourceId='com.tencent.qqlite:id/et_search_keyword') if obj.exists: z.heartbeat() z.sleep(2) obj.set_text(QQnumber) time.sleep(1) d(text='找人:', resourceId='com.tencent.qqlite:id/0').click() continue time.sleep(1) z.heartbeat() obj = d(text='发送') #不需要验证可直接添加为好友的情况 if obj.exists: z.sleep(2) obj.click() if d(text='添加失败,请勿频繁操作').exists: # z.sleep( 1 ) # z.heartbeat( ) # d( text="确定", className="android.widget.TextView" ).click( ) # z.sleep( 1 ) # z.heartbeat( ) # d( text="返回", className="android.widget.TextView" ).click( ) z.toast("频繁操作,跳出模块") return else: print(str(QQnumber) + "请求发送成功") time.sleep(1) d(resourceId='com.tencent.qqlite:id/ib_clear_text', description='清空搜索输入').click() obj = d(text='QQ号/手机号/邮箱/群', resourceId='com.tencent.qqlite:id/et_search_keyword') if obj.exists: z.heartbeat() z.sleep(2) obj.set_text( QQnumber) # 要改为从库里取------------------------------- obj = d(text='网络查找人', resourceId='com.tencent.qqlite:id/et_search_keyword') if obj.exists: z.sleep(2) obj.set_text(QQnumber) d(text='找人:', resourceId='com.tencent.qqlite:id/0').click() continue time.sleep(2) obj = d(index=3, className="android.widget.EditText", resourceId="com.tencent.qqlite:id/0").info #将之前消息框的内容删除 obj = obj['text'] lenth = len(obj) t = 0 while t < lenth: d.press.delete() t = t + 1 time.sleep(2) z.input(material) z.sleep(1) d(text='下一步').click() z.sleep(1) d(text='发送').click() print(str(QQnumber) + "请求发送成功") time.sleep(1) if d(text='添加失败,请勿频繁操作', resourceId='com.tencent.qqlite:id/name').exists: # z.sleep( 1 ) # z.heartbeat( ) # d( text="确定", className="android.widget.TextView" ).click( ) # z.sleep( 1 ) # z.heartbeat( ) # d( text="返回", className="android.widget.TextView" ).click( ) print("频繁操作,跳出模块") z.toast("频繁操作,跳出模块") return z.sleep(2) d(resourceId='com.tencent.qqlite:id/ib_clear_text', description='清空搜索输入').click() z.sleep(2) count = count + 1 if count == add_count: print("模块已完成") z.toast("模块已完成") break if count < add_count: obj = d(text='QQ号/手机号/邮箱/群', resourceId='com.tencent.qqlite:id/et_search_keyword') if obj.exists: obj.click() z.input(QQnumber) z.sleep(2) obj = d(text='网络查找人', resourceId='com.tencent.qqlite:id/et_search_keyword') if obj.exists: obj.set_text(QQnumber) z.sleep(1) d(text='找人:', resourceId='com.tencent.qqlite:id/0').click() else: z.sleep(2) z.heartbeat() d(text="取消", className="android.widget.Button").click() z.sleep(2) d(text="返回", className="android.widget.TextView").click() if (args["time_delay"]): time.sleep(int(args["time_delay"]))
def login(self, d, args, z): z.heartbeat() self.scode = smsCode(d.server.adb.device_serial()) 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) sourcePng = os.path.join(base_dir, "%s_s.png" % (self.GetUnique())) codePng = os.path.join(base_dir, "%s_c.png" % (self.GetUnique())) cate_id = args["repo_cate_id"] time_limit1 = args['time_limit1'] numbers = self.repo.GetAccount(cate_id, time_limit1, 1) while len(numbers) == 0: z.heartbeat() d.server.adb.cmd( "shell", "am broadcast -a com.zunyun.zime.toast --es msg \"QQ帐号库%s号仓库无%s分钟未用,开始切换卡槽\"" % (cate_id, time_limit1)).communicate() z.sleep(2) return 0 QQNumber = numbers[0]['number'] # 即将登陆的QQ号 QQPassword = numbers[0]['password'] z.sleep(1) z.heartbeat() d.server.adb.cmd("shell", "pm clear com.tencent.mobileqq").communicate() # 清除缓存 d.server.adb.cmd( "shell", "am start -n com.tencent.mobileqq/com.tencent.mobileqq.activity.SplashActivity" ).communicate() # 拉起来 while d(textContains='正在更新数据').exists: z.sleep(2) z.sleep(20) z.heartbeat() d.dump(compressed=False) if d(text='登 录', resourceId='com.tencent.mobileqq:id/btn_login').exists: d(text='登 录').click() z.sleep(1) # d(className='android.widget.EditText', index=0).set_text(QQNumber) # 1918697054----xiake1234. QQNumber d(className='android.widget.EditText', index=0).click() # 1918697054----xiake1234. QQNumber z.input(QQNumber) z.sleep(1) # d(resourceId='com.tencent.mobileqq:id/password').set_text(QQPassword) # Bn2kJq5l QQPassword d(resourceId='com.tencent.mobileqq:id/password').click( ) # Bn2kJq5l QQPassword z.input(QQPassword) z.heartbeat() logger = util.logger print('QQ号:%s,QQ密码:%s' % (QQNumber, QQPassword)) d.dump(compressed=False) d(text='登 录', resourceId='com.tencent.mobileqq:id/login').click() z.sleep(1) while d(text='登录中').exists: z.sleep(2) z.sleep(20) z.heartbeat() loginStatusList = z.qq_getLoginStatus(d) if loginStatusList is None: if d(text='消息').exists and d(text='联系人').exists and d( text='动态').exists: loginStatusList = {'success': True} else: loginStatusList = {'success': False} loginStatus = loginStatusList['success'] if loginStatus: return QQNumber detection_robot = d(index='3', className="android.widget.EditText") not_detection_robot = d(resourceId='com.tencent.mobileqq:id/name', index='2', className="android.widget.EditText") if detection_robot.exists or not_detection_robot.exists: # 需要验证码的情况 z.toast("非网页打码") icode = imageCode() im_id = "" for i in range(0, 4): # 打码循环 if i > 0: icode.reportError(im_id) obj = d(resourceId='com.tencent.mobileqq:id/name', className='android.widget.ImageView' ) # 当弹出选择QQ框的时候,定位不到验证码图片 if not obj.exists: obj = d(index='2', className='android.widget.Image') obj = obj.info obj = obj['bounds'] # 验证码处的信息 left = obj["left"] # 验证码的位置信息 top = obj['top'] right = obj['right'] bottom = obj['bottom'] d.screenshot(sourcePng) # 截取整个输入验证码时的屏幕 img = Image.open(sourcePng) box = (left, top, right, bottom) # left top right bottom region = img.crop(box) # 截取验证码的图片 img = Image.new('RGBA', (right - left, bottom - top)) img.paste(region, (0, 0)) img.save(codePng) im = open(codePng, 'rb') codeResult = icode.getCode(im, icode.CODE_TYPE_4_NUMBER_CHAR, 60) code = codeResult["Result"] im_id = codeResult["Id"] os.remove(sourcePng) os.remove(codePng) z.heartbeat() z.sleep(5) if not_detection_robot.exists: d(resourceId='com.tencent.mobileqq:id/name', index='2', className="android.widget.EditText").set_text(code) else: detection_robot.set_text(code) z.sleep(3) if d(descriptionContains='验证', className='android.view.View').exists: d(descriptionContains='验证', className='android.view.View').click() else: d(text='完成', resourceId='com.tencent.mobileqq:id/ivTitleBtnRightText' ).click() z.sleep(6) z.heartbeat() while d(className='android.widget.ProgressBar', index=0).exists: # 网速不给力时,点击完成后仍然在加载时的状态 z.sleep(2) z.sleep(3) z.heartbeat() if detection_robot.exists or not_detection_robot.exists: continue else: break z.sleep(5) if d(textContains='验证码').exists: return "nothing" else: if self.WebViewBlankPages(d)[2] > 200: z.toast("不是空白页") self.WebViewPlayCode(d, z) z.heartbeat() # z.toast( "强制停止,拉起" ) # d.server.adb.cmd( "shell", "am force-stop com.tencent.mobileqq" ).communicate( ) # 强制停止 # z.sleep( 1 ) # d.server.adb.cmd( "shell", # "am start -n com.tencent.mobileqq/com.tencent.mobileqq.activity.SplashActivity" ).communicate( ) # 拉起来 z.sleep(5) z.heartbeat() loginStatusList = z.qq_getLoginStatus(d) if loginStatusList is None: if d(text='消息').exists and d(text='联系人').exists and d( text='动态').exists: loginStatusList = {'success': True} else: z.toast("登陆新场景,现无法判断登陆状态") loginStatusList = {'success': False} loginStatus = loginStatusList['success'] if loginStatus: z.toast("卡槽QQ状态正常,继续执行") else: if d(text='去安全中心').exists: self.repo.BackupInfo(cate_id, 'frozen', QQNumber, '', '') # 仓库号,使用中,QQ号,设备号_卡槽号QQNumber else: self.repo.BackupInfo(cate_id, 'normal', QQNumber, '', '') z.toast("卡槽QQ状态异常,跳过此模块") return "nothing" if d(text='马上绑定').exists: self.BindAddressBook(z, d, args) if d(text='匹配手机通讯录').exists: # 登陆上后弹出t通讯录的情况 d(text='匹配手机通讯录').click() z.sleep(1.5) if d(text='取消').exists: d(text='取消').child() if d(textContains="请在小米神隐模式中将TIM设置为“无限制”。").exists: z.toast("我是小米神隐") d(text='我知道了').click() return QQNumber
def login(self, d, z, args, password): z.toast("开始登录") d.server.adb.cmd("shell", "pm clear im.yixin" ).communicate( ) # 清除缓存 d.server.adb.cmd("shell", "am start -n im.yixin/.activity.WelcomeActivity" ).communicate( ) # 拉起易信 z.sleep(10) z.heartbeat() if d(text='很抱歉,“易信”已停止运行。').exists: d( text='确定' ).click( ) return 'fail' d.server.adb.cmd( "shell", "am force-stop im.yixin" ).communicate( ) # 强制停止 d.server.adb.cmd( "shell", "am start -n im.yixin/.activity.WelcomeActivity" ).communicate( ) # 拉起易信 z.sleep(5) z.heartbeat() if d( text='很抱歉,“易信”已停止运行。' ).exists: d( text='确定' ).click( ) return 'fail' if d( text='接受', resourceId='im.yixin:id/easy_dialog_positive_btn' ).exists: d( text='接受', resourceId='im.yixin:id/easy_dialog_positive_btn' ).click( ) z.sleep( 2 ) if d( text='登 录' ).exists: d( text='登 录' ).click() z.sleep( 2 ) while True: z.heartbeat() z.toast(u"开始获取手机号码") self.scode = smsCode( d.server.adb.device_serial( ) ) str = d.info # 获取屏幕大小等信息 height = str["displayHeight"] width = str["displayWidth"] if d( resourceId='im.yixin:id/register_phone_number_edittext' ).exists: d( resourceId='im.yixin:id/register_phone_number_edittext' ).click.bottomright( ) number_cate_id = args['repo_number_id'] # number_time_limit = int(args['number_time_limit']) # 号码提取时间间隔 exist_numbers = self.repo.GetNumber( number_cate_id, 0, 1, 'exist' ) remain = 1 - len( exist_numbers ) normal_numbers = self.repo.GetNumber( number_cate_id, 0, remain, 'normal' ) numbers = exist_numbers + normal_numbers if len( numbers ) == 0: d.server.adb.cmd("shell", "am broadcast -a com.zunyun.zime.toast --es msg \"电话号码%s号仓库为空\"" % number_cate_id).communicate() return None number = numbers[0]["number"] if d(resourceId='im.yixin:id/editUserid').exists: d(resourceId='im.yixin:id/editUserid').click() try: PhoneNumber = self.scode.GetPhoneNumber(self.scode.WECHAT_REGISTER, number) # 获取接码平台手机号码 except: PhoneNumber = None # PhoneNumber = self.scode.GetPhoneNumber(self.scode.WECHAT_REGISTER) # 获取接码平台手机号码 if PhoneNumber is None: z.toast(u'讯码查不无此号,重新获取') continue else: z.toast(u"成功获取手机号") break z.input(PhoneNumber) if d(text='找回密码').exists: d(text='找回密码').click() z.sleep(3) if not d(text='中国',resourceId='im.yixin:id/country_name').exists: d( resourceId='im.yixin:id/country_name' ).click() z.sleep(1) while True: if d( text='中国').exists: d( text='中国' ).click() break else: d.swipe( width / 2, height * 6 / 7, width / 2, height / 7 ) if d(text='下一步').exists: d(text='下一步').click() z.sleep(8) z.heartbeat() if d(text='注册',resourceId='im.yixin:id/easy_dialog_positive_btn').exists: return "fail" if d(text='输入收到的验证码').exists: d(text='输入收到的验证码').click() try: code = self.scode.GetVertifyCode( PhoneNumber, self.scode.WECHAT_REGISTER, 4) # 获取接码验证码 self.scode.defriendPhoneNumber( PhoneNumber, self.scode.WECHAT_REGISTER ) except: self.scode.defriendPhoneNumber( PhoneNumber, self.scode.WECHAT_REGISTER ) code = '' if code == '': z.toast( PhoneNumber + '手机号,获取不到验证码' ) return "fail" z.input(code) if d(text='下一步').exists: d(text='下一步').click() z.sleep(8) if d(resourceId='im.yixin:id/password_edittext').exists: z.input(password) z.sleep(1) d(text='完成').click() z.sleep(15) z.heartbeat() if d(text='立即更新').exists and d(text='下次再说').exists: d(text='下次再说').click() if d(text='消息').exists and d(text='电话').exists and d(text='发现').exists and d(text='通讯录').exists: z.toast(u'登录成功') return PhoneNumber else: z.toast(u'登录失败,重新登录') return "fail"
def palyCode(self, d, z, picObj): self.scode = smsCode(d.server.adb.device_serial()) 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) sourcePng = os.path.join(base_dir, "%s_s.png" % (self.GetUnique())) codePng = os.path.join(base_dir, "%s_c.png" % (self.GetUnique())) icode = imageCode() im_id = "" code = "" for i in range(0, 2): # 打码循环 if i > 0: icode.reportError(im_id) obj = picObj.info obj = obj['bounds'] # 验证码处的信息 left = obj["left"] # 验证码的位置信息 top = obj['top'] right = obj['right'] bottom = obj['bottom'] d.screenshot(sourcePng) # 截取整个输入验证码时的屏幕 img = Image.open(sourcePng) box = (left, top, right, bottom) # left top right bottom region = img.crop(box) # 截取验证码的图片 img = Image.new('RGBA', (right - left, bottom - top)) img.paste(region, (0, 0)) img.save(codePng) time.sleep(1) with open(codePng, 'rb') as f: # file = f.read() file = "data:image/jpeg;base64," + base64.b64encode(f.read()) da = {"IMAGES": file} path = "/ocr.index" headers = { "Content-Type": "application/x-www-form-urlencoded", "Connection": "Keep-Alive" } conn = httplib.HTTPConnection("162626i1w0.51mypc.cn", 10082, timeout=30) time.sleep(0.5) params = urllib.urlencode(da) conn.request(method="POST", url=path, body=params, headers=headers) time.sleep(1) response = conn.getresponse() if response.status == 200: code = response.read() break else: continue # print data # im = open(codePng, 'rb') # # codeResult = icode.getCode(im, icode.CODE_TYPE_4_NUMBER_CHAR, 60) # # code = codeResult["Result"] # im_id = codeResult["Id"] os.remove(sourcePng) os.remove(codePng) z.heartbeat() break # if code.isalpha() or code.isisdigitv() or code.isalnum(): # break # else: # continue return code
def action(self, d, z, args): z.toast("准备执行TIM唤醒名片加好友模块") z.sleep(1) z.heartbeat() 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() 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(8) z.heartbeat() if d(text='消息').exists: # 到了通讯录这步后看号有没有被冻结 z.toast("卡槽TIM状态正常,继续执行") else: z.toast("卡槽TIM状态异常,跳过此模块") return z.heartbeat() gender1 = args['gender'] cate_id1 = args["repo_material_cate_id"] add_count = int(args['add_count']) # 要添加多少人 switch_card = args["switch_card"] switch = args["switch"] count = 1 num = 0 while True: #总人数 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) return message = Material[0]['content'] # 取出验证消息的内容 repo_number_cate_id = int(args["repo_number_cate_id"]) # 得到取号码的仓库号 numbers = self.repo.GetNumber(repo_number_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号仓库为空,等待中\"" % repo_number_cate_id).communicate() z.sleep(5) return z.heartbeat() QQnumber = numbers[0]['number'] print(QQnumber) z.sleep(1) z.cmd( "shell", 'am start -a android.intent.action.VIEW -d "mqqapi://card/show_pslcard?src_type=internal\&version=1\&uin=%s\&card_type=person\&source=qrcode"' % QQnumber) # qq名片页面 z.sleep(random.randint(5, 7)) if d(text='TIM').exists: z.heartbeat() d(text='TIM').click() z.sleep(2) z.heartbeat() while d(text='仅此一次').exists: z.heartbeat() d(text='仅此一次').click() z.sleep(1) if d(text="申请加群").exists: continue objtext = d(index=0, className="android.widget.LinearLayout").child( index=1, className="android.widget.RelativeLayout").child( index=1, className="android.widget.TextView") if objtext.exists: objtext = objtext.info['text'] if objtext == "": z.toast("账号为空,继续唤醒") continue if gender1 != '不限': gender2 = self.Gender(d, z) z.heartbeat() if gender1 == gender2: # gender1是外界设定的,gender2是读取到的 z.sleep(1) else: # d( text='返回', resourceId='com.tencent.tim:id/ivTitleBtnLeft' ).click( ) # add_count = add_count+1 continue z.sleep(1) n = 1 d.dump(compressed=False) if d(text='加好友', className="android.widget.Button").exists: d(text='加好友', className="android.widget.Button").click() z.toast("点了一次") z.sleep(6) d.dump(compressed=False) if d(text='加好友', className="android.widget.Button").exists: d(text='加好友', className="android.widget.Button").click() z.toast("点了二次") z.sleep(6) d.dump(compressed=False) if d(text='加好友', className="android.widget.Button").exists: d(text='加好友', className="android.widget.Button").click() z.toast("点了三次") z.sleep(6) z.heartbeat() d.dump(compressed=False) if d(text='加好友', className="android.widget.Button").exists: #拒绝被添加的轻况 z.toast("无法加好友,重新唤醒") z.sleep(2) continue if d(text='必填', resourceId='com.tencent.tim:id/name').exists: #要回答问题的情况 z.heartbeat() continue d.dump(compressed=False) if d(text="风险提示").exists: #风险提示 z.heartbeat() 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("频繁操作,跳出模块") return else: count = count + 1 print(QQnumber + "请求发送成功") continue if switch == "是": 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) # 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(3) z.heartbeat() d.dump(compressed=False) if d(text="添加我的名片").exists: 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(3) z.heartbeat() d.dump(compressed=False) if d(text='下一步', resourceId='com.tencent.tim:id/ivTitleBtnRightText').exists: z.heartbeat() d(text='下一步', resourceId='com.tencent.tim:id/ivTitleBtnRightText').click() z.sleep(2) if d(text='发送').exists: z.heartbeat() d(text='发送').click() z.sleep(3) if d(resourceId='com.tencent.tim:id/name', text='添加失败,请勿频繁操作').exists: # 操作过于频繁的情况 z.toast("频繁操作,跳出模块") return print(QQnumber + "请求发送成功") z.heartbeat() if count == add_count: break count = count + 1 z.sleep(1) z.toast("模块完成") if (args["time_delay"]): z.sleep(int(args["time_delay"]))
def action(self, d, z, args): z.toast("准备执行TIM搜索加好友模块") 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( "网络通畅。开始执行: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() 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(8) 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("登录状态异常,跳过此模块") return repo_material_cate_id = args["repo_material_cate_id"] # 得到验证语的仓库号 Material = self.repo.GetMaterial(repo_material_cate_id, 0, 1) switch_card = args["switch_card"] gender1 = args['gender'] wait = 1 # 判断素材仓库里是否由素材 while wait == 1: try: material = Material[0]['content'] # 取出验证消息的内容 wait = 0 except Exception: d.server.adb.cmd( "shell", "am broadcast -a com.zunyun.zime.toast --es msg \"仓库为空,没有取到验证消息\"" ) add_count = int(args['add_count']) # 要添加多少人 repo_number_cate_id = int(args["repo_number_cate_id"]) # 得到取号码的仓库号 wait = 1 while wait == 1: numbers = self.repo.GetNumber(repo_number_cate_id, 120, add_count) # 取出add_count条两小时内没有用过的号码 if "Error" in numbers: # d.server.adb.cmd( "shell", "am broadcast -a com.zunyun.zime.toast --es msg \"仓库为空,没有取到号码\"" ) continue wait = 0 # list = numbers # 将取出的号码保存到一个新的集合 # num = list[0]['number'] QQnumber = numbers[0]['number'] z.sleep(1) z.heartbeat() d(resourceId='com.tencent.tim:id/name', description='快捷入口').click() z.heartbeat() z.sleep(1) if d(text='加好友', resourceId='com.tencent.tim:id/name').exists: d(text='加好友', resourceId='com.tencent.tim:id/name').click() z.heartbeat() else: z.heartbeat() d(resourceId='com.tencent.tim:id/name', description='快捷入口').click() z.heartbeat() d(text='加好友', resourceId='com.tencent.tim:id/name').click() z.sleep(1) z.heartbeat() if d(text='QQ号/手机号/群', resourceId='com.tencent.tim:id/name').exists: d(text='QQ号/手机号/群', resourceId='com.tencent.tim:id/name').click() # d(text='QQ号/手机号/群', resourceId='com.tencent.tim:id/et_search_keyword').click() z.heartbeat() # d(text='QQ号/手机号/群', resourceId='com.tencent.tim:id/et_search_keyword').set_text(QQnumber) # 第一次添加的帐号 list[0] z.input(QQnumber) z.heartbeat() # d( text='搜索', resourceId='com.tencent.tim:id/btn_cancel_search' ).click( ) if d(text="找人:", className="android.widget.TextView").exists: d(text="找人:", className="android.widget.TextView").click() z.sleep(3) count = 0 while count < add_count: # numbers = list[0] repo_material_cate_id = args["repo_material_cate_id"] # 得到验证语的仓库号 Material = self.repo.GetMaterial(repo_material_cate_id, 0, 1) material = Material[0]['content'] # 得到验证语 numbers = self.repo.GetNumber(repo_number_cate_id, 120, 1) # 取出两小时内没有用过的号码 # list = numbers QQnumber = numbers[0]['number'] z.heartbeat() time.sleep(1) if d(text='没有找到相关结果', className='android.widget.TextView').exists: #没有这个人的情况 z.heartbeat() d(resourceId='com.tencent.tim:id/ib_clear_text', description='清空').click() obj = d(text='QQ号/手机号/群', resourceId='com.tencent.tim:id/et_search_keyword') if obj.exists: z.heartbeat() z.sleep(2) obj.set_text(QQnumber) # 下次要添加的号码 obj = d(text='网络查找人', resourceId='com.tencent.tim:id/et_search_keyword') if obj.exists: z.heartbeat() z.sleep(2) obj.set_text(QQnumber) # 下次要添加的号码 if d(text="找人:", className="android.widget.TextView").exists: d(text="找人:", className="android.widget.TextView").click() z.sleep(3) time.sleep(1) continue time.sleep(2) if d(text="申请加群").exists: d(resourceId="com.tencent.tim:id/ivTitleBtnLeft", description="返回按钮").click() d(resourceId='com.tencent.tim:id/ib_clear_text', description='清空').click() obj = d(text='QQ号/手机号/群', resourceId='com.tencent.tim:id/et_search_keyword') if obj.exists: z.heartbeat() z.sleep(2) obj.set_text(QQnumber) # 下次要添加的号码 obj = d(text='网络查找人', resourceId='com.tencent.tim:id/et_search_keyword') if obj.exists: z.heartbeat() z.sleep(2) obj.set_text(QQnumber) # 下次要添加的号码 # d( text='搜索', resourceId='com.tencent.tim:id/btn_cancel_search' ).click( ) if d(text="找人:", className="android.widget.TextView").exists: d(text="找人:", className="android.widget.TextView").click() z.sleep(3) time.sleep(1) continue z.sleep(2) if d(className='android.widget.AbsListView').child( index=1, resourceId='com.tencent.tim:id/name').exists: #在同一查条件有多个人 z.heartbeat() z.sleep(2) d(className='android.widget.AbsListView').child( index=1, resourceId='com.tencent.tim:id/name').click() z.sleep(2) z.sleep(1) z.heartbeat() if gender1 != '不限': gender2 = self.Gender(d, z) z.heartbeat() if gender1 == gender2: # gender1是外界设定的,gender2是读取到的 z.sleep(1) else: d(text='返回', resourceId='com.tencent.tim:id/ivTitleBtnLeft').click() z.sleep(2) d(resourceId='com.tencent.tim:id/ib_clear_text', description='清空').click() obj = d(text='QQ号/手机号/群', resourceId='com.tencent.tim:id/et_search_keyword') if obj.exists: z.heartbeat() z.sleep(2) obj.set_text( QQnumber) # 要改为从库里取------------------------------- obj = d(text='网络查找人', resourceId='com.tencent.tim:id/et_search_keyword') if obj.exists: z.sleep(2) obj.set_text(QQnumber) if d(text="找人:", className="android.widget.TextView").exists: d(text="找人:", className="android.widget.TextView").click() z.sleep(3) continue z.heartbeat() d(text='加好友', resourceId='com.tencent.tim:id/name').click() time.sleep(1) if d(text='加好友', resourceId='com.tencent.tim:id/name').exists: #拒绝被添加为好友的情况 time.sleep(1) z.heartbeat() d(text='返回', resourceId='com.tencent.tim:id/ivTitleBtnLeft').click() z.sleep(2) d(resourceId='com.tencent.tim:id/ib_clear_text', description='清空').click() z.sleep(2) obj = d(text='QQ号/手机号/群', resourceId='com.tencent.tim:id/et_search_keyword') if obj.exists: z.heartbeat() z.sleep(2) obj.set_text( QQnumber) # 要改为从库里取------------------------------ obj = d(text='网络查找人', resourceId='com.tencent.tim:id/et_search_keyword') if obj.exists: z.heartbeat() z.sleep(2) obj.set_text(QQnumber) time.sleep(1) if d(text="找人:", className="android.widget.TextView").exists: d(text="找人:", className="android.widget.TextView").click() z.sleep(3) continue time.sleep(2) if d(text="风险提示").exists: #风险提示 z.sleep(1) z.heartbeat() d(text="取消").click() z.sleep(1) d(text='返回', resourceId='com.tencent.tim:id/ivTitleBtnLeft').click() z.sleep(2) d(resourceId='com.tencent.tim:id/ib_clear_text', description='清空').click() obj = d(text='QQ号/手机号/群', resourceId='com.tencent.tim:id/et_search_keyword') if obj.exists: z.heartbeat() z.sleep(2) obj.set_text( QQnumber) # 要改为从库里取------------------------------- obj = d(text='网络查找人', resourceId='com.tencent.tim:id/et_search_keyword') if obj.exists: z.sleep(2) obj.set_text(QQnumber) if d(text="找人:", className="android.widget.TextView").exists: d(text="找人:", className="android.widget.TextView").click() z.sleep(3) continue if d(text='必填', resourceId='com.tencent.tim:id/name').exists: #要回答问题的情况 z.heartbeat() z.sleep(2) d(text='返回', resourceId='com.tencent.tim:id/ivTitleBtnLeft').click() time.sleep(1) z.heartbeat() d(text='返回', resourceId='com.tencent.tim:id/ivTitleBtnLeft').click() z.sleep(2) d(resourceId='com.tencent.tim:id/ib_clear_text', description='清空').click() obj = d(text='QQ号/手机号/群', resourceId='com.tencent.tim:id/et_search_keyword') if obj.exists: z.sleep(2) obj.set_text(QQnumber) # 下次要添加的号码- obj = d(text='网络查找人', resourceId='com.tencent.tim:id/et_search_keyword') if obj.exists: z.heartbeat() z.sleep(2) obj.set_text(QQnumber) time.sleep(1) if d(text="找人:", className="android.widget.TextView").exists: d(text="找人:", className="android.widget.TextView").click() z.sleep(3) continue time.sleep(1) z.heartbeat() 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.sleep( 1 ) # z.heartbeat( ) # d( text="确定", className="android.widget.TextView" ).click( ) # z.sleep( 1 ) # z.heartbeat( ) # d( text="返回", className="android.widget.TextView" ).click( ) z.toast("频繁操作,跳出模块") return else: print(str(QQnumber) + "请求发送成功") time.sleep(1) d(text='返回', resourceId='com.tencent.tim:id/ivTitleBtnLeft').click() z.sleep(2) d(resourceId='com.tencent.tim:id/ib_clear_text', description='清空').click() obj = d(text='QQ号/手机号/群', resourceId='com.tencent.tim:id/et_search_keyword') if obj.exists: z.heartbeat() z.sleep(2) obj.set_text( QQnumber) # 要改为从库里取------------------------------- obj = d(text='网络查找人', resourceId='com.tencent.tim:id/et_search_keyword') if obj.exists: z.sleep(2) obj.set_text(QQnumber) if d(text="找人:", className="android.widget.TextView").exists: d(text="找人:", className="android.widget.TextView").click() z.sleep(3) continue time.sleep(2) obj = d(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) d(className='android.widget.EditText', resourceId='com.tencent.tim:id/name').click() #发送验证消息 material z.input(material) 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(3) z.heartbeat() d.dump(compressed=False) if d(text="添加我的名片").exists: 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() d(text='下一步', resourceId='com.tencent.tim:id/ivTitleBtnRightText').click() z.sleep(1) d(text='发送', resourceId='com.tencent.tim:id/ivTitleBtnRightText').click() print(str(QQnumber) + "请求发送成功") time.sleep(1) if d(text='添加失败,请勿频繁操作', resourceId='com.tencent.tim:id/name').exists: # z.sleep( 1 ) # z.heartbeat( ) # d( text="确定", className="android.widget.TextView" ).click( ) # z.sleep( 1 ) # z.heartbeat( ) # d( text="返回", className="android.widget.TextView" ).click( ) z.toast("频繁操作,跳出模块") return z.sleep(1) d(text='返回', resourceId='com.tencent.tim:id/ivTitleBtnLeft').click() z.sleep(2) d(resourceId='com.tencent.tim:id/ib_clear_text', description='清空').click() z.sleep(1) count = count + 1 if count < add_count: obj = d(text='QQ号/手机号/群', resourceId='com.tencent.tim:id/et_search_keyword') if obj.exists: obj.click() z.input(QQnumber) z.sleep(2) obj = d(text='网络查找人', resourceId='com.tencent.tim:id/et_search_keyword') if obj.exists: obj.set_text(QQnumber) z.sleep(1) if d(text="找人:", className="android.widget.TextView").exists: d(text="找人:", className="android.widget.TextView").click() z.sleep(3) else: z.sleep(2) z.heartbeat() d(text="取消", className="android.widget.Button").click() z.sleep(2) d(text="返回", className="android.widget.TextView").click() if count == add_count: print("模块已完成") z.toast("模块已完成") break if (args["time_delay"]): time.sleep(int(args["time_delay"]))
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版TIM我的名片夹加好友模块") 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("网络通畅。开始执行: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() 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(8) 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 add_count = int(args['add_count']) # 要添加多少人 repo_number_cate_id = int(args["repo_number_cate_id"]) # 得到取号码的仓库号 switch_card = args["switch_card"] z.heartbeat() z.sleep(8) # while True: # 由于网速慢或手机卡可能误点 # if d( index=1, className='android.widget.ImageView' ).exists: # # d(index=0,className="android.widget.RelativeLayout").child( index=1,resourceId="com.tencent.tim:id/name", className='android.widget.ImageView' ).click() # z.heartbeat( ) # d( index=2, className="android.widget.FrameLayout" ).child( index=0, # className="android.widget.RelativeLayout" ).click( ) # # d( index=2, className="android.widget.FrameLayout" ).child( index=0,className="android.widget.RelativeLayout" ).child( index=1, className='android.widget.ImageView' ).click() # if d( text="加好友" ).exists: # 由于网速慢或手机卡可能误点 # d( text="加好友" ).click( ) # d( text="返回", className="android.widget.TextView" ).click( ) # d( index=2, className="android.widget.FrameLayout" ).child( index=0, # className="android.widget.RelativeLayout" ).click( ) # z.sleep( 3 ) # if d( text='我的名片夹', resourceId='com.tencent.tim:id/name', className="android.widget.TextView" ).exists: # z.heartbeat( ) # d( text='我的名片夹', resourceId='com.tencent.tim:id/name' ).click( ) # break # z.sleep( 1 ) if d(index=1, className="android.widget.RelativeLayout").child( index=0, className="android.widget.ImageView").exists: d(index=1, className="android.widget.RelativeLayout").child( index=0, className="android.widget.ImageView").click() z.sleep(1) if d(description="名片夹").exists: d(description="名片夹").click() z.sleep(0.5) else: if d(index=1, className="android.widget.RelativeLayout").child( index=0, className="android.widget.ImageView").exists: d(index=1, className="android.widget.RelativeLayout").child( index=0, className="android.widget.ImageView").click() z.sleep(1) if d(description="名片夹").exists: d(description="名片夹").click() 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 count = 0 i = 0 num = 0 # 请求失败的次数 repo_material_cate_id = args["repo_material_cate_id"] # for i in range(0, add_count, +1): # 总人数 flag = True while count < add_count: numbers = self.repo.GetNumber(repo_number_cate_id, 60, 1) # 取出totalNumber条一小时内没有用过的号码 if len(numbers) == 0: d.server.adb.cmd( "shell", "am broadcast -a com.zunyun.zime.toast --es msg \"号码%s号仓库为空,等待中\"" % repo_number_cate_id).communicate() now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return list = numbers # 将取出的号码保存到一个新的集合 Material = self.repo.GetMaterial(repo_material_cate_id, 0, 1) if len(Material) == 0: d.server.adb.cmd( "shell", "am broadcast -a com.zunyun.zime.toast --es msg \"消息素材%s号仓库为空,没有取到消息\"" % repo_material_cate_id).communicate() now = datetime.datetime.now() nowtime = now.strftime( '%Y-%m-%d %H:%M:%S') # 将日期转化为字符串 datetime => string z.setModuleLastRun(self.mid) z.toast('模块结束,保存的时间是%s' % nowtime) return material = Material[0]['content'] if flag: z.sleep(1) if d(text="添加第一张名片").exists: z.heartbeat() d(text="添加第一张名片").click() z.sleep(1) else: z.heartbeat() d(index=0, className="android.widget.RelativeLayout", resourceId="com.tencent.tim:id/name").child( index=1, className="android.widget.RelativeLayout").child( index=1, className="android.widget.ImageView", resourceId="com.tencent.tim:id/name").click() z.sleep(1) d(index=2, text="编辑").click() z.sleep(1) if d(text="重新扫描", className="android.widget.TextView").exists: d(text="重新扫描", className="android.widget.TextView").click() z.sleep(2) z.heartbeat() while d(index=3, className="android.widget.Button").exists: z.heartbeat() d(index=3, className="android.widget.Button").click() z.sleep(1) 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: obj.click() z.sleep(1) d(text='确定', resourceId='com.tencent.tim:id/name').click() z.heartbeat() z.sleep(4) flag = False obj = d(index=0, className="android.widget.LinearLayout", resourceId="com.tencent.tim:id/name").child( index=0, className="android.widget.EditText") if obj.exists: obj.click() z.heartbeat() obj = obj.info['text'] lenth = len(obj) t = 0 while t < 11: z.heartbeat() d.press.delete() t = t + 1 z.input(list[0]['number']) z.heartbeat() z.sleep(1) i = 0 d(text="完成").click() z.sleep(2) Str = d.info # 获取屏幕大小等信息 height = Str["displayHeight"] width = Str["displayWidth"] # for index in range( 0, 3 ): z.heartbeat() d.swipe(width / 2 + 20, height / 2, width / 2 + 20, 0, 5) z.sleep(1) obj = d(text="加好友", className="android.widget.Button") if obj.exists: z.heartbeat() obj.click() z.sleep(1) else: d.swipe(width / 2, height * 1 / 6, width / 2, height * 5 / 6) continue if d(text="加好友", className="android.widget.Button").exists: # 请求失败活拒绝 z.heartbeat() num = num + 1 # 请求失败的次数+1 d.swipe(width / 2, height * 1 / 6, width / 2, height * 5 / 6) continue if d(text="风险提示").exists: # 风险提示 z.heartbeat() z.sleep(1) d(text="取消").click() z.sleep(1) z.heartbeat() d(text="返回", className="android.widget.TextView").click() d.swipe(width / 2, height * 1 / 6, width / 2, height * 5 / 6) continue if d(text='发送', resourceId='com.tencent.tim:id/ivTitleBtnRightText' ).exists: # 可直接添加为好友的情况 z.heartbeat() d(text='发送', resourceId='com.tencent.tim:id/ivTitleBtnRightText').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 elif d(resourceId='com.tencent.tim:id/name', text='添加失败,请勿频繁操作').exists: # 操作过于频繁的情况 # z.sleep( 1 ) # z.heartbeat( ) # d(text = "确定",className="android.widget.TextView").click() # z.sleep( 1 ) # z.heartbeat( ) # d(text="返回",className="android.widget.TextView").click() z.toast("频繁操作,跳出模块") return if d(text='必填', resourceId='com.tencent.tim:id/name').exists: # 需要验证时 z.heartbeat() d(text="返回", className="android.widget.TextView").click() num = 0 d.swipe(width / 2, height * 1 / 6, width / 2, height * 5 / 6) continue num = 0 z.heartbeat() obj = d(className='android.widget.EditText', resourceId='com.tencent.tim:id/name').info # 将之前消息框的内容删除 obj = obj['text'] lenth = len(obj) t = 0 while t < lenth: z.heartbeat() d.press.delete() t = t + 1 time.sleep(1) z.heartbeat() d(className='android.widget.EditText', resourceId='com.tencent.tim:id/name').click() # 发送验证消息 material z.sleep(1) z.heartbeat() z.input(material) 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(3) z.heartbeat() d.dump(compressed=False) if d(text="添加我的名片").exists: 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() d(text='下一步', resourceId='com.tencent.tim:id/ivTitleBtnRightText').click() z.heartbeat() z.sleep(1) d(text='发送', resourceId='com.tencent.tim:id/ivTitleBtnRightText').click() time.sleep(1) if d(text="请求发送失败").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 elif d(resourceId='com.tencent.tim:id/name', text='添加失败,请勿频繁操作').exists: # 操作过于频繁的情况 # d( text="确定", className="android.widget.TextView" ).click( ) # z.sleep( 1 ) # d( text="返回", className="android.widget.TextView" ).click( ) 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 count = count + 1 if count == add_count: break if num > 3: # 一直请求失败,跳出循环 z.heartbeat() print("该QQ好暂时无法通过我的名片夹加好友,请切换账号或者执行其他操作") z.toast("该QQ好暂时无法通过我的名片夹加好友,请切换账号或者执行其他操作") z.sleep(5) break z.sleep(1) 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 LoginPlayCode(self, d, z): self.scode = smsCode( d.server.adb.device_serial( ) ) 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 ) sourcePng = os.path.join( base_dir, "%s_s.png" % (self.GetUnique( )) ) codePng = os.path.join( base_dir, "%s_c.png" % (self.GetUnique( )) ) detection_robot = d( index='3', className="android.widget.EditText" ) not_detection_robot = d( resourceId='com.tencent.tim:id/name', index='2', className="android.widget.EditText" ) if detection_robot.exists or not_detection_robot.exists: # 需要验证码的情况 icode = imageCode( ) im_id = "" for i in range( 0, 4 ): # 打码循环 # if i > 0: # icode.reportError( im_id ) obj = d( resourceId='com.tencent.tim:id/name', className='android.widget.ImageView' ) # 当弹出选择QQ框的时候,定位不到验证码图片 if not obj.exists: obj = d( index='2', className='android.widget.Image' ) obj = obj.info obj = obj['bounds'] # 验证码处的信息 left = obj["left"] # 验证码的位置信息 top = obj['top'] right = obj['right'] bottom = obj['bottom'] d.screenshot( sourcePng ) # 截取整个输入验证码时的屏幕 img = Image.open( sourcePng ) box = (left, top, right, bottom) # left top right bottom region = img.crop( box ) # 截取验证码的图片 img = Image.new( 'RGBA', (right - left, bottom - top) ) img.paste( region, (0, 0) ) img.save( codePng ) with open( codePng, 'rb' ) as f: # file = f.read() file = "data:image/jpeg;base64," + base64.b64encode( f.read( ) ) da = {"IMAGES": file} path = "/ocr.index" headers = {"Content-Type": "application/x-www-form-urlencoded", "Connection": "Keep-Alive"} conn = httplib.HTTPConnection( "162626i1w0.51mypc.cn", 10082, timeout=30 ) params = urllib.urlencode( da ) conn.request( method="POST", url=path, body=params, headers=headers ) response = conn.getresponse( ) if response.status == 200: code = response.read( ) else: continue os.remove( sourcePng ) os.remove( codePng ) z.heartbeat( ) z.sleep( 5 ) if not_detection_robot.exists: d( resourceId='com.tencent.tim:id/name', index='2', className="android.widget.EditText" ).set_text( code ) else: detection_robot.set_text( code ) z.sleep( 3 ) if d( descriptionContains='验证', className='android.view.View' ).exists: d( descriptionContains='验证', className='android.view.View' ).click( ) else: d( text='完成', resourceId='com.tencent.tim:id/ivTitleBtnRightText' ).click( ) z.sleep( 5 ) z.heartbeat( ) while d( className='android.widget.ProgressBar', index=0 ).exists: # 网速不给力时,点击完成后仍然在加载时的状态 z.sleep( 2 ) z.heartbeat( ) if detection_robot.exists or not_detection_robot.exists: continue else: break z.sleep( 5 ) if d( textContains='验证码' ).exists: return "no" else: return "yes" else: return "no"
def action(self, d, z, args): z.toast("准备执行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(8) z.heartbeat() if d(text='消息').exists: # 到了通讯录这步后看号有没有被冻结 z.toast("卡槽状态正常,继续执行") else: z.toast("卡槽状态异常,跳过此模块") return z.heartbeat() str = d.info # 获取屏幕大小等信息 height = str["displayHeight"] width = str["displayWidth"] repo_material_cate_id = args["repo_material_cate_id"] textType = args["type"] z.heartbeat() if d(text='绑定手机号码').exists: d(text='关闭').click() if d(textContains='匹配').exists: d.press.back() #等同于按返回键 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(random.randint(1, 3)) z.heartbeat() while not d(index=2, description="写说说等按钮", className='android.widget.LinearLayout').exists: z.sleep(1) count = int(args["count"]) for i in range(0, count): Material = self.repo.GetMaterial(repo_material_cate_id, 5, 1) if len(Material) == 0: d.server.adb.cmd( "shell", "am broadcast -a com.zunyun.zime.toast --es msg \"消息素材%s号仓库为空,没有取到消息\"" % repo_material_cate_id).communicate() z.sleep(10) return message = Material[0]['content'] if d(index=2, description="写说说等按钮", className='android.widget.LinearLayout').exists: d(index=2, description="写说说等按钮", className='android.widget.LinearLayout').click() # z.sleep(1) z.sleep(2) z.heartbeat() if d(index=1, text="说说", className="android.widget.TextView").exists: d(index=1, text="说说", className="android.widget.TextView").click() z.sleep(1) z.heartbeat() if textType == "文字" or textType == "文字+图片": z.input(message.encode('utf-8')) z.sleep(2) if textType == "照片" or textType == "文字+图片": z.sleep(1) z.heartbeat() d(text="照片/视频", className="android.widget.TextView").click() z.sleep(1) z.heartbeat() d(text="从手机选择", resourceId="com.tencent.mobileqq:id/action_sheet_button" ).click() z.sleep(3) if d(className='com.tencent.widget.GridView').child( className='android.widget.RelativeLayout', index=i).exists: d(className='com.tencent.widget.GridView').child( className='android.widget.RelativeLayout', index=i).click() else: if d(className='com.tencent.widget.GridView').child( className='android.widget.RelativeLayout', index=0).exists: d(className='com.tencent.widget.GridView').child( className='android.widget.RelativeLayout', index=0).click() else: z.toast("没有照片,停止模块") return z.sleep(1) z.heartbeat() if d(textContains="确定", resourceId="com.tencent.mobileqq:id/send_btn").exists: d(textContains="确定", resourceId="com.tencent.mobileqq:id/send_btn").click() z.sleep(2) z.heartbeat() if d(text="发表", resourceId="com.tencent.mobileqq:id/ivTitleBtnRightText" ).exists: d(text="发表", resourceId="com.tencent.mobileqq:id/ivTitleBtnRightText" ).click() z.sleep(3) z.heartbeat() z.toast("模块完成") if (args["time_delay"]): z.sleep(int(args["time_delay"]))
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 action(self, d,z,args): z.toast( "准备执行轻聊版唤醒名片加好友模块" ) z.sleep(1) z.heartbeat( ) 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( "网络通畅。开始执行:轻聊版唤醒名片加好友" ) 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.qqlite" ).communicate( ) # 强制停止 d.server.adb.cmd( "shell", "am start -n com.tencent.qqlite/com.tencent.mobileqq.activity.SplashActivity" ).communicate( ) # 拉起来 z.sleep( 8 ) z.heartbeat( ) if d( text='消息' ).exists: # 到了通讯录这步后看号有没有被冻结 z.toast( "卡槽状态正常,继续执行" ) else: z.toast( "卡槽状态异常,跳过此模块" ) return z.heartbeat() gender1 = args['gender'] cate_id1 = args["repo_material_cate_id"] add_count = int(args['add_count']) # 要添加多少人 count = 0 while count<add_count: #总人数 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 ) return message = Material[0]['content'] # 取出验证消息的内容 repo_number_cate_id = int( args["repo_number_cate_id"] ) # 得到取号码的仓库号 numbers = self.repo.GetNumber( repo_number_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号仓库为空,等待中\"" % repo_number_cate_id ).communicate( ) z.sleep( 5 ) return z.heartbeat( ) QQnumber = numbers[0]['number'] # print(QQnumber) z.sleep(2) z.cmd("shell", 'am start -a android.intent.action.VIEW -d "mqqapi://card/show_pslcard?src_type=internal\&version=1\&uin=%s\&card_type=person\&source=qrcode"'%QQnumber) # qq名片页面 # z.sleep(5) z.sleep(random.randint(1,3)) if d(text='QQ轻聊版').exists: z.heartbeat( ) d(text='QQ轻聊版').click() z.sleep(2) if d(text='仅此一次').exists: d(text='仅此一次').click() z.heartbeat( ) z.sleep(1) if d(text="消息").exists: continue z.heartbeat() if d(text="申请加群").exists: continue obj = d(index=1,resourceId="com.tencent.qqlite:id/0",className="android.widget.RelativeLayout").child(index=2,resourceId="com.tencent.qqlite:id/0",className="android.widget.TextView") if obj.exists: obj = obj.info gender2 = obj["text"][0:1] else: gender2 = "不限" if gender1 != '不限': z.heartbeat( ) if gender1 == gender2: # gender1是外界设定的,gender2是读取到的 z.sleep( 1 ) else: continue z.sleep(1) d.dump( compressed=False ) d(text='加好友',className="android.widget.TextView").click() z.sleep( random.randint( 1, 3 ) ) z.heartbeat() if d(text='加好友',className="android.widget.TextView").exists: #拒绝被添加的轻况 print("拒绝添加或请求失败") continue if d(text='必填').exists: #要回答问题的情况 print("需要回答问题") z.heartbeat( ) continue d.dump( compressed=False ) if d(text="风险提示").exists: #风险提示 print( "该账号有风险" ) z.heartbeat() continue obj = d( text='发送', resourceId='com.tencent.qqlite:id/ivTitleBtnRightText' ) # 不需要验证可直接添加为好友的情况 if obj.exists: z.sleep( 2 ) obj.click( ) z.sleep( random.randint( 3, 5 ) ) if d( text='添加失败,请勿频繁操作').exists: z.heartbeat( ) z.toast( "频繁操作,跳出模块" ) print( "频繁操作,跳出模块" ) return else: print( QQnumber + "请求发送成功" ) continue d.dump( compressed=False ) # obj = d(index=3, className='android.widget.EditText', resourceId='com.tencent.qqlite:id/name' ).info # 将之前消息框的内容删除 需要发送验证信息 obj = d(index=3,className="android.widget.EditText",resourceId="com.tencent.qqlite:id/0").info obj = obj['text'] lenth = len( obj ) t = 0 while t < lenth: d.press.delete( ) t = t + 1 time.sleep( 1 ) z.input(message) d(text='下一步',resourceId='com.tencent.qqlite:id/ivTitleBtnRightText').click() z.sleep( 1 ) d(text='发送').click() z.sleep( random.randint( 3, 5 ) ) if d( text='添加失败,请勿频繁操作' ).exists: # 操作过于频繁的情况 z.toast("频繁操作,跳出模块") print("频繁操作,跳出模块") return print(QQnumber+"请求发送成功") z.heartbeat() count = count + 1 if count == add_count: z.toast("加好友请求次数达到设定值,模块完成") break # z.toast("模块完成!") z.sleep(1) if (args["time_delay"]): z.sleep(int(args["time_delay"]))
def Bind(self, d, z): circle = 0 self.scode = smsCode(d.server.adb.device_serial()) newStart = 1 while newStart == 1: GetBindNumber = self.scode.GetPhoneNumber( self.scode.QQ_CONTACT_BIND) print(GetBindNumber) z.sleep(2) d(resourceId='com.tencent.mobileqq:id/name', className='android.widget.EditText').set_text( GetBindNumber) #GetBindNumber z.heartbeat() z.sleep(2) d(text='下一步').click() z.sleep(3) if d(textContains='中国').exists: #操作过于频繁的情况 return 'false' if d(text='确定').exists: #提示该号码已经与另一个qq绑定,是否改绑,如果请求失败的情况 d(text='确定', ).click() z.sleep(1) if d(text='确定').exists: z.toast('请求失败,结束程序') return 'false' z.heartbeat() code = self.scode.GetVertifyCode(GetBindNumber, self.scode.QQ_CONTACT_BIND, '4') print(code) newStart = 0 d(resourceId='com.tencent.mobileqq:id/name', className='android.widget.EditText').set_text(code) if d(text='请输入验证码').exists: if circle < 4: z.toast('没有接收到验证码') d(textContains='返回').click() if d(text='取消').exists: d(text='取消').click() d(textContains='联系人').click() d(className='android.view.View').child( className='android.widget.RelativeLayout', index=4).click() circle = circle + 1 newStart = 1 continue else: z.toast('程序结束') return 'false' z.heartbeat() d(text='下一步').click() z.sleep(2) if d(text='请求失败').exists: d(text='确定').click() return 'false' if d(textContains='匹配手机通讯录').exists: d(text='匹配手机通讯录').click() time.sleep(10) self.scode.defriendPhoneNumber(GetBindNumber, self.scode.QQ_CONTACT_BIND) if d(textContains='匹配手机通讯录').exists: d(text='匹配手机通讯录').click() z.sleep(15) return 'true'
def action(self, d,z, args): z.heartbeat() Str = d.info # 获取屏幕大小等信息 height = Str["displayHeight"] width = Str["displayWidth"] saveCate = args['repo_information_id'] self.scode = smsCode(d.server.adb.device_serial()) logger = util.logger while True: nowTime = datetime.datetime.now( ).strftime( "%Y-%m-%d %H:%M:%S" ); # 生成当前时间 NUM_INFO = self.repo.GetInformationByDevice( saveCate, d.server.adb.device_serial() ) x26 = NUM_INFO[0]['x26'] if x26 == '登陆状态YSE': z.toast('该设备已成功注册微信号') break d.press.home() d.server.adb.cmd("shell", "pm clear com.tencent.mm").communicate() # 清除缓存,返回home页面 while True: if d(text='微信').exists: d(text='微信').click() break d.swipe( width - 20, height / 2, 0, height / 2, 5 ) z.sleep(8) if d(text='注册').exists: d(text='注册').click() cate_id = args['repo_material_id'] # 得到昵称库的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 name = Material[0]['content'] # 从素材库取出的要发的材料 z.input(name) #name if not d( text='中国' ).exists: d( text='国家/地区' ).click( ) d( className='android.support.v7.widget.LinearLayoutCompat', index=1 ).click( ) z.input( '中' ) d( text='中国' ).click( ) d(className='android.widget.ScrollView').child(className='android.widget.LinearLayout', index=2).child( className='android.widget.EditText', index=1).click() d(className='android.widget.ScrollView').child(className='android.widget.LinearLayout', index=2).child( className='android.widget.EditText', index=1).click.bottomright() z.heartbeat() information_cate_id = args['repo_information_id'] numbers = self.repo.GetInformation(information_cate_id) if len(numbers) == 0: d.server.adb.cmd( "shell", "am broadcast -a com.zunyun.zime.toast --es msg \"资料库%s号仓库为空,没有取到手机号\"" % information_cate_id ).communicate( ) z.sleep(10) return z.heartbeat() number = numbers[0]['phonenumber'] PhoneNumber = self.scode.GetPhoneNumber(self.scode.WECHAT_REGISTER,number)#获取接码平台手机号码 # PhoneNumber = '13829507040' if PhoneNumber is None: self.repo.DeleteInformation( saveCate, number ) z.toast('讯码查不无此号') continue z.heartbeat() print(PhoneNumber) z.input(PhoneNumber) d(className='android.widget.LinearLayout',index=3).child(className='android.widget.EditText').click() d(textContains='密码').click() z.heartbeat() password = self.GenPassword() z.input(password) print(password) print('↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ 上面是手机+密码 ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ') z.heartbeat() d(text='注册').click() z.sleep(3) if d(textContains='操作太频繁,请稍后再试').exists: para = {"phoneNumber": PhoneNumber, 'x_03': nowTime, 'x_19': 'WXRegister'} self.repo.PostInformation( saveCate, para ) d( text='确定' ).click() break if d(textContains='相同手机号不可频繁重复注册微信帐号').exists: para = {"phoneNumber": PhoneNumber, 'x_03': nowTime, 'x_19': 'WXRegister'} self.repo.PostInformation( saveCate, para ) d( text='确定' ).click() break d( text='确定' ).click() z.sleep(3) if d(textContains='正在验证').exists: z.sleep(35) z.heartbeat() code = self.scode.GetVertifyCode(PhoneNumber, self.scode.WECHAT_REGISTER)#获取接码验证码 # self.scode.defriendPhoneNumber(PhoneNumber,self.scode.WECHAT_REGISTER) if code == '': self.repo.DeleteInformation( saveCate, PhoneNumber ) z.toast(PhoneNumber + '手机号,获取不到验证码') continue z.heartbeat() print('验证码:'+code) logger.info(numbers) logger.info('我是numbers------------------------------------------------') logger.info(numbers[0]['x02']) logger.info('我是numbers[0][x02]----------------------') x_02 = int( numbers[0]['x02'] ) + 1 para = {"phoneNumber": PhoneNumber, 'x_02': x_02, 'x_19': 'WXRegister'} self.repo.PostInformation( saveCate, para ) d(text='请输入验证码').click() d(text='请输入验证码').click() z.input(code) d(text='下一步', className='android.widget.Button').click() z.sleep(10) z.heartbeat( ) while d(text='验证码不正确,请重新输入').exists: d(text='确定').click() d(className='android.widget.ScrollView').child(className='android.widget.LinearLayout',index=0).child(className='android.widget.LinearLayout',index=2).child( className='android.widget.LinearLayout',index=0).child(className='android.widget.EditText', index=1).click.bottomright() code = self.scode.GetVertifyCode(PhoneNumber, self.scode.WECHAT_REGISTER) self.scode.defriendPhoneNumber(PhoneNumber,self.scode.WECHAT_REGISTER) if code == '': self.repo.DeleteInformation( saveCate, PhoneNumber ) z.toast(PhoneNumber+'手机号,获取不到验证码') break z.sleep(8) print(code) d(text='请输入验证码').click() z.input(code) d(text='下一步', className='android.widget.Button').click() z.sleep(3) if d(textContains='你操作频率过快').exists: d(text='确定').click() break if d( textContains='看看手机通讯录' ).exists: d( text='是' ).click() para = {"phoneNumber": PhoneNumber,'x_05': 'YES', 'x_19': 'WXRegister', 'x_20':d.server.adb.device_serial(), 'x_26': '登陆状态YSE'} self.repo.PostInformation( saveCate, para ) z.sleep(15) z.heartbeat( ) if d( textContains='如果这不是你本人操作,你的短信内容已经泄露。请检查手机是否被植入木马导致短信被转发。' ).exists: d( text='确定' ).click( ) continue if d(textContains='当前手机号一个月内已成功注册微信号').exists: d(text='确定') self.repo.DeleteInformation( saveCate, PhoneNumber ) if d( textContains='操作频率' ).exists: d( text='确定' ).click( ) break z.sleep(2) n = 0 while True: z.sleep(5) if d(text='是我的,立刻登录').exists: n = n + 1 d(text='是我的,立刻登录').click() if n == 1: z.sleep(10) z.heartbeat( ) else: z.sleep(15) z.heartbeat( ) if d( textContains='看看手机通讯录' ).exists: d( text='是' ).click() number_info = self.repo.GetInformation(saveCate,PhoneNumber) logger.info(number_info) logger.info('number_info--------------------------------------------') if number_info[0]['x05'] is None: para = {"phoneNumber": PhoneNumber, 'x_05': 'YES', 'x_19': 'WXRegister', 'x_26': '登陆状态YSE','x_20': d.server.adb.device_serial( )} else: para = {"phoneNumber": PhoneNumber,'x_05': 'YES', 'x_19': 'WXRegister', 'x_26': '登陆状态YSE','x_20':d.server.adb.device_serial()} self.repo.PostInformation( saveCate, para ) z.sleep(10) z.heartbeat( ) if d(textContains='如果这不是你本人操作,你的短信内容已经泄露。请检查手机是否被植入木马导致短信被转发。' ).exists: d(text='确定' ).click( ) break if d(text='声纹验证').exists: d(className='android.widget.ImageView', description='返回').click() x_27 = int( numbers[0]['x27'] ) + 1 para = {"phoneNumber": PhoneNumber, 'x_01': "exist", 'x_03': nowTime, 'x_19': 'WXRegister', 'x_27': x_27} self.repo.PostInformation( saveCate, para ) break if d(textContains='非法软件注册').exists: d(text='取消').click() self.repo.DeleteInformation(saveCate, PhoneNumber) break if d(text='该帐号长期未登录,为保护帐号安全,系统将其自动置为保护状态。点击确定按钮可立即激活帐号解除保护状态。').exists: d(text='取消').click() self.repo.DeleteInformation( saveCate, PhoneNumber ) break if d(textContains='帐号有异常').exists: d(text='取消').click() self.repo.DeleteInformation( saveCate, PhoneNumber ) break if d(textContains='限制登录').exists: d(text='取消').click() self.repo.DeleteInformation( saveCate, PhoneNumber ) break if d(textContains='长期没有登陆,帐号已被收回').exists: d(text='取消').click() self.repo.DeleteInformation( saveCate, PhoneNumber ) break if d(textContains='相同手机号不可频繁重复注册微信帐号').exists: d(text='确定').click() self.repo.DeleteInformation( saveCate, PhoneNumber ) break if d(textContains='你操作频率过快').exists: d(text='确定').click() break if d(textContains='是否立即验证').exists: d(text='确定').click() z.sleep(10) z.heartbeat( ) if d(text='确认登录').exists: self.repo.DeleteInformation( saveCate, PhoneNumber ) if n==1: self.repo.DeleteInformation( saveCate, PhoneNumber ) else: para = {"phoneNumber": PhoneNumber, 'x_01': "exist", 'x_03': nowTime, 'x_19': 'WXRegister'} self.repo.PostInformation( saveCate, para ) break if d(text='设置密码').exists: d(className='android.widget.LinearLayout', index=2).child(className='android.widget.EditText', index=1).click() z.input(password) z.sleep(2) d(className='android.widget.LinearLayout', index=4).child(className='android.widget.EditText', index=1).click() z.input(password) d(text='完成').click() z.sleep(15) z.heartbeat( ) if d(textContains='看看手机通讯录').exists: d( text='是' ).click( ) para = {"phoneNumber": PhoneNumber,'x_05': 'YES', 'x_19': 'WXRegister','x_20':d.server.adb.device_serial(),'x_21':password, 'x_26': '登陆状态YSE'} self.repo.PostInformation( saveCate, para ) z.sleep(15) z.heartbeat( ) if d( textContains='你的操作频繁过快,请稍后重试' ).exists: d( text='确定' ).click( ) para = {"phoneNumber": PhoneNumber,'x_05': 'YES', 'x_19': 'WXRegister', 'x_20': d.server.adb.device_serial( ), 'x_21': password, 'x_26': '登陆状态YSE'} self.repo.PostInformation( saveCate, para ) z.sleep( 15 ) z.heartbeat( ) if d( textContains='如果这不是你本人操作,你的短信内容已经泄露。请检查手机是否被植入木马导致短信被转发。' ).exists: d( text='确定' ).click( ) break if d(text='验证身份').exists: z.sleep(3) x_value = '' if d( description='通过扫码验证身份', className='android.view.View', index=1 ).exists: self.repo.DeleteInformation( saveCate, PhoneNumber ) break if d( descriptionContains='验证失败', className='android.view.View' ).exists: d( descriptionContains='关闭页面', className='android.view.View',index=3).click( ) if x_value != '': para = {"phoneNumber": PhoneNumber, 'x_01': "exist", "x_key": x_value, 'x_19': 'WXRegister'} self.repo.PostInformation( saveCate, para ) break if d( descriptionContains='验证通过', className='android.view.View' ).exists: d( descriptionContains='关闭页面', className='android.view.View',index=3).click( ) if x_value == '': x_value = 'YSE' para = {"phoneNumber": PhoneNumber, 'x_01': "exist", 'x_05': x_value, 'x_19': 'WXRegister'} self.repo.PostInformation( saveCate, para ) break for i in range( 1, 6 ): if i != 1: yibushiObj_HTC = d( className='android.widget.RadioButton', descriptionContains='以上都不是',index=6 ) if not yibushiObj_HTC.exists: break if d( description='请选择你最近一次登录设备的名称' ).exists: if d( className='android.widget.RadioButton', index=1 ).exists: numberInfo = self.repo.GetInformation( information_cate_id, number ) if numberInfo[0]['x07'] is not None: x0_val = d( className='android.widget.RadioButton', index=1 ).info[ 'contentDescription'].replace('\n\n','') x1_val = d( className='android.widget.RadioButton', index=2 ).info[ 'contentDescription'].replace('\n\n','') x2_val = d( className='android.widget.RadioButton', index=3 ).info[ 'contentDescription'].replace('\n\n','') x3_val = d( className='android.widget.RadioButton', index=4 ).info[ 'contentDescription'].replace('\n\n','') x4_val = d( className='android.widget.RadioButton', index=5 ).info[ 'contentDescription'].replace('\n\n','') data = {'cate_id': saveCate, 'phoneNumber': PhoneNumber, 'x_07': x0_val,'x_08': x1_val, 'x_09': x2_val, 'x_10': x3_val, 'x_11': x4_val} logger.info(data) logger.info('data----------------------------------------------------') trues = repo.GetTrueAnswer(data) logger.info( trues ) logger.info( 'trues----------------------------------------------------' ) true = trues[0]['x07'] logger.info( true ) logger.info( 'true----------------------------------------------------' ) trues = repo.GetTrueAnswer(data) true = trues[0]['x07'] if true == x0_val: x_value = x0_val d( className='android.widget.RadioButton', index=1 ).click( ) d( className='android.view.View', descriptionContains='下一步' ).click( ) # 下一步 z.sleep( 2 ) if true == x1_val: x_value = x1_val d( className='android.widget.RadioButton', index=2 ).click( ) d( className='android.view.View', descriptionContains='下一步' ).click( ) # 下一步 z.sleep( 2 ) if true == x2_val: x_value = x2_val d( className='android.widget.RadioButton', index=3 ).click( ) d( className='android.view.View', descriptionContains='下一步' ).click( ) # 下一步 z.sleep( 2 ) if true == x3_val: x_value = x3_val d( className='android.widget.RadioButton', index=4 ).click( ) d( className='android.view.View', descriptionContains='下一步' ).click( ) # 下一步 z.sleep( 2 ) if true == x4_val: x_value = x4_val d( className='android.widget.RadioButton', index=5 ).click( ) d( className='android.view.View', descriptionContains='下一步' ).click( ) # 下一步 z.sleep( 2 ) if true is None: d.click(410, 540) d.click(410, 640) z.sleep(2) else: number = random.randint( 1, 5 ) if number == 1: x_value = d( className='android.widget.RadioButton', index=1 ).info[ 'contentDescription'].replace('\n\n','') d( className='android.widget.RadioButton', index=1 ).click( ) d( className='android.view.View', descriptionContains='下一步' ).click( ) # 下一步 z.sleep( 2 ) if number == 2: x_value = d( className='android.widget.RadioButton', index=2 ).info[ 'contentDescription'].replace('\n\n','') d( className='android.widget.RadioButton', index=2 ).click( ) d( className='android.view.View', descriptionContains='下一步' ).click( ) # 下一步 z.sleep( 2 ) if number == 3: x_value = d( className='android.widget.RadioButton', index=3 ).info[ 'contentDescription'].replace('\n\n','') d( className='android.widget.RadioButton', index=3 ).click( ) d( className='android.view.View', descriptionContains='下一步' ).click( ) # 下一步 z.sleep( 2 ) if number == 4: x_value = d( className='android.widget.RadioButton', index=4 ).info[ 'contentDescription'].replace('\n\n','') d( className='android.widget.RadioButton', index=4 ).click( ) d( className='android.view.View', descriptionContains='下一步' ).click( ) # 下一步 z.sleep( 2 ) if number == 5: x_value = d( className='android.widget.RadioButton', index=5 ).info[ 'contentDescription'].replace('\n\n','') d( className='android.widget.RadioButton', index=5 ).click( ) d( className='android.view.View', descriptionContains='下一步' ).click( ) # 下一步 z.sleep( 2 ) else: d.click( 410, 540 ) d.click( 410, 640 ) z.sleep( 2 ) elif d( description='请从下面头像中选出两位你的好友' ).exists: d( className='android.widget.ImageView', description='返回' ).click( ) break else: d.click( 410, 540 ) d.click( 410, 640 ) z.sleep( 2 ) x_04_number = self.repo.GetInformation( information_cate_id, PhoneNumber ) logger.info(PhoneNumber) logger.info(x_04_number) logger.info('我是x_04_number--------------------------------------------------------') x_04 = int( x_04_number[0]['x04'] ) + 1 para = {"phoneNumber": PhoneNumber, 'x_04': x_04, 'x_19': 'WXRegister'} self.repo.PostInformation( saveCate, para ) z.sleep(5) if d(text='确认登录').exists: para = {"phoneNumber": PhoneNumber, 'x_01': "exist", 'x_03': nowTime, 'x_19': 'WXRegister'} self.repo.PostInformation( saveCate, para ) break if d(descriptionContains='验证失败', className='android.view.View').exists: d(descriptionContains='关闭页面', className='android.view.View',index=3).click() if x_value == '': para = {"phoneNumber": PhoneNumber, 'x_01': "exist", 'x_05': '空', 'x_19': 'WXRegister'} else: para = {"phoneNumber": PhoneNumber, 'x_01': "exist", "x_key": x_value, 'x_19': 'WXRegister'} self.repo.PostInformation( saveCate, para ) logger.info(para) if d(descriptionContains='验证通过', className='android.view.View').exists: d(descriptionContains='关闭页面', className='android.view.View',index=3).click() if x_value == '': x_value = 'YSE' para = {"phoneNumber": PhoneNumber, 'x_01': "exist", 'x_05':x_value , 'x_19': 'WXRegister'} self.repo.PostInformation( saveCate, para ) logger.info(para) continue
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版TIM修改我的名片夹加好友模块" ) 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( "网络通畅。开始执行: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( ) 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( 8 ) 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 z.heartbeat( ) z.sleep( 8 ) # while True: # 由于网速慢或手机卡可能误点 # if d( index=1, className='android.widget.ImageView' ).exists: # # d(index=0,className="android.widget.RelativeLayout").child( index=1,resourceId="com.tencent.tim:id/name", className='android.widget.ImageView' ).click() # z.heartbeat( ) # d( index=2, className="android.widget.FrameLayout" ).child( index=0, # className="android.widget.RelativeLayout" ).click( ) # # d( index=2, className="android.widget.FrameLayout" ).child( index=0,className="android.widget.RelativeLayout" ).child( index=1, className='android.widget.ImageView' ).click() # if d( text="加好友" ).exists: # 由于网速慢或手机卡可能误点 # d( text="加好友" ).click( ) # d( text="返回", className="android.widget.TextView" ).click( ) # d( index=2, className="android.widget.FrameLayout" ).child( index=0, # className="android.widget.RelativeLayout" ).click( ) # z.sleep( 3 ) # if d( text='我的名片夹', resourceId='com.tencent.tim:id/name', className="android.widget.TextView" ).exists: # z.heartbeat( ) # d( text='我的名片夹', resourceId='com.tencent.tim:id/name' ).click( ) # break # z.sleep( 1 ) if d(index=1,className="android.widget.RelativeLayout").child(index=0,className="android.widget.ImageView").exists: d( index=1, className="android.widget.RelativeLayout" ).child( index=0, className="android.widget.ImageView" ).click() z.sleep(1) if d(description="名片夹").exists: d( description="名片夹" ).click() z.sleep(0.5) else: if d( index=1, className="android.widget.RelativeLayout" ).child( index=0,className="android.widget.ImageView" ).exists: d( index=1, className="android.widget.RelativeLayout" ).child( index=0,className="android.widget.ImageView" ).click( ) z.sleep( 1 ) if d( description="名片夹" ).exists: d( description="名片夹" ).click( ) 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: z.heartbeat( ) d( text="设置我的名片" ).click() z.sleep( 1 ) d(text="添加我的名片").click() z.sleep(3) else: if d(index=0,description="我的名片",className="android.widget.FrameLayout").exists: d( index=0, description="我的名片", className="android.widget.FrameLayout" ).click() z.sleep(1) z.heartbeat() if d(text="编辑",resourceId="com.tencent.tim:id/ivTitleBtnRightText").exists: d( text="编辑", resourceId="com.tencent.tim:id/ivTitleBtnRightText" ).click() z.sleep(0.5) if d(text="重新扫描",className="android.widget.TextView").exists: d( text="重新扫描", className="android.widget.TextView" ).click() z.sleep(1) while d(index=3,className="android.widget.Button").exists: z.heartbeat() d( index=3, className="android.widget.Button" ).click() z.sleep( 5 ) 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: obj.click( ) z.sleep( 6 ) d( text='确定', resourceId='com.tencent.tim:id/name' ).click( ) num = 0 #休眠次数 while not d( text='完成' ).exists: if num==2: break else: z.sleep(2) num = num +1 z.heartbeat( ) if d(index=0,className="android.widget.ImageButton").exists and not d(text="完成").exists: z.sleep(1) z.heartbeat() # d( index=0, className="android.widget.ImageButton" ).click() 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: 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: # d( text="重选" ).click( ) # d( index=0, className="com.tencent.widget.GridView", # resourceId="com.tencent.tim:id/photo_list_gv" ).child( index=0, # className="android.widget.RelativeLayout" ).click( ) # d( text='确定', resourceId='com.tencent.tim:id/name' ).click( ) # while d( text='正在识别' ).exists: # time.sleep( 2 ) z.sleep(2) while d(text="完成").exists: d(text="完成").click() z.sleep( 1 ) 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 registerWithSlot(self,d,z,args): cateId = args['repo_cate_id'] self.scode = smsCode(d.server.adb.device_serial()) d.server.adb.cmd("shell", "pm clear com.tencent.tim").communicate() # 清除缓存 d.server.adb.cmd("shell","am start -n com.tencent.tim/com.tencent.mobileqq.activity.SplashActivity").communicate() # 拉起来 self.swipe(d) if d(className='android.widget.Button', text='新用户').exists: d(className='android.widget.Button', text='新用户').click() time.sleep(2) phoneNumber = self.scode.GetPhoneNumber(self.scode.QQ_REGISTER) print '手机号' print phoneNumber print '============' time.sleep(2) d(text='请输入你的手机号码', className='android.widget.EditText').set_text(phoneNumber) time.sleep(1) d(text='下一步', className='android.widget.Button').click() time.sleep(2) for j in range(0, 15): time.sleep(1) if d(text='请输入短信验证码', className='android.widget.EditText').exists: break if d(text='分享', className='android.widget.TextView').exists: d(text='填写手机号码', className='android.widget.TextView').click() d(text='下一步', className='android.widget.Button').click() continue if j == 14: d.server.adb.cmd("shell", "am broadcast -a com.zunyun.zime.toast --es msg \"TIM验证码跳转失败\"").communicate() return False time.sleep(1) while 1: if d(text='请输入短信验证码', className='android.widget.EditText').exists: break else: time.sleep(1) vertifyCode = self.scode.GetVertifyCode(phoneNumber, self.scode.QQ_REGISTER) # 获取验证码 if vertifyCode == "": if d(text='重新发送', className='android.widget.TextView').exists: d(text='重新发送', className='android.widget.TextView').click() time.sleep(2) print '重新发送' vertifyCode = self.scode.GetVertifyCode(phoneNumber, self.scode.QQ_REGISTER) if vertifyCode == '': self.scode.ReleasePhone(phoneNumber, self.scode.QQ_REGISTER) print '验证码获取失败' return False print vertifyCode self.scode.defriendPhoneNumber(phoneNumber, self.scode.QQ_REGISTER) d(text='请输入短信验证码', className='android.widget.EditText').set_text(vertifyCode) time.sleep(1) for i in range(0,3): if d(text='下一步', className='android.widget.Button').exists: d(text='下一步', className='android.widget.Button').click() else: time.sleep(1) while 1: if d(text='绑定新QQ号码', className='android.widget.TextView').exists: d(text='绑定新QQ号码', className='android.widget.TextView').click() break elif d(text='设置昵称', className='android.widget.TextView').exists: break else: time.sleep(1) nickNameList = self.repo.GetMaterial(cateId, 0, 1) nickName = nickNameList[0]["content"] nickName = nickName.encode("utf-8") d(resourceId='com.tencent.tim:id/name', className='android.widget.EditText').click() z.input(nickName) d(text='完成', resourceId='com.tencent.tim:id/name').click() obj = d(resourceId='com.tencent.tim:id/name',className='android.widget.TextView',index=1).info info = obj['text'] #要保存的qq号 d(text='登录', resourceId='com.tencent.tim:id/name').click() time.sleep(2) return info