• 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
215 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 (344,100 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 (269,120 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 42 wizyt
pytanie zadane 10 lutego w Python przez piotr_domanski Bywalec (2,040 p.)
0 głosów
1 odpowiedź 251 wizyt
pytanie zadane 18 sierpnia 2022 w Python przez Podlasianin Początkujący (400 p.)
0 głosów
1 odpowiedź 415 wizyt
pytanie zadane 13 czerwca 2022 w Python przez karcia53 Nowicjusz (120 p.)

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...