Publier sur Facebook depuis Apps Script
J'ai une base de donnée injectée dans Sheet, contenant l'URL de mes pages, et d'autres informations, que je publie, avec un semi-hasard, sur ma page Facebook.
Pour ce faire, je génère avec Javascript, annuellement, un planning de numéros aléatoires dans une seconde feuille, où chaque colonne est un mois. Ces numéros correspondant aux lignes contenant les informations à publier. Certaines publications ont plus d'intérêts sur certains mois, et j'opère des échanges.
En seconde partie, ce sont les négociations avec l'API Facebook. Vous devrez démarrer une application possédant les autorisations nécessaire, et récupérer le Token. L'algorithme pioche un numéro au hasard, dans la bonne colonne/mois, récupères les informations dans la base de données, et publies, après avoir "traduit" certains symboles en UTF-8.
function facebookpageplanning() {
//Il n'est pas possible de déclencher le script, une seule fois dans l'année, donc il démarre tous les mois, et la suite se déclenche si nous sommes en Janvier.
if (new Date().toISOString().slice(5, 7) != 01) {
result = 'Script non déclenché, nous ne sommes pas en Janvier';
} else {
result = 'Script déclenché pour ce premier Janvier';
// Un url random, dans ma liste de liens Webpage, prédécortiqué dans le sheet.
var sss = SpreadsheetApp.getActiveSpreadsheet();
var ss = sss.getSheetByName('FullPages');
var ssdiffusion = ss.getRange(1,10,ss.getLastRow(), 10);
var range = ss.getRange(1,1,ss.getLastRow(), 1);
var data = range.getValues();
///GENARATION DU PLANNING. Nétoyage du tableau.
var tablehasard = sss.getSheetByName('FullRandom');
tablehasard.clear();
var mois = 12+1;
var maxmois = (Math.ceil(data.length/12));
var l = 1;
//Distribution aléatoire des numéros
for(var i=1; i<(maxmois+1); i++ ) {
for(var j=1; j<mois; j++ ) {
var isUnique = false
do {
var k = Math.floor(Math.random() * data.length);
if(data[k][0] !== 0){ //Vérifier si la valeur a été utilisée.
data[k][0] = 0; // Set a used value to zero
isUnique = true;
l=l+1;
}
if (k==0) {isUnique = false}; //Virer l'url 0
}
while (!isUnique);
tablehasard.getRange(i,j).setValue(k);
if (l-1==(data.length)) {
// var sauve = data.length+1
break;// l s'incrémente jusqu'à atteindre la maximum de la pile
};
tablehasard.getRange(maxmois,12).setValue(data.length); //Il manque le dernier de la pile, je ne sais pas pourquoi, alors petit ajout..
Logger.log("Numéro : " + l);
}};
Logger.log("Génération du tableau : OK !"); //
// Redistribuer ces chiffres, selon les mois.
for (var month = 1; month < 13; month++) { // Pour chacuns des mois, il récupérère le terme à rechercher, et procède aux changements.
Logger.log("month : " + month);
if(month == 1) {lebonmois = "Janvier"};
if(month == 2) {lebonmois = "Février"};
if(month == 3) {lebonmois = "Mars"};
if(month == 4) {lebonmois = "Avril"};
if(month == 5) {lebonmois = "Mai"};
if(month == 6) {lebonmois = "Juin"};
if(month == 7) {lebonmois = "Juillet"};
if(month == 8) {lebonmois = "Aout"};
if(month == 9) {lebonmois = "Septembre"};
if(month == 10) {lebonmois = "Octobre"};
if(month == 11) {lebonmois = "Novembre"};
if(month == 12) {lebonmois = "Décembre"};
Logger.log("lebonmois : " + lebonmois);
var traqueur = ssdiffusion.createTextFinder(lebonmois); //On recherche le terme dans la liste.
traqueur.matchEntireCell(true)
var all = traqueur.findAll();
Logger.log("all : " + all);
var recurrence = all.length // Le nombre de fois où le terme apparait.
Logger.log("recurrence : " + recurrence);
for (var m = 1; m < recurrence+1; m++) {
if(m<maxmois+1) { // Pour que les colonnes restent équilibrées, la liste de récurrence ne peux pas dépasser la moyenne par mois.
Logger.log("m : " + m);
var ligne = all[m-1].getRow()
Logger.log("ligne : " + ligne);
var decale = tablehasard.getRange(m,month).getValue(); // Obtenir la valeur de l'ancienne cell.
Logger.log("A decaler : " + decale);
var tfdecale = tablehasard.createTextFinder(ligne); // Trouver l'emplacement du film sélectionné.
tfdecale.matchEntireCell(true) // Il faut absoluement la même valeur sinon, il trouve 6 dans 16, 66 ,..
var trouvetout = tfdecale.findAll();
Logger.log("trouvetout : " + trouvetout);
n=0;
var interchange = trouvetout[n].getA1Notation();
Logger.log("Interchange : " + interchange);
tablehasard.getRange(m,month).setValue(ligne);
tablehasard.getRange(interchange).setValue(decale) ;
}}
Logger.log(lebonmois +" Ok !");
}}};
Seconde Partie
function facebookpagepublication() {
// Un url random, dans ma liste de liens Webpage, prédécortiqué dans le sheet.
var sss = SpreadsheetApp.getActiveSpreadsheet();
var ss = sss.getSheetByName('FullPages');
var range = ss.getRange(1,1,ss.getLastRow(), 1);
var data = range.getValues();
var temporel = sss.getSheetByName('FullRandom')
var maxmois = Math.ceil(1+data.length/12)
// let nombre = Math.floor(Math.random() * data.length); // Tirer vraiment au pif.
//Tirer un un film au hasard, dans ceux sélectionnés pour le mois.
var date = Utilities.formatDate(new Date(), "GMT+1", "MM")
for(var x=2; x>1; x++ ) {
var h = Math.floor(Math.random() * (maxmois - 1 + 1) + 1);
var prenombre = temporel.getRange(h,date)
var nombre = (prenombre.getValue())-1;
if (nombre != -1 ) { break };}
temporel.getRange(h,date).setValue(""); //Empêcher de retomber sur le même film.
var url = data[nombre];
Logger.log("URL: " + url);
//Titrage
var rangetitre = ss.getRange(1,2,ss.getLastRow(), 1);
var pretitre = rangetitre.getValues()
var titi = pretitre[nombre];
var titre = titi.toString().replace("?", "%3F").replace("!","%21")
Logger.log("Titre : " + titre);
//Note
var rangenote = ss.getRange(1,3,ss.getLastRow(), 1);
var prenote = rangenote.getValues()
var note = " Niveau : " + prenote[nombre] + "/5";
Logger.log(note);
//Description
var rangedescription = ss.getRange(1,4,ss.getLastRow(), 1);
var predescription = rangedescription.getValues()
var descrip = predescription[nombre];
Logger.log("Description : " + descrip);
var description = descrip.toString().replace("|", "%7C").replace("|", "%7C").replace("👁", "%F0%9F%91%81").replace("👁", "%F0%9F%91%81").replace("🔒", "%F0%9F%94%92").replace("🔒", "%F0%9F%94%92").replace("©", "%C2%A9").replace("©", "%C2%A9").replace("⏰", "%E2%8F%B0").replace("⏰", "%E2%8F%B0").replace("⛔️", "%E2%9B%%94").replace("⛔️", "%E2%9B%%94").replace("🚧", "%F0%9F%9A%A7").replace("🚧", "%F0%9F%9A%A7").replace("💰", "%F0%9F%92%B0").replace("💰", "%F0%9F%92%B0"); //UTF-8
//Genre
var rangegenre = ss.getRange(1,5,ss.getLastRow(), 1);
var pregenre = rangegenre.getValues()
var genre = "Genre : " + pregenre[nombre];
Logger.log(genre);
//Commentaire
var rangecome = ss.getRange(1,11,ss.getLastRow(), 1);
var precome = rangecome.getValues()
var comente = precome[nombre];
var comentaire = comente.toString().replace("!","%21").replace("#","%23").replace("&","%26").replace("'","%27").replace("(","%28").replace(")","%29").replace("*","%2A").replace("+", "%2B").replace(",","%2C").replace("/","%2F").replace(":","%3A").replace(";","%3B").replace("=","%3D").replace("?", "%3F").replace("@","%40").replace("[","%5B").replace("]","%5D").replace("^","%5E")
Logger.log("Commentaire : " + comentaire);
//FULL blabla "%7C" c'est une barre de séparation. UTF8
var message = titre + "%0A" + comentaire + "%0A" + "%0A" + description + "%0A" + genre + " %7C" + note;
Logger.log("message : " + message + description + genre + note);
//Obtenir le token : le jeton https://developers.facebook.com/tools/explorer/ un fois généré, il est court. En cliquant sur le intérogation bleu, il y a moyen de l'étendre pour le mener à deux mois... Mais il est plus intéressant de l'avoir en illimité, ce qui mène à des tactiques de contournement. Après en avoir essayé plusieures, voici une réponse récente qui semble correcte : https://docs.squiz.net/funnelback/docs/latest/build/data-sources/facebook/facebook-page-access-token.html En gros remplacer l'urls : https://graph.facebook.com/v12.0/APP-SCOPED-USER-ID/accounts?access_token=LONG-LIVED-ACCESS-TOKEN Avec id uilisateur (pas l'app) et le token longue durée
var token = "TONTOKEN"
Logger.log("FB token: " + token);
var optnPostFB = {"method" : "post"}; //
var PostToFB_URL = "https://graph.facebook.com/TONIDPAGE/feed?message=" + message + "&link=" + url + "&access_token="
+ token;
//Make a post to the Page
var whatHappened = UrlFetchApp.fetch(PostToFB_URL, optnPostFB );
//The return from facebook is an object. Has to be converted to a string.
var strFrmFbObj = whatHappened.getContentText();
Logger.log("Return value of Post: " + strFrmFbObj);
//When a post is successfully made to Facebook, a return object is passed back with an id value.
var rtrnVerify = strFrmFbObj.indexOf('{\"id\":\"');
Logger.log("rtrnVerify: " + rtrnVerify);
if (rtrnVerify != -1) {
return true;
} else {
return false;
};
};