allegro / allegro-api

Issue tracker and wiki for Allegro REST API
https://developer.allegro.pl/
217 stars 39 forks source link

autoresponder w dyskusjach #9791

Open axelsport opened 2 months ago

axelsport commented 2 months ago

Witam, mam problem ze skryptem który ma działać jako autoresponder w nowych dyskusjach. Skrypt się prawidłowo wykonuje, ale nie wyświetla info w nowych dyskusjach.

<?php

// Dane aplikacji Allegro
$clientId = 'xxxxx';
$clientSecret = 'xxxxx';
$refreshTokenFile = 'refresh_token.txt';
$accessTokenFile = 'access_token.txt';
$emailTo = 'xxx@xxxx.pl';
$processedDisputesFile = 'processed_disputes.txt'; // Plik do śledzenia przetworzonych dyskusji
$logFile = 'script_log.txt'; // Plik do logowania działań skryptu

// Funkcja do logowania
function logMessage($message, $logFile) {
    $timestamp = date('Y-m-d H:i:s');
    file_put_contents($logFile, "[$timestamp] $message" . PHP_EOL, FILE_APPEND);
}

// Funkcja do wysyłania e-maila
function sendEmail($emailTo, $subject, $message) {
    $headers = 'From: no-reply@xxx.pl' . "\r\n" .
        'Reply-To: no-reply@xxx.pl'' . "\r\n" .
        'X-Mailer: PHP/' . phpversion();

    mail($emailTo, $subject, $message, $headers);
}

// Funkcja do odświeżania tokena
function refreshAllegroToken($clientId, $clientSecret, $refreshTokenFile, $accessTokenFile, $logFile) {
    $refreshToken = file_get_contents($refreshTokenFile);
    $url = 'https://allegro.pl/auth/oauth/token';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
        'grant_type' => 'refresh_token',
        'refresh_token' => $refreshToken
    ]));
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Authorization: Basic ' . base64_encode("$clientId:$clientSecret"),
        'Content-Type: application/x-www-form-urlencoded'
    ]);

    $response = curl_exec($ch);
    curl_close($ch);

    if ($response === false) {
        logMessage('Błąd podczas odświeżania tokena.', $logFile);
        die('Błąd podczas odświeżania tokena.');
    }

    $data = json_decode($response, true);

    if (isset($data['access_token']) && isset($data['refresh_token'])) {
        // Zapisz nowe tokeny do użycia w przyszłości
        file_put_contents($accessTokenFile, $data['access_token']);
        file_put_contents($refreshTokenFile, $data['refresh_token']);

        logMessage('Token odświeżony pomyślnie.', $logFile);
        return $data['access_token'];
    } else {
        logMessage('Nie udało się odświeżyć tokena. Odpowiedź API: ' . $response, $logFile);
        die('Nie udało się odświeżyć tokena.');
    }
}

// Funkcja do sprawdzania nowych dyskusji i odpowiadania na nie
function checkAndRespondToNewDiscussions($accessToken, $emailTo, $processedDisputesFile, $logFile) {
    $apiUrl = 'https://api.allegro.pl/sale/disputes';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $apiUrl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        "Authorization: Bearer $accessToken",
        "Accept: application/vnd.allegro.public.v1+json"
    ]);

    $response = curl_exec($ch);
    curl_close($ch);

    if ($response === false) {
        logMessage('Błąd podczas pobierania danych z Allegro API.', $logFile);
        die('Błąd podczas pobierania danych z Allegro API.');
    }

    $disputes = json_decode($response, true);

    $processedDisputes = file_exists($processedDisputesFile) ? file($processedDisputesFile, FILE_IGNORE_NEW_LINES) : [];

    $newDiscussions = false;

    foreach ($disputes['disputes'] as $dispute) {
        // Sprawdź, czy dyskusja jest nowa i nie była jeszcze odpowiedziana
        if ($dispute['status'] == 'NEW' && !in_array($dispute['id'], $processedDisputes)) {
            $buyerLogin = $dispute['buyer']['login'];

            // Wyślij e-mail z informacją o nowej dyskusji
            $subject = 'Nowa dyskusja na Allegro';
            $message = "Nowa dyskusja od użytkownika: $buyerLogin";
            sendEmail($emailTo, $subject, $message);

            // Odpowiedz na dyskusję
            $messageContent = "Dziękujemy za kontakt. Twoja sprawa jest dla nas bardzo ważna. Postaramy się odpowiedzieć jak najszybciej.";

            $postData = json_encode([
                'message' => $messageContent
            ]);

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, "https://api.allegro.pl/sale/disputes/{$dispute['id']}/messages");
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
            curl_setopt($ch, CURLOPT_HTTPHEADER, [
                "Authorization: Bearer $accessToken",
                "Content-Type: application/vnd.allegro.public.v1+json"
            ]);

            $response = curl_exec($ch);
            curl_close($ch);

            if ($response === false) {
                logMessage('Błąd podczas wysyłania odpowiedzi w dyskusji.', $logFile);
                die('Błąd podczas wysyłania odpowiedzi w dyskusji.');
            }

            // Zapisz ID przetworzonej dyskusji
            file_put_contents($processedDisputesFile, $dispute['id'] . PHP_EOL, FILE_APPEND);
            logMessage('Odpowiedź wysłana na dyskusję: ' . $dispute['id'], $logFile);
            $newDiscussions = true;
        }
    }

    if (!$newDiscussions) {
        logMessage('Brak nowych dyskusji do przetworzenia.', $logFile);
    }
}

// Odśwież token, jeśli jest to konieczne
$accessToken = refreshAllegroToken($clientId, $clientSecret, $refreshTokenFile, $accessTokenFile, $logFile);

// Sprawdź nowe dyskusje i odpowiedz na nie
checkAndRespondToNewDiscussions($accessToken, $emailTo, $processedDisputesFile, $logFile);

echo "Kod wykonany prawidłowo.";

?>
PrzemyslawLukanowski commented 2 months ago

Witam, aby to zweryfikować, poprosimy o trace-id wywołania, gdzie nie zwróciliśmy nowej dyskusji oraz ID takiej przykładowej dyskusji, która powinna być w odpowiedzi.

PrzemyslawLukanowski commented 2 months ago

Przepraszam, teraz zauważyłem, że napisałeś "nie wyświetla info w nowych dyskusjach" - w takim przypadku poprosimy o trace-id dla przypadków odpowiedzialnych za wysyłanie wiadomości w dyskusjach.

axelsport commented 2 months ago

Trace-Id: 66d6f3aab4cf0

PrzemyslawLukanowski commented 2 months ago

Niestety, ale dla tego przykładu nie widzę żadnej informacji w logach. Czy to na pewno prawidłowy numer? Mógłbym prosić o inne, świeże przykłady?

axelsport commented 2 months ago

W jaki sposób definiujecie nowe dyskusje?

PrzemyslawLukanowski commented 1 month ago

Co masz dokładnie na myśli? Nowe dyskusje to po prostu nowo utworzone dyskusje przez użytkowników zwracane w ramach GET /sale/disputes. Dla trace-id 66d6f3aab4cf0 nie widzę żadnego wpisu w naszych logach, ponieważ mogła to być jakaś starsza operacja. Dlatego aby zweryfikować tę sytuacją, potrzebuję w miarę nowy przykład, np. z ostatnich kilku dni, tygodnia.

stale[bot] commented 1 month ago

W tym wątku nie pojawiła się żadna nowa odpowiedź w ciągu 7 dni, dlatego automatycznie oznaczamy go jako przeterminowany. Jeśli w ciągu kolejnych 7 dni nie pojawi się żadna odpowiedź, wątek zostanie zamknięty. Dziękujemy za zaangażowanie w dyskusję i zachęcamy Cię do wypełnienia ankiety dotyczącej naszego wsparcia na forum.


There was no new reply in this thread within 7 days, therefore, we automatically marked it as expired. If no response is received within the next 7 days, this thread will be closed. Thank you for engaging in the discussion. We encourage you to complete our forum support survey.