├── resultados ├── testparsing.xlsx ├── testparsingcsv.zip └── testscrapenew.xlsx ├── README.md ├── LICENSE ├── combinandocomselenium.py ├── bet365raspagemapi.py ├── cythontest.py └── betapiformat.py /resultados/testparsing.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hansalemaos/raspagem_bet365_pe_de_cabra/HEAD/resultados/testparsing.xlsx -------------------------------------------------------------------------------- /resultados/testparsingcsv.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hansalemaos/raspagem_bet365_pe_de_cabra/HEAD/resultados/testparsingcsv.zip -------------------------------------------------------------------------------- /resultados/testscrapenew.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hansalemaos/raspagem_bet365_pe_de_cabra/HEAD/resultados/testscrapenew.xlsx -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### pip install regex psutil pdmemedit numpy pandas a_pandas_ex_sequence_search 2 | 3 | [![YT](https://i.ytimg.com/vi/ZXuBccIVKbE/maxresdefault.jpg)](https://www.youtube.com/watch?v=ZXuBccIVKbE) 4 | [https://www.youtube.com/watch?v=ZXuBccIVKbE]() 5 | 6 | ### pip install regex psutil pdmemedit numpy pandas a_pandas_ex_sequence_search exceptdrucker 7 | 8 | [![YT](https://i.ytimg.com/vi/EBMcvnhPec0/maxresdefault.jpg)](https://www.youtube.com/watch?v=EBMcvnhPec0) 9 | [https://www.youtube.com/watch?v=EBMcvnhPec0]() 10 | 11 | [![YT](https://i.ytimg.com/vi/Nd6FOnstOU8/maxresdefault.jpg)](https://www.youtube.com/watch?v=Nd6FOnstOU8) 12 | [https://www.youtube.com/watch?v=Nd6FOnstOU8]() 13 | 14 | [![YT](https://i.ytimg.com/vi/7YN6aBL9IgM/maxresdefault.jpg)](https://www.youtube.com/watch?v=7YN6aBL9IgM) 15 | [https://www.youtube.com/watch?v=7YN6aBL9IgM]() 16 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Hans Alemão 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /combinandocomselenium.py: -------------------------------------------------------------------------------- 1 | from time import sleep 2 | import psutil 3 | import pymem 4 | import numpy as np 5 | from pdmemedit import Pdmemory 6 | from cythonsequencefinder import np_search_sequence 7 | from seleniumbase import Driver 8 | from exceptdrucker import errwrite 9 | import ujson 10 | 11 | driver = Driver(uc=True) 12 | driver.get("https://br.betano.com") 13 | sleep(15) 14 | allprocs = [] 15 | 16 | for q in psutil.process_iter(): 17 | try: 18 | if q.name().lower() == "chrome.exe": 19 | allprocs.append(q) 20 | except Exception: 21 | pass 22 | allmems = [] 23 | for q in allprocs: 24 | allmems.append(Pdmemory(pid=q.pid, filename=None)) 25 | 26 | 27 | def search_memory( 28 | string, 29 | encoding="utf-8", # utf-8 / utf-16-le / latin1 / cp1252 30 | outencodingreplace="ignore", 31 | ): 32 | seqarra = np.array(list(string.encode(encoding)), dtype=np.uint8) 33 | resultsfound = [] 34 | for la in allmems: 35 | try: 36 | la.update_region_df( 37 | limitfunction=lambda x: True, 38 | dtypes=( 39 | "S1", 40 | np.uint8, 41 | ), 42 | allowed_protections=( 43 | pymem.ressources.structure.MEMORY_PROTECTION.PAGE_READWRITE, 44 | ), 45 | ) 46 | for numara in range(len(la.regiondf.aa_dump_numpy_uint8)): 47 | try: 48 | if np.any( 49 | np_search_sequence( 50 | la.regiondf.aa_dump_numpy_uint8.iloc[numara], 51 | seqarra, 52 | distance=1, 53 | ) 54 | ): 55 | resultsfound.append( 56 | (la.regiondf.aa_dump_S1.iloc[numara]).copy() 57 | ) 58 | except Exception: 59 | errwrite() 60 | except Exception: 61 | errwrite() 62 | return resultsfound 63 | 64 | 65 | resxa = search_memory( 66 | string="displayOrder", 67 | encoding="utf-8", 68 | outencodingreplace="ignore", 69 | ) 70 | 71 | 72 | # 6[{"sports":1 73 | for a in resxa: 74 | # if a.size < 1000000: 75 | print("--------------------------------------------------------") 76 | try: 77 | stri = (b"".join(a)).split(b'[{"sports":', maxsplit=1)[1] 78 | stri = stri.rsplit(b"]", maxsplit=1)[0] 79 | stri = b'[{"sports":' + stri + b"]" 80 | print(ujson.loads(stri)) 81 | except Exception: 82 | errwrite() 83 | -------------------------------------------------------------------------------- /bet365raspagemapi.py: -------------------------------------------------------------------------------- 1 | from time import sleep 2 | import regex as re 3 | import sys, psutil, pymem, subprocess 4 | import numpy as np 5 | from pdmemedit import Pdmemory 6 | from a_pandas_ex_sequence_search import pd_add_find_sequence 7 | import pandas as pd 8 | 9 | bravebro = subprocess.Popen( 10 | [ 11 | r"C:\Program Files\BraveSoftware\Brave-Browser\Application\brave.exe", 12 | "https://www.bet365.com/#/IP/B1", 13 | ] 14 | ) 15 | pd_add_find_sequence() 16 | allmapped = [] 17 | sleep(5) 18 | allpids = [] 19 | allprocs = [] 20 | 21 | for q in psutil.process_iter(): 22 | try: 23 | if q.name() == "brave.exe": 24 | allprocs.append(q) 25 | except Exception: 26 | pass 27 | resi = [] 28 | allmems = [] 29 | memmi = [] 30 | np8stuff = np.array([79, 68, 61], dtype=np.uint8) 31 | for q in allprocs: 32 | print("---------------------") 33 | allmems.append(Pdmemory(pid=q.pid, filename=None)) 34 | hlist = [] 35 | allresults = [] 36 | try: 37 | while True: 38 | allresults.append([]) 39 | hlist.clear() 40 | for la in allmems: 41 | try: 42 | la.update_region_df( 43 | limitfunction=lambda x: True, 44 | dtypes=( 45 | "S1", 46 | np.uint8, 47 | ), 48 | allowed_protections=( 49 | pymem.ressources.structure.MEMORY_PROTECTION.PAGE_READWRITE, 50 | ), 51 | ) 52 | memmi.append( 53 | la.regiondf.loc[ 54 | ( 55 | la.regiondf.aa_dump_numpy_uint8.s_find_sequence( 56 | np8stuff, 57 | exception_val=[], 58 | distance=2, 59 | ).apply(lambda x: len(x) > 0) 60 | ) 61 | ] 62 | ) 63 | for h in pd.concat(memmi, ignore_index=True).aa_dump_S1.apply( 64 | lambda x: b"".join(x).decode("utf-8", "ignore") 65 | ): 66 | hlist.append(h) 67 | 68 | for h in hlist: 69 | for hh in h.split("|"): 70 | if not hh.strip().endswith(";") or not re.search( 71 | r"^[A-Z]+", hh.strip() 72 | ): 73 | continue 74 | allresults[-1].append(hh) 75 | print(hh) 76 | sys.stderr.write("\nEND END END END XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n") 77 | sys.stderr.flush() 78 | except Exception as e: 79 | sys.stderr.write(str(e) + "\n") 80 | sys.stderr.flush() 81 | except KeyboardInterrupt: 82 | try: 83 | sleep(1) 84 | except: 85 | pass 86 | print(memmi) 87 | -------------------------------------------------------------------------------- /cythontest.py: -------------------------------------------------------------------------------- 1 | from time import sleep 2 | import regex as re 3 | import sys, psutil, pymem, subprocess 4 | import numpy as np 5 | from pdmemedit import Pdmemory 6 | from a_pandas_ex_sequence_search import pd_add_find_sequence 7 | import pandas as pd 8 | import ctypes 9 | from cythonsequencefinder import find_seq 10 | 11 | bravebro = subprocess.Popen( 12 | [ 13 | r"C:\Program Files\BraveSoftware\Brave-Browser\Application\brave.exe", 14 | "https://www.bet365.com/#/IP/B1", 15 | ] 16 | ) 17 | ctypes.pythonapi.PyMemoryView_FromMemory.argtypes = ( 18 | ctypes.c_char_p, 19 | ctypes.c_ssize_t, 20 | ctypes.c_int, 21 | ) 22 | ctypes.pythonapi.PyMemoryView_FromMemory.restype = ctypes.py_object 23 | pd_add_find_sequence() 24 | allmapped = [] 25 | sleep(5) 26 | allpids = [] 27 | allprocs = [] 28 | 29 | for q in psutil.process_iter(): 30 | try: 31 | if q.name() == "brave.exe": 32 | allprocs.append(q) 33 | except Exception: 34 | pass 35 | resi = [] 36 | allmems = [] 37 | memmi = [] 38 | np8stuff = np.array([79, 0, 68, 0, 61], dtype=np.uint8) 39 | for q in allprocs: 40 | print("---------------------") 41 | allmems.append(Pdmemory(pid=q.pid, filename=None)) 42 | hlist = [] 43 | allresults = [] 44 | try: 45 | while True: 46 | allresults.append([]) 47 | hlist.clear() 48 | memmi.clear() 49 | for la in allmems: 50 | try: 51 | la.update_region_df( 52 | limitfunction=lambda x: True, 53 | dtypes=( 54 | "S1", 55 | np.uint8, 56 | ), 57 | allowed_protections=( 58 | pymem.ressources.structure.MEMORY_PROTECTION.PAGE_READWRITE, 59 | ), 60 | ) 61 | 62 | indigood = la.regiondf.loc[ 63 | (la.regiondf.aa_type == "MEM_PRIVATE") 64 | & (la.regiondf.aa_state == "MEM_COMMIT") 65 | ].index.__array__() 66 | indibad = np.setdiff1d(la.regiondf.index.__array__(), indigood) 67 | la.regiondf.drop(indibad, inplace=True) 68 | la.regiondf.aa_dump_numpy_uint8 = la.regiondf.aa_dump_numpy_uint8.apply( 69 | lambda px: ctypes.pythonapi.PyMemoryView_FromMemory( 70 | px.ctypes.data_as(ctypes.c_char_p), px.size, 0x200 71 | ) 72 | ) 73 | la.regiondf.aa_dump_numpy_uint8 = la.regiondf.aa_dump_numpy_uint8.apply( 74 | lambda x: np.frombuffer(x, dtype=np.uint8) 75 | ) 76 | 77 | memmi.append( 78 | la.regiondf.loc[ 79 | ( 80 | la.regiondf.aa_dump_numpy_uint8.apply( 81 | lambda arax: find_seq(arax, np8stuff, distance=1) 82 | ).apply(lambda x: len(x) > 0) 83 | ) 84 | ] 85 | ) 86 | for h in pd.concat(memmi, ignore_index=True).aa_dump_S1.apply( 87 | lambda x: b"".join(x).decode("utf-8", "ignore") 88 | ): 89 | hlist.append(h) 90 | 91 | for h in hlist: 92 | for hh in h.split("|"): 93 | h2 = hh.strip() 94 | if not h2.endswith(";") or not re.search( 95 | r"^[A-Z]+", h2.strip() 96 | ): 97 | continue 98 | # allresults[-1].append(hh) 99 | print(hh) 100 | sys.stderr.write("\nEND END END END XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n") 101 | sys.stderr.flush() 102 | except Exception as e: 103 | sys.stderr.write(str(e) + "\n") 104 | sys.stderr.flush() 105 | except KeyboardInterrupt: 106 | try: 107 | sleep(1) 108 | except: 109 | pass 110 | print(memmi) 111 | -------------------------------------------------------------------------------- /betapiformat.py: -------------------------------------------------------------------------------- 1 | from time import sleep, time 2 | import regex as re 3 | import sys, psutil, pymem, subprocess 4 | import numpy as np 5 | from pdmemedit import Pdmemory 6 | from a_pandas_ex_sequence_search import pd_add_find_sequence 7 | import pandas as pd 8 | from exceptdrucker import errwrite 9 | from copy import deepcopy 10 | # from rich import print 11 | 12 | rencols = { 13 | "3P": "PLACE_365", 14 | "3W": "WIN_365", 15 | "4Q": "MARKET_GROUP_PAIR_ID", 16 | "AB": "FINANCIALS_PRICE_1", 17 | "AC": "STATS_COLUMN", 18 | "AD": "ADDITIONAL_DATA", 19 | "AE": "STATS_CELL", 20 | "AF": "ARCHIVE_FIXTURE_INFO", 21 | "AH": "ASIAN_HOVER", 22 | "AI": "ANIMATION_ID", 23 | "AJ": "FINANCIALS_MARKET_ODDS_2", 24 | "AM": "ANIMATION_ICON", 25 | "AO": "ANIMATION_TOPIC", 26 | "AP": "STATS_PANE", 27 | "AQ": "FINANCIALS_CLOSE_TIME", 28 | "AS": "ADDITIONAL_STATS", 29 | "AT": "ANIMATION_TEXT", 30 | "AU": "AUDIO_AVAILABLE", 31 | "AV": "ARCHIVE_VIDEO_AVAILABLE", 32 | "BB": "BUTTON_BAR", 33 | "BC": "BOOK_CLOSES", 34 | "BD": "PULL_BET_DATA", 35 | "BE": "BET", 36 | "BH": "BLURB_HEADER", 37 | "BI": "BUTTON_BAR_INDEX", 38 | "BL": "BASE_LINE", 39 | "BO": "BASE_ODDS", 40 | "BS": "BANNER_STYLE", 41 | "BT": "INFO_POD_DETAIL_2", 42 | "C1": "C1_ID", 43 | "C2": "C2_ID", 44 | "C3": "MINI_DIARY_C3", 45 | "CB": "CLOSE_BETS_DISABLED", 46 | "CC": "BET_TYPE_PULL", 47 | "CD": "COMPETITION_DROPDOWN", 48 | "CF": "CONFIG", 49 | "CG": "GLOBAL_CONFIG", 50 | "CI": "CLASS_ID", 51 | "CK": "COMPETITION_KEY", 52 | "CL": "CLASSIFICATION", 53 | "CM": "BET_CALL_FEATURE_DISABLED", 54 | "CN": "CHANNEL", 55 | "CO": "COLUMN", 56 | "CP": "CLOSE_BETS_PRESENTATION_PULL_DISABLED", 57 | "CR": "CLASS_ORDER", 58 | "CS": "CLASSIFICATIONS", 59 | "CT": "COMPETITION_NAME", 60 | "CU": "CURRENT_INFO", 61 | "D1": "DATA_1", 62 | "D2": "DATA_2", 63 | "D3": "DATA_3", 64 | "D4": "DATA_4", 65 | "D5": "DATA_5", 66 | "DA": "DIARY_DAY", 67 | "DC": "DISPLAY_CLOCK", 68 | "DD": "DISPLAY_DATE", 69 | "DE": "DESCRIPTION", 70 | "DM": "IN_PLAY_LAUNCHER_DISPLAY_MODE", 71 | "DN": "DIARY_NAME", 72 | "DO": "DEFAULT_OPEN", 73 | "DP": "DECIMAL_PLACES", 74 | "DR": "DIARY_REFRESH", 75 | "DS": "DISPLAY_SCORE", 76 | "DX": "DISABLE_COLUMN_DISTRIBUTION", 77 | "DY": "DIARY", 78 | "EA": "EVENT_TIME", 79 | "EC": "ERROR_CODE", 80 | "ED": "EXTRA_DATA_2", 81 | "EE": "ETOTE_LINK_DATA", 82 | "EI": "EVENT_ID", 83 | "EL": "EXTRA_STATS_AVAILABLE", 84 | "EM": "EMPTY", 85 | "EP": "EXTRA_PARTICIPANTS", 86 | "ER": "ERROR_LOGGING", 87 | "ES": "EMBEDDED_STREAMING", 88 | "ET": "END_TIME", 89 | "EV": "EVENT", 90 | "EW": "EACH_WAY", 91 | "EX": "EXTRA_DATA_1", 92 | "FD": "FORCE_DISPLAY", 93 | "FF": "FILTERING", 94 | "FI": "FIXTURE_PARENT_ID", 95 | "FK": "FINANCIALS_FEED_1", 96 | "FL": "FINANCIALS_PERIOD_1", 97 | "FM": "FINANCIALS_MARKET_1A", 98 | "FN": "FINANCIALS_MARKET_1B", 99 | "FO": "FINANCIALS_FEED_2", 100 | "FP": "FINANCIALS_PERIOD_2", 101 | "FQ": "FINANCIALS_MARKET_2A", 102 | "FR": "FINANCIALS_MARKET_2B", 103 | "FS": "FIXTURE_STARTED", 104 | "FW": "FIXED_WIN", 105 | "GC": "LOTTO_GAME_CODE", 106 | "GM": "LOTTO_GAME_MARKET", 107 | "GR": "GROUP", 108 | "HA": "HANDICAP", 109 | "HD": "HANDICAP_FORMATTED", 110 | "HI": "HEADER_IMAGE", 111 | "HM": "MARKET_BAR", 112 | "HO": "DEFAULT_OPEN_HOMEPAGE", 113 | "HP": "SHOW_ON_HOMEPAGE", 114 | "HS": "HASH", 115 | "HT": "POD_HEADER_TEXT", 116 | "HU": "INFO_BANNER_SUBHEAD2", 117 | "HV": "POD_BODY_TEXT_2", 118 | "HW": "HORSE_WEIGHT", 119 | "HY": "HORSE_AGE", 120 | "I2": "ID2", 121 | "IA": "AUDIO_ICON", 122 | "IB": "IBOX", 123 | "IC": "ICON", 124 | "ID": "ID", 125 | "IF": "IN_PLAY", 126 | "IG": "IMAGE_ID", 127 | "IM": "IMAGE", 128 | "IN": "INFO", 129 | "IO": "ITEM_ORDER", 130 | "IP": "IN_PLAY_AVAILABLE_FLAG", 131 | "IQ": "INFO_POD_IMAGE1", 132 | "IR": "INRUNNING_INFO", 133 | "IS": "INFO_POD_IMAGE_PATH1", 134 | "IT": "TOPIC_ID", 135 | "ITX": "TOPIC_IDX", 136 | "IU": "INFO_POD_IMAGE2", 137 | "JN": "JOCKEY_PULL", 138 | "JY": "JOCKEY", 139 | "KC": "KIT_COLORS", 140 | "KI": "KIT_ID", 141 | "L1": "BREADCRUMB_LEVEL_1", 142 | "LA": "LABEL", 143 | "LB": "INFO_POD_LINK_1_DISPLAY_TEXT", 144 | "LC": "EVENT_COUNT", 145 | "LD": "INFO_POD_LINK_1_C1_ID_TABLE", 146 | "LE": "INFO_POD_LINK_1_C2_ID", 147 | "LF": "INFO_POD_LINK_1_C2_ID_TABLE", 148 | "LG": "INFO_POD_LINK_2_ID", 149 | "LH": "INFO_POD_LINK_2_DISPLAY_TEXT", 150 | "LI": "INFO_POD_LINK_2_C1_ID", 151 | "LJ": "INFO_POD_LINK_2_C1_ID_TABLE", 152 | "LK": "INFO_POD_LINK_2_C2_ID", 153 | "LL": "INFO_POD_LINK_2_C2_ID_TABLE", 154 | "LM": "POD_ENCODED_URL_1", 155 | "LN": "POD_ENCODED_URL_2", 156 | "LO": "DEFAULT_OPEN_LEFT", 157 | "LP": "LIVE_IN_PLAY", 158 | "LQ": "INFO_POD_LINK_1_C3_ID_TABLE", 159 | "LR": "INFO_POD_LINK_1_C3_SECTION_ID", 160 | "LS": "PREVIOUS_SET_SCORE", 161 | "MA": "MARKET", 162 | "MB": "BET_CALL_V2_DISABLED", 163 | "MC": "CUSTOMER_TO_CUSTOMER_CALLING_FEATURE_DISABLED", 164 | "MD": "MATCHLIVE_PERIOD", 165 | "ME": "MULTI_EVENT", 166 | "MF": "MATCH_FLAG", 167 | "MG": "MARKET_GROUP", 168 | "ML": "MATCH_LENGTH", 169 | "MM": "MERGE_MARKET", 170 | "MO": "SECONDARY_UK_EVENT", 171 | "MP": "MATCH_POSTPONED", 172 | "MR": "CUSTOMER_TO_REPRESENTATIVE_CALLING_FEATURE_DISABLED", 173 | "MS": "MEDIA_ID", 174 | "MT": "BET_CALL_V2_TWILIO_DISABLED", 175 | "MU": "MULTILINE", 176 | "MW": "LOTTO_MAX_WINNINGS", 177 | "MY": "MARKET_STYLE", 178 | "N2": "NAME2", 179 | "NA": "NAME", 180 | "NC": "CLOTH_NUMBER", 181 | "NG": "NGENERA", 182 | "NH": "NEXT_HEADER", 183 | "NM": "NON_MATCH_BASED", 184 | "NR": "NON_RUNNER", 185 | "NT": "NEUTRAL_VENUE_TEXT", 186 | "NV": "NEUTRAL_VENUE", 187 | "OB": "BANKER_OPTION", 188 | "OD": "ODDS", 189 | "OH": "ODDS_HISTORY", 190 | "OO": "ODDS_OVERRIDE", 191 | "OP": "OPEN_BETS_PRESENTATION_PULL_DISABLED", 192 | "OR": "ORDER", 193 | "OT": "OTHERS_AVAILABLE", 194 | "PA": "PARTICIPANT", 195 | "PB": "PUSH_BALANCE_ENABLED", 196 | "PC": "PAGE_DATA_1", 197 | "PD": "PAGE_DATA", 198 | "PE": "PARTICIPANTS_EXCEEDED", 199 | "PF": "PUSH_FLAG", 200 | "PG": "PENALTY_GOALS", 201 | "PH": "PHONE_ONLY", 202 | "PI": "PLAYING_INDICATOR", 203 | "PN": "CLOTH_NUMBER_PULL", 204 | "PO": "POD_STACK_ORDER", 205 | "PP": "POD_OPEN", 206 | "PR": "PREFERENCE_ID", 207 | "PS": "POD_STACK", 208 | "PT": "PRODUCT_TYPE", 209 | "PV": "PREMIUM_VERSION", 210 | "PX": "NO_OFFER", 211 | "PY": "PARTICIPANT_STYLE", 212 | "RA": "RANGE", 213 | "RC": "RESULT_CODE", 214 | "RD": "RACE_DETAILS", 215 | "RE": "BET_RETURNS", 216 | "RG": "REGION", 217 | "RI": "R4_COMMENT", 218 | "RO": "DEFAULT_OPEN_RIGHT", 219 | "RS": "RUNNER_STATUS", 220 | "RT": "RESULTS_TEXT", 221 | "S1": "MATCHLIVE_STATS_1", 222 | "S2": "MATCHLIVE_STATS_2", 223 | "S3": "MATCHLIVE_STATS_3", 224 | "S4": "MATCHLIVE_STATS_4", 225 | "S5": "MATCHLIVE_STATS_5", 226 | "S6": "MATCHLIVE_STATS_6", 227 | "S7": "MATCHLIVE_STATS_7", 228 | "S8": "MATCHLIVE_STATS_8", 229 | "SA": "CHANGE_STAMP", 230 | "SB": "SCOREBOARD_TYPE", 231 | "SC": "SCORE", 232 | "SD": "AUDIO_ID", 233 | "SE": "SECONDARY_EVENT", 234 | "SF": "SPOTLIGHT_FORM", 235 | "SG": "STAT_GROUP", 236 | "SI": "IMAGE_ID_PULL", 237 | "SL": "SCORES_CELL", 238 | "SM": "START_TIME", 239 | "SN": "DRAW_NUMBER_PULL", 240 | "SP": "STAT_PERIOD", 241 | "SS": "SHORT_SCORE", 242 | "ST": "INFO_POD_DETAIL_1", 243 | "SU": "SUCCESS", 244 | "SV": "MATCHLIVE_AVAILABLE", 245 | "SY": "STYLE", 246 | "SZ": "STAT_LOCATION", 247 | "T1": "C1_TABLE", 248 | "T2": "C2_TABLE", 249 | "T3": "MINI_DIARY_T3", 250 | "T4": "TEXT_4", 251 | "T5": "TEXT_5", 252 | "TA": "TIME_ADDED", 253 | "TB": "BREADCRUMB_TRAIL", 254 | "TC": "BET_TOTE_TYPE", 255 | "TD": "COUNTDOWN", 256 | "TE": "TEAM", 257 | "TG": "TEAM_GROUP", 258 | "TI": "TMR_SERVER", 259 | "TL": "LEAGUE_TOPIC", 260 | "TM": "STAT_TIME", 261 | "TN": "TRAINER_NAME", 262 | "TO": "EMPTY_TOPIC_ID", 263 | "TP": "TIME_STAMP", 264 | "TR": "TAX_RATE", 265 | "TS": "TMR_SECS", 266 | "TT": "TMR_TICKING", 267 | "TU": "TMR_UPDATED", 268 | "TX": "TAX_METHOD", 269 | "UC": "CURRENT_INFO_V4", 270 | "UF": "UPDATE_FREQUENCY", 271 | "VA": "VALUE", 272 | "VC": "MATCHLIVE_ANIMATION", 273 | "VD": "VIRTUAL_DATA", 274 | "VI": "VIDEO_AVAILABLE", 275 | "VL": "VISIBLE", 276 | "VR": "VIRTUAL_RACE", 277 | "VS": "VIDEO_STREAM", 278 | "WG": "WIZE_GUY", 279 | "WM": "WINNING_MARGIN", 280 | "XB": "CHECK_BOX", 281 | "XC": "EXCLUDE_COLUMN_NUMBERS", 282 | "XI": "EXTRA_INFO_NODE", 283 | "XL": "CONTROLLER", 284 | "XP": "SHORT_POINTS", 285 | "XT": "EXTRA_TIME_LENGTH", 286 | "XY": "MATCHLIVE_COORDINATES", 287 | "ZA": "TIMEZONE_ADJUSTMENT", 288 | "_V": "PADDOCK_VIDEO_AVAILABLE", 289 | "UNDEFINED": "EVENT_TYPE", 290 | } 291 | 292 | 293 | def get_data(limite=5, encodingdata="cp1252"): 294 | limi = int(limite) 295 | coux = 0 296 | stoptrigger = False 297 | try: 298 | while not stoptrigger: 299 | allresults.append([]) 300 | internalid0 = 0 301 | 302 | for la in allmems: 303 | hlist.clear() 304 | memmi.clear() 305 | try: 306 | la.update_region_df( 307 | limitfunction=lambda x: True, 308 | dtypes=( 309 | "S1", 310 | np.uint8, 311 | ), 312 | allowed_protections=( 313 | pymem.ressources.structure.MEMORY_PROTECTION.PAGE_READWRITE, 314 | ), 315 | ) 316 | memmi.append( 317 | la.regiondf.loc[ 318 | ( 319 | la.regiondf.aa_dump_numpy_uint8.s_find_sequence( 320 | np8stuff, 321 | exception_val=[], 322 | distance=2, 323 | ).apply(lambda x: len(x) > 0) 324 | ) 325 | ] 326 | ) 327 | for h in pd.concat(memmi, ignore_index=True).aa_dump_S1.apply( 328 | lambda x: b"".join(x).decode(encodingdata, "ignore") 329 | ): 330 | hlist.append(h) 331 | tmptimestamp = time() 332 | internalid1 = 0 333 | for h in hlist: 334 | internalid2 = 0 335 | for hh in h.split("|"): 336 | linhapronta = hh.strip() 337 | if not linhapronta.endswith(";") or not re.search( 338 | r"^[A-Z0-9]{2,}", linhapronta 339 | ): 340 | continue 341 | 342 | allresults[-1].append( 343 | f'{linhapronta.rstrip(";")};TIMESTAMP={tmptimestamp};INTERNALID0={internalid0};INTERNALID1={internalid1};INTERNALID2={internalid2}' 344 | ) 345 | internalid2 += 1 346 | internalid1 += 1 347 | print("\n-----------------------\n") 348 | internalid0 += 1 349 | except Exception as e: 350 | errwrite() 351 | coux += 1 352 | if coux > limi: 353 | stoptrigger = True 354 | break 355 | except KeyboardInterrupt: 356 | try: 357 | sleep(1) 358 | except: 359 | pass 360 | return None 361 | 362 | 363 | bravebro = subprocess.Popen( 364 | [ 365 | r"C:\Program Files\BraveSoftware\Brave-Browser\Application\brave.exe", 366 | "https://www.bet365.com/#/IP/B1", 367 | ] 368 | ) 369 | pd_add_find_sequence() 370 | allmapped = [] 371 | sleep(5) 372 | allpids = [] 373 | allprocs = [] 374 | 375 | for q in psutil.process_iter(): 376 | try: 377 | if q.name() == "brave.exe": 378 | allprocs.append(q) 379 | except Exception: 380 | pass 381 | resi = [] 382 | allmems = [] 383 | memmi = [] 384 | np8stuff = np.array([79, 68, 61], dtype=np.uint8) 385 | for q in allprocs: 386 | allmems.append(Pdmemory(pid=q.pid, filename=None)) 387 | hlist = [] 388 | allresults = [] 389 | get_data(limite=5, encodingdata="cp1252") 390 | # from threading import Lock,Thread 391 | # lock=Lock() 392 | # lock.acquire() 393 | # lock.release() 394 | 395 | colunas = set() 396 | parsedresults = [] 397 | for a in allresults: 398 | for aa in a: 399 | parsedresults.append({}) 400 | for ini, aaa in enumerate(aa.split(";")): 401 | if ini == 0 and "=" not in aaa: 402 | aaa = "UNDEFINED=" + aaa 403 | try: 404 | kcol, vcol = aaa.split("=", maxsplit=1) 405 | colunas.add(kcol) 406 | parsedresults[-1][kcol] = vcol 407 | except Exception: 408 | errwrite() 409 | parsedresults2 = deepcopy(parsedresults) 410 | for ini, singledict in enumerate(parsedresults): 411 | for kcol in colunas: 412 | for col in colunas - set(singledict.keys()): 413 | parsedresults2[ini][col] = "" 414 | 415 | df = pd.DataFrame(parsedresults2) 416 | df.columns = [rencols.get(x, x) for x in df.columns.to_list()] 417 | df.EVENT_TYPE = df.EVENT_TYPE.apply(lambda x: rencols.get(x, x)) 418 | df.to_excel("c:\\scrapesamples.xlsx") 419 | --------------------------------------------------------------------------------