From 698e5bf22af3bd83c02aae0eb82ea187761313fa Mon Sep 17 00:00:00 2001 From: yiekheng Date: Sat, 2 May 2026 17:54:58 +0800 Subject: [PATCH] refactor(scraper): convert input-value extractions to helper --- app/cm_bot.py | 42 ++++++++++++++++++++++++++++-------- tests/test_cm_bot_scraper.py | 8 +++++++ 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/app/cm_bot.py b/app/cm_bot.py index 5a4f619..b512eba 100644 --- a/app/cm_bot.py +++ b/app/cm_bot.py @@ -386,11 +386,15 @@ class CM_BOT: def get_register_form_token(self): try: response = self.session.post( - f'{self.base_url}/cm/loadUserAccount', + f'{self.base_url}/cm/loadUserAccount', headers=self.get_register_form_headers ) soup = BeautifulSoup(response.content, 'html.parser') - return soup.find('input', {'name' : "token"})['value'] + return self._find_input_value( + soup, "token", + context="register_form_token", + raw=response.content, + ) except requests.exceptions.RequestException as e: print(f"Error getting register form: {e}") return None @@ -399,7 +403,11 @@ class CM_BOT: def get_security_pin_form_token(self): response = self.session.get(f'{self.base_url}/cm/setSecurityPin') soup = BeautifulSoup(response.content, 'html.parser') - return soup.find('input', {'name' : "token"})['value'] + return self._find_input_value( + soup, "token", + context="security_pin_form_token", + raw=response.content, + ) def register_user(self, user_id, user_password): try: @@ -474,17 +482,29 @@ class CM_BOT: headers=self.transfer_search_headers ) soup = BeautifulSoup(response.content, 'html.parser') - name = soup.find('input', {'id': "name"})['value'] - token = soup.find('input', {'name': "token"})['value'] - toUserId = soup.find('input', {'id': "toUserId"})['value'] + name = self._find_input_value( + soup, "name", + context="transfer_search_name", + raw=response.content, + by="id", + ) + token = self._find_input_value( + soup, "token", + context="transfer_search_token", + raw=response.content, + ) + toUserId = self._find_input_value( + soup, "toUserId", + context="transfer_search_toUserId", + raw=response.content, + by="id", + ) transfer_data = self.get_transfer_data(token, t_username, name, toUserId, amount, t_password) response = self.session.post( f'{self.base_url}/cm/saveTransfer', data=transfer_data, headers=self.transfer_credit_headers ) - # with open('transfer_credit.html', 'wb') as f: - # f.write(response.content) return True if re.search(r'Successfully saved the record\.', response.text) else False def get_user_credit(self): @@ -505,7 +525,11 @@ class CM_BOT: def get_transfer_token(self): response = self.session.get(f'{self.base_url}/cm/transfer') soup = BeautifulSoup(response.content, 'html.parser') - return soup.find('input', {'name' : "token"})['value'] + return self._find_input_value( + soup, "token", + context="transfer_token", + raw=response.content, + ) def logout(self): """Logout from the system.""" diff --git a/tests/test_cm_bot_scraper.py b/tests/test_cm_bot_scraper.py index c51519f..03aefb9 100644 --- a/tests/test_cm_bot_scraper.py +++ b/tests/test_cm_bot_scraper.py @@ -114,6 +114,14 @@ class ScraperHelpersTests(unittest.TestCase): "happy path should not create the failure dir", ) + def test_find_input_value_supports_by_id(self): + html = '
' + soup = BeautifulSoup(html, "html.parser") + result = self.bot._find_input_value( + soup, "toUserId", context="by_id", raw=html.encode(), by="id", + ) + self.assertEqual(result, "42") + if __name__ == "__main__": unittest.main()