Использовать Python для анализа JSON, возвращенного из вызова Bash, а затем упаковать его для отправки в Twillio?

Я люблю каждое утро получать текстовое сообщение от банка 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)

Прошла неделя с момента моего предыдущего комментария, поэтому я переместил ваше решение в ответ сообщества вики.

Cœur 30.04.2018 12:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
165
2

Ответы 2

Ой! Мне потребовалось некоторое время, прежде чем я наконец понял вопрос, упс. 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.

matthewvolk 01.04.2018 06:02

Я отредактировал свой комментарий. Если getoutput () не возвращает список в виде строки (это должно быть из того, что вы сказали), дайте мне знать.

necko 01.04.2018 06:21

Хм, при получении ValueError: malformed node or string: <_ast.Name object at 0x1103659e8>, возможно, строка JSON не анализируется правильно?

matthewvolk 01.04.2018 19:17

@matthewvolk У вас есть образец того, что возвращает mintapi 'email' '******' --accounts, который я мог бы просмотреть?

necko 01.04.2018 21:26

Решил! Я обновил исходный пост. Спасибо вам за помощь!!

matthewvolk 01.04.2018 22:00

Нет проблем :) Я собирался предложить json.loads (), если вывод команды вернул что-то загружаемое.

necko 02.04.2018 00:54

Решение 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('-----------------------')

Другие вопросы по теме