• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Aplikacja Flask nie dekoduje JSON przy requescie POST

VPS Starter Arubacloud
0 głosów
239 wizyt
pytanie zadane 9 lipca 2021 w Python przez Hellmick Początkujący (270 p.)

Cześć,

podczas pracy nad botem do messengera, kiedy testowałem webhooka przy testowym requeście POST, dostaję odpowiedź:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>400 Bad Request</title>
<h1>Bad Request</h1>
<p>Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)</p>
curl: (6) Could not resolve host: page,
curl: (6) Could not resolve host: entry
curl: (3) [globbing] bad range specification in column 2
curl: (3) [globbing] bad range specification in column 2
curl: (3) [globbing] unmatched close brace/bracket in column 13

Kod mojego programu:

from flask import Flask, request
import requests
from os import getenv
import config

app = Flask(__name__)
cfg = config.Config

FB_API_URL = cfg.FB_API_URL
VERIFY_TOKEN = cfg.VERIFY_TOKEN
USER_ACCESS_TOKEN = cfg.USER_ACCESS_TOKEN
THREAD_ID = cfg.THREAD_ID
PRODUCTION = cfg.THREAD_ID
MY_ID = cfg.MY_ID


def send_message(text):
    payload = {
        'message': {
            'text': text
        },
        "recipient": {
            "thread_key": THREAD_ID
        },
    }

    if PRODUCTION:
        payload['recipient'] = {
            "id": [MY_ID]
        }

    auth = {
        'access_token': USER_ACCESS_TOKEN
    }

    response = requests.post(
        FB_API_URL,
        params=auth,
        json=payload
    )

    return response.json

def get_bot_response(message):
    return f'<bot> {message}'

def verify_webhook(req):
    print(req.args.get("challenge"))
    if req.args.get("hub.verify_token") == VERIFY_TOKEN and req.args.get("hub.mode") == "subscribe":
        print("Webhook verified")
        return req.args.get("hub.challenge")
    else:
        return "403 forbidden"

def respond(message):
    send_message(get_bot_response(message))

def is_valid(message):
    return message.get('message') and message['message'].get('text') and not message['message'].get('is_echo')

@app.route('/webhook', methods=['GET','POST'])
def listen():
    if request.method == 'GET':
        return verify_webhook(request)

    if request.method == 'POST':
        payload = request.json.loads()
        #print(payload)
        event = payload['entry'][0]['messages']
        for x in event:
            if is_valid(x):
                text = x['message']['text']
                respond(text)

        return "ok"


if __name__ == '__main__':
    app.run()

Proszę o pomoc, co może powodować ten błąd.

komentarz 9 lipca 2021 przez adrian17 Ekspert (349,940 p.)
Chyba niezbyt rozumiem na jakiej warstwie jest błąd, bo tu i odbierasz zapytania, i robisz nowe...

Możesz pokazać jak testujesz curlem?

Nie rozumiem też tego `request.json.loads()`, nigdzie nie widzę w dokumentacji by coś takiego istniało. Jest `request.json` i `flask.json.loads()`, ale raczej tutaj ma sens tylko to pierwsze?

2 odpowiedzi

+1 głos
odpowiedź 11 lipca 2021 przez obl Maniak (51,280 p.)
edycja 11 lipca 2021 przez obl
from flask import Flask, json, jsonify, request

...

request.json # dostajesz jsona (jeżeli sparsuje się poprawnie)

...

return (jsonify({"data": "something to send"}), 200) # zamieniasz dictionary na jsona
0 głosów
odpowiedź 9 lipca 2021 przez Wiciorny Ekspert (277,580 p.)

Nie wiem jak ewaulowane są tutaj JSON - czy nie jest to przypadkiem  json w postaci STRING Request tzn, posyłany jest json jako string wtedy, problem może leżęć w braku konwencji 
 

payload = {
        'message': {
            'text': text
        },
        "recipient": {
            "thread_key": THREAD_ID
        },
    }

raz stosujesz "", a raz pojedynczy. 
 

"{\"title\":\"Read a boo\"}"

trzeba by wtedy przysłonić ;] żeby domyślnie nie było kolizji 
Pytanie czy twój request wysyła JSON, czy JSON stringa, bo samo to że headerem jest JSON nie wyklucza że może to być JSON string, np. tak jest w Springu ;'[ w Javie. 
Dodatkowo pytanie, czego oczekuje server  jako request body, czy typowo JSON format, czy możę JSON object jako JSON String. 
Z tego co wyczytałem to problem jest tego typu że przesyłany jest JSON string ;] więc jeśli twoje dane mają podwójny "" to problem leży w parsowaniu 

Podobne pytania

0 głosów
0 odpowiedzi 135 wizyt
pytanie zadane 10 lutego w Python przez piotr_domanski Bywalec (2,140 p.)
0 głosów
1 odpowiedź 298 wizyt
pytanie zadane 18 sierpnia 2022 w Python przez Podlasianin Początkujący (400 p.)
0 głosów
1 odpowiedź 668 wizyt
pytanie zadane 13 czerwca 2022 w Python przez karcia53 Nowicjusz (120 p.)

93,020 zapytań

141,985 odpowiedzi

321,284 komentarzy

62,366 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...