feat: support com

This commit is contained in:
yihong0618
2023-07-13 20:30:58 +08:00
parent 2c2ddb36b5
commit f97c5730d3
3 changed files with 53 additions and 12 deletions

2
.gitignore vendored
View File

@@ -136,6 +136,8 @@ dmypy.json
EPUB/
DOWNLOADS/
.device_id
.device_id.com
.tokens
.tokens.com
*.csv
my_kindle_stats.md

View File

@@ -22,6 +22,8 @@ from Crypto.Signature import pkcs1_15
SCRIPT_PATH = os.path.dirname(os.path.realpath(sys.argv[0]))
DEVICE_ID_PATH = os.path.join(SCRIPT_PATH, ".device_id")
TOKENS_PATH = os.path.join(SCRIPT_PATH, ".tokens")
DEVICE_ID_PATH_COM = os.path.join(SCRIPT_PATH, ".device_id.com")
TOKENS_PATH_COM = os.path.join(SCRIPT_PATH, ".tokens.com")
if os.path.isfile(DEVICE_ID_PATH):
with open(DEVICE_ID_PATH, "r") as f:
@@ -31,15 +33,35 @@ else:
DEVICE_ID = secrets.token_hex(16)
f.write(DEVICE_ID)
if os.path.isfile(DEVICE_ID_PATH_COM):
with open(DEVICE_ID_PATH_COM, "r") as f:
DEVICE_ID_COM = f.read()
else:
with open(DEVICE_ID_PATH_COM, "w") as f:
DEVICE_ID_COM = secrets.token_hex(16)
f.write(DEVICE_ID_COM)
PID = hashlib.sha256(DEVICE_ID.encode()).hexdigest()[23:31].upper()
PID_COM = hashlib.sha256(DEVICE_ID_COM.encode()).hexdigest()[23:31].upper()
def save_tokens(tokens):
with open(TOKENS_PATH, "w") as f:
f.write(json.dumps(tokens))
def save_tokens(tokens, is_com=False):
if is_com:
with open(TOKENS_PATH_COM, "w") as f:
f.write(json.dumps(tokens))
else:
with open(TOKENS_PATH, "w") as f:
f.write(json.dumps(tokens))
def get_tokens():
def get_tokens(is_com=False):
if is_com:
if os.path.isfile(TOKENS_PATH_COM):
with open(TOKENS_PATH_COM, "r") as f:
return json.loads(f.read())
else:
return None
if os.path.isfile(TOKENS_PATH):
with open(TOKENS_PATH, "r") as f:
return json.loads(f.read())
@@ -123,8 +145,13 @@ def generate_frc(device_id):
def login(email, password, domain="com", device_id=DEVICE_ID):
tokens = get_tokens()
if tokens and tokens["name"] == hashlib.md5(email.encode()).hexdigest():
is_com = domain == "com"
tokens = get_tokens(is_com=is_com)
if (
tokens
and tokens["name"] == hashlib.md5(email.encode()).hexdigest()
and tokens["domain"] == domain
):
return refresh(tokens)
body = {
@@ -189,7 +216,7 @@ def login(email, password, domain="com", device_id=DEVICE_ID):
"adp_token"
],
}
return register_device(tokens)
return register_device(tokens, is_com=is_com)
except:
print(json.dumps(response_json))
return None
@@ -299,7 +326,7 @@ def signed_request(
return requests.Request(method, url, headers, data=body).prepare()
def register_device(tokens=None):
def register_device(tokens=None, is_com=False):
if not tokens:
tokens = get_tokens()
@@ -308,7 +335,8 @@ def register_device(tokens=None):
"Content-Type": "text/xml",
"Expect": "",
}
body = f"<?xml version=\"1.0\" encoding=\"UTF-8\"?><request><parameters><deviceType>{DEVICE_TYPE}</deviceType><deviceSerialNumber>{tokens['device_id']}</deviceSerialNumber><pid>{PID}</pid><deregisterExisting>false</deregisterExisting><softwareVersion>{SW_VERSION}</softwareVersion><softwareComponentId>{APP_NAME}</softwareComponentId><authToken>{tokens['access_token']}</authToken><authTokenType>ACCESS_TOKEN</authTokenType></parameters></request>"
pid = PID_COM if is_com else PID
body = f"<?xml version=\"1.0\" encoding=\"UTF-8\"?><request><parameters><deviceType>{DEVICE_TYPE}</deviceType><deviceSerialNumber>{tokens['device_id']}</deviceSerialNumber><pid>{pid}</pid><deregisterExisting>false</deregisterExisting><softwareVersion>{SW_VERSION}</softwareVersion><softwareComponentId>{APP_NAME}</softwareComponentId><authToken>{tokens['access_token']}</authToken><authTokenType>ACCESS_TOKEN</authTokenType></parameters></request>"
s = requests.session()
resp = s.send(signed_request("POST", url, headers, body, tokens=tokens))
@@ -317,7 +345,7 @@ def register_device(tokens=None):
tokens["device_private_key"] = parsed_response["response"]["device_private_key"]
tokens["adp_token"] = parsed_response["response"]["adp_token"]
save_tokens(tokens)
save_tokens(tokens, is_com=is_com)
return tokens

View File

@@ -335,11 +335,22 @@ class NoKindle:
time.sleep(i + 2)
else:
# if you are on other contries or other languages PR welcome here
price_re = re.findall("订单总额(.*)</b>", r.text)
# TODO
if self.domain == "cn":
price_re = re.findall("订单总额(.*)</b>", r.text)
else:
price_re = re.findall("Total for this Order:(.*)</b>", r.text)
if not price_re:
v["price"] = ""
return
price = price_re[0].replace("", "").replace(" ", "").replace("", "")
price = (
price_re[0]
.replace("", "")
.replace(" ", "")
.replace("", "")
.replace("$", "")
.replace(":", "")
)
print(
f"[{self.price_index} / {len(self.ebooks)}] Order: {order_id}, Book: {v.get('title', '')} Price: {price} Done"
)