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 5973
Hei!
Jeg leker litt med Facebook-API!
Mitt mål er å varsle meg på andre måter om meldinger som kommer til Facebook-siden min. Hvordan jeg skal bli varslet er ikke relevant, det ordner jeg selv.

Jeg har kjørt API-calls til Facebook-siden og får dette:

Kode

{
  "data": [
    {
      "messages": {
        "data": [
          {
            "message": "Kan du programmere dette for meg, please? <3",
            "created_time": "2020-06-22T14:15:08+0000",
            "from": {
              "name": "Stingray",
              "email": "420@facebook.com",
              "id": "420"
            },
            "id": "m_a9sd9+fuq0t9åjasiodfja09teawpoermn4oå8t9jwpomå4t90jpomslryhwqja9epoamøldfs"
          },
          {
            "message": "Hei! Ja, hva kan jeg hjelpe deg med?",
            "created_time": "2020-06-22T14:14:51+0000",
            "from": {
              "name": "Administrasjonen",
              "email": "420420420420420420@facebook.com",
              "id": "420420420420420420"
            },
            "id": "m_a9+t0akwt+¨0ekf0+sajeyt9+w4k0tmgw490jpskdfoålasjgipadkoflømsasa"
          },
          {
            "message": "Automatisk svar: Hei, du har kommet til administrasjonen. Et øyeblikk, så vil en administrator svare deg så fort som mulig!",
            "created_time": "2020-06-22T14:10:10+0000",
            "from": {
              "name": "Administrasjonen",
              "email": "420420420420420420@facebook.com",
              "id": "420420420420420420"
            },
            "id": "m_jiasdfædsjfpisajgpaisfjsoiagjspdfokøgjhapdkoøflsadfoøsjafoøkla"
          },
		  {
            "message": "Hjelp!",
            "created_time": "2020-06-22T14:10:29+0000",
            "from": {
              "name": "Stingray",
              "email": "420@facebook.com",
              "id": "420"
            },
            "id": "m_8sdathwj9ptjasåptua9sidfosajlyht9sipfodøl,ayjouhitjpisdfkømad"
          },
Dere ser her at:
- Stingray sender PM til administrasjonen med "Hjelp!"

- Administrasjonen besvarer automatisk "Automatisk svar: Hei, du har kommet til administrasjonen. Et øyeblikk, så vil en administrator svare deg så fort som mulig!"

- Administrasjonen svarer "Hei! Ja, hva kan jeg hjelpe deg med?"

- Stingray svarer "Kan du programmere dette for meg, please? <3"

Det jeg ønsker er å undersøke om det siste svaret fra administrasjonen var det automatiske svaret. Da vet man at administrasjonen ikke har besvart henvendelsen fra Stingray enda.

Noen tips?
Det spiller ingen rolle hvilket programmeringsspråk dette går i, jeg er åpen for alt.
Jeg ville kanskje gjort noe som dette: (testet i Python 3.8)

Kode

import json
from datetime import datetime

with open("input.json") as ifile:
    data = json.loads(ifile.read())

adm_msgs = sorted(
    filter(
        lambda x: x["from"]["name"] == "Administrasjonen",
        data["data"][0]["messages"]["data"]
    ), key=lambda x: datetime.strptime(x["created_time"], "%Y-%m-%dT%H:%M:%S%z")
)

if "Automatisk svar" in adm_msgs[-1]["message"]:
    print("Siste melding var automatisk")
Stingray's Avatar
Trådstarter
Tusen takk! Det gir mening :-)
Hvor i skriptet blir output fra API hentet inn, forresten?

Prøvde å opprette en fil som heter input.json med outputen jeg la ut i første innlegg, da får jeg dette:

Kode

Traceback (most recent call last):
  File "test", line 5, in <module>
    data = json.loads(ifile.read())
  File "/usr/lib/python2.7/json/__init__.py", line 339, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 364, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/json/decoder.py", line 380, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting object: line 45 column 13 (char 1698)
Jeg er imidlertid ikke noe flink på Python i det hele tatt altså

Hei igjen!
Jeg la inn hele outputet fra API-callet i input.json, da kom ikke samme feilen frem. Tenker for meg at skriptet forventet en begynnelse og en slutt, for eksempel { og }. Det jeg la inn i første post var jo ikke hele outputet. Da ble det bedre.
Da kom det opp en ny feilmelding, og da løste jeg det ved å fjerne alle linjeskift i filen.

Nå får jeg en feil jeg ikke skjønner hvorfor kommer:

Kode

Traceback (most recent call last):
  File "test", line 14, in <module>
    if "Autoreply" in adm_msgs[-1]["message"]:
IndexError: list index out of range
Sist endret av Stingray; 22. juni 2020 kl. 20:04. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Det betyr at det ikke er noen meldinger i den filtrerte listen. [-1] betyr "siste element". Hvis listen er tom vil det ikke være noe siste element, og scriptet gir deg en exception.

Det betyr antakeligvis at det ikke er noen meldinger fra Administrator i json-dataen, eller at json-dataen du har lagret i inputfilen ikke er strukturert på samme måte som i eksempeldataene du oppga i første post. Eller en annen feil..

Koden min ovenfor er selvfølgelig bare en POC og den bør nok gjøres mye mer solid før man bruker den i produksjon

Det finnes forøvrig helt sikkert et bibliotek til Python for API-et til Facebook som helt nok er mer fornuftig å bruke enn å finne opp kruttet på nytt.
Sist endret av steili; 22. juni 2020 kl. 20:39. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Stingray's Avatar
Trådstarter
Fant fort ut av det.
Navnet på administrasjonen er ikke bare "Administrasjonen" Da jeg byttet navnet til det som er riktig, ordna det seg!
Nå er alt i orden, mangler bare å finne ut av det med æ ø å, for navnet til administrasjonen inneholder et å....
Og så er det bare å gjøre koden din mer solid

EDIT:
Jeg gjør det enklere, og bare henter frem ID-en til senderen istedenfor navnet, altså fra denne delen:

Kode

            "from": {
              "name": "Administrasjonen",
              "email": "420420420420420420@facebook.com",
              "id": "420420420420420420"
            },
Tusen takk for hjelpen!
Python virker som et ganske kraftig programmeringsspråk, har du noen tips til hva jeg burde gjøre for å bli mer solid på det?
Sist endret av Stingray; 22. juni 2020 kl. 20:46. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Tja, si det. Selv har jeg lært meg selv ved å skrive stadig mer komplisert og utfordrende kode. Python er ekstremt bra dokumentert (https://docs.python.org/3/) og du kan lære veldig mye bare ved å lese deg opp der mens du koder. Python har også veldig mye annet læremateriell tilgjengelig. Har hørt mange skryte av Khan Acadamy, men selv foretrekker jeg å lese fremfor å se videoer.

Hvis du vil ha noen spesifikke forslag til kodeoppgaver kan jeg anbefale å prøve deg på noen oppgaver på projecteuler.net. Disse er gjerne litt matematikkfokuserte, men jeg tror du kan lære deg mye generell python bare ved å prøve deg litt der.
Sist endret av steili; 22. juni 2020 kl. 20:56.