Почему Twilio выдает ошибку 400 при отправке графического изображения - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь отправить изображения пользователю WhatsApp через Twilio, но всегда получаю ошибку 400

(400) Плохой запрос. -> {"code": 21620, "message": "URL-адреса носителей: https://image-charts.com/chart?cht=pd&chd=a: 10238,10200 & chs = 400x300 & chdls = 9e9e9e, 10 & chco = FFC00 C, 03A9F4 & chtt = Ocupaci% C3% B3n% 20en% 20al% 20 almac % C3% A9n & chdl = Contratado% 7COcupado & chli = 100.37% 25 & chl = 10238% 7C10200 & chdlp = b & chof = .png недопустимы. Пожалуйста, используйте только действительные http и https urls "," more_info ":" https://www.twilio.com/docs/errors/21620 "," status ": 400}

Изображение отлично работает в браузере или когда отправляется непосредственно пользователю напрямую в whatsapp

Я кодирую изображение вот так ( js):

    img_url = encodeURI(img_url);

Любые идеи или обходной путь?

спасибо

1 Ответ

0 голосов
/ 18 апреля 2020

Кажется, что не каждый параметр был закодирован, например: chd=a:10238,10200 должно быть chd=a%3A10238%2C10200.

encodeURI не будет производить безопасный URL, вам нужно будет полагаться на encodeURIComponent, но это будет закодируйте весь URL (включая '/ chart?'), так что это тоже не вариант.

Если вы делаете это на стороне сервера с NodeJS:

// node v10+
const url = require('url');
const querystring = require('querystring');

function encode_uri(chart_url) {
  const parsed_url = url.parse(chart_url);
  // parse the querytring and then encode every parameter values
  parsed_url.query = querystring.stringify(querystring.parse(parsed_url.query));
  // generate the full url
  return url.format({
    ...parsed_url,
    href:undefined,
    path:undefined,
    search:'?' + parsed_url.query,
  });
}


let chart_url = 'https://image-charts.com/chart?cht=pd&chd=a:10238,10200&chs=400x300&chdlp=b&chdls=9e9e9e,10&chco=FFC00C,03A9F4&chtt=Ocupación en almacén&chli=100.37%&chl=10238|10200&chdl=Contratado|Ocupado&chof=.png';
console.log(encode_uri(chart_url));

// Fully encoded URL
// https://image-charts.com/chart?cht=pd&chd=a%3A10238%2C10200&chs=400x300&chdlp=b&chdls=9e9e9e%2C10&chco=FFC00C%2C03A9F4&chtt=Ocupaci%C3%B3n%20en%20almac%C3%A9n&chli=100.37%25&chl=10238%7C10200&chdl=Contratado%7COcupado&chof=.png

Если вы делаете это на стороне браузера, тогда используйте:

function encode_uri(chart_url) {
  // use https://developer.mozilla.org/en-US/docs/Web/API/URL
  // not supported in IE10
  const parsed_url = new URL(chart_url); 

  // encode every parameter values
  [...parsed_url.searchParams.keys()].forEach(key => parsed_url.searchParams.set(key, encodeURIComponent(parsed_url.searchParams.get(key))));

  // generate back the full url
  return parsed_url.toString();
}

let chart_url = 'https://image-charts.com/chart?cht=pd&chd=a:10238,10200&chs=400x300&chdlp=b&chdls=9e9e9e,10&chco=FFC00C,03A9F4&chtt=Ocupación en almacén&chli=100.37%&chl=10238|10200&chdl=Contratado|Ocupado&chof=.png';

console.log(encode_uri(chart_url));
// https://image-charts.com/chart?cht=pd&chd=a%253A10238%252C10200&chs=400x300&chdlp=b&chdls=9e9e9e%252C10&chco=FFC00C%252C03A9F4&chtt=Ocupaci%25C3%25B3n%2520en%2520almac%25C3%25A9n&chli=100.37%2525&chl=10238%257C10200&chdl=Contratado%257COcupado&chof=.png
...