-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathserver.py
More file actions
126 lines (102 loc) · 3.35 KB
/
Copy pathserver.py
File metadata and controls
126 lines (102 loc) · 3.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import json
import os
import sys
from alexa import AlexaShoppingList
from anylist import AnyList
from synchronizer import Synchronizer
import onetimepass as otp
from time import sleep
import traceback
import logging
logging.basicConfig(
format='%(asctime)s.%(msecs)03d %(levelname)s %(module)s - %(funcName)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
)
logger = logging.getLogger('__name__')
logger.setLevel(logging.DEBUG)
def _config_path():
return os.environ.get(
"CONFIG_PATH",
os.path.dirname(os.path.realpath(__file__))
)
def _load_config():
if os.path.exists(os.path.join(_config_path(), 'config.json')):
with open(os.path.join(_config_path(), 'config.json'), 'r') as file:
return json.load(file)
return {}
def _get_config_value(key, default=None):
if key in config.keys():
return config[key]
return default
def _start_alexa():
global alexa
global alexa_running
if alexa_running == False:
alexa = AlexaShoppingList(
_get_config_value("amazon_url", "amazon.co.uk"),
_config_path()
)
alexa_running = True
return alexa
def _stop_alexa():
global alexa
global alexa_running
if alexa_running == True:
del alexa
alexa = None
alexa_running = False
# Make sure the length of a given string is a multiple of 8.
# If it isn't, pad it with '=' characters until it is.
def _pad_string(string):
while len(string) % 8 != 0:
string += '='
return string
alexa_running = False
alexa = None
global config
config = _load_config()
anylist = AnyList(
email=_get_config_value("anylist_username", "anylist_username"),
password=_get_config_value("anylist_password", "anylist_password"),
credential_cache='anylist-credentials.json',
)
anylist.login()
list_anylist = anylist.get_list_by_name(_get_config_value("anylist_list_name", "anylist_list_name"))
logger.info(f"Anylist: {list_anylist}")
if list_anylist is None:
logger.info("List not found")
anylist.teardown()
sys.exit(1)
logger.info("Connecting to Alexa...")
alexa = _start_alexa()
logger.info("Logging in...")
alexa.login(_get_config_value("amazon_username", "amazon_username"), _get_config_value("amazon_password", "amazon_password"))
if alexa.login_requires_mfa():
logger.info("Requires MFA")
my_token = otp.get_totp(_pad_string(_get_config_value("amazon_mfa_secret", "amazon_mfa_secret")))
alexa.submit_mfa(my_token)
if alexa.is_authenticated:
logger.info("Code accepted")
else:
logger.info("Code failed")
if alexa.is_authenticated:
logger.info("Logged in successfully")
else:
logger.info("Login failed!!")
_stop_alexa()
if anylist is not None:
anylist.teardown()
sys.exit(1)
syncer = Synchronizer(list_anylist, alexa, journal_file='journal.json')
while True:
try:
syncer.sync()
sleep(10)
except Exception as e:
logger.error(e, exc_info=True)
break
_stop_alexa()
anylist.teardown()
# Original Alexa list: ['Garbanzos 3.5kg', 'Alubia pinta 4kg']
# ~/alexa2anylist [main|✚ 2 …4]> rm config/anylist-credentials.json config/cookies.json -f
# ~/alexa2anylist [main|✚ 1 …4]> podman build . -t alexa2anylist && podman run --rm -it -v ./config/:/config/ -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro -v /tmp/out:/out alexa2anylist