Post request mit parameter scheitert

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Hallo zusammen,

um mit einem Skript bestimmte Tätigkeiten zu automatisieren, möchte ich über die requests lib eine API von Sirportly ansprechen. Dabei werden zum einen Token zur Authentifizierung übertragen, zum anderen bestimmte Parameter, um zu übermitteln, welche Informationen man erhalten möchte.

Code: Alles auswählen

import requests
import json


url = "https://api.sirportly.com/api/v2/contacts/delete"
headers = {'X-Auth-Token': 'my_fancy_token',
           'X-Auth-Secret': 'my_fancy_secret'}

contact = {'id': '0815'}
req = requests.post(url, headers=headers, data=contact)

print(response.json())
Die Ausgabe sieht dann so aus:

Code: Alles auswählen

{'error': "Contact not found with reference,name,id exclusively matching ''"}
In der Doku steht zwar beschrieben, welche Parameter man dafür einsetzen muss, ich habe nur nicht begriffen, wie ich das jetzt in den request einpflege.

https://sirportly.com/docs/api-specific ... contacts-2

Könnt ihr mir einen Ratschlag geben?

Gruß,

sls
When we say computer, we mean the electronic computer.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@sls: von Pythonseite her scheinst Du ja alles richtig zu machen, es existiert nur kein Kontakt mit der Referenz, dem Namen oder der ID '0815'. Fang doch mal mit „Listing all contacts“ an, da kannst Du bei den Parametern weniger falsch, da keine gebraucht werden.
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

@Sirius4: vielen Dank für die Antwort. "Listing all contacts" funktioniert einwandfrei, da der Parameter "page" optional ist, lässt man diesen weg, nimmt er immer Page 1 und gibt somit alle Einträge der ersten Seite zurück.

Ich habe nun mal versucht, die Daten für eine bestimmte Seite zu erhalten:

Code: Alles auswählen

import requests
import json

url = "https://api.sirportly.com/api/v2/contacts/all"
headers = {'X-Auth-Token': 'blablubblabla',
           'X-Auth-Secret': 'blahablabla'}

page={"pagination": {"page": 5}}

response = requests.post(url, headers=headers, data=page)

print(response.json())
Er ignoriert meinen Übergabeparameter und geht vom Default-Wert aus. Kann das so mittels "data=page" hier überhaupt funktionieren?



Mfg,
sls
When we say computer, we mean the electronic computer.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@sls: die API erwartet ja auch nur page als Parameter:

Code: Alles auswählen

page = {"page": 5}
response = requests.post(url, headers=headers, data=page)
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

@Sirius3: verstehe, ja, das funktioniert einwandfrei. Vielen dank dafür schonmal!

Nun zum Anzeigen / Löschen bestimmter Kontakte. Beide können laut Doku wieder mit dem Ende /info oder /delete im URL angesprochen werden. Übergabeparameter "contact".

Code: Alles auswählen

import requests
import json

url = "https://api.sirportly.com/api/v2/info"
headers = {'X-Auth-Token': 'bla',
           'X-Auth-Secret': 'blub'}

contact = {'id': 0815}

response = requests.post(url, headers=headers, data=contact)

print(response.json())
Als Antwort kommt dann:

Code: Alles auswählen

{'error': 'ControllerOrActionMissing'}
Bzw. hat das response-Objekt den Rückgabecode 404. Ich habe es mit mehreren IDs probiert, aber leider tut sich nichts.

Mfg,

sls
When we say computer, we mean the electronic computer.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Du musst mal genauer lesen.

Du kannst deine Variabeln in Python nennen wie du möchtest, das sieht der Server nicht. Der Parameter heißt "contact - this is the name, ID or reference for a contact (required)"

ich schätze also mal: contact = {'id': 123} oder contact = {'id': 'My Name'}
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

@Sr4l: wie übergebe ich denn contact = {'id': 0815} der Post-methode so, dass es der Server als gültigen Parameter erkennt?

Code: Alles auswählen

{
  "id": 1,
  "reference": "ADAM",
  "name": "Adam Cooke",
  "abbreviated_name": "Adam C",
  "company": "aTech Media",
  "pin": "390976",
  "created_at": "2012-03-20T09:28:41Z",
  "discussion_count": 1,
  "contact_methods": [
    {
      "id": 1,
      "method_type": "email",
      "data": "adam@atechmedia.com",
      "default": true
      ...
    }
So ist der exemplarische Aufbau des Json-Strings, 'id':1 wäre also das was ich benötige. 'name' als Parameter fällt leider heraus, da es auch Kontakte mit None-Wert gibt.

Mfg,

sls
When we say computer, we mean the electronic computer.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

ups ... sorry ich war nur mit halben Kopf dabei. Mein Text ist richtig, mein Code falsch.

Der Parameter ist "contact", nicht "id".

contact = {'contact': 123} oder contact = {'contact': 'My Name'}
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Ich habe vergessen zu erwähnen, dass ich schon alle möglichen Varianten ausprobiert habe, unter anderem auch die von dir empfohlene: contacts = {'contact': 0815}. Auch habe ich es mit params=contact probiert, und was mir in meiner Ahnungslosigkeit und stack overflow Zeitverbrennung noch so in den Sinn kam. Übersehe ich etwas?

Muss der Parameter vielleicht doch noch etwas anders aussehen? :K
When we say computer, we mean the electronic computer.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Wenn das ganze mit dem Parameter "page" funktioniert sollte es keinen Grund geben warum bei "contact" nicht so funktioniert.

Versuch doch einfach mal alle möglichen API Aktionen und notiere dir welche funktionieren und welche nicht, dann wirst du sicherlich ein Muster erkennen.
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Hi,

mittlerweile konnte ich den Fehler finden. Wie so oft, mal wieder ein dämlicher Fehler.

Aus welchem Grund auch immer habe ich im URL "https://api.sirportly.com/api/v2/contactsinfo" eine Angabe ausgelassen. Jetzt funktioniert es natürlich einwandfrei. Beim nächsten Mal werde ich den Code gründlicher prüfen.

Vielen Dank für eure Hilfe, hat mir super weitergeholfen!

Grüße,

sls
When we say computer, we mean the electronic computer.
Antworten