appium_mitmproxy_demo.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. # -*- codeing = utf-8 -*-
  2. # @Time : 2022/9/29 16:17
  3. # @Author : Clown
  4. # @File : appium_mitmproxy_demo.py
  5. # @Software : PyCharm
  6. import mitmproxy
  7. import csv
  8. import pandas
  9. import appium
  10. from appium import webdriver
  11. from appium.webdriver.common.appiumby import AppiumBy
  12. from appium.webdriver.common.touch_action import TouchAction
  13. import time
  14. import random
  15. def getSize(driver):
  16. """获取页面大小"""
  17. x = driver.get_window_size()['width']
  18. y = driver.get_window_size()['height']
  19. return(x, y)
  20. def swipeRight(driver):
  21. """向右滑动 - [x轴变动,y轴不变]"""
  22. l = getSize(driver)
  23. x1 = int(l[0] * 0.8)
  24. x2 = int(l[0] * 0.2)
  25. y = int(l[1] * 0.5)
  26. driver.swipe(x1, y, x2, y, 1000)
  27. def swipeLeft(driver):
  28. """向左滑动 - [x轴变动,y轴不变]"""
  29. l = getSize(driver)
  30. x1 = int(l[0] * 0.9)
  31. x2 = int(l[0] * 0.1)
  32. y = int(l[1] * 0.5)
  33. driver.swipe(x2, y, x1, y, 1000)
  34. def swipeDown(driver,y1):
  35. """向下滑动 - [x轴不变,y轴变动]"""
  36. l = getSize(driver)
  37. # y1 = int(l[1] * 0.5)
  38. # y2 = int(l[1] * 0.2)
  39. y2 = y1 - 630
  40. x_v = random.uniform(0.45,0.55)
  41. x = int(l[0] * (x_v)) # 329 --348
  42. x1 = int(l[0] * (x_v))
  43. # driver.swipe(x, y1, x1, y2)
  44. driver.swipe(x, y1, x1, y2)
  45. # time.sleep(random.uniform(0.5,1))
  46. def swipeUp(driver):
  47. """向上滑动 - [x轴不变,y轴变动]"""
  48. l = getSize(driver)
  49. y1 = int(l[1] * 0.9)
  50. y2 = int(l[1] * 0.2)
  51. x = int(l[0] * 0.5)
  52. driver.swipe(x, y2, x, y1, 1000)
  53. #计算器
  54. appPackage = 'com.oneplus.calculator'
  55. appActivity = 'com.oneplus.calculator.Calculator'
  56. #美团
  57. appPackage = 'com.sankuai.meituan'
  58. appActivity = 'com.meituan.android.pt.homepage.activity.MainActivity'
  59. # #美团外卖
  60. # appPackage = 'com.sankuai.meituan.takeoutnew'
  61. # appActivity = 'com.sankuai.waimai.business.page.homepage.MainActivity'
  62. addr = '徐汇区石龙路853号'
  63. city = '上海'
  64. app_dict = {
  65. "platformName": "Android",
  66. "platformVersion": '10.0.11',
  67. "automationName": "uiautomator2",
  68. "deviceName": '4b324dc1',
  69. "appPackage": appPackage,
  70. "appActivity": appActivity,
  71. "unicodeKeyboard": True,
  72. "resetKeyboard": True,
  73. "newCommandTimeout": 6000,
  74. "noReset": True
  75. }
  76. '''
  77. "platformName": "Android", # 系统环境
  78. "platformVersion": xxxx, #测试手机android版本
  79. "automationName": "uiautomator2", #自动化名称
  80. "deviceName": xxxxx, #设备名称 设备名称查看方式:win + r 输入cmd 使用adb命令【adb devices】获取
  81. "appPackage": xxxx, # 程序包名 程序包名查看方式:win + r 输入cmd 使用adb命令【adb shell "dumpsys window | grep mCurrent】(不要按回车),然后操作安卓设备清除所有在运行的app,打开需自动执行的app,在cmd界面按回车执行命令
  82. # 程序包名的操作对应输出的内容如:[
  83. # mCurrentUserId=0
  84. # mCurrentFocus=Window{408742e u0 com.oneplus.calculator/com.oneplus.calculator.Calculator} 【com.oneplus.calculator】为包名,【com.oneplus.calculator.Calculator】为程序入口名
  85. # mCurrent=[0,80][1080,2280]
  86. # mCurrentAppOrientation=SCREEN_ORIENTATION_UNSPECIFIED
  87. # mCurrentRotation=ROTATION_0]
  88. "appActivity": "xxxx, #程序入口类名
  89. "unicodeKeyboard": True, #使用自带输入法,输入中文时填True
  90. "resetKeyboard": True, #执行程序恢复原来输入法
  91. "newCommandTimeout": 6000,
  92. "noReset": true #保存session状态,不重置app
  93. '''
  94. driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',app_dict)
  95. driver.update_settings({'waitForIdleTimeout': 100})
  96. # 设置缺省等待时间
  97. driver.implicitly_wait(10)
  98. # driver.find_element_by_accessibility_id('外卖').click()
  99. driver.find_element(AppiumBy.ACCESSIBILITY_ID,'外卖').click()
  100. try:
  101. # driver.find_element_by_accessibility_id('关闭').click()
  102. driver.find_element (AppiumBy.ACCESSIBILITY_ID, '关闭').click ()
  103. except:
  104. pass
  105. # driver.find_element_by_accessibility_id('全部分类').click()
  106. # driver.find_element_by_accessibility_id('com.sankuai.meituan:id/actionbar_txt').click()
  107. #点击顶部 定位
  108. driver.find_element(AppiumBy.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.RelativeLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.TextView').click()
  109. #点击收货地址搜索
  110. driver.find_element(AppiumBy.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.EditText').click()
  111. #点击城市定位
  112. driver.find_element(AppiumBy.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.TextView[2]').click()
  113. #点击城市搜索框并输入城市关键词
  114. driver.find_element(AppiumBy.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.EditText').click()
  115. driver.find_element(AppiumBy.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.EditText').send_keys(city)
  116. #选择首个匹配的城市
  117. driver.find_element(AppiumBy.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.view.ViewGroup[3]/android.view.ViewGroup[1]/android.widget.ScrollView/android.view.ViewGroup/android.view.ViewGroup[2]/android.widget.TextView').click()
  118. #点击收货地址搜索并输入具体地址
  119. driver.find_element(AppiumBy.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.EditText').click()
  120. driver.find_element(AppiumBy.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.EditText').send_keys(addr)
  121. #选择首个匹配的地址
  122. driver.find_element(AppiumBy.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.support.v7.widget.RecyclerView/android.widget.LinearLayout[1]/android.widget.LinearLayout').click()
  123. #选择美食
  124. try:
  125. # driver.find_element_by_accessibility_id('美食').click()
  126. driver.find_element (AppiumBy.ACCESSIBILITY_ID, '美食').click ()
  127. except:
  128. driver.find_element(AppiumBy.XPATH,'//android.widget.RelativeLayout[@content-desc="美食"]').click()
  129. #点击综合排序
  130. driver.find_element(AppiumBy.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.support.v7.widget.RecyclerView/android.widget.LinearLayout/android.support.v4.view.ViewPager/android.widget.FrameLayout/android.support.v7.widget.RecyclerView/android.widget.FrameLayout[1]/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.TextView').click()
  131. #点击距离优先
  132. driver.find_element(AppiumBy.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.support.v7.widget.RecyclerView/android.widget.LinearLayout/android.support.v4.view.ViewPager/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout[2]/android.widget.RelativeLayout/android.widget.RelativeLayout/android.widget.FrameLayout[2]/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.ListView/android.widget.RelativeLayout[3]').click()
  133. long = 0
  134. page = 1
  135. while long <= 2:
  136. print(f'-------{page}页--------')
  137. y_p = 2044
  138. for n in range(1,8):
  139. try:
  140. # n = 2
  141. main_path = f'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.support.v7.widget.RecyclerView/android.widget.LinearLayout/android.support.v4.view.ViewPager/android.widget.FrameLayout/android.support.v7.widget.RecyclerView/android.widget.FrameLayout[{n}]'
  142. #'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.support.v7.widget.RecyclerView/android.widget.LinearLayout/android.support.v4.view.ViewPager/android.widget.FrameLayout/android.support.v7.widget.RecyclerView/android.widget.FrameLayout[2]
  143. fix_path = '/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout[3]'
  144. title = main_path + fix_path + '/android.widget.FrameLayout[1]/android.widget.TextView'
  145. mark = main_path + fix_path + '/android.widget.FrameLayout[2]/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.widget.TextView'
  146. month_order = main_path + fix_path + '/android.widget.FrameLayout[2]/android.widget.FrameLayout[1]/android.widget.TextView[1]'
  147. per_pp = main_path + fix_path + '/android.widget.FrameLayout[2]/android.widget.FrameLayout[1]/android.widget.TextView[2]'
  148. qisongfei = main_path + fix_path + '/android.widget.FrameLayout[3]/android.widget.FrameLayout/android.widget.TextView[1]'
  149. peisongfei = main_path + fix_path + '/android.widget.FrameLayout[3]/android.widget.FrameLayout/android.widget.TextView[2]'
  150. peisongTime = main_path + fix_path + '/android.widget.FrameLayout[3]/android.widget.TextView[1]'
  151. peisongDistent = main_path + fix_path + '/android.widget.FrameLayout[3]/android.widget.TextView[2]'
  152. tips = main_path + fix_path + '/android.widget.FrameLayout[4]/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.TextView'
  153. title1 = driver.find_element(AppiumBy.XPATH,title).text
  154. peisongDistent1 = driver.find_element(AppiumBy.XPATH,peisongDistent).text
  155. if n == 6:
  156. img = main_path
  157. elem = driver.find_element(AppiumBy.XPATH,tips)
  158. height = elem.size['height']
  159. y_p = elem.location['y'] + height
  160. except:
  161. title1 = '未知'
  162. peisongDistent1 = '未知'
  163. print('序号',n,'店名:',title1,'配送距离:',peisongDistent1,'Y轴:',y_p)
  164. try:
  165. long = int(peisongDistent1.split('.')[0])
  166. except:
  167. long = 0
  168. swipeDown(driver,y_p)
  169. page += 1
  170. '''
  171. import frida
  172. import sys
  173. def on_message(message, data):
  174. if message['type'] == 'send':
  175. print("[*] {0}".format(message['payload']))
  176. else:
  177. print(message)
  178. hookcode = """
  179. Java.perform(function () {
  180. var SwitchConfig = Java.use('mtopsdk.mtop.global.SwitchConfig')
  181. SwitchConfig.isGlobalSpdySwitchOpen.implementation = function () {
  182. return false;
  183. }
  184. });
  185. """
  186. process = frida.get_usb_device().attach('com.taobao.taobao')
  187. script = process.create_script(hookcode)
  188. script.on('message', on_message)
  189. script.load()
  190. sys.stdin.read()
  191. '''