Korzystać z API Facebook w aplikacji internetowej Google Apps Script?

[1]}próbuję stworzyć aplikację Facebook za pomocą skryptu Google Apps jako aplikacji internetowej, jako back-end. Jedynym API Facebook, który wydaje się mieć zastosowanie jest Javascript SDK, ale nie mogę nawet dostać, że jeden do pracy.
Obecny problem, który mam jest to, że Facebook JS SDK używa identyfikatorów Javascript, które kończą się:"__". Google Apps Script ogranicza nazwy, które kończą się podwójnym podkreśleniem.

Jeśli użyję zmodyfikowanej kopii pliku JS Facebook ' a bez podwójnego podkreślenia w nazwy, dostaję ten błąd:
Refused to display [URL] in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'

Jakiś pomysł, jak dostać Gaz grając ładnie z FB?

Author: Sandy Good, 2014-01-30

1 answers

Wymyśliłem, jak używać skrypt aplikacji UrlFetchApp.fetch i usługi HTML, aby zalogować użytkownika do aplikacji my Apps Script za pomocą Facebook. Mogę również pisać na Facebook Z Apps Script.

  • nie potrzebujesz Facebook Javascript SDK

Ogólny Przegląd

Jest 8 różnych platform Facebook:

Platformy Facebook

[18]}Platforma Facebook, że używam z Apps Script jest platforma internetowa. Strona nie działa osadzona w Facebook.

Czego nie możesz zrobić: (Z tego co wiem)

    Facebook facebook to strona internetowa, która łączy się z Facebookiem, z zakładką na Facebooku. Facebook Facebook Page Tab działa osadzony w Facebooku. Z mojego doświadczenia wynika, że Url skryptu aplikacji powoduje problemy z Facebook Page Tab. Skrypt URL dla aplikacji ma wiele rzeczy dołączonych do końca, które Facebook wydaje się usuwać. (Lub coś w tym stylu) próbowałem wielu różnych odmian produktów Google z Facebook. Facebook Facebook może być używany jako zakładka strony Google, ale osadzenie skryptu Google Apps w witrynie, czyli w zakładce Strony Facebook, spowoduje błąd między domenami. Więc jedyną opcją, którą mogę dostać się do pracy, jest opcja strony internetowej.

Rodzajem obejścia, którego używam do problemu z zakładką strony, jest użycie statycznego HTML Thunderpenny jako zakładki Strony Facebook, która następnie łączy się z aplikacją my Apps Script lub aplikacją GAE. (W zależności czy potrzebuję HTTP S or not)

Możesz użyć witryny Google jako Zakładki strony, ale Thunderpenny może zaprojektować aplikację z HTML, Javascript i CSS tak, jak zwykle. OH! I próbowałem użyć Facebook Javascript SDK wewnątrz Thunderpenny, i nigdzie z tym nie mam. Poza tym aplikacja Thunderpenny nie ma backendu, Apps Script ma backend (. GS code), w którym można ukryć Token aplikacji Facebook.

Podstawowe kroki to:

  • Uruchom link do Facebook oauth z Twojej aplikacji.
  • href="https://www.facebook.com/dialog/oauth?client_id=yourIDhereNoQuotes&redirect_uri=https://script.google.com/macros/s
  • Facebook jest jednym z najbardziej popularnych serwisów społecznościowych na świecie.]}
  • nie można przetworzyć adresu URL przekierowania Facebook z powrotem do aplikacji z doGet(e). Oto dlaczego. Skrypt aplikacji musi zobaczyć znak zapytania w adresie URL, aby przeanalizować adres URL. Facebook zwraca adres URL z innym konfiguracja.
  • Po załadowaniu aplikacji, użytkownik może uruchomić skrypt, aby przetworzyć Token Facebook ' a.]}
  • okno.onload=function () {};
  • funkcja onload uruchamia funkcję .gs do weryfikacji tokena
  • użyj UrlFetchApp.fetch do debug tokena
  • Pamięć podręczna stan logowania w prywatnej pamięci podręcznej
  • var cache = CacheService.getPrivateCache ();
  • Sprawdź status logowania w razie potrzeby.

Pamiętaj, że Facebook śledzi status logowania do aplikacji niezależnie. Ale Twoja aplikacja może mieć status zalogowanego nadal aktywnego, gdy token Facebook wygasł. Więc musisz to sprawdzić.

Użyj Oficjalnej Grafiki Facebook

Zasoby Marki-Facebook

Pobierz grafikę Facebook. Czytaj Do 'S I Dont' s

Utwórz przycisk Facebook Login

<div id="FbLog">
    <a href="https://www.facebook.com/dialog/oauth?client_id=YourClientID&redirect_uri=https://script.google.com/macros/s/YourAppsScript/exec?&response_type=token&scope=publish_stream"><img src="https://FacebookGraphic.png" height="95%" width="95%"></a>
</div>

Style przycisk Facebook Login

#FbLog {
    padding: 10px;
    background-color: white;
    margin-left:auto;
    margin-right:auto;
    cursor: pointer;
}

Window Onload Code

Oto okno.pobranie kodu po stronie klienta, którego używam do przechwytywania Facebook token. Jest to używane tylko do przechwytywania tokenu Facebook, a nie do weryfikacji tokenu. Moja aplikacja umożliwia zarówno Logowanie Facebook, jak i regularne logowanie. Walidacja tokenu Facebook odbywa się w innym kodzie.

window.onload=function(){
  //console.log("This onload did run");

  //get the URL out of the browsers address bar
  //the URL can have multiple different strings attached depending upon the situation.
  //1)Sign in with Facebook. 2) Someone wanting to buy an item 3) Someone wanting to input an item for sale.
  //Any situation other than the FB log in is initiated in the back end.
  window.daURL = window.location;
  window.urlStrng = daURL.toString();

  //console.log("url: " + urlStrng);
  //If there was a FaceBook login, there will be a hashtag in the url string
  window.hashPos = urlStrng.indexOf("#");
  if (window.hashPos > 0) {
    mainStart('InputBlock', 'InputForm');
    window.urlEnd = urlStrng.split("#", 2);
    window.urlTkn = urlEnd[1].split("&", 2);
    window.fbAcsTkn = urlTkn[0].split("=", 2);
    window.finalTkn = fbAcsTkn[1];

    window.scndExpire = urlStrng.substring(urlStrng.indexOf("_in=")+4, urlStrng.length);
    console.log("scndExpire: " + scndExpire);

    google.script.run.withFailureHandler(onFailure)
    .withSuccessHandler(showFBsuccess)
    .processFB_LogIn(window.finalTkn, scndExpire)
  }
  else {
    //If it's not a Facebook log in, go to next two choices
    //If the URL string has &L in it, then item listing info is being passed because someone clicked 'Buy'
    window.whatToLoad = urlStrng.indexOf("&L");
    console.log("Second option of onload ran");
    if (window.whatToLoad > 0) {
      google.script.run.withFailureHandler(onFailure)
        .withSuccessHandler(injectBuyForm)
        .include('MutualCmit');
     } else {
     google.script.run.withFailureHandler(onFailure)
       .withSuccessHandler(injectSignInForm)
       .include('SignIn');
     };
  };
};

Zauważ, że nawet jeśli logowanie na Facebook jest wyzwalane w interfejsie, Walidacja odbywa się w kodzie .gs. Ktoś mógłby wprowadzić fałszywy token Facebook, ale nie przejdzie kontroli w kodzie po stronie serwera.

To jest .gs kod do przetwarzanie loginu Facebook:

Walidacja kodu Facebook Token GS

//I put this cache line at the very top of the `.gs` file. The other code
// can be put somewhere lower.

var cache = CacheService.getPrivateCache();

function processFB_LogIn(argFB_Tkn, expTime) {
    cache.put('fbTkn', argFB_Tkn, 4000);
    cache.put('fbExpr', expTime, 4000);

    var meFBtkn = cache.get('fbTkn');

    Logger.log("FaceBook Token: " + meFBtkn);

     //This section is for verifying (debug) the user actually signed in through Facebook
    //The first FB token is passed in from the URL right after the user signs in, and when this apps Script loads.
    //IMPORTANT!!!    IMPORTANT!!!   You MUST escape the | character with code %7C

    var AppAccssTkn = 'YourAppID%7YourAppToken'; //This never changes unless app secret changes
    var optnGetTkn = {"method" : "get", "muteHttpExceptions" : true};
      //This 'Debugs' the token returned in the URL after the user signed in with Facebook.  You "should" verify that the token is real.
      var rsltDebug = UrlFetchApp.fetch("https://graph.facebook.com/debug_token?input_token="  + meFBtkn  + "&access_token=" + AppAccssTkn, optnGetTkn);
      var debugTxt = rsltDebug.getContentText();
      Logger.log("debugTxt: " + debugTxt);

      var jsonObj = JSON.parse(debugTxt);
      Logger.log("jsonObj: " + jsonObj);
      //This is the FB user ID
      var useIdTxt = jsonObj.data.user_id;
      cache.put('pubIDcache', useIdTxt, 4000);

      var tknValid = jsonObj.data.is_valid;

      Logger.log("reslt of the debug: " + useIdTxt);
      Logger.log("tknValid: " + tknValid);

      var getFbUseName = UrlFetchApp.fetch("https://graph.facebook.com/" + useIdTxt + "/?fields=first_name&access_token=" + AppAccssTkn, optnGetTkn);

      var objUseName = JSON.parse(getFbUseName);
      var arryFirstName = objUseName.first_name;
      Logger.log("user name: " + arryFirstName);

      cache.put('fbFrstName', arryFirstName, 4000);

   if (tknValid === false) {
     return 'notValid';
   }
   else if (arryFirstName != null) {
     //This is how it's determined if someone is logged in or not.
     cache.put('imin', '9847594ujglfugfjogj', 4000);
     return arryFirstName;
  };
};

Potrzebujesz one time token aplikacji, który nie zmieni się, chyba że aplikacja tajne zmiany. Musisz wygenerować to za pomocą jednorazowego kodu.

Aby uzyskać dostęp do aplikacji za pomocą tego kodu:]}
//A Facebook App Token never changes unless you go to the Facebook Developers Console, and you
//change the App Secret.  So, do NOT keep requesting a new App Token.  Just get it once, then
//hard code it into a backend secret function.
// The App Token can be used to modify your App, but you can just do that 'Manually'
function getOneTimeFB_AppToken() {
  Logger.log("getOneTimeFB_AppToken ran");
  //keep this info secret
  //Generate an App Access Token
  var ysshAppID = 'Your App ID';
  var ysshAppSecret = 'Your App Secret';
  var optnAppTkn = {"method" : "get"};
  var getAppTknURL = "https://graph.facebook.com/oauth/access_token?client_id=" + ysshAppID + "&client_secret=" + ysshAppSecret + "&grant_type=client_credentials"
  var getAppTkn = UrlFetchApp.fetch(getAppTknURL, optnAppTkn);
  Logger.log("Object returned from GET: " + getAppTkn)
  var myAppTkn = getAppTkn.getContentText();
  Logger.log("myAppTkn: " + myAppTkn);
};

Post do Facebook GS Code

function fncPostItemFB(arg1ToPost, arg2ToPost, arg3ToPost, argEtcToPost) {
  var fbCacheTkn = cache.get('fbTkn');
  Logger.log("fbCacheTkn: " + fbCacheTkn);

  if (fbCacheTkn === null) {
    return false;
  };
  Logger.log("fncPostItemFB ran: " + fbCacheTkn);
  return fncPostSecurly_(arg1ToPost, arg2ToPost, arg3ToPost, argEtcToPost);
};

function fncPostSecurly_(arg1ToPost, arg2ToPost, arg3ToPost, argEtcToPost) {
  Logger.log("fncPostSecurly ran");

  var sttsUpdate = argToPost + "your text to post here" + argToPost;
  var fromLogInTkn = cache.get('fbTkn');

  Logger.log("cache FB token: " + fromLogInTkn);

  //This is added security https://developers.facebook.com/docs/graph-api/securing-requests/
  var appsecret_sig = Utilities.computeHmacSha256Signature(fromLogInTkn, "YourAppSecret");
  var optnPostFB = {"method" : "post"};  //
  var PostToFB_URL = "https://graph.facebook.com/FacebookPageOrGroupID/feed?message=" + sttsUpdate + "&access_token=" 
    + fromLogInTkn; // + "&appsecret_proof=" + appsecret_sig;


    //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;
    };
 };

Post do Facebook Front End Javascript Code

<script>
window.WriteInput = function(whereToPost) {

    window.strngCtgry = document.getElementById('id_Category').value;
    window.strngMaker = document.getElementById('id_Maker').value;
    window.strngAskingPrice = document.getElementById('id_AskingPrice').value;
    window.strngType = document.getElementById('id_ShrtDesc').value;
    window.strngFunction = document.getElementById('id_Function').value;
    window.strngCosmetic = document.getElementById('id_Cosmetic').value;  
    window.strngDescription = document.getElementById('id_Description').value;
    window.strngUserID = document.getElementById('pubID_Holder').textContent;
    window.addrIP = document.getElementById('IP_Holder').textContent;

  if (whereToPost === 'fb') {
    console.log("fncPostToFB ran" + strngDescription);
    if (strngDescription === "" || strngAskingPrice === "") {alert("Missing Input"); return false;};
    google.script.run.withFailureHandler(postFbFail)
    .withSuccessHandler(savedToFB)
    .fncPostItemFB(strngCtgry, strngMaker, strngAskingPrice, strngType, strngDescription, strngFunction, strngCosmetic, addrIP);
  } else {
    google.script.run.withFailureHandler(onFailure)
      .withSuccessHandler(savedLst)
      .fncSaveItem(strngCtgry, strngMaker, strngAskingPrice, strngType, strngDescription, strngFunction, strngCosmetic, addrIP);
      };
    };

window.savedLst = function(rtrnInput) {
   if (rtrnInput === false) {
     alert("Failed to Save Data");
   }
   else if (rtrnInput === "NotLogged") {
     alert("You are not logged in!");
     mainStart('SignInBody', 'SignIn');
   }
   else if (rtrnInput === "noItemForPic") {
     alert("You Need to Save an Item to attach the Picture to");
   }
   else {
  alert("Your Data Was Saved!");
  //Show the listing that was just saved next to the upload Pics button
  document.getElementById('listToPic').innerHTML = document.getElementById('id_ShrtDesc').value +
    ", " + document.getElementById('id_Description').value +
    ", - Made By: " + document.getElementById('id_Maker').value +
    ", Price: $" + document.getElementById('id_AskingPrice').value;

    };
};

window.postFbFail = function() {
  alert("Failed to Post to Facebook!  Try Signing In Again.");
  unsignFB();
};

window.savedToFB = function(pstFbStat) {
  if (pstFbStat === false) {
    alert("You are Not Signed in to Facebook!");
    unsignFB();
    google.script.run.withFailureHandler(onFailure)
      .signOutFB();
  } else {
    alert("Your Item was Posted to Facebook!");
  };
};

</script>
 15
Author: Sandy Good,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-25 20:11:58