pyxllib 0.3.28__tar.gz → 0.3.30__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyxllib-0.3.28/pyxllib.egg-info → pyxllib-0.3.30}/PKG-INFO +1 -1
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/ext/kq5034lib.py +131 -10
- pyxllib-0.3.30/pyxllib/ext/seleniumlib.py +63 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30/pyxllib.egg-info}/PKG-INFO +1 -1
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib.egg-info/SOURCES.txt +1 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ai/clientlib.py +11 -7
- {pyxllib-0.3.28 → pyxllib-0.3.30}/setup.py +1 -1
- {pyxllib-0.3.28 → pyxllib-0.3.30}/LICENSE +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/MANIFEST.in +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/README.md +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/algo/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/algo/disjoint.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/algo/geo.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/algo/intervals.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/algo/newbie.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/algo/pupil.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/algo/shapelylib.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/algo/specialist.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/algo/stat.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/algo/treelib.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/algo/unitlib.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/cv/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/cv/expert.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/cv/imfile.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/cv/imhash.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/cv/pupil.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/cv/rgbfmt.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/cv/trackbartools.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/cv/xlcvlib.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/cv/xlpillib.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/data/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/data/echarts.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/data/oss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/data/pglib.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/data/sqlite.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/data/sqllib.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/ext/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/ext/autogui/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/ext/autogui/autogui.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/ext/autogui/virtualkey.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/ext/demolib.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/ext/old.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/ext/qt.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/ext/tk.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/ext/unixlib.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/ext/utools.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/ext/webhook.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/ext/win32lib.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/file/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/file/docxlib.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/file/gitlib.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/file/movielib.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/file/newbie.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/file/onenotelib.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/file/packlib/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/file/packlib/zipfile.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/file/pdflib.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/file/pupil.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/file/specialist/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/file/specialist/dirlib.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/file/specialist/download.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/file/specialist/filelib.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/file/xlsxlib.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/prog/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/prog/deprecatedlib.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/prog/newbie.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/prog/pupil.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/prog/sitepackages.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/prog/specialist/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/prog/specialist/bc.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/prog/specialist/browser.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/prog/specialist/common.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/prog/specialist/datetime.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/prog/specialist/tictoc.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/prog/specialist/xllog.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/stdlib/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/stdlib/tablepyxl/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/stdlib/tablepyxl/style.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/stdlib/tablepyxl/tablepyxl.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/text/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/text/ahocorasick.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/text/latex/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/text/levenshtein.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/text/nestenv.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/text/newbie.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/text/pupil/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/text/pupil/common.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/text/pupil/xlalign.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/text/pycode.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/text/specialist/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/text/specialist/common.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/text/specialist/ptag.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/text/spellchecker.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/text/xmllib.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/xl.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib/xlcv.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib.egg-info/dependency_links.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib.egg-info/requires.txt +5 -5
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxllib.egg-info/top_level.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ai/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ai/specialist.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ai/torch_app.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ai/xlpaddle.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ai/xltorch.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/data/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/data/coco.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/data/datacls.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/data/datasets.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/data/icdar/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/data/icdar/deteval.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/data/icdar/icdar2013.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/data/icdar/iou.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/data/imtextline.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/data/labelme.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/data/removeline.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/data/specialist.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/eval/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/paddleocr.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/imaug/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/imaug/copy_paste.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/imaug/east_process.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/imaug/label_ops.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/imaug/make_border_map.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/imaug/operators.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/imaug/pg_process.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/imaug/randaugment.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/imaug/sast_process.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/lmdb_dataset.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/pgnet_dataset.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/pubtab_dataset.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/data/simple_dataset.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/ace_loss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/basic_loss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/center_loss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/cls_loss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/combined_loss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/det_basic_loss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/det_db_loss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/det_east_loss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/det_pse_loss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/det_sast_loss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/distillation_loss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/rec_aster_loss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/rec_att_loss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/rec_sar_loss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/rec_srn_loss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/losses/table_att_loss.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/metrics/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/metrics/cls_metric.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/metrics/det_metric.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/metrics/distillation_metric.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/metrics/e2e_metric.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/metrics/eval_det_iou.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/metrics/kie_metric.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/metrics/rec_metric.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/metrics/table_metric.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/architectures/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/architectures/base_model.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/backbones/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/heads/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/heads/cls_head.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/heads/self_attention.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/necks/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/necks/fpn.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/necks/rnn.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/transforms/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/transforms/stn.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/transforms/tps.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/optimizer/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/optimizer/learning_rate.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/optimizer/optimizer.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/optimizer/regularizer.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/postprocess/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/postprocess/db_postprocess.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/postprocess/east_postprocess.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/tools/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/tools/eval.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/tools/export_center.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/tools/export_model.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/tools/infer/predict_cls.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/tools/infer/predict_det.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/tools/infer/predict_rec.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/tools/infer/predict_system.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/tools/infer/utility.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/tools/infer_cls.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/tools/infer_det.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/tools/infer_e2e.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/tools/infer_kie.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/tools/infer_rec.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/tools/infer_table.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/tools/program.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/tools/test_hubserving.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/tools/train.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/tools/xlprog.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/be_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/en_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/french_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/german_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/it_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/table_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/te_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/dict90.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/en_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/gen_label.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/ic15_dict.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/iou.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/logging.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/network.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/profiler.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/save_load.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/stats.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppocr/utils/utility.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppstructure/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppstructure/predict_system.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppstructure/table/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppstructure/table/eval_table.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppstructure/table/matcher.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppstructure/table/predict_structure.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppstructure/table/predict_table.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppstructure/table/table_metric/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppstructure/table/table_metric/parallel.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppstructure/table/tablepyxl/style.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/ppstructure/utility.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/pyxlpr/xlai.py +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/requirements.txt +0 -0
- {pyxllib-0.3.28 → pyxllib-0.3.30}/setup.cfg +0 -0
@@ -20,6 +20,7 @@ import datetime
|
|
20
20
|
import math
|
21
21
|
import os
|
22
22
|
import re
|
23
|
+
import time
|
23
24
|
|
24
25
|
import fire
|
25
26
|
import pandas as pd
|
@@ -28,10 +29,12 @@ from tqdm import tqdm
|
|
28
29
|
from pyxllib.text.pupil import chinese2digits, grp_chinese_char
|
29
30
|
from pyxllib.file.xlsxlib import openpyxl
|
30
31
|
from pyxllib.file.specialist import XlPath
|
31
|
-
from pyxllib.prog.specialist import parse_datetime, browser, TicToc
|
32
|
+
from pyxllib.prog.specialist import parse_datetime, browser, TicToc, dprint
|
32
33
|
from pyxllib.cv.rgbfmt import RgbFormatter
|
33
34
|
from pyxllib.data.sqlite import Connection
|
34
35
|
|
36
|
+
from pyxllib.ext.seleniumlib import XlChrome
|
37
|
+
|
35
38
|
|
36
39
|
class 网课考勤:
|
37
40
|
def __init__(self, today=None):
|
@@ -43,9 +46,14 @@ class 网课考勤:
|
|
43
46
|
self.打卡返款 = {5: 100, 10: 150, 15: 200} # 打卡满5/10/15次的返款额
|
44
47
|
self._init(today)
|
45
48
|
|
49
|
+
self.driver = None # 浏览器脚本
|
50
|
+
|
51
|
+
def __1_基础数据处理(self):
|
52
|
+
pass
|
53
|
+
|
46
54
|
def _init(self, today=None):
|
47
55
|
""" 可以手动指定today,适合某些场景下的调试 """
|
48
|
-
self.课次数 =
|
56
|
+
self.课次数 = len(self.课程链接) - 1 # 课次一般都是固定21课,不用改
|
49
57
|
self.达标时长 = 30 # 单位:分钟。在线听课的时长达到此标准以上,才计算为完成一节课的学习
|
50
58
|
# 一般是3天,因为回放第1、2、3天都会数额,第4天就没数额了,所以第4天返款
|
51
59
|
self.回放返款天数 = sum((x > 0) for x in self.视频返款[1:])
|
@@ -61,8 +69,10 @@ class 网课考勤:
|
|
61
69
|
self.开课日期 = date.fromisoformat(self.开课日期)
|
62
70
|
# self.觉观禅课 = (self.开课日期.day == 1)
|
63
71
|
self.觉观禅课 = '觉观' in self.返款标题
|
64
|
-
self.当天课次 = (self.today - self.开课日期).days + 1
|
65
|
-
self
|
72
|
+
self.当天课次 = (self.today - self.开课日期).days + 1 # 这是用于逻辑运算的,可能超过实际课次数
|
73
|
+
self.当天课次2 = min(self.当天课次, self.课次数)
|
74
|
+
self.结束课次 = self.当天课次 - len(self.视频返款) + 1 # 这是用于逻辑运算的,可能有负值
|
75
|
+
self.结束课次2 = max(0, self.结束课次)
|
66
76
|
self.用户列表 = pd.read_csv(self.get_file('数据表/用户列表导出*.csv'))
|
67
77
|
# 用户列表 = 用户列表[用户列表['账号状态'] == '正常']
|
68
78
|
|
@@ -530,14 +540,29 @@ class 网课考勤:
|
|
530
540
|
# for idx, row in df.iterrows():
|
531
541
|
# data[row['用户id']] = row['打卡次数']
|
532
542
|
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
543
|
+
df = None
|
544
|
+
try:
|
545
|
+
df = pd.read_excel(files[-1]) # 220804周四08:28,小鹅通更新了模板
|
546
|
+
except ValueError:
|
547
|
+
pass
|
548
|
+
|
549
|
+
if df is None:
|
550
|
+
try:
|
551
|
+
df = pd.read_csv(files[-1]) # 221005周三09:19,小鹅通又双叒更新了
|
552
|
+
except UnicodeDecodeError:
|
553
|
+
pass
|
554
|
+
|
555
|
+
if df is None:
|
556
|
+
raise ValueError
|
557
|
+
|
558
|
+
df = df.applymap(lambda x: x.strip() if isinstance(x, str) else x)
|
559
|
+
df.columns = df.columns.map(lambda x: x.strip() if isinstance(x, str) else x)
|
560
|
+
|
561
|
+
# data = Counter([x for x in df['用户id']])
|
537
562
|
try:
|
538
563
|
data = {row['用户id']: row['打卡次数'] for _, row in df.iterrows()}
|
539
564
|
except KeyError: # 230202周四19:49,另一种实际是xlsx格式,然后再转出csv的情况
|
540
|
-
data = Counter([row['user_id']
|
565
|
+
data = Counter([row['user_id'] for _, row in df.iterrows()])
|
541
566
|
|
542
567
|
# 3 将打卡次数写入表格
|
543
568
|
ls = [] # 返款汇总
|
@@ -559,7 +584,7 @@ class 网课考勤:
|
|
559
584
|
if 返款额 <= 0:
|
560
585
|
color = RgbFormatter(255, 0, 0)
|
561
586
|
elif 返款额 < 最高返款额:
|
562
|
-
color = RgbFormatter(255, 255, 0).light(1
|
587
|
+
color = RgbFormatter(255, 255, 0).light(1 - 返款额 / 最高返款额)
|
563
588
|
elif 返款额 == 最高返款额: # 最高返款额
|
564
589
|
color = RgbFormatter(0, 255, 0)
|
565
590
|
|
@@ -646,6 +671,102 @@ class 网课考勤:
|
|
646
671
|
def __call__(self, *args, **kwargs):
|
647
672
|
print('程序测试通过,可正常使用')
|
648
673
|
|
674
|
+
def 表格内容对齐(self, ws_name1, ws_name2, col_name):
|
675
|
+
wb = self.wb
|
676
|
+
wb.merge_sheets_by_keycol([wb[ws_name1], wb[ws_name2]], col_name)
|
677
|
+
|
678
|
+
# 保存。一般不用重新再加载self.wb、self.ws,因为这里需求本来基本都是要分段重新执行程序的。
|
679
|
+
wb.save(self.表格路径)
|
680
|
+
|
681
|
+
def __2_自动浏览网页(self):
|
682
|
+
pass
|
683
|
+
|
684
|
+
def ensure_driver(self):
|
685
|
+
if not self.driver:
|
686
|
+
self.driver = XlChrome()
|
687
|
+
return self.driver
|
688
|
+
|
689
|
+
def 登录小鹅通(self, name, passwd):
|
690
|
+
# 登录小鹅通
|
691
|
+
driver = self.ensure_driver()
|
692
|
+
driver.get('https://admin.xiaoe-tech.com/t/login#/acount')
|
693
|
+
driver.locate('//*[@id="common_template_mounted_el_container"]'
|
694
|
+
'/div/div[1]/div[3]/div/div[4]/div/div[1]/div[1]/div/div[2]/input').send_keys(name)
|
695
|
+
driver.locate('//*[@id="common_template_mounted_el_container"]'
|
696
|
+
'/div/div[1]/div[3]/div/div[4]/div/div[1]/div[2]/div/div/input').send_keys(passwd)
|
697
|
+
driver.click('//*[@id="common_template_mounted_el_container"]/div/div[1]/div[3]/div/div[4]/div/div[2]')
|
698
|
+
|
699
|
+
# 然后自己手动操作验证码
|
700
|
+
# 以及选择"店铺"
|
701
|
+
|
702
|
+
def 登录微信支付(self):
|
703
|
+
driver = self.ensure_driver()
|
704
|
+
driver.get('https://pay.weixin.qq.com/index.php/core/home/login')
|
705
|
+
|
706
|
+
def 下载课次考勤数据(self, 起始课=None, 终止课=None, 文件名前缀=''):
|
707
|
+
if 起始课 is None:
|
708
|
+
起始课 = max(1, self.结束课次)
|
709
|
+
if 终止课 is None:
|
710
|
+
终止课 = min(self.当天课次, self.课次数)
|
711
|
+
|
712
|
+
# 1 遍历课程下载表格
|
713
|
+
driver = self.driver
|
714
|
+
for i in range(起始课, 终止课 + 1):
|
715
|
+
print(f'第{i}课', self.课程链接[i])
|
716
|
+
driver.get('https://admin.xiaoe-tech.com/t/data_center/index') # 必须要找个过渡页,不然不会更新课程链接
|
717
|
+
driver.get(self.课程链接[i])
|
718
|
+
driver.locate_text('//*[@id="app"]/div/div/div[1]/div[2]/div[1]/div[2]', f'第{i}课') # 检查页面
|
719
|
+
|
720
|
+
driver.click('//*[@id="tab-studentTab"]/span') # 直播间用户
|
721
|
+
driver.click('//*[@id="pane-studentTab"]/div/div[2]/div[2]/form/div[2]/button[2]/span/span') # 导出列表
|
722
|
+
driver.click('//*[@id="data-export-container"]/div/div[2]/div/div[2]/div[2]/button[2]/span/span') # 导出
|
723
|
+
time.sleep(1)
|
724
|
+
|
725
|
+
# 2 下载表格
|
726
|
+
# 2.1 等待下载文件生成完毕
|
727
|
+
while True:
|
728
|
+
driver.get('https://admin.xiaoe-tech.com/t/basic-platform/downloadCenter')
|
729
|
+
if '任务撤回' in driver.locate('//*[@id="downloadsCenter"]/div[4]/div/div[4]/div[2]/table/tbody/tr[1]/'
|
730
|
+
'td[9]/div/div/span').text:
|
731
|
+
time.sleep(1)
|
732
|
+
else:
|
733
|
+
break
|
734
|
+
|
735
|
+
# 2.2 下载表格
|
736
|
+
files = []
|
737
|
+
for i in range(1, 终止课 - 起始课 + 2):
|
738
|
+
driver.click(f'//*[@id="downloadsCenter"]/div[4]/div/div[4]/div[2]/table/tbody/tr[{i}]/'
|
739
|
+
f'td[9]/div/div/span[1]')
|
740
|
+
file = driver.locate(f'//*[@id="downloadsCenter"]/div[4]/div/div[3]/table/tbody/tr[{i}]/'
|
741
|
+
f'td[1]/div/div/div').text + '.csv' # 下载后还会再多一个csv后缀
|
742
|
+
files.append(file)
|
743
|
+
time.sleep(1)
|
744
|
+
|
745
|
+
# 2.3 移动表格
|
746
|
+
time.sleep(1)
|
747
|
+
download_path = XlPath(os.path.join(os.environ['USERPROFILE'], 'Downloads'))
|
748
|
+
for file in files:
|
749
|
+
src_file = (download_path / file)
|
750
|
+
while True:
|
751
|
+
if src_file.is_file():
|
752
|
+
src_file.move(self.root / '数据表' / (文件名前缀 + file), if_exists='replace')
|
753
|
+
break
|
754
|
+
else:
|
755
|
+
time.sleep(1)
|
756
|
+
|
757
|
+
def 批量退款(self):
|
758
|
+
self.driver.get('https://pay.weixin.qq.com/index.php/xphp/cbatchrefund/batch_refund#/pages/index/index')
|
759
|
+
|
760
|
+
def 申请单条退款(self, 凭证号, 退款金额=0, 退款原因=''):
|
761
|
+
driver = self.ensure_driver()
|
762
|
+
driver.get('https://pay.weixin.qq.com/index.php/core/refundapply')
|
763
|
+
driver.locate('//*[@id="app"]/div/div[2]/div[2]/div[2]/div/span/input').send_keys(凭证号)
|
764
|
+
driver.click('//*[@id="applyRefundBtn"]') # 申请退款
|
765
|
+
driver.locate('//*[@id="app"]/div/div[2]/div[2]/div[3]/div[2]/div/div[1]/div/span[1]/input').send_keys(
|
766
|
+
str(退款金额))
|
767
|
+
driver.locate('//*[@id="textInput"]').send_keys(退款原因)
|
768
|
+
# driver.click('//*[@id="commitRefundApplyBtn"]') # 建议手动点"提交申请"
|
769
|
+
|
649
770
|
|
650
771
|
class KqDb(Connection):
|
651
772
|
""" 五一身心行修考勤工具 """
|
@@ -0,0 +1,63 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
# @Author : 陈坤泽
|
4
|
+
# @Email : 877362867@qq.com
|
5
|
+
# @Date : 2023/03/28
|
6
|
+
|
7
|
+
import time
|
8
|
+
|
9
|
+
from selenium import webdriver
|
10
|
+
from selenium.webdriver.common.by import By
|
11
|
+
from selenium.webdriver.support.ui import WebDriverWait
|
12
|
+
from selenium.webdriver.support import expected_conditions as EC
|
13
|
+
from selenium.common.exceptions import ElementClickInterceptedException, NoSuchWindowException
|
14
|
+
|
15
|
+
|
16
|
+
class element_has_text(object):
|
17
|
+
def __init__(self, locator, text):
|
18
|
+
self.locator = locator
|
19
|
+
self.text = text
|
20
|
+
|
21
|
+
def __call__(self, driver):
|
22
|
+
element = driver.find_element(*self.locator)
|
23
|
+
if self.text in element.text:
|
24
|
+
return element
|
25
|
+
else:
|
26
|
+
return False
|
27
|
+
|
28
|
+
|
29
|
+
class XlChrome(webdriver.Chrome):
|
30
|
+
def __init__(self, *args, **kwargs):
|
31
|
+
super().__init__(*args, **kwargs)
|
32
|
+
self.maximize_window()
|
33
|
+
|
34
|
+
def locate(self, locator, seconds=10):
|
35
|
+
""" 定位一个元素 """
|
36
|
+
if isinstance(locator, str): # 默认是XPATH格式
|
37
|
+
locator = (By.XPATH, locator)
|
38
|
+
return WebDriverWait(self, seconds).until(EC.presence_of_element_located(locator))
|
39
|
+
|
40
|
+
def click(self, locator, seconds=10):
|
41
|
+
""" 点击一个元素 """
|
42
|
+
if isinstance(locator, str):
|
43
|
+
locator = (By.XPATH, locator)
|
44
|
+
element = WebDriverWait(self, seconds).until(EC.element_to_be_clickable(locator))
|
45
|
+
try:
|
46
|
+
element.click()
|
47
|
+
except ElementClickInterceptedException:
|
48
|
+
# 特殊情况,例如小鹅通下载页面的"下载"按钮没法正常click,要用js脚本去click
|
49
|
+
self.execute_script("arguments[0].click();", element)
|
50
|
+
|
51
|
+
def locate_text(self, locator, text, seconds=10):
|
52
|
+
""" 判断指定元素位置是否含有指定文本 """
|
53
|
+
if isinstance(locator, str):
|
54
|
+
locator = (By.XPATH, locator)
|
55
|
+
return WebDriverWait(self, seconds).until(element_has_text(locator, text))
|
56
|
+
|
57
|
+
def __bool__(self):
|
58
|
+
""" 判断driver是否还存在,如果已被手动关闭,这个值会返回False """
|
59
|
+
try:
|
60
|
+
self.title
|
61
|
+
return True
|
62
|
+
except NoSuchWindowException:
|
63
|
+
return False
|
@@ -273,7 +273,7 @@ class XlAiClient:
|
|
273
273
|
self._priu_host = host
|
274
274
|
connent = True
|
275
275
|
break
|
276
|
-
except requests.exceptions.ConnectionError:
|
276
|
+
except (requests.exceptions.ConnectionError, requests.exceptions.ReadTimeout):
|
277
277
|
continue
|
278
278
|
|
279
279
|
if not connent:
|
@@ -1042,12 +1042,15 @@ class XlAiClient:
|
|
1042
1042
|
|
1043
1043
|
def func(buffer, options):
|
1044
1044
|
image_uri = f'data:image/jpg;base64,' + base64.b64encode(buffer).decode()
|
1045
|
-
|
1046
|
-
|
1047
|
-
|
1048
|
-
|
1049
|
-
|
1050
|
-
|
1045
|
+
for i in range(10): # 尝试10次,10次都失败就无语了~
|
1046
|
+
try:
|
1047
|
+
r = requests.post('https://api.mathpix.com/v3/latex',
|
1048
|
+
data=json.dumps({'src': image_uri}),
|
1049
|
+
headers=self._mathpix_header)
|
1050
|
+
return json.loads(r.text)
|
1051
|
+
except requests.exceptions.ConnectionError:
|
1052
|
+
pass
|
1053
|
+
else:
|
1051
1054
|
return {'latex': '', 'error': 'requests.exceptions.ConnectionError'}
|
1052
1055
|
|
1053
1056
|
# mathpix的接口没有说限制图片大小,但我还是按照百度的规范处理下更好
|
@@ -1097,6 +1100,7 @@ class XlAiClient:
|
|
1097
1100
|
data['options'] = options
|
1098
1101
|
if meta_opts:
|
1099
1102
|
data.update(meta_opts)
|
1103
|
+
|
1100
1104
|
# TODO 增加超时timeout=seconds参数?
|
1101
1105
|
r = requests.post(f'{self._priu_host}/api/{mode}', json=data, headers=self._priu_header)
|
1102
1106
|
if r.status_code == 200:
|
@@ -30,7 +30,7 @@ _dir = Path(__file__).parent
|
|
30
30
|
|
31
31
|
setup(
|
32
32
|
name='pyxllib', # pip 安装时用的名字
|
33
|
-
version='0.3.
|
33
|
+
version='0.3.30', # 当前版本,每次更新上传到pypi都需要修改; 第4位版本号一般是修紧急bug
|
34
34
|
author='code4101',
|
35
35
|
author_email='877362867@qq.com',
|
36
36
|
url='https://github.com/XLPRUtils/pyxllib',
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -21,14 +21,14 @@ Jinja2
|
|
21
21
|
pandas>=0.23.4
|
22
22
|
|
23
23
|
[xlai]
|
24
|
-
pillow
|
25
|
-
opencv-python
|
26
|
-
visdom
|
27
|
-
xlcocotools
|
28
24
|
opsdroid-get-image-size
|
25
|
+
xlcocotools
|
26
|
+
visdom
|
27
|
+
opencv-python
|
29
28
|
pynvml
|
29
|
+
pillow
|
30
30
|
|
31
31
|
[xlcv]
|
32
|
+
opsdroid-get-image-size
|
32
33
|
opencv-python
|
33
34
|
pillow
|
34
|
-
opsdroid-get-image-size
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|