Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  5 6723
Hei.
Jeg driver og lærer å programmere en robot som automatisk svarer på Messenger-samtaler, og har behov for å vite hva Facebook sender til roboten min.

Altså, når Facebook sender en POST til roboten min, vet jeg ikke hva den inneholder, og vet heller ikke hvilke variabler / verdier jeg skal se etter. Derfor trenger jeg en måte å få Flask til å gi meg output av alt som er i POST-en, sånn at jeg kan studere dette og finne veien videre. Noen av variablene har jeg funnet ved å ta i utgangspunkt en annen kode jeg har funnet på nett.

Hjeeeeeelp? Det hadde vært fint å få en konkret kode, jeg merker at det er lettere for meg å lære når jeg får konkrete eksempler.

La ved koden for sikkerhets skyld, jeg la ####HER#### og ####STOPP#### der post-prosesseringen starter og slutter.

Kode

from flask import Flask, request
from pymessenger.bot import Bot

app = Flask(__name__)
VERIFY_TOKEN = '1234'
@app.route("/messenger", methods=['GET', 'POST'])
def receive_message():
 verify_token = '1234'
 if request.method == 'GET':
  token_sent = request.args.get('hub.verify_token')
  return verify_fb_token(token_sent)
####HER#### 
 else:
  output = request.get_json()
  for event in output['entry']:
   messaging = event['messaging']
   for message in messaging:
    if message.get('message'):
     recipient_id = message['sender']['id']
     if message['message'].get('text'):
      return 'Hei!'
####STOPP####

def verify_fb_token(token_sent):
   if token_sent == VERIFY_TOKEN:
    return request.args.get("hub.challenge")
    #return 'Yes'
   return 'Invalid verification token'
Sist endret av Stingray; 23. juli 2020 kl. 13:38.
Du kan f.eks. bruke https://docs.python.org/3/library/logging.html og dumpe hele requesten som kommer til fil eller stdout

f.eks slik: https://stackoverflow.com/a/26460395
Sist endret av liasis; 23. juli 2020 kl. 13:50.
Stingray's Avatar
Trådstarter
Hei! Da har jeg prøvd å kopiere koden du linket til.

Kode

from flask import Flask, request, logging
from pymessenger.bot import Bot
 
http.client.HTTPConnection.debuglevel = 1

logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True

app = Flask(__name__)
VERIFY_TOKEN = '1234'
@app.route("/messenger", methods=['GET', 'POST'])
def receive_message():
 verify_token = '1234'
 if request.method == 'GET':
  token_sent = request.args.get('hub.verify_token')
  return verify_fb_token(token_sent)
####HER#### 
 else:
  output = request.get_json()
  for event in output['entry']:
   messaging = event['messaging']
   for message in messaging:
    if message.get('message'):
     recipient_id = message['sender']['id']
     if message['message'].get('text'):
      return 'Hei!'
####STOPP####
 
def verify_fb_token(token_sent):
   if token_sent == VERIFY_TOKEN:
    return request.args.get("hub.challenge")
    #return 'Yes'
   return 'Invalid verification token'
Da skjer dette i terminalen:

Kode

Traceback (most recent call last):
  File "/home/script/robot.py", line 7, in <module>
    http.client.HTTPConnection.debuglevel=1
NameError: name 'http' is not defined
Hmm....
Det du ser etter ligger her:
output = request.get_json()

Denne ønsker du å printe ut på terminal vindu, eller skrive ut i en fil.

Formatet, eller "datatypen" er JSON. Les litt opp om hva det er, deretter kan du lese deg opp på hvordan man printer JSON i python.

Du lærer LANGT mer dersom du gjør det selv. Du lærer vanvittig mye av å feile, det er dessverre en nødvendig hindring før man lærer noe skikkelig. Husk at programmering ER basically 90% "hvordan i helsike får jeg til dette?!?", så fint å lære seg å leve med denne følelsen. Det gir seg etterhvert.
Stingray's Avatar
Trådstarter
Sitat av Patrick Vis innlegg
Det du ser etter ligger her:
output = request.get_json()

Denne ønsker du å printe ut på terminal vindu, eller skrive ut i en fil.

Formatet, eller "datatypen" er JSON. Les litt opp om hva det er, deretter kan du lese deg opp på hvordan man printer JSON i python.

Du lærer LANGT mer dersom du gjør det selv. Du lærer vanvittig mye av å feile, det er dessverre en nødvendig hindring før man lærer noe skikkelig. Husk at programmering ER basically 90% "hvordan i helsike får jeg til dette?!?", så fint å lære seg å leve med denne følelsen. Det gir seg etterhvert.
Vis hele sitatet...
Har bare en ting å si: LETT!
Jeg begynte med dette programmeringsspråket idag, så har nok mye å ta igjen. Tusen takk for all hjelp. La oss håpe at jeg neste gang klarer å finne en løsning uten å måtte komme hit og sutre da

Og forresten, en ting!!!

Kode

{'object': 'page', 'entry': [{'id': '1234', 'time': 1595511816560, 'messaging': [{'sender': {'id': '420'}, 'recipient': {'id': '4567'}, 'timestamp': 1595511816159, 'message': {'mid': 'aljsdfhuoisahtuiashuhstauishdfuiasitlghsuieyhodg', 'text': 'Testmelding? Hallo?'}}]}]}
Jeg reagerte på dette:

Kode

recipient_id = message['sender']['id']
                if message['message'].get('text'):
                    response_sent_text = get_message()
                    send_message(recipient_id, response_sent_text)
Hvis man ser på recipinent_id, ligger den ikke under "message", men "messaging". Message kommer først etter recipinent id. Hvorfor fungerer det da ved å bruke message['sender']['id']? Er det fordi den sier "sjekk før message, der finner du recipinent og id"?

Bump?
Sist endret av Stingray; 23. juli 2020 kl. 19:09. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Sitat av Stingray Vis innlegg
Har bare en ting å si: LETT!
Jeg begynte med dette programmeringsspråket idag, så har nok mye å ta igjen. Tusen takk for all hjelp. La oss håpe at jeg neste gang klarer å finne en løsning uten å måtte komme hit og sutre da

Og forresten, en ting!!!

Kode

{'object': 'page', 'entry': [{'id': '1234', 'time': 1595511816560, 'messaging': [{'sender': {'id': '420'}, 'recipient': {'id': '4567'}, 'timestamp': 1595511816159, 'message': {'mid': 'aljsdfhuoisahtuiashuhstauishdfuiasitlghsuieyhodg', 'text': 'Testmelding? Hallo?'}}]}]}
Jeg reagerte på dette:

Kode

recipient_id = message['sender']['id']
                if message['message'].get('text'):
                    response_sent_text = get_message()
                    send_message(recipient_id, response_sent_text)
Hvis man ser på recipinent_id, ligger den ikke under "message", men "messaging". Message kommer først etter recipinent id. Hvorfor fungerer det da ved å bruke message['sender']['id']? Er det fordi den sier "sjekk før message, der finner du recipinent og id"?
Vis hele sitatet...
Det blir mye enklere å lese JSON dersom vi "pretty printer" objektet:

Kode

{
  "object": "page",
  "entry": [
    {
      "id": "1234",
      "time": 1595511816560,
      "messaging": [
        {
          "sender": {
            "id": "420"
          },
          "recipient": {
            "id": "4567"
          },
          "timestamp": 1595511816159,
          "message": {
            "mid": "aljsdfhuoisahtuiashuhstauishdfuiasitlghsuieyhodg",
            "text": "Testmelding? Hallo?"
          }
        }
      ]
    }
  ]
}
JSON sin struktur er altså "trestruktur". Du kan se på det litt som et filsystem. Der har du mapper og filer. JSON fungerer på samme måte, men istedenfor mapper og filer, så har vi arrays/objects/strings/bool/osv.

Legg merke til at "entry" er et array der første element er et objekt som har properties som "id", "time", "messaging" osv.