Aplikacja do powiadomień SMS w oparciu o kalendarz Google

0

Cześć.
Mam do napisania pracę dyplomową na temat aplikacji powiadomień SMS w oparciu na komputer jednopłytkowy. Aplikacja ma obsługiwać wielu użytkowników i do tego mieć analizę danych w chmurze. Ogólnie koncepcje mam taką, aby wykorzystać do tego Raspberry Pi z modułem GSM na którym będzie uruchomiona aplikacja. Chciałem do tego wykorzystać Google Calendar API, aby użytkownicy dodawali swoje wydarzenia do kalendarza., a aplikacja cyklicznie odpytywała by kalendarze użytkowników czy są jakieś wydarzenia którym należy wysłać przypomnienie SMS. I tu pojawia się mój problem - komunikacja z kalendarzami. Z tego co widzę do tego, aby skomunikować się z API wymagane jest uwierzytelnienie przy pomocy OAuth2 (próbowalem przy użyciu API Key, ale otrzymuje "API keys are not supported by this API. Expected OAuth2 access token or other authentication credentials that assert a principal."). Ale nie wiem jak to zrobić (i w sumie czy w ogóle się da), aby aplikacja sama pobierała dane z kalendarza, bez ingerencji użytkownika? Tak, aby raz udostępnić dostęp do niego, a aplikacja już potem sobie działała. Ktoś może ma z tym jakieś doświadczenie?

0

Da się, musisz zapytać użytkownika, czy udostępni dane konkretnej aplikacji. Nie pamiętam już szczegółów "jak", ale na 100% się da, bo robiłem to przy okazji jakiegoś tam projektu.
Pewnie widziałeś, ale na wszelki wypadek... https://developers.google.com/calendar/api/guides/auth
Musisz zarejestrować nową aplikację, aplikacja dostaje jakiś swój API key, później użytkownik musi przyznać aplikacji uprawnienia (OAuth flow) do odczytu kalendarza i wtedy już wystarczy używać api w samej aplikacji.

1

jestem zdziwiony otagowaniem "Spring".

Tak dałeś, bo "wypada", czy serio proof-of-concept klienta jakiejś usługi (jaka by nie była) rozwijasz w Springu?

Setki prób z programem command line to początek

0
piotrpo napisał(a):

Da się, musisz zapytać użytkownika, czy udostępni dane konkretnej aplikacji. Nie pamiętam już szczegółów "jak", ale na 100% się da, bo robiłem to przy okazji jakiegoś tam projektu.
Pewnie widziałeś, ale na wszelki wypadek... https://developers.google.com/calendar/api/guides/auth
Musisz zarejestrować nową aplikację, aplikacja dostaje jakiś swój API key, później użytkownik musi przyznać aplikacji uprawnienia (OAuth flow) do odczytu kalendarza i wtedy już wystarczy używać api w samej aplikacji.

Tak, widziałem. Aczkolwiek jak próbuje przez explorera cokolwiek pobrać GETem to musze potwierdzić i tak logując się, a jak próbuje przez postmana to mam błąd 401.

ZrobieDobrze napisał(a):

jestem zdziwiony otagowaniem "Spring".

Tak dałeś, bo "wypada", czy serio proof-of-concept klienta jakiejś usługi (jaka by nie była) rozwijasz w Springu?

Setki prób z programem command line to początek

W Springu planowałem zrobić funkcjonalność dodawania nowych użytkowników kalendarza do aplikacji.

0

@TheZioMeK: A dołączasz te tokeny, które dostałeś? czy tak zwyczajnie strzelasz get'a do api?

0

Udało mi się uruchomić coś co działa w taki sposób jaki bym chciał... Ale nie do końca. Problem w tym że jak raz zaciągnie dane tokena z pliku JSON, to gdy zamienie JSONa na inny on i tak pobiera dane dla tego poprzedniego. Nawet po restarcie aplikacji. Tak wygląda kod:

package com.example.demo;

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.client.util.DateTime;
import com.google.api.services.calendar.Calendar;
import com.google.api.services.calendar.CalendarScopes;
import com.google.api.services.calendar.model.Event;
import com.google.api.services.calendar.model.Events;

import java.io.FileInputStream;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;
import java.util.List;

public class ServiceTest {

    /**
     * Application name.
     */
    private static final String APPLICATION_NAME = "Google Calendar API Java Quickstart";
    /**
     * Global instance of the JSON factory.
     */
    private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
    /**
     * Directory to store authorization tokens for this application.
     */
    private static final String TOKENS_DIRECTORY_PATH = "tokens";


    public static void main(String[] args) throws IOException, GeneralSecurityException {

        final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();


        GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("/home/theziomek/Downloads/demo/src/main/resources/sms.json"))
                .createScoped(Collections.singletonList(CalendarScopes.CALENDAR_READONLY));

        Calendar service = new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
                .setApplicationName(APPLICATION_NAME)
                .build();


        DateTime now = new DateTime(System.currentTimeMillis());
        Events events = service.events().list("primary")
                .setMaxResults(10)
                .setTimeMin(now)
                .setOrderBy("startTime")
                .setSingleEvents(true)
                .execute();
        List<Event> items = events.getItems();
        if (items.isEmpty()) {
            System.out.println("No upcoming events found.");
        } else {
            System.out.println("Upcoming events");
            for (Event event : items) {
                DateTime start = event.getStart().getDateTime();
                if (start == null) {
                    start = event.getStart().getDate();
                }
                System.out.printf("%s (%s)\n", event.getSummary(), start);
            }
        }
    }
}

0

@TheZioMeK: Co znaczy "pobierze dane dla tego poprzedniego"? Zmieniasz zawartość pliku, a aplikacja dalej bierze z niego wcześniejszą wersję, czy o co biega?

0
piotrpo napisał(a):

@TheZioMeK: Co znaczy "pobierze dane dla tego poprzedniego"? Zmieniasz zawartość pliku, a aplikacja dalej bierze z niego wcześniejszą wersję, czy o co biega?

Tak. Podmieniam zawartość pliku albo w ogóle inny plik biore, a i tak aplikacja korzysta z wartości JSONa z poprzedniego uruchomienia.

0

@TheZioMeK: Na 99% wskazujesz nie ten plik. Dorzuć sobie jakieś sprawdzenie (np. wyrzuć do logu jego zawartość).

0
piotrpo napisał(a):

@TheZioMeK: Na 99% wskazujesz nie ten plik. Dorzuć sobie jakieś sprawdzenie (np. wyrzuć do logu jego zawartość).

Wskazuje prawidłowy, bo jeśli usunę coś z niego jakąś zmienną wyrzuca błąd. Ale jeśli zostawie pustą to działa lub wpisze głupoty, to działa dla wartości z poprzedniego uruchomienia.

0

W innym miejscu musisz mieć coś skopane, sprawdź na innym użytkowniku albo komputerze. Zmienna TOKENS_DIRECTORY_PATH nie jest nigdzie użyta?

1 użytkowników online, w tym zalogowanych: 0, gości: 1