Zum Inhalt

Interface #

Das Projekt ist in drei Teile aufgeteilt: Authentifizierung, User und Posts. Die Authentifizierung ist eine einfache Schnittstelle, die einen Account erstellt, bearbeitet oder löscht. Über die User oder Post-Schnittstelle kann einen Benutzer oder Post von Instagram oder Twitter abgefragt werden.

Die Felder {{ TEXT }} sind Platzhalter, die durch die richtigen Werte ersetzt werden.

Bei der Abfrage wurde der Anfang der URL weggelassen. Für eine funktionierende Abfrage fehlt http://localhost:9999/instagram/. Die Beispiele sind mit dem Endpunkt instagram gemacht. Es kann jedoch auch der twitter Endpunkt verwendet werden.

Postman#

Das ganze Projekt mit allen möglichen Abfragen und Antworten ist in einer Postman Collection abgelegt. Sie beinhaltet Beispiele und die richtige Antwort des Servers dahinter. Zudem sind die Abfragen automatisiert, sodass API-Keys automatisch geändert werden.

Run in Postman

Authentifizierung#

Damit eine Anfrage an den Server gesendet werden kann, muss ein Token mitgesendet werden. Dieser Token wird durch einen Benutzer beim ersten Login erstellt. Ohne diesen API-Key kann keine Abfrage gemacht werden.

Es kann keine Authentifizierung mit einem Konto, welches 2FA aktiviert hat, durchgeführt werden.

Limit

Die Abfragen sind limitiert, dass die Server nicht überlastet werden. Es gilt, dass ein Benutzer alle 12 Stunden erneut abgefragt werden kann. In der Zwischenzeit wird der gecachte ausgegeben. Bei Instagram sind die Abfragen auf 900 Abfragen pro 15 Minuten limitiert. Das Limit gilt für jeden Account einzeln. An dieses Limit wird sich in dieser API auch gehalten. Bei Twitter gibt es ein allgemeines Abfragelimit von 900 Abfragen pro 15 Minuten, was für alle Accounts gleichzeitig gilt.

API-Key erstellen#

Um eine Abfrage an den Instagram-Server zu machen, muss der Benutzer authentifiziert werden. Um dies zu ermöglichen, wird beim Versenden der Abfrage Cookies mitgegeben. Das Passwort wird auf dem Server nicht gespeichert, sondern nur die Cookies.

POST
/auth/generate
Body
{
    "apiKey": "",
    "email": "{{INSTAGRAM_EMAIL}}",
    "password": "{{INSTAGRAM_PASSWD}}"
}
POST - /auth/generate
{
    "data": "66890439D60AE4A53DED100D731387B0534E86A29EEBF70926E147343CD886EB009FFF1099DE07E1E47C9DBA6D2128F3B3688ED10020F28C5DAFFB6E88E80C78",
    "message": "",
    "status": "OK"
}

API-Key neu erstellen#

Falls ein Key veröffentlicht wurde, kann dieser mit einem neuen Key ersetzt werden. Dazu muss der Benutzer sich erneut authentifizieren und Cookies erstellen.

PUT
/auth/generate
Body
{
    "apiKey": "{{API_KEY}}",
    "email": "{{INSTAGRAM_EMAIL}}",
    "password": "{{INSTAGRAM_PASSWD}}"
}
PUT - /auth/generate
{
    "data": "164A0BD88E4E0FFF2D2C7B00C203D6D14691ACB3BF5DA8299924A5C2D18BFD4D71764174A1C88B0B9C32C7B0817103E125E8496E3DFD84CD04F381B97A4CE4EA",
    "message": "",
    "status": "OK"
}

API-Key löschen#

Wenn ein Key veröffentlicht wurde, kann dieser auch gelöscht werden. Dazu muss nur der Schlüssel an den Server mit einer DELETE-Anfrage übertragen werden.

DELETE
/auth/delete?apiKey={{API_KEY}}
DELETE - /auth/delete
{
    "data": "Account deleted",
    "message": "",
    "status": "OK"
}

User#

Was alles abgefragt werden kann, kann in der Zielsetzung nachgeschaut werden. Die Voraussetzung ist, dass der Benutzer existiert. Wenn der Benutzer in den letzten 12 Stunden bereits abgefragt wurde, dann wird aus dem Cache eine Antwort geliefert. Erkennbar ist dies an der Nachricht (message) der Rückgabe.

Hinweis

Es kann möglich sein, dass ein Benutzer wegen der Gross- und Kleinschreibung nicht gefunden wird. Aus diesem Grund sollte darauf geachtet werden.

GET
/instagram/user?username={{BENUTZERNAME}}&api_key={{API_KEY}}
GET - /instagram/user?username={{BENUTZERNAME}}&api_key={{API_KEY}}
{
    "data": {
        "id": 63,
        "cachedSince": "2022-05-30T15:12:05.071936400Z",
        "platform": "INSTAGRAM",
        "username": "rezo",
        "name": "Rezo",
        "bio": "Daddy von @sprk_official 🔥",
        "website": "http://www.sprk.store/",
        "profilePictureUrl": "https://instagram.fzrh3-1.fna.fbcdn.net/",
        "followerCount": 1111974,
        "followingCount": 282,
        "private": false,
        "verified": true
    },
    "message": "",
    "status": "SUCCESS"
}

Posts#

Die Anzahl der Posts kann beschränkt werden. Das Maximale ist 100, was jedoch selten möglich ist, da nur die letzten Posts abgerufen werden können. Es müssen mindestens 10 Posts abgefragt werden, was auch der Standardwert ist.

Sofern ein Benutzer nicht privat ist, kann dieser abgefragt werden. Dazu gibt es noch einen Sonderfall bei Instagram. Diese Limitierung kann umgegangen werden, indem der Person gefolgt wird.

GET
/instagram/posts?username={{BENUTZERNAME}}&api_key={{API_KEY}}
GET - /instagram/posts?username={{BENUTZERNAME}}&limit={{ANZAHL}}&api_key={{API_KEY}}
{
    "data": [
        {
            "description": "Another chapter in history plays out.",
            "publishedAt": "2022-06-05T16:55:06Z",
            "likesCount": 141641,
            "commentsCount": 1215,
            "medias": [
                {
                    "mediaType": "IMAGE",
                    "url": "https://www.instagram.com/p/CeblkijO0lu"
                }
            ],
            "linkedUsers": [
                "rafaelnadal",
                "nikecourt",
                "RafaelNadal"
            ],
            "aiPrediction": "Photo shared by Nike on June 05, 2022 tagging @nikecourt, and @rafaelnadal. May be an image of 1 person, playing a sport and indoor."
        },
        {
            "description": "“I saw that moment of holding the X up as a moment for raising awareness for people who usually aren't being seen and telling them, \"Hey, I see you. I'm like you. Look at what I got.",
            "publishedAt": "2022-05-29T16:08:06Z",
            "likesCount": 132373,
            "commentsCount": 2585,
            "medias": [
                {
                    "mediaType": "IMAGE",
                    "url": "https://www.instagram.com/p/CeJeoPruUmT"
                },
                {
                    "mediaType": "VIDEO",
                    "url": "https://www.instagram.com/p/CeJejZotnQe"
                }
            ],
            "linkedUsers": [
                "giveme1shot__"
            ],
            "aiPrediction": "Photo shared by Nike on May 29, 2022 tagging @giveme1shot__. May be an image of 1 person."
        },
        {
            "description": "When everyone else saw a waffle iron, Nike co-founder Bill Bowerman saw a shoe. 50 years later, the Waffle One pairs everything you love about the past with fresh innovations.",
            "publishedAt": "2022-06-02T17:04:55Z",
            "likesCount": 192312,
            "commentsCount": 2312,
            "medias": [
                {
                    "mediaType": "VIDEO",
                    "url": "https://www.instagram.com/p/CeT4RYQs0x-"
                }
            ],
            "linkedUsers": [
                "fabianoefner"
            ],
            "aiPrediction": "null"
        },
        {
            "description": "Drop in the comments what you’ll be doing to make progress today 👀",
            "publishedAt": "2022-05-28T15:00:06Z",
            "likesCount": 137856,
            "commentsCount": 2613,
            "medias": [
                {
                    "mediaType": "IMAGE",
                    "url": "https://www.instagram.com/p/CeGyDVmuB60"
                }
            ],
            "linkedUsers": [
                "nikewomen",
                "tune2tunde"
            ],
            "aiPrediction": "Photo shared by Nike on May 28, 2022 tagging @tune2tunde, and @nikewomen. May be an image of 1 person and indoor."
        },
        {
            "description": "Never done making an impact.",
            "publishedAt": "2022-05-31T16:23:43Z",
            "likesCount": 170682,
            "commentsCount": 1515,
            "medias": [
                {
                    "mediaType": "IMAGE",
                    "url": "https://www.instagram.com/p/CeOqAWOOnTt"
                }
            ],
            "linkedUsers": [
                "nikeparis",
                "leshijabeuses",
                "kaepernick7"
            ],
            "aiPrediction": "Photo shared by Nike on May 31, 2022 tagging @kaepernick7, and @nikeparis. May be an image of 1 person and beard."
        }
    ],
    "message": "Successfully requested and mapped 5 posts",
    "status": "OK"
}

GraphQL#

Eine GraphQL Abfrage kann entweder über den Endpunkt /graphql gemacht werden oder mit den UI (/graphiql). Die Abfrage sieht ähnlich aus wie JSON, ist jedoch im GraphQL Syntax. Die Rückgabe des Servers ist dafür JSON. Wenn eine Abfrage nicht gültig ist, dann wird im Editor eine Fehlermeldung angezeigt. Dies ist nützlich, falls man versehentlich einen Schreibfehler hat oder eine Schleife erstellte. Postman hat bereits eine eingebaute Funktion, welches das Schema automatisch vom Server lädt und damit die Abfrage validiert.

Um alles abzufragen, kann folgende Query ausgeführt werden:

{
    user(api_key: "AA", username: "TheRock", platform: TWITTER) {
        cachedSince
        platform
        username
        name
        bio
        website
        profilePictureUrl
        followerCount
        followingCount
        isVerified
        isPrivate
        posts (limit: 20) {
            description
            publishedAt
            likesCount
            commentsCount
            linkedUsers
            medias {
                type
                url
            }
            aiPrediction
        }
    }
}
{
    "data": {
        "user": {
            "cachedSince": "2022-06-10T10:59:02.768Z",
            "platform": "INSTAGRAM",
            "username": "therock",
            "name": "therock",
            "bio": "founder",
            "website": "https://linktr.ee/therock",
            "profilePictureUrl": "https://instagram.fzrh3-1.fna.fbcdn.net/v/t51.2885-19/11850309_1674349799447611_206178162_a.jpg?_nc_ht=instagram.fzrh3-1.fna.fbcdn.net&_nc_cat=1&_nc_ohc=MWS3hSohUyMAX-s1L7j&edm=AOQ1c0wBAAAA&ccb=7-5&oh=00_AT8BQVPIKGpyQh_hzhgLjFcBMUNKUhF-7AWwFKbSoe2_ww&oe=62A9E1C4&_nc_sid=8fd12b",
            "followerCount": 321030400,
            "followingCount": 573,
            "isVerified": true,
            "isPrivate": false,
            "posts": [
                {
                    "description": "TOMORROW. ⚡️\n\nOFFICIAL #BLACKADAM GLOBAL EVENT TRAILER DROPS. \n\n9AM ET/6AM PT \n\n#ManInBlack \n#JSA\n#toodaloo",
                    "medias": [
                        {
                            "url": "https://www.instagram.com/p/Ceh8QjCFaGU"
                        }
                    ]
                },
                {
                    "description": "WHO’S THIRSTY? 🙋🏽\u200d♂️😜😈 \nGot my ice cold @ZOAEnergy in my cup and our #ZOASummerJam 🎶 playlist bumpin’ and I’m taking both with me into the #IronParadise today 🎧\n\nTurn up the music in my bio with our official ZOA SUMMER JAM PLAYLIST – it’s got all my favorite summer jams on there, each \nhand-picked by yours truly 👊🏾💯\n\n#ZOAEnergy\n#Founder",
                    "medias": [
                        {
                            "url": "https://www.instagram.com/p/Celwg5vFqjT"
                        }
                    ]
                },
                {
                    "description": "In 2 days. \nWorld premiere trailer of #BlackAdam⚡️\nJune 8th \n\n* here’s a cool bts pic from set of the man in black who can fly at the speed of light, but often….hovers. \n#mentalchess ♟💀\n#blackadam ⚡️\n#JSA",
                    "medias": [
                        {
                            "url": "https://www.instagram.com/p/CeewR0-PW5n"
                        }
                    ]
                }
            ]
        }
    }
}

Bei verlinkten Datentypen können die abgefragten Attribute auch definiert werden. Wenn ein Feld nicht gebraucht wird, dann kann es ganz einfach aus der Abfrage entfernt werden. Das einzige Wichtige ist, dass die Abfrage dem Schema entspricht.