• 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

HackNation - ogólnopolski hackathon
0 głosów
362 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 Mentor (354,880 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,300 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 (282,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 282 wizyt
pytanie zadane 10 lutego 2024 w Python przez piotr_domanski Bywalec (2,490 p.)
0 głosów
1 odpowiedź 439 wizyt
pytanie zadane 18 sierpnia 2022 w Python przez Podlasianin Początkujący (400 p.)
0 głosów
1 odpowiedź 1,007 wizyt
pytanie zadane 13 czerwca 2022 w Python przez karcia53 Nowicjusz (120 p.)

93,627 zapytań

142,551 odpowiedzi

323,050 komentarzy

63,132 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 1694p. - dia-Chann
  2. 1676p. - DziarnowskiJ
  3. 1650p. - Łukasz Piwowar
  4. 1640p. - CC PL
  5. 1616p. - Maurycy W
  6. 1607p. - raydeal
  7. 1602p. - Adrian Wieprzkowicz
  8. 1588p. - Tomasz Bielak
  9. 1521p. - Michal Drewniak
  10. 1360p. - rafalszastok
  11. 1335p. - robwarsz
  12. 1269p. - Rafał Trójniak
  13. 1257p. - ssynowiec
  14. 1208p. - Mariusz Fornal
  15. 1116p. - rucin93
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...