walle89 / SwedbankJson

Unofficial API client for the Swedbank's and Sparbankerna's mobile apps in Sweden.
MIT License
75 stars 14 forks source link

Kan enbart hämta 40 senaste transaktionerna #47

Open lasdjfk opened 2 years ago

lasdjfk commented 2 years ago

Kan enbart hämta 40 senaste transaktionerna, sedan kommer inga fler, även om jag går till nästa sida. Är detta en begränsning som är inbyggd i detta API? I den officiella Swedbank appen verkar man kunna gå hur långt tillbaka i tiden som helst.

walle89 commented 2 years ago

Det du kan göra i Swedbanks/sparbanken app kan du i teorin göra med SwedbankJson, den använder exakt samma API. Det kanske är möjligt att Swedbank har ändrat hur den sköter sidbläddringen sedan jag sist tittade på det.

Vad är det för typ av konto du försöker bläddra i? Har ser din kod ut som sköter bläddringen?

lasdjfk commented 2 years ago

Hmm, ja känns som kanske Swedbank ändrat något. Använder vanligt privatkonto $bankApp = 'swedbank'. Ungefär denna kod:

// get profile id $profiles = $bankConn->Profilelist();

$profile_id = $profiles->privateProfile->id;

$accounts = $bankConn->AccountList($profile_id); $account_id = $accounts->transactionAccounts[1]->id;

// loop until all transaction have been found for ($x = 1; $x < 999; $x++) {

$account_info = $bankConn->AccountDetails($account_id, 20, $x);

$transactions = $account_info->transactions;
$count = count($transactions);

if (! $account_info->moreTransactionsAvailable)
{
    break;
}

}

Funkar att bläddra till andra sidor om jag väljer 20 per sida. Men totalt blir endast 40 transaktioner.

walle89 commented 2 years ago

Det jag kan se är att Swedbanks appar ät att de använder endpointen engagement/account/$accountID/transactions, till skillnad mot AccountDetails() som använder engagement/transactions/$accountID.

Det är möjligt att dessa endpoints har olika beteenden, men jag har tyvärr inte möjlighet att se det pga. jag har inte tillgång till ett konto med många transaktioner.

Har du provat att enbart ange accountID i AccountDetails() och inte skicka med antalet och sidnumrering? Får du fler transaktioner då? Om ja, då brukar Swedbank skicka med en next-länk med den URL som man bör använda för att kunna göra en viss sak i API:et. Om du kan dela med dig av den URL:en, anonymiserad så klar, så skulle jag kunna titta på att antingen göra en ny patch eller lägga till en syster-metod till AccountDetails() som använder den nya metoden.

lasdjfk commented 2 years ago

Aha! Fick några fler transaktioner när jag skickar utan antal och sidnumrering, och även [moreTransactionsAvailable] => 1, samt en next länk. Så det är nog som du säger. Såhär ser länken ut:

/v5/engagement/transactions/$accountID?transactionsPerPage=46&paginationId=$accountID&page=2

lasdjfk commented 2 years ago

Tjohoo, när jag ändrar till $output = $this->_auth->getRequest("engagement/account/$accountID/transactions", $query);

i accountDetails-metoden så får jag transaktioner ända tillbaka till början av 2020. Underbart! Dock har transaktionsobjektet lite annat format så kanske hade varit bättre ett ha det i en separat metod.

lasdjfk commented 2 years ago

En annan bra grej är att det numera verkar finnas ett uniqueTransactionId som verkar stabilt och borde kunna användas för att synkronisera transaktioner till databas.

walle89 commented 2 years ago

Tjohoo, när jag ändrar till $output = $this->_auth->getRequest("engagement/account/$accountID/transactions", $query);

i accountDetails-metoden så får jag transaktioner ända tillbaka till början av 2020. Underbart! Dock har transaktionsobjektet lite annat format så kanske hade varit bättre ett ha det i en separat metod.

Strålande, bra jobbat! Ja, det är nog bäst att man har det som en separat metod. Tänker att man döper den till "AccountTranscations" eller likande. Men om jag ska kunna göra det, så behöver jag veta hur responsen för engagement/account/$accountID/transactions ser ut. Närmare bestämt hur den bygger upp URL:en för pagenering till nästa sida. För jag tror att att skicka in next-URL:en som en eventuell parameter kanske är en tillräcklig bra lösning för det.

En annan bra grej är att det numera verkar finnas ett uniqueTransactionId som verkar stabilt och borde kunna användas > för att synkronisera transaktioner till databas.

Nice om det stämmer. Jag behöver nog undersöka det lite djupare, då Swedbanks API kan vara oberäknelig i vissa situationer. Men om den är tillförlitlig så löser det många sync-relaterade problem!

lasdjfk commented 2 years ago

Såhär ser next URL:en ut: [uri] => /v5/engagement/account/$accountID/transactions?transactionsPerPage=57&page=2

Av någon anledning verkar pagineringen inte fungera i accountDetails efter ändringen enl ovan. Om jag skickar med parametrarna får jag samtliga transaktioner i en enda respons. Skickar jag inte med några parametrar får jag 57 transaktioner och en länk till nästa sida.

lasdjfk commented 2 years ago

Verkar enbart fungera med paginering om jag tar exakt 57 transaktioner i taget. Alla andra nummer returnerar samtliga transaktioner från tidens begynnelse.

Edit: Tror swedbank appen laddar 57 transaktioner i taget också, så det kanske är hårdkodat att bara funka med detta.

CirruZZ commented 2 years ago

Undersökt vad för info man får från engagement/account/$accountID/transactions, tyvärr så saknas memo info från Swish, och ingen länk till mer info om transaktionen finns heller.

            [40] => stdClass Object
                (
                    [hasUncertainCategorization] => 
                    [parsedData] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [key] => ReferenceId
                                    [value] => 66337120502xxxxx
                                )

                            [1] => stdClass Object
                                (
                                    [key] => BookedDate
                                    [value] => 2022-01-10
                                )

                            [2] => stdClass Object
                                (
                                    [key] => TextSv
                                    [value] => Swish skickad +467093xxxxx
                                )

                            [3] => stdClass Object
                                (
                                    [key] => TextEn
                                    [value] => Swish payment +467093xxxxx
                                )

                            [4] => stdClass Object
                                (
                                    [key] => TransCode
                                    [value] => 256
                                )

                            [5] => stdClass Object
                                (
                                    [key] => SwishFromName
                                    [value] => SVEN SVENSSON
                                )

                            [6] => stdClass Object
                                (
                                    [key] => SwishFromNumber
                                    [value] => +46 (0)705 xxx xxx
                                )

                            [7] => stdClass Object
                                (
                                    [key] => SwishToName
                                    [value] => Jan Jacobsson
                                )

                            [8] => stdClass Object
                                (
                                    [key] => SwishToNumber
                                    [value] => +46 (0)709 xxx xxx
                                )

                            [9] => stdClass Object
                                (
                                    [key] => MerchantName
                                    [value] =>  
                                )

                        )

                    [accountId] => 416984
                    [uniqueTransactionId] => 00DAE1F6E123ADA3B2xxxxxxxx
                    [reservationId] => 00DAE1F6E123ADA3B2xxxxxxxx
                    [comments] => Array
                        (
                        )

                    [tags] => Array
                        (
                        )

                    [timestamp] => 2022-01-08T10:58:31.00000
                    [id] => 600xxxxxx
                    [date] => 2022-01-08T00:00:00.00000
                    [dateFormatted] => 2022-01-08
                    [amount] => -5120
                    [currency] => SEK
                    [text] => Swish skickad +46709xxxxxx
                    [categoryId] => 290
                    [detectedCategories] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [categoryId] => 290
                                    [score] => 1
                                )

                        )

                    [isOwnAccountTransfer] => 
                )
lasdjfk commented 2 years ago

@CirruZZ precis. Och saknas även acccountingDate (bokföringsdatum). Och detta är ju konstigt för på Swedbank-appen kan man få all denna data, även om man går tillbaka långt i tiden. Undrar om swedbank-appen använder någon annan endpoint nu för tiden. Vad tror du @walle89 ?

Ps. jag försökte använda detta id med funktionen transactionDetails, men detta gick inte tyvärr.

CirruZZ commented 2 years ago

@CirruZZ precis. Och saknas även acccountingDate (bokföringsdatum). Och detta är ju konstigt för på Swedbank-appen kan man få all denna data, även om man går tillbaka långt i tiden. Undrar om swedbank-appen använder någon annan endpoint nu för tiden. Vad tror du @walle89 ?

Är inte [key] => BookedDate bokföringsdatumet då?

Ps. jag försökte använda detta id med funktionen transactionDetails, men detta gick inte tyvärr.

Kollade på det också men det är olika id. Du kan bara, vad jag vet, få ut det ID som behövs från engagement/transactions/$accountID och där är ju begräsningen hur långt bak i tiden man kan gå.

lasdjfk commented 2 years ago

@CirruZZ precis. Och saknas även acccountingDate (bokföringsdatum). Och detta är ju konstigt för på Swedbank-appen kan man få all denna data, även om man går tillbaka långt i tiden. Undrar om swedbank-appen använder någon annan endpoint nu för tiden. Vad tror du @walle89 ?

Är inte [key] => BookedDate bokföringsdatumet då?

Nä, BookedDate verkar alltid vara samma som transaktionsdatum såvitt jag kan se.

walle89 commented 2 years ago

Jag har en transkation som i Swedbankappen är märkt som Bokförningsdartum 2022-02-25, Transatkionsdatum 2022-02-24. Detta är payloaden:

{
        "hasUncertainCategorization": false,
        "parsedData": [{
            "key": "BookedDate",
            "value": "2022-02-25"
        }, {
            "key": "TextSv",
            "value": "Övf via internet 24438FAKE635970"
        }, {
            "key": "TextEn",
            "value": "Tranf by interne 24438FAKE635970"
        }, {
            "key": "TransCode",
            "value": "552"
        }, {
            "key": "MerchantName",
            "value": " "
        }],
        "accountId": 5FAKE61,
        "uniqueTransactionId": "45A00FAKE1D9096806BCC53952",
        "reservationId": "45A0000DB1D9FAKE5395096802",
        "comments": [],
        "tags": [],
        "timestamp": "2022-02-24T20:08:51.00000",
        "id": 63FAKE793,
        "date": "2022-02-24T00:00:00.00000",
        "dateFormatted": "2022-02-24",
        "amount": 2.0,
        "currency": "SEK",
        "text": "Övf via internet 24438FAKE635970",
        "categoryId": 213,
        "detectedCategories": [{
            "categoryId": 213,
            "score": 0.65
        }, {
            "categoryId": 229,
            "score": 0.2
        }, {
            "categoryId": 302,
            "score": 0.15
        }],
        "isOwnAccountTransfer": false
    }

Med andra ord, BookedDate är bokförnngsdatumet. Någon av de övriga datumen är transaktionsdatumet.

Dessutom så verkar det som att transactionDetails eller motsvarande inte används över huvud taget med engagement/account/$accountID/transactions endpointen. All information om alla transaktioner bör finnas där.

Gällande Swish så kan jag tyvärr inte testa det, då jag använder inte det med Swedbank.

lasdjfk commented 2 years ago

Ja, det verkar ju faktiskt stämma, nu när jag kollar igen, att BookedDate är bokföringsdatum. Så bra!

parsedData finns inte innan 2021-02-01 för mig, men det stämmer med den info jag får från swedbank-appen (inte heller där får jag bokföringsdatum för transaktioner innan 2021-02-01).