Как добавить значения из API coinmarketcap в сообщение телеграммы? - PullRequest
1 голос
/ 02 апреля 2019

Я пытаюсь завершить телеграмм-бот, который после нескольких команд ответит сообщением ... У меня нет надежды на то, что я смогу решить это в одиночку.Эти команды с предопределенным сообщением сделаны и работают как шарм. Но теперь я застрял в команде / price, которая должна показывать ценность монеты в сообщении от интерфейса coinmarket API.

Я перепробовал много вариантов, но следующие результатывсегда вызывается для ошибки API Call: или сообщение типа [объект объекта] ..

     ALQO: $0.0443407142 | 9.73% ?
     ETH: 0.000313592 | 10.14% ?
     BTC: 0.0000107949 | 9.5% ?
     Cap: $2,545,718

Этот текст является правильным ответом от бота ... К сожалению, с бесплатным API от CMC я могу сделать только цену с долларом США, поэтомуправильный ответ должен быть

       Coinname: Price | Change%
       Cap: Marketcap       

Мой код команды / price

    //This is /price command code
    'use strict';

     const Telegram = require('telegram-node-bot');

     const rp = require('request-promise');
     const requestOptions = {
     method: 'GET',
     uri: 'https://pro- 
     api.coinmarketcap.com/v1/cryptocurrency/quotes/latest? 
     id=3501&convert=USD',
     headers: {
     'X-CMC_PRO_API_KEY': 'MYFREEAPIKEYFROMCMC'
      },
      json: true,
      gzip: true
     };

     rp(requestOptions).then(response => {
     console.log('API call response:', response['data'][3501]);
     }).catch((err) => {
     console.log('API call error:', err.message);
   });

    class PriceController extends Telegram.TelegramBaseController {
    PriceHandler($) {
    rp(requestOptions).then(response => {
    console.log('API call response:', response['data'][3501]);
    $.sendMessage('Cryptosoul: price', response['data']['USD']['price'] 
    [3501]);
   }).catch((err) => {
    $.sendMessage('API call error:', err.message);
  });
 }

get routes() {
    return {
        'priceCommand': 'PriceHandler'
    };
  };
}

 module.exports = PriceController;

Ответ от API после узла index.js (включение бота, (сообщение от терминала Visual Studio)

     API call response: { id: 3501,
     name: 'CryptoSoul',
     symbol: 'SOUL',
     slug: 'cryptosoul',
     circulating_supply: 143362580.31,
     total_supply: 499280500,
     max_supply: null,
     date_added: '2018-10-25T00:00:00.000Z',
     num_market_pairs: 3,
     tags: [],
     platform:
   { id: 1027,
     name: 'Ethereum',
     symbol: 'ETH',
     slug: 'ethereum',
     token_address: '0xbb1f24c0c1554b9990222f036b0aad6ee4caec29' },
     cmc_rank: 1194,
     last_updated: '2019-04-01T23:03:07.000Z',
   quote:
    { USD:
     { price: 0.000188038816143,
     volume_24h: 11691.5261174775,
     percent_change_1h: 0.29247,
     percent_change_24h: 0.0222015,
     percent_change_7d: 4.69888,
     market_cap: 26957.72988069816,
     last_updated: '2019-04-01T23:03:07.000Z' } } }

Сообщения, которые появляются после команды / price, вызвали «Ошибка вызова API:» «[object object]» «Ошибка при запуске узла index.js (неверный код)» Чат с ботом

1 Ответ

0 голосов
/ 02 апреля 2019

Как я мог видеть, вы неправильно получаете доступ к полученному объекту ответа json здесь:

$.sendMessage('Cryptosoul: price', response['data']['USD']['price'] 
[3501])

Простая печать этого объекта ответа дает правильный способ доступа к определенным свойствам.

{
    "status": {
        "timestamp": "2019-04-02T08:38:09.230Z",
        "error_code": 0,
        "error_message": null,
        "elapsed": 14,
        "credit_count": 1
    },
    "data": {
        "3501": {
            "id": 3501,
            "name": "CryptoSoul",
            "symbol": "SOUL",
            "slug": "cryptosoul",
            "circulating_supply": 143362580.31,
            "total_supply": 499280500,
            "max_supply": null,
            "date_added": "2018-10-25T00:00:00.000Z",
            "num_market_pairs": 3,
            "tags": [],
            "platform": {
                "id": 1027,
                "name": "Ethereum",
                "symbol": "ETH",
                "slug": "ethereum",
                "token_address": "0xbb1f24c0c1554b9990222f036b0aad6ee4caec29"
            },
            "cmc_rank": 1232,
            "last_updated": "2019-04-02T08:37:08.000Z",
            "quote": {
                "USD": {
                    "price": 0.000201447607597,
                    "volume_24h": 12118.3983544441,
                    "percent_change_1h": 1.48854,
                    "percent_change_24h": 6.88076,
                    "percent_change_7d": 12.4484,
                    "market_cap": 28880.04882238228,
                    "last_updated": "2019-04-02T08:37:08.000Z"
                }
            }
        }
    }
}

Итак, мы могли видеть, что поле price находится под USD объектом, который сам находится под объектом quote, которого нет в вашем коде.

Правильный способ получить это будет:

const price = response["data"][3501]["quote"]["USD"]["price"];

Код цены продавца:

PriceHandler($) {
    rp(requestOptions)
        .then((response) => {
            const price = response["data"][3501]["quote"]["USD"]["price"];
            $.sendMessage("Cryptosoul: price", price);
        })
        .catch((err) => {
            console.error("API call error:", err.message);
        });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...