• 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

0 głosów
76 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 (306,660 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,120 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 Mędrzec (198,200 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
1 odpowiedź 51 wizyt
0 głosów
1 odpowiedź 129 wizyt
pytanie zadane 24 lutego 2021 w Python przez Klmn3 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 72 wizyt
pytanie zadane 27 października 2020 w Python przez antypop Mądrala (5,720 p.)

86,514 zapytań

135,267 odpowiedzi

300,569 komentarzy

57,263 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...