web-dev-qa-db-fra.com

Comment puis-je obtenir une liste d'albums dans Google Photos?

J'ai plusieurs albums dans Google Photos. (Peut-être 200). Je veux obtenir une liste de ces albums avec leurs URL. Comment puis-je faire ceci?

Pour mettre les choses en contexte, je veux envoyer un email listant plusieurs de ces albums à des amis. En guise de solution de contournement, je peux, en principe, cliquer sur chaque album de l'interface Web de Google Photos. Cliquez ensuite sur "Plus d'options", puis sur "Options de partage", puis sur "COPIER". Ensuite, je peux coller cette URL quelque part. Mais c’est le meilleur cas absolu de 5 ou 6 clics multiplié par 200. C’est probablement beaucoup plus élevé.

Sûrement, il y a une API que je peux utiliser dans un genre unique de hacky pour obtenir une liste de tous mes albums. Non? Il semble que cela devrait être simple. Quelqu'un peut-il m'indiquer la documentation que je ne trouve pas? Je ne vois même pas où dans le monde de Google poser cette question. J'ai trouvé un question similaire , mais c'est sans réponse. Il semble qu’aujourd’hui (2016-03-05) l’API de données Picasa Web Albums est probablement ce dont j’ai besoin. Mais je ne suis pas sur.

Ma solution idéale consiste probablement à insérer un simple script dans une feuille Google afin de récupérer la liste de tous les albums: Noms dans une colonne et URL publique (si elle existe) dans une autre colonne. Mais je me contenterai de TOUT moyen d’obtenir une liste de tous mes albums avec leurs URL.

MISE À JOUR: Sally, a soulevé la possibilité de grattage d'écran pour obtenir la réponse. J'adore cette idée! Mais je ne peux pas utiliser son idée, alors j'ajoute cet angle à la question pour provoquer une réponse plus claire.

Je peux répertorier tous mes albums partagés à cette adresse URL: https://photos.google.com/shared

Je voudrais obtenir l'URL publique pour tous ces albums. Mais l'URL publique, qui a cette forme: https://goo.gl/photos/Rw5gpSaD4ikadj6M9 , ne se trouve pas dans le code source de la page. Je dois cliquer sur chaque album, puis sur "Partager" pour trouver l'URL publique.

En bref: obtenir la liste complète de mes albums partagés avec leurs URL publiques via l'API, le grattage d'écran ou tout autre moyen satisferait à mes besoins.

5
mdahlman

L’interface de Google Photos est très minimale, même pour les humains, sans parler des applications. Le meilleur moyen que j’ai trouvé d’obtenir une liste des noms d’album et des URL est d’analyser le code source de la page à l’aide de la console du navigateur.

La liste de tous les albums

Exécuté sur la page https://photos.google.com/albums , ce script renvoie une chaîne pouvant être copiée-collée dans une feuille Google, créant ainsi un tableau de noms et d'URL.

var links = document.getElementsByTagName('A'); 
var s = ''; 
for (var i = 0; i< links.length; i++) {
  if (/\b(album|share)\b/.test(links[i].href)) {
    var albumName = links[i].children[3].children[0].innerText;
    s = s + albumName + '\t' + links[i].href + '\n';
  }
}

La liste des albums partagés

Exécuté sur la page https://photos.google.com/shared , ce script renvoie la liste des noms d'album et des URL.

var links = document.getElementsByTagName('A'); 
var s = ''; 
for (var i = 0; i< links.length; i++) {
  if (/\b(album|share)\b/.test(links[i].href)) {
    s = s + links[i].innerText + '\t' + links[i].href + '\n';
  }
}

Les URL sont au format long: https://photos.google.com/share/...?key=..., pas au format court https://goo.gl/photos/... que vous obtiendriez en cliquant sur le bouton Partager. Mais ils sont fonctionnellement équivalents: ce dernier redirige vers le premier après avoir utilisé le service de raccourcissement d'URL de Google goo.gl. Si la longueur vous préoccupe, vous pouvez les raccourcir vous-même dans Google Sheets en utilisant un script Apps permettant de générer des URL goo.gl .

2
user79865

J'ai trouvé que l'API Google pouvait fournir une liste d'albums et fournir un moyen en ligne d'exécuter la commande et d'imprimer les résultats à l'aide de vos données en direct.

https://developers.google.com/photos/library/reference/rest/v1/albums/list

Définissez excludeNonAppCreatedData sur false.

Notez le jeton de page suivante requis pour les pages suivantes (50 éléments maximum suivants, 20 éléments répertoriés par défaut), il est fourni à la fin des données JSON de la dernière page demandée.

1
user205212

Si votre code est exécuté dans le cadre d'une extension Chrome, vous pouvez utiliser l'API Picasa pour obtenir la liste des albums et télécharger des images. Pas sûr que cela fonctionne dans le code de page Web. (Je ne pense pas que ce soit le cas, à cause des restrictions d'origine croisée)

Autant que je sache, malgré son nom, il vous permet d'accéder à tous les albums/images de Google Photos, pas seulement à ceux créés via Picasa.

async function GetAlbums(token, retriesLeft = 2) {
    var response = await fetch("https://picasaweb.google.com/data/feed/api/user/default?alt=json", {
        method: "GET",
        headers: new Headers({
            Authorization: "Bearer " + token, 
        }),
    });
    //var responseJSON = await response.json();
    let responseText = await response.text();
    try {
        var responseJSON = JSON.parse(responseText);
    } catch (ex) {
        console.error("Error converting text into JSON: " + responseText);
        throw ex;
    }

    let albums = responseJSON.feed.entry;
    for (let album of albums) {
        album.name = album.title.$t;
        album.id = album.gphoto$id.$t;
    }
    return albums;
}

async function UploadImageToAlbum(token: string, albumID: string, fileName: string, imageDataBlob: Blob, retriesLeft = 2) {
    var response = await fetch("https://picasaweb.google.com/data/feed/api/user/default/albumid/" + albumID + "?alt=json", {
        method: "POST",
        body: imageDataBlob,
        headers: new Headers({
            Authorization: "Bearer " + token,
            Slug: fileName,
        }),
    });
    //var responseJSON = await response.json();
    let responseText = await response.text();
    try {
        var responseJSON = JSON.parse(responseText);
    } catch (ex) {
        console.error("Error converting text into JSON: " + responseText);
        throw ex;
    }

    var viewLink = responseJSON.entry.link.find(a=>a.rel == "alternate");
    if (viewLink) {
        //chrome.tabs.create({url: viewLink.href});
        window.open(viewLink.href, "_blank");
    }
}

Et voici un exemple d'utilisation: (cet exemple doit être exécuté dans un script d'arrière-plan en raison de l'utilisation de chrome.identity, bien que je pense qu'il existe une page Web/un équivalent client)

async function PostImageAndMessageToGooglePlus(imageDataURI: string) {
    chrome.identity.getAuthToken({interactive: true}, token=> {
        let albums = await GetAlbums(token);
        let targetAlbum = albums.find(a=>a.name == "MyAlbum");
        if (targetAlbum == null) throw new Error(`Could not find album titled "MyAlbum".`);
        console.log("Found album:" + JSON.stringify(targetAlbum));

        let imageDataBlob = dataURItoBlob(imageDataURI);
        await UploadImageToAlbum(token, targetAlbum.id, "Graph", imageDataBlob);
    });
}

function dataURItoBlob(dataURI) {
    var byteString = atob(dataURI.split(",")[1]);
    var ab = new ArrayBuffer(byteString.length);
    var ia = new Uint8Array(ab);
    for (var i = 0; i < byteString.length; i++) {
         ia[i] = byteString.charCodeAt(i);
    }
    return new Blob([ab], {type: "image/png"});
}
0
Venryx