Hallo,
da steht schon eine Menge Interna drin habe ich eben gemerkt. Also alles in einen Texteditor geladen und mit suchen/ersetzen hoffentlich alle wichtigen Daten gelöscht. Vorweg: Ich würde für Hilfe auch bezahlen wenn das hier für kostenlos zu aufwendig wird.
Der Code der mir eine Anfrage erstellt und den response ausgibt/in die DB schreibt:
Code: Alles auswählen
import json
import pyodbc
from itertools import islice
from datetime import datetime
import requests
# Variables
api_key = ""
customercode = "[deleted]861"
url = "https://api.[deleted]/customers/[deleted]861/inquiries"
headers = {
'Content-Type': 'application/json',
'Authorization': 'Basic MDA1OTc4NjErcmVzdEB0dmguY29tOm5UQ2VucjRBNjJ5MkUzSkZXcmdicU[deleted]==',
'Cookie': 'f5avraaaaaaaaaaaaaaaa_session_=DABML[DELETED]CDNIGLAEBGNIECFLFAFKJJJELGAMJKAKHIBFJCJDJHLKIFMIGNNJCEJBDLELKIOFJKKKKHGDAIOPLCGJFINEFOIKFIGOCGJJOKPFMEANMLIEBENHBKAGA; XSRF-TOKEN=NOT_USED'
}
# Variable to set the maximum number of articles to request
max_articles = 5000
# Variable to set the number of lines per JSON request
lines_per_request = 1
def make_request(url, headers, payload):
start_time = datetime.now()
response = requests.post(url, headers=headers, data=payload)
end_time = datetime.now()
print(f"Startzeit der Anforderung: {start_time}")
print(f"Endzeit der Anforderung: {end_time}")
print(f"Dauer der Anforderung: {end_time - start_time}")
if response.text.strip():
return response
else:
print("Leere Antwort erhalten.")
return None
def main():
try:
con_string = r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\_python\[deleted]_api\[DELETED]_Abgleich.accdb;'
conn = pyodbc.connect(con_string)
cur = conn.cursor()
cur.execute('SELECT tbl_Bestell_Nr.Bestellnummer, First(tbl_MakeCodes.code) AS Make_Code FROM tbl_Bestell_Nr INNER JOIN tbl_MakeCodes ON tbl_Bestell_Nr.Lieferant_Marke = tbl_MakeCodes.descr GROUP BY tbl_Bestell_Nr.Bestellnummer;')
rows = cur.fetchall()
print(rows[:10])
rows = list(islice(rows, max_articles))
for i in range(0, len(rows), lines_per_request):
batch = list(islice(rows, i, i + lines_per_request))
lines = []
for index, row in enumerate(batch):
if row.Bestellnummer is not None and row.Make_Code != "#NV":
lines.append({
"lineNumber": index + 1,
"makeCode": row.Make_Code,
"partNumber": row.Bestellnummer,
"customerPartNumber": "Testanfrage Teil {}".format(index + 1),
"quantity": 1,
"text": "inquiry extra text{}".format(index + 1)
})
print(f"Angefragter Artikel: {row.Bestellnummer}, {row.Make_Code}")
payload = json.dumps({
"text": "Text abc def",
"customerquiryNumber": "Testanfrage inquiry",
"customerCode": "[deleted]861",
"customerContactName": "[deleted]",
"lines": lines
})
response = make_request(url, headers, payload)
if response is not None:
try:
response_data = response.json()
for item in response_data:
for line in item['lines']:
Preis = line.get('price')
makeCode = line.get('makeCode') # Get makeCode from the API response
if Preis is not None:
print(f"Antwort: Artikel {line['partNumber']}, makeCode: {makeCode} ,Preis: {Preis}")
cur.execute("""
INSERT INTO tbl_[deleted]_Preise (EKPreis, fid_Liefer, Datum, [DELETED]_Bestellnummer, makeCode, json_response)
VALUES (?, ?, ?, ?, ?, ?)
""", (Preis, 1, datetime.now(), line['partNumber'], makeCode, json.dumps(response_data))) # Insert makeCode into the database
conn.commit()
except json.decoder.JSONDecodeError as e:
print(f"Fehler beim Dekodieren der JSON-Antwort: {e}")
except pyodbc.Error as e:
print("Error in Connection to access database")
# Run the main function
main()
Der Code der mir stattdessen nur den Anfragestring erstellt und in eine Tabelle schreibt (die Datenbank hat sich in der Zwischenzeit leicht geändert weil noch Testversion):
Code: Alles auswählen
import json
import pyodbc
DATABASE_PATH = r'C:\_python\[deleted]_api2\[DELETED]_Abgleich.accdb'
def get_data_from_cache(conn):
cur = conn.cursor()
cur.execute("SELECT Lieferant_Marke, Bestellnummer FROM tbl_cache")
rows = cur.fetchall()
cur.close()
return rows
def update_json_strings_in_cache(conn, updates):
cur = conn.cursor()
for lieferant_marke, bestellnummer, json_string in updates:
cur.execute("UPDATE tbl_cache SET json_string = ? WHERE Lieferant_Marke = ? AND Bestellnummer = ?", (json_string, lieferant_marke, bestellnummer))
conn.commit()
cur.close()
api_key = ""
customercode = "[deleted]861"
url = "https://api.[deleted]/customers/[deleted]861/inquiries"
con_string = f'DRIVER={{Microsoft Access Driver (*.mdb, *.accdb)}};DBQ={DATABASE_PATH};'
conn = pyodbc.connect(con_string)
data_from_cache = get_data_from_cache(conn)
updates = []
for index, row in enumerate(data_from_cache, 1):
line = {
"lineNumber": index,
"makeCode": row.Lieferant_Marke,
"partNumber": row.Bestellnummer,
"customerPartNumber": f"Testanfrage Teil {index}",
"quantity": 3,
"text": f"inquiry extra text{index}"
}
payload = {
"text": "Text abc def",
"customerInquiryNumber": "Testanfrage inquiry",
"customerCode": "[deleted]861",
"customerContactName": "[deleted]",
"lines": [line]
}
headers = {
'Content-Type': 'application/json',
'Authorization': 'Basic MDA1OTc4NjErcmVzdEB0dmguY29tOm5UQ2VucjRBNjJ5MkUzSkZXcmdicU[deleted]==',
'Cookie': 'f5avraaaaaaaaaaaaaaaa_session_=DABML[DELETED]CDNIGLAEBGNIECFLFAFKJJJELGAMJKAKHIBFJCJDJHLKIFMIGNNJCEJBDLELKIOFJKKKKHGDAIOPLCGJFINEFOIKFIGOCGJJOKPFMEANMLIEBENHBKAGA; XSRF-TOKEN=NOT_USED'
}
complete_request = {
"url": url,
"method": "POST",
"headers": headers,
"payload": payload
}
json_dump = json.dumps(complete_request, indent=4)
updates.append((row.Lieferant_Marke, row.Bestellnummer, json_dump))
# Wenn die Liste 'updates' 5000 Einträge erreicht, schreiben Sie sie in die Datenbank und leeren Sie die Liste
if len(updates) >= 5000:
update_json_strings_in_cache(conn, updates)
updates = []
# Schreiben Sie alle verbleibenden Updates in die Datenbank
if updates:
update_json_strings_in_cache(conn, updates)
conn.close()
Das hier ist es was dann im Datensatz landet:
Code: Alles auswählen
{
"url": "https://api.[deleted]/customers/[deleted]861/inquiries",
"method": "POST",
"headers": {
"Content-Type": "application/json",
"Authorization": "Basic MDA1OTc4NjErcmVzdEB0dmguY29tOm5UQ2VucjRBNjJ5MkUzSkZXcmdicU[deleted]==",
"Cookie": "f5avraaaaaaaaaaaaaaaa_session_=DABML[DELETED]CDNIGLAEBGNIECFLFAFKJJJELGAMJKAKHIBFJCJDJHLKIFMIGNNJCEJBDLELKIOFJKKKKHGDAIOPLCGJFINEFOIKFIGOCGJJOKPFMEANMLIEBENHBKAGA; XSRF-TOKEN=NOT_USED"
},
"payload": {
"text": "Text abc def",
"customerInquiryNumber": "Testanfrage inquiry",
"customerCode": "[deleted]861",
"customerContactName": "[deleted]",
"lines": [
{
"lineNumber": 2,
"makeCode": "400",
"partNumber": "0009249402",
"customerPartNumber": "Testanfrage Teil 2",
"quantity": 3,
"text": "inquiry extra text2"
}
]
Und dagegen geschaut ist es das hier der json Anfrage string wenn ich Ihn per print aus der console ausgeben lasse (beim funktionierenden code):
Code: Alles auswählen
{"text": "Text abc def", "customerInquiryNumber": "Testanfrage inquiry", "customerCode": "[deleted]861", "customerContactName": "[deleted]", "lines": [{"lineNumber": 1, "makeCode": "400", "partNumber": "0009249378", "customerPartNumber": "Testanfrage Teil 1", "quantity": 3, "text":