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.
  10 7107
Hei.
PYTHON3

Kode

      if output["object"] == "page":
       for entry in output["entry"]:
        for messaging_event in entry["messaging"]:
         ##We got message
         if messaging_event.get("message"):
          ##What is sender id, and which page recieve?
          sender_id = messaging_event["sender"]["id"]
          page_id = messaging_event["recipient"]["id"]
          ##If message is text, put it in message_text
          if messaging_event['message'].get('text'):
           message_text = messaging_event["message"]["text"]
           print('It is text, ' + message_text + ', OK?') 
          ##If message is attachment, get URL
          if messaging_event['message'].get('attachments'):
           attachment_url = messaging_event["message"]["attachments"]["type"]
           print(attachment_url)
           print("It is attachment")
     return("ok", 200)
Dette er skriptet mitt. Facebook messenger-robot. Den ene delen sjekker om meldingen er tekst, og printer teksten.

Nå prøver jeg med å finne frem til URL-en til vedlegget som blir sendt. Jeg er veldig usikker på hvordan jeg parser den, og henter frem URL-adressen.

Det som sendes er:

Kode

#####Meldinger som sendes til roboten min. Alt OK. Får hentet frem feltene jeg vil ha.

{'object': 'page', 'entry': [{'id': '420420', 'time': 420420, 'messaging': [{'sender': {'id': '420420'}, 'recipient': {'id': '420420'}, 'timestamp': 420420, 'message': {'mid': 'asdfasdfsafsafa', 'text': 'Test'}}]}]}

#####Vedlegg som sendes til roboten min. Jeg vil ha frem "type: image", "payload" og "url:..."

{'object': 'page', 'entry': [{'id': '420420', 'time': 420420, 'messaging': [{'sender': {'id': '420420'}, 'recipient': {'id': '420420'}, 'timestamp': 420420, 'message': {'mid': '420420', 'attachments': [{'type': 'image', 'payload': {'url': 'https://scontent.xx.fbcdn.net/v/bilde.png', 'sticker_id': 420420}}]}}]}]}
Thanks

Fint hvis noen også gidder å forklare litt om hvordan jeg går fra et punkt til et underpunkt, og så videre, og gjerne tar med hva jeg skal gjøre hvis det kommer et [.
Sist endret av Stingray; 5. august 2020 kl. 18:27. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
nso
popålol
nso's Avatar
Administrator
Jeg forstår ikke helt problemet. Du leser jo allerede "messaging", og "attachments" er jo akkurat samme datatype (array av objekter).
Sist endret av nso; 5. august 2020 kl. 20:14.
Feilmeldingen jeg får er

Kode

  File "/home/user/robot.py", line 41, in receive_message
    attachment_type = messaging_event["attachments"]["type"]
KeyError: 'attachments'
Nå prøvde jeg med å bytte ut "attachments" med noe random, da dukket ikke feilmeldingen opp (bare så det er spesifisert: Funksjonen fungerte heller ikke da, selvfølgelig!). Nå forstår jeg ihvertfall ikke hvor problemet ligger....

Kanskje greit å ta med hele koden jeg utvikler nå, beklager at jeg bytter mellom norsk og engelsk kommentarer, jeg som roter litt

Kode

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

app = Flask(__name__)
FB_API_URL = 'https://graph.facebook.com/v7.0/me/messages'
ACCESS_TOKEN = '420420'
VERIFY_TOKEN = '420420'
bot = Bot(ACCESS_TOKEN)

#We will receive messages that Facebook sends our bot at this endpoint 

@app.route("/messenger", methods=['GET', 'POST'])
def receive_message():
    print("Kommando starter...")
    if request.method == 'GET':
        print("Request er GET")
        token_sent = request.args.get("hub.verify_token")
        return verify_fb_token(token_sent)
        print("Token er kanskje OK")

    else:
     print("Request er ikke GET")
     if request.method == 'POST':
      print("Request er POST")
      output = request.get_json()
      print(output)
      if output["object"] == "page":
       for entry in output["entry"]:
        for messaging_event in entry["messaging"]:

         #We got message
         if messaging_event.get("message"):

          ##What is sender id, and which page recieve?
          sender_id = messaging_event["sender"]["id"]
          page_id = messaging_event["recipient"]["id"]

          ##If message is text, put it in message_text
          if messaging_event['message'].get('text'):
           message_text = messaging_event["message"]["text"]
           print('It is text, ' + message_text + ', OK?') 

          ##If message is attachment
         if messaging_event['message'].get('attachments'):
          #for attachment_event in entry["messaging"]["attachments"]:
           attachment_type = messaging_event["attachments"]["type"]
           attachment_url = messaging_event["attachments"]["url"]
           print(attachment_url)
           print("It is attachment")
     return("ok", 200)
           

def verify_fb_token(token_sent):
   if token_sent == VERIFY_TOKEN:
    return request.args.get("hub.challenge")
    print("hub.challenge")
   return 'Invalid verification token'

if __name__ == "__main__":
    app.run(debug=True)
Sist endret av Stingray; 5. august 2020 kl. 20:11.
nso
popålol
nso's Avatar
Administrator
Kan ikke FB, kan ikke python, men noe a'la:

Kode

if output["object"] == "page":
   for entry in output["entry"]:
        for messaging_event in entry["messaging"]:
            if messaging_event.get("message"):
                if messaging_event['message'].get('text'):
                    message_text = messaging_event["message"]["text"]
                    print('Found text: ' + message_text + ', OK?') 
                elif messaging_event['message'].get('attachments'):
                    for attachment in entry["attachments"]: # les attachments-attributen som array...
                        if attachment["type"]== "image":
                            print('Found image attachment: ' + attachment["payload"]["url"])
                        else:
                            print('Found unsupported attachment type')
                else:
                    print('Found unsupported message type')
JSON er ganske simpelt.

Kode

{
    'something': [...], # array
    'something': {...}, # objekt
    'something': 123, # nummer
    'something': 'tekst', # streng

    # og så bruker man disse 4 datatypene til å lage mer kompliserte strukturer hvis ønsket

    'something': ['abc', 'def', ...], # array av strenger
    'something': [{ 'a': 123 }, {'b': 234}, ...], # array av objekter som inneholder en attribut som er et tall
    ... etc etc
}
Sist endret av nso; 5. august 2020 kl. 20:23.
La oss også pretty printe objektet mens jeg undersøker forslaget ditt, kommer tilbake med tilbakemelding

Kode

{
'object': 'page', 
 'entry': [
  {
   'id': '420420', 
   'time': 420420, 
    'messaging': 
    [
     {
      'sender': 
      {
         'id': '420420'
      },
      'recipient': 
      {
         'id': '420420'
      }, 
      'timestamp': 420420, 
      'message': 
      {
       'mid': 'm_420420', 

     'attachments': 
     [
      {
      'type': 'image', 
      'payload': 
        {
         'url': 'https://scontent.xx.fbcdn.net/v/420420', 'sticker_id': 420420
        }
       }
      ]
     }
    }
   ]
  }
 ]
}
Sist endret av Stingray; 5. august 2020 kl. 20:18.
All the way up
[entry] [messaging][attachments][payload][url] ?
sitter på tlf så får ikke prøvd atm. Du må åpne dictsa inne i dictsa
Sist endret av semis; 5. august 2020 kl. 20:20.
Sitat av semis Vis innlegg
[entry] [messaging][attachments][payload][url] ?
sitter på tlf så får ikke prøvd atm. Du må åpne dictsa inne i dictsa
Vis hele sitatet...
Jeg forstod ikke helt hvor / hvordan jeg bruker dette

Nå får jeg følgende feilmelding:

Kode

  File "/home/user/robot.py", line 50, in receive_message
    attachment_type=messaging_event['message']['attachments']["type"]
TypeError: list indices must be integers or slices, not str
Nå ser koden slik ut:

Kode

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

app = Flask(__name__)
FB_API_URL = 'https://graph.facebook.com/v7.0/me/messages'
ACCESS_TOKEN = '420420'
VERIFY_TOKEN = '420420'
bot = Bot(ACCESS_TOKEN)

#We will receive messages that Facebook sends our bot at this endpoint 
@app.route("/messenger", methods=['GET', 'POST'])
def receive_message():
    print("Kommando starter...")


    if request.method == 'GET':
        print("Request er GET")
        token_sent = request.args.get("hub.verify_token")
        return verify_fb_token(token_sent)
        print("Token er kanskje OK")

    else:
     print("Request er ikke GET")
     if request.method == 'POST':
      print("Request er POST")
      output = request.get_json()
      print(output)
      if output["object"] == "page":
       for entry in output["entry"]:
        for messaging_event in entry["messaging"]:


         #We got message
         if messaging_event.get("message"):
           ##What is sender id, and which page recieve?
           sender_id = messaging_event["sender"]["id"]
           page_id = messaging_event["recipient"]["id"]


           ##If message is text, put it in message_text
           if messaging_event['message'].get('text'):
            message_text = messaging_event["message"]["text"]
            print('Found text: ' + message_text + ', OK?') 

####Se herfra, freak!
           ##If message is attachment
           if messaging_event['message'].get('attachments'):
            print("It is attachment")
            attachment_type=messaging_event['message']['attachments']["type"] # Dette er linje 50
            attachment_url=messaging_event['message']['attachments']["payload"]["url"] # Dette er linje 51
            print("Found attachment type: " + attachment_type)
            print("Found attachment url: " + attachment_url)
           
           ##If attachment type is image 
            if attachment_type == "image":
              print("It is image")
              attachment_url = attachment_event["url"]
              print(attachment_url)
            else:
              print("Found unsupported attachment type")
####Stopp her, freak.

         else:
          print("Found unsupported message type")   
     return("ok", 200)
           
def verify_fb_token(token_sent):
   if token_sent == VERIFY_TOKEN:
    return request.args.get("hub.challenge")
    print("hub.challenge")
   return 'Invalid verification token'

if __name__ == "__main__":
    app.run(debug=True)
Trigonoceps occipita
vidarlo's Avatar
Donor
Sitat av Stingray Vis innlegg
Feilmeldingen jeg får er

Kode

  File "/home/user/robot.py", line 41, in receive_message
    attachment_type = messaging_event["attachments"]["type"]
KeyError: 'attachments'
Vis hele sitatet...
https://freak.no/forum/showpost.php?...75&postcount=2

Set breakpoint på linje 41, fyr opp debugger, og sjekk korleis objektet ditt *faktisk* ser ut. Det er nettopp slikt som det her du bruker en debugger til. Det er ikkje spesielt vanskelig, og gjer det mogeleg å sjå korleis datastrukturer e.l. faktisk ser ut i minnet.
JSON blir parset som nøstede lister og dictionaries. Listeeelementene finner du med index (heltall), mens dictionary-verdien finner du med navn på keyen (som regel en string her, ser det ut til).

Jeg synes ikke den pretty-printen din var så veldig pretty, men hvis du f.eks. skal ha tak i payloaden, så kan du f.eks. prøve med

Kode

["entry"][0]["messaging"][0]["attachments"][0]["payload"]
Ellers, så kan du alltids manøvrere deg gjennom JSON-en ved å printe ut de forskjellige nivåene, ev. med type() for å dobbeltsjekke hva slags type det er.

F.eks.:

Kode

>>> print(output["entry"])
...blabla
>>> type(output["entry"])
...blabla
>>> print(output["entry"][0])
...blabla
Ofte er det lister inni der med bare ett element, noe som også er hvorfor jeg prøver med [0] innimellom. Men ved å gå gjennom JSON-en steg for steg på denne måten, så finner du fort ut hvordan du skal manøvrere deg til det punktet du er interessert i.

PS: Jupyter Notebook er perfekt til denne typen eksperimentering.
Sist endret av Realist1; 5. august 2020 kl. 21:11.
▼ ... over en uke senere ... ▼
Sitat av vidarlo Vis innlegg
https://freak.no/forum/showpost.php?...75&postcount=2

Set breakpoint på linje 41, fyr opp debugger, og sjekk korleis objektet ditt *faktisk* ser ut. Det er nettopp slikt som det her du bruker en debugger til. Det er ikkje spesielt vanskelig, og gjer det mogeleg å sjå korleis datastrukturer e.l. faktisk ser ut i minnet.
Vis hele sitatet...
Hei!
"Sett breakpoint på linje 41", det vil si legge inn teksten "breakpoint()" der?

"Fyr opp debugger", kjøre et annet program som er ment til sånt altså? Forslag til hvilket?

Sitat av Realist1 Vis innlegg
JSON blir parset som nøstede lister og dictionaries. Listeeelementene finner du med index (heltall), mens dictionary-verdien finner du med navn på keyen (som regel en string her, ser det ut til).

Jeg synes ikke den pretty-printen din var så veldig pretty, men hvis du f.eks. skal ha tak i payloaden, så kan du f.eks. prøve med

Kode

["entry"][0]["messaging"][0]["attachments"][0]["payload"]
Ellers, så kan du alltids manøvrere deg gjennom JSON-en ved å printe ut de forskjellige nivåene, ev. med type() for å dobbeltsjekke hva slags type det er.

F.eks.:

Kode

>>> print(output["entry"])
...blabla
>>> type(output["entry"])
...blabla
>>> print(output["entry"][0])
...blabla
Ofte er det lister inni der med bare ett element, noe som også er hvorfor jeg prøver med [0] innimellom. Men ved å gå gjennom JSON-en steg for steg på denne måten, så finner du fort ut hvordan du skal manøvrere deg til det punktet du er interessert i.

PS: Jupyter Notebook er perfekt til denne typen eksperimentering.
Vis hele sitatet...
Smart! Jeg orket ikke å gjøre så mye ut av dette, men fant til slutt ut at dette fungerer:

Kode

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

app = Flask(__name__)
FB_API_URL = 'https://graph.facebook.com/v7.0/me/messages'
ACCESS_TOKEN = '420420'
VERIFY_TOKEN = '420420'
bot = Bot(ACCESS_TOKEN)

#We will receive messages that Facebook sends our bot at this endpoint 
@app.route("/messenger", methods=['GET', 'POST'])
def receive_message():
    print("Kommando starter...")


    if request.method == 'GET':
        print("Request er GET")
        token_sent = request.args.get("hub.verify_token")
        return verify_fb_token(token_sent)
        print("Token er kanskje OK")

    else:
     print("Request er ikke GET")
     if request.method == 'POST':
      print("Request er POST")
      output = request.get_json()
      print(output)
      if output["object"] == "page":
       for entry in output["entry"]:
        for messaging_event in entry["messaging"]:
         #print(output["entry"])
         type(output["entry"])


         #We got message
         if messaging_event.get("message"):
           ##What is sender id, and which page recieve?
           sender_id = messaging_event["sender"]["id"]
           page_id = messaging_event["recipient"]["id"]


           ##If message is text, put it in message_text
           if messaging_event['message'].get('text'):
            message_text = messaging_event["message"]["text"]
            print('Found text: ' + message_text + ', OK?')


           ##If message is attachment
           if messaging_event['message'].get('attachments'):
            print("It is attachment")
            attachment_type = messaging_event["message"]["attachments"][0]["type"]

//Her
           ##If attachment type is image
            if attachment_type == "image":
              print("It is image")
              #attachment_url = attachment_event["url"]
              attachment_link = messaging_event["message"]["attachments"][0]["payload"]["url"]
              print(attachment_link)
            else:
              print("Found unsupported attachment type")
//Stopp
         else:
          print("Found unsupported message type")
     return("ok", 200)

def verify_fb_token(token_sent):
   if token_sent == VERIFY_TOKEN:
    return request.args.get("hub.challenge")
    print("hub.challenge")
   return 'Invalid verification token'

if __name__ == "__main__":
    app.run(debug=True)
Sist endret av Stingray; 12. august 2020 kl. 23:29.
Trigonoceps occipita
vidarlo's Avatar
Donor
Sitat av Stingray Vis innlegg
Hei!
"Sett breakpoint på linje 41", det vil si legge inn teksten "breakpoint()" der?

"Fyr opp debugger", kjøre et annet program som er ment til sånt altså? Forslag til hvilket?
Vis hele sitatet...
Les innlegget eg lenka til. Det har kjapp guide på å komme i gang med debugging.