Michael-Beutling / Amazon-MoneyMoney

Give you a overview about your amazon orders in MoneyMoney
91 stars 8 forks source link

nil value beim Abgleich Amazon Business #21

Closed Istaroth closed 4 years ago

Istaroth commented 4 years ago

Ich bekomme seit einiger Zeit beim Abgleich eines Amazon Business Kontos immer den Fehler

amazon-orders.lua:1015: attempt to index upvalue 'html' (a nil value)

Damit lässt sich das Konto nicht mehr abgleichen. Auch eine Neuerstellung des Kontos hilft nichts. Ebenso kein Unterschied bei den verschiedenen Kontoarten - ich nutze "mix". Es sieht also so aus, als wäre in der Rückgabe von Amazon beim Businesskonto etwas anders als beim Privatkonto (dort funktioniert alles top).

Leider bin ich nicht fit in LUA, kann also nicht selbst suchen. Für eine "geführte" Fehlersuche stehe ich aber zur Verfügung.

Michael-Beutling commented 4 years ago

Ausgehend von der neusten Version V1.12 ist die Zeile 1015 in der Funktion enterCredentials. Die wird ggf. mehrfach beim Login aufgerufen. Dein Login-Prozess ist der "normale" (Username,Passwort,ggf. 2FA)? Auch nicht vor kurzen auf 2FA umgestellt?

Wenn Du im Browser angemeldet bist, kann man mit den Entwicklerwerkzeugen des Browsers mal abprüfen ob die Ankerpunkte für das Plugin da sind. Der erste Kandidate wäre: $x('//a[@id="nav-orders" or contains(@href,"/order-history")]') Da sollte ein Array zurückkommen mit dem Bestellungen-Link als 1. Element. Wie fit bist Du mit den Entwicklerwerkzeugen Deines Browsers und welchen Browser verwendest Du?

Istaroth commented 4 years ago

Ja, gemeint war die 1.12. 2FA habe ich schon immer (für beide Konten), und es hatte auch schon mal damit funktioniert. Prinzipiell funktioniert der Login ja auch, da ich bei der Neueinrichtung die Credentials angebe, 2FA wird abgefragt, und die Liste der "Konten" wird angezeigt.

Auch der Login-Prozess unterscheidet sich nicht zwischen Privat und Business. Alle XPath in enterCredentials sind zu finden, und nach dem Login findet sich auch der Bestellink über Deinen oben beschriebenen XPath.

P.S.: Browser ist Safari 14.

Michael-Beutling commented 4 years ago

Das heißt das erste Login klappt, jedes weitere scheitert? Wenn man mit CMD+Shift+R das Konto neu lädt kann im Log die "Received" Zeile kopieren und sich die Antworten von Amazon mit dem Befehl pbpaste >$TMPDIR/test.html;open $TMPDIR/test.html ansehen.

Interessant ist die letzte und vorletzte Antwort von Amazon. Kommen da komische Abfrage? In der letzten Seite sollte mit dem xpath $x('//a[@id="nav-orders" or contains(@href,"/order-history")]') die Bestellübersicht verlinkt sein.

Hast Du die Betaversion von MoneyMoney?

Istaroth commented 4 years ago

Korrekt, erster Login funktioniert, Orders holen nicht. Es gibt nur eine "Received"-Zeile für Business, nämlich die für den Request auf www.amazon.de, und die führt direkt zu dem Fehler. Und in der Tat, in der Raw-Feedback aus dem Log findet man den XPath nicht. Wie es scheint (der Code ist ziemlich messy), werden bei Business die Menüs per Javascript generiert.

Michael-Beutling commented 4 years ago

Im Entwickler-Menü Javascript abschalten und die Seite neu laden. Rechts oben sollte ein Text "Warenrücksendungen und Bestellungen" o.ä. sein. Mit den Inspector sollte das so ähnlich aussehen.

Bildschirmfoto 2020-08-30 um 18 08 32

Wie sieht es bei Dir aus bzw. wie kommst Du ohne Javascript in die Bestellübersicht?

Istaroth commented 4 years ago

Bei Business gibt es diesen Link nicht (auch nicht den Button). Aber: Es gibt aber etwas unterhalb des Hauptmenüs ein Element auf der Seite, welches die nächste ausstehende Lieferung anzeigt. Das Element sieht wie folgt aus:

<div cel_widget_id="bnp-next-delivery-slot" class="celwidget">
    <span class="a-color-tertiary bnp-slot-title">
        Nächste Lieferung
    </span>
    <br>
    <a class="a-link-normal bnp-slot-link" target="_blank" rel="noopener" href="/gp/your-account/order-details?orderID=111-1111111-1111111&amp;ref=ab_bnp_d_nd_ad_re">
        31. August
    </a>
    <img alt="" src="https://images-na.ssl-images-amazon.com/images/G/01/x-locale/common/transparent-pixel._V111111111_.gif" class="bnp-hidden-element icon-section">
</div>

Wenn man diesen Link ohne orderID und ohne ref aufruft, dann kommt man auch auf die Order-History.

Ich weiß aber weder, ob dieses Verhalten auch zukünftig so sein wird, noch, was passiert, wenn es keine ausstehende Lieferung gibt (kann ich vielleicht die nächsten Tage herausfinden).

Ein weiteres Problem: bei Amazon Business kann es für einen Account mehrere Nutzer geben. Der direkt Einsprung zur Order-History führt dabei auf die Bestellungen des aktuellen Nutzers. Es gibt in der Order-History ein weiteres Formular mit dem auf eine Liste für alle Nutzer gewechselt werden kann:

<span class="a-declarative" data-action="b2b-account-change" data-b2b-account-change="{}">
    <form id="b2bForm" method="get" action="/gp/your-account/order-history" class="a-spacing-none">
        <input type="hidden" name="opt" value="ab">
        <input type="hidden" name="digitalOrders" value="1">
        <input type="hidden" name="unifiedOrders" value="1">
        <span class="a-dropdown-container"><select name="selectedB2BGroupKey" autocomplete="off" id="b2bDropdown" tabIndex="-1" class="a-native-dropdown">
            <option value="yourself" id="b2bDropdownEntry-yourself">Meine Bestellungen anzeigen: Bezahlt von Ihnen</option>
            <option value="OMA:XXXXXXXXXXXXXX" id="b2bDropdownEntry-OMA">Meine Bestellungen anzeigen: Bezahlt von NAME</option>
            <option value="B2B:XXXXXXXXXXXXXX" id="b2bDropdownEntry-B2B" selected>Alle Bestellungen anzeigen: NAME</option>

        </select><span tabIndex="-1" class="a-button a-button-dropdown a-button-small"><span class="a-button-inner"><span class="a-button-text a-declarative" data-action="a-dropdown-button" role="button" tabIndex="0" aria-hidden="true"><span class="a-dropdown-prompt">Alle Bestellungen anzeigen: NAME</span></span><i class="a-icon a-icon-dropdown"></i></span></span></span>
        <span class="a-button a-button-base a-button-small hide-if-js"><span class="a-button-inner"><input class="a-button-input" type="submit"><span class="a-button-text" aria-hidden="true">
            Los
        </span></span></span>
    </form>
</span>

Insgesamt ist Amazon Business also leider deutlich komplexer.

P.S.: Potentiell persönliche Daten sind verfremdet ...

Michael-Beutling commented 4 years ago

Hast Du die Beta von MoneyMoney installiert? Als schnellen Work-around würde ich, wenn der Bestellübersichtslink nicht gefunden wird, den hart-codiert Link nehmen. Um zu testen ob dass sinnvoll ist, bitte alle Cookies für Amazon löschen und ohne Javascript anmelden nach der Anmeldung (eMail/Passwort/2FA) direkt auf https://www.amazon.de/gp/css/order-history gehen. Kommt dann die gewünschte Bestellübersicht?

Ob und wie ich Business Accounts mit mehreren Benutzern umgehen weiß ich derzeit nicht. Zumal ich das nicht debuggen kann weil ich nur ein Privatkonto habe.

Istaroth commented 4 years ago

Die Beta habe ich nicht installiert, sondern die aus dem App-Store (ich habe mehrere wichtige Konten darüber laufen → keine Experimente).

Der Aufruf der URL funktioniert. Eine prinzipiell etwas allgemeinere Liste bekommt man mit https://www.amazon.de/gp/your-account/order-history?unifiedOrders=1, ist aber im ersten Schritt sicherlich nicht zwingend notwendig.

Michael-Beutling commented 4 years ago

Die signierte Version mit einen Work-around ist da: https://github.com/Michael-Beutling/Amazon-MoneyMoney/releases/tag/V1.13 oder https://moneymoney-app.com/extensions/amazon-orders.lua

Gruß Micha

Istaroth commented 4 years ago

Der Workaround funktioniert, getestet mit "normal" und "yearly". Danke für das geführte Debugging.