def get_crawl_max_count(): config = MonitorConfig() crawl_max_count = config.get_value('appiumConfig', 'crawl_max_count') Logger.println(f"【crawl_max_count={crawl_max_count}】") if not crawl_max_count: return '100' return crawl_max_count
def getAppiumConfig(): deviceId = '' deviceVersion = '' try: # 读取设备 id # 正则表达式匹配出 id 信息 deviceId = getDeviceid()[0] # readDeviceId = list(os.popen('adb devices').readlines()) # deviceId = re.findall(r'^\w*\b', readDeviceId[1])[0] # 读取设备系统版本号 deviceAndroidVersion = list( os.popen(f'adb -s {deviceId} shell getprop ro.build.version.release').readlines()) deviceVersion = re.findall(r'^\w*\b', deviceAndroidVersion[0])[0] except Exception as e: Logger.println(f"get deviceAndroidVersion Exception【e={e}】") appiumConfig = { "platformName": "Android", "deviceName": deviceId, "udid": deviceId, "platformVersion": deviceVersion, "appPackage": "com.tencent.mm", "appActivity": "com.tencent.mm.ui.LauncherUI", "noReset": "True", "unicodeKeyboard": "True", "resetKeyboard": "True" } Logger.println(f"【appium_config={appiumConfig}】") return appiumConfig
def get_addfriend_inte_seconds(): config = MonitorConfig() addfriend_inte_seconds = config.get_value('appiumConfig', 'addfriend_inte_seconds') Logger.println(f"【get_addfriend_inte_seconds={addfriend_inte_seconds}】") if not addfriend_inte_seconds: return '3600' return addfriend_inte_seconds
def deletePictures(): Logger.println( f"【deletePictures===========开始删除手机图片缓存========================】") deviceId = WxConfig.getAppiumConfig()["deviceName"] if deviceId: execute_adb_shell('shell rm -r /sdcard/Pictures/WeiXin', deviceId=deviceId) Logger.println(f"【deletePictures===========删除图片缓存执行完成=================】")
def files_token(type='file', count=1): res = requests.get(f"http://internal.zuker.im/files/token?type={type}&count={count}") res_json = res.json() jsonstr = json.dumps(res_json, indent=4, ensure_ascii=False) Logger.println(f"【files_token().jsonstr={jsonstr}】") if res_json['code'] == 0: return res_json['result'] else: return None
def getNickName(self, driver=None): driver = driver or self.driver try: nickname = driver.find_element_by_id( 'com.tencent.mm:id/e3x').get_attribute("text") Logger.println(f"【getNickName().nickname={nickname}】") return nickname except: pass
def putItems(array): try: for index, item in enumerate(array): if wx_stop.stopFlag: break put_item(index, item) except Exception as e: Logger.println(f"【e={e}】") pass
def get_region_by_page(page): item = {"page": page, "page_size": pageSize} res = requests.get("http://internal.zuker.im/department", params=item) res_json = res.json() if res_json['code'] == 0: total_page = res_json['result']['total_page'] items = res_json['result']['items'] return total_page, items else: Logger.println(f"【接口异常】{res_json}") return None
def main(): Exceptionhandler.main() linesStr = list(os.popen('adb version').readlines()) for line in linesStr: Logger.println(f"{line}") app = QtWidgets.QApplication(sys.argv) gui = MainUi() gui.editConfigDialog() gui.show() sys.exit(app.exec_())
def excel2array(xlsPath, sheet_name=None): arrays = [] params_keys = get_xls_heads(xlsPath, sheet_name) Logger.println(f"【excel2array().params_keys={params_keys}】") params_values = get_xls(xlsPath, sheet_name) for values in params_values: param = {} for index in range(len(params_keys)): param[params_keys[index]] = values[index] arrays.append(param) return arrays
def getPhone(self, driver=None): driver = driver or self.driver try: xpath = driver.find_element_by_id('com.tencent.mm:id/ec9') if xpath: phone = xpath.find_element_by_xpath( '//android.widget.TextView').get_attribute("text") return phone except Exception as e: Logger.println(f"【getPhone().e={e}】") pass
def uploadItem(item): try: Logger.println(f"uploadItem【item={item}】") res = requests.post("http://internal.zuker.im/moment", json=item) res_json = res.json() # jsonstr = json.dumps(res_json, indent=4, ensure_ascii=False) # Logger.println(f"【uploadItems().res={jsonstr}】") if res_json['code'] == 20003: return '20003' except Exception as e: Logger.println(f"【e={e}】") pass
def scrollElement(self, origin_el: WebElement, destination_el: WebElement): try: size = self.screen_size x1 = int(size[0] * 0.5) # 起始x坐标 location_start = origin_el.location location_end = destination_el.size y_ = location_start['y'] height_ = location_end['height'] + 40 if y_ >= height_: self.driver.flick(x1, y_, x1, height_) except Exception as e: Logger.println(f"【scrollElement().e={e}】")
def rows_write(ws, row_x, rows): Logger.println(f"【rows_write().rows={rows}】") style.alignment.wrap = 1 # 自动换行 for num, value in enumerate(rows): value = value if value != None else '' pattern = re.compile( r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+') url = re.findall(pattern, value) if len(url) > 0: s = str(url[0]) if (len(s) <= 255): value = xlwt.Formula('HYPERLINK("%s","链接详情")' % s) ws.write(row_x, num, value, style)
def waitContentTextById(self, id, driver=None): driver = driver or self.driver try: by_id = self.wait_find_element(By.ID, id, driver) if by_id: content = by_id.get_attribute("text") if content is None: pass Logger.println(content) return content except: return None pass
def need_upload_photo_item(item): try: Logger.println(f"【item={item}】") res = requests.get("http://internal.zuker.im/moment", params=item) res_json = res.json() # jsonstr = json.dumps(res_json, indent=4, ensure_ascii=False) # Logger.println(f"【need_upload_photo_item().res={jsonstr}】") if res_json['code'] == 0: return not res_json['result']['file_ids'] else: return False except Exception as e: Logger.println(f"【e={e}】") return False
def export(): full_dir = FilePathUtil.get_full_dir('wxfriend', 'pic') weixinPath = FilePathUtil.get_full_dir('wxfriend', 'pic', 'WeiXin') if os.path.exists(weixinPath): try: shutil.rmtree(weixinPath) except: pass deviceId = WxConfig.getAppiumConfig()["deviceName"] if deviceId: execute_adb_shell(f'pull /sdcard/Pictures/WeiXin/ {full_dir}', deviceId=deviceId) else: Logger.println(f"【().未找到设备】")
def appendData(full_dir, items): # !/usr/bin/env python # -*- coding:utf-8 -*- from xlrd import open_workbook from xlutils.copy import copy r_xls = open_workbook(full_dir, encoding_override=ENCODING) # 读取excel文件 row = r_xls.sheets()[0].nrows # 获取已有的行数 excel = copy(r_xls) # 将xlrd的对象转化为xlwt的对象 table = excel.get_sheet(0) # 获取要操作的sheet for index, item in enumerate(items): Logger.println(f"【write_excel().index={row + index}】") values = list(item.values()) for sub_index, sub_item in enumerate(values): table.write(row + index, sub_index, sub_item) # 括号内分别为行数、列数、内容 excel.save(full_dir) # 保存并覆盖文件
def save_screenshot(self, content_element, dir, file_name): """ :param content_element: :param dir: :param file_name: :return: """ try: full_dir = FilePathUtil.get_full_dir("wxfriend", "pic", dir) if not os.path.exists(full_dir): os.mkdir(full_dir) content_element.screenshot(FilePathUtil.get_full_dir(full_dir, file_name)) return True except Exception as e: Logger.println(f"【save_screenshot().e={e}】") return False
def get_text_elment(self, txitem, text_type='text'): attribute = txitem.get_attribute(text_type) if attribute and str.strip(attribute): Logger.println(f"【找到{text_type}={attribute}") content = {} content[text_type] = attribute try: resourceId = txitem.get_attribute("resource-id") content['resourceId'] = resourceId class_name = txitem.get_attribute('className') content['className'] = class_name except: pass return content else: return None
def write_excel(filename, worksheet_name, items): ''' :return: ''' workbook = xlwt.Workbook(encoding='utf-8') worksheet = workbook.add_sheet(worksheet_name) if len(items) > 0: keys = list(items[0].keys()) Logger.println(f"【write_excel().keys={keys}】") title_write(worksheet, keys) excel_items = [] for item in items: values = list(item.values()) excel_items.append(values) data_write(worksheet, excel_items) workbook.save(filename)
def uploadItems(array): try: for index, item in enumerate(array): if wx_stop.stopFlag: break Logger.println(f"【({index}).item={item}】") res = requests.post("http://internal.zuker.im/moment", json=item) res_json = res.json() # jsonstr = json.dumps(res_json, indent=4, ensure_ascii=False) # Logger.println(f"【uploadItems({index}).res={jsonstr}】") if res_json['code'] == 20003: put_item(index, item) return '20003' except Exception as e: Logger.println(f"【e={e}】") pass
def classify(full_dir): # 2.excel获取朋友圈所有说说的md5以及图片的保存起始时间值 Logger.println(f"【().full_dir={full_dir}】") array = excel_util.excel2array(full_dir) count = 0 for index, item in enumerate(array): content_md5 = item['content_md5'] start = int(item['start']) end = int(item['end']) count = int(item['count']) if count > 0: # Logger.println(f"【classify().item={item}】") # 3.根据起始时间值以及md5值分类好图片 full_dir = FilePathUtil.get_full_dir('wxfriend', 'pic', 'WeiXin') des_dir = FilePathUtil.get_full_dir('wxfriend', 'pic', 'WeiXinCopy', content_md5) files = FilePathUtil.move_files_by_time(full_dir, des_dir, start, end)
def swipe_to_top(self): while True: source = self.driver.page_source """ 向上滑动 :param driver: :param _time: :return: """ size = self.screen_size x1 = int(size[0] * 0.5) # 起始x坐标 y1 = int(size[1] * 0.8) # 起始y坐标 y2 = int(size[1] * 0.5) # 终点y坐标 self.driver.swipe(x1, y2, x1, y1, 300) sleep(1.5) current_source = self.driver.page_source if source == current_source: Logger.println(f"【swipe_to_top().已经滑动到顶部了】") break
def batch_export_upload(full_dir): global upload_md5_pic_position upload_md5_pic_position = 0 global index start_time = int(time.time()) config = MonitorConfig() sleeptime = 3 * 60 value = config.get_value('appiumConfig', 'batch_pic_seconds') if value: sleeptime = int(value) Logger.println( f"【====================开始批量导出并上传图片batch_pic_seconds={sleeptime}=======================】") while True: time.sleep(5) time_start_time = int(time.time()) - start_time if sleeptime - time_start_time > 0: Logger.println( f"=================【{sleeptime - time_start_time}秒后执行第={index}个批量导出并上传图片任务===================】") if time_start_time >= sleeptime: index = index + 1 break time.sleep(5) PicClassfyUtil.classify_from(full_dir) excel_full_dir = FilePathUtil.get_lastmodify_file( FilePathUtil.get_full_dir("wxfriend", "excel", "pic")) main(excel_full_dir) if wx_stop.stopFlag: Logger.println(f"【===================批量导出并上传图片任务停止=================】") return batch_export_upload(full_dir)
def downloadFile(name, url, signals: pyqtSignal = None): headers = {'Proxy-Connection': 'keep-alive'} r = requests.get(url, stream=True, headers=headers) length = float(r.headers['content-length']) f = open(name, 'wb') count = 0 count_tmp = 0 time1 = time.time() for chunk in r.iter_content(chunk_size=512): if chunk: f.write(chunk) count += len(chunk) if time.time() - time1 > 1: p = count / length * 100 speed = (count - count_tmp) / 1024 / 1024 / 2 count_tmp = count Logger.println(f'已下载 {formatFloat(p)}% (下载速度:{formatFloat(speed)}M/s)') time1 = time.time() if signals: signals.emit(f'已下载 {formatFloat(p)}% (下载速度:{formatFloat(speed)}M/s)') signals.emit(f'已下载 {formatFloat(100)}%') f.close()
def exportPhone(full_dir): array = excel2array(full_dir) datas = [] phones = [] for item in array: new_item = {} txt = get_phone_from_txt(item['描述']) if txt in phones: continue else: if txt: new_item['描述'] = item['描述'] new_item['手机'] = txt datas.append(new_item) phones.append(txt) date = time_util.now_to_date('%Y%m%d_%H') des_dir = FilePathUtil.get_full_dir("wxfriend", "excel", f"手机号列表{date}.xlsx") write_excel(des_dir, '手机号列表', datas) Logger.println(f"【main().检测到重复电话号码={len(array) - len((datas))}条】") Logger.println(f"【main().获取到电话号码={len((datas))}条】") FilePathUtil.startfile(des_dir) return des_dir
def put_img(md5, file_ids): ''' 上传图片ids :param md5: :param file_ids: :return: ''' item = {'content_md5': md5, 'file_ids': file_ids} Logger.println(f"【put_img().item={item}】") try: res = requests.put("http://internal.zuker.im/moment", json=item) res_json = res.json() # jsonstr = json.dumps(res_json, indent=4, ensure_ascii=False) # Logger.println(f"put_img【res={jsonstr}】") if res_json['code'] == 0: return True else: return False except Exception as e: Logger.println(f"Exception is【{e}】") return False
def run(self): Logger.init(self.signals) try: Logger.println(f"【run()开始停止】") wx_stop.stopFlag = True Logger.println(f"【run()任务已经停止】") except Exception as e: Logger.println(f"【run().e={e}】")
def run(self): Logger.init(self.signals) try: Logger.println(f"【run()开始恢复输入法】") PicClassfyUtil.setImiDefault() Logger.println(f"【run()已经恢复输入法】") except Exception as e: Logger.println(f"【run().e={e}】")