Aplikacja do powiadomień SMS w oparciu o kalendarz Google

Aplikacja do powiadomień SMS w oparciu o kalendarz Google
TheZioMeK
  • Rejestracja:prawie 3 lata
  • Ostatnio:ponad rok
  • Postów:6
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?

piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:7 dni
  • Postów:3277
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.

edytowany 1x, ostatnio: piotrpo
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
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


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
edytowany 1x, ostatnio: ZrobieDobrze
TheZioMeK
  • Rejestracja:prawie 3 lata
  • Ostatnio:ponad rok
  • Postów:6
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.

piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:7 dni
  • Postów:3277
0

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

TheZioMeK
  • Rejestracja:prawie 3 lata
  • Ostatnio:ponad rok
  • Postów:6
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:

Kopiuj
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);
            }
        }
    }
}

piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:7 dni
  • Postów:3277
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?

TheZioMeK
  • Rejestracja:prawie 3 lata
  • Ostatnio:ponad rok
  • Postów:6
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.

piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:7 dni
  • Postów:3277
0

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

TheZioMeK
  • Rejestracja:prawie 3 lata
  • Ostatnio:ponad rok
  • Postów:6
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.

IX
  • Rejestracja:około 6 lat
  • Ostatnio:około 19 godzin
  • Postów:18
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.