Я люблю каждое утро получать текстовое сообщение от банка Chase Bank с балансом моего текущего счета. Я погрузился в настройки своей личной учетной записи, чтобы посмотреть, могу ли я запланировать отправку сообщения мне с остатками на других счетах в моей учетной записи, только чтобы понять, что проверка была единственной учетной записью, с которой это было возможно.
Используя библиотеку под названием mintapi (https://github.com/mrooney/mintapi), я смог очистить данные учетной записи, хранящейся в моей учетной записи Mint. Цель состоит в том, чтобы каждое утро отправлять текстовое сообщение через Twillio с балансом каждой отдельной учетной записи в моей учетной записи Mint.
$ mintapi [email: String] [password: String] --accounts
Выполнение приведенной выше команды в вашем терминале возвращает следующий объект для каждого финансового счета, который у меня есть в Mint:
{
"linkedAccountId": null,
"addAccountDate": Int,
"fiLoginDisplayName": Str,
"dueDate": "12/27/2017",
"isTerminal": true,
"linkCreationTime": null,
"isActive": true,
"lastUpdated": Int,
"rateType": 2,
"fiName": Str,
"origAmount": null,
"klass": "loan",
"accountTypeInt": 6,
"id": 9856811,
"fiLoginId": 3914975,
"accountType": "loan",
"currentBalance": Int,
"fiLoginStatus": "OK",
"origDate": "02/27/2020",
"linkStatus": "NOT_LINKED",
"accountId": Int,
"yodleeAccountId": Int,
"name": Str (Account Nickname),
"status": "1",
"accountName": Str (Account Name, e.g. Chase Checking),
"ccAggrStatus": 0,
"exclusionType": "0",
"linkedAccount": null,
"isHiddenFromPlanningTrends": true,
"accountStatus": "1",
"accountSystemStatus": "ACTIVE",
"fiLastUpdated": Int,
"yodleeAccountNumberLast4": "Int",
"isError": false,
"isAccountNotFound": false,
"rate": null,
"possibleLinkAccounts": [],
"lastUpdatedInString": "12 hours",
"currency": "USD",
"term": 100,
"isHostAccount": false,
"value": Int (Confidential - Account Balance),
"usageType": null,
"interestRate": null,
"isAccountClosedByMint": false,
"userName": null,
"yodleeName": Str,
"closeDate": Int,
"dueAmt": Int (Confidential - Amount due on next bill),
"amountDue": 0.0,
"isClosed": false,
"fiLoginUIStatus": "OK",
"addAccountDateInDate": "2017-06-11 13:54:06",
"closeDateInDate": "2018-03-30 08:21:39",
"fiLastUpdatedInDate": "2018-03-31 05:33:47",
"lastUpdatedInDate": "2018-03-31 05:33:47"
}
Я хотел бы захватить вывод из приведенного выше сценария bash и сохранить его как данные JSON в переменной python.
Редактировать: Задав вопрос, я обнаружил библиотеку подпроцесса.
import subprocess
out = subprocess.run("mintapi 'email' '******' --accounts", shell=True)
Теперь мое возвращаемое значение:
CompletedProcess(args = "mintapi 'email' '*******' --accounts", returncode=0)






Ой! Мне потребовалось некоторое время, прежде чем я наконец понял вопрос, упс. Twilio иметь документацию по API для отправки сообщения и даже библиотека Python с примером кода. Двух ссылок должно быть достаточно, чтобы помочь вам в этом, удачи.
РЕДАКТИРОВАТЬ
Попробуйте использовать subprocess.getoutput() (https://docs.python.org/3/library/subprocess.html#subprocess.getoutput)
Тогда вы могли бы (возможно) объединить это с ast.literal_eval () как таковым
import ast
import subprocess
out = subprocess.getoutput("mintapi 'email' '******' --accounts")
output = ast.literal_eval(out)
Тогда output окажется именно тем, что вам нужно :)
Да, прости! Я должен был быть более конкретным, основная проблема, с которой я столкнулся, - это захват вывода из вызова подпроцесса. После публикации я импортировал библиотеку подпроцесса, а затем позвонил в subprocess.run (command, shell = True), а затем сохранил это в переменной. Однако теперь переменная просто содержит экземпляр класса, мне нужно, чтобы она содержала экземпляр данных JSON.
Я отредактировал свой комментарий. Если getoutput () не возвращает список в виде строки (это должно быть из того, что вы сказали), дайте мне знать.
Хм, при получении ValueError: malformed node or string: <_ast.Name object at 0x1103659e8>, возможно, строка JSON не анализируется правильно?
@matthewvolk У вас есть образец того, что возвращает mintapi 'email' '******' --accounts, который я мог бы просмотреть?
Решил! Я обновил исходный пост. Спасибо вам за помощь!!
Нет проблем :) Я собирался предложить json.loads (), если вывод команды вернул что-то загружаемое.
Решение OP.
import mintapi
import subprocess
import json
import getpass
mint_user = input('Please enter your Mint login email: ')
mint_pass = getpass.getpass('Please enter your Mint password: ')
# Format cmd string to inject into Python subprocess
cmd = "mintapi '{}' '{}' --accounts".format(mint_user, mint_pass)
# Store class method value in output variable
output = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
# Read output value and convert to bytestring
jsonS = output.communicate()
# Decode bytestring into JSON data Array object
account_json = json.loads(jsonS[0].decode('utf-8'))
for i in range(0, len(account_json)):
if (account_json[i]['currentBalance'] != 0):
print(account_json[i]['accountName'], end=' - ')
print(account_json[i]['fiLoginDisplayName'])
print('${:,.2f}'.format((account_json[i]['currentBalance'])))
print('-----------------------')
Прошла неделя с момента моего предыдущего комментария, поэтому я переместил ваше решение в ответ сообщества вики.