2009-11-13 5 views
0

я собираюсь создать приложение Facebook, которое получит информацию (имя и PAGE_URL) о Facebook странице с его PAGE_ID. Так я пошел в Facebook вики и я нашел этот метод API, который хорошо звучит на первый взгляд:Получение информации о Facebook страницу с помощью API, но без session_key

http://wiki.developers.facebook.com/index.php/Pages.getInfo

Мое единственное желание было то, что я бы не передать параметр session_key, потому что я не хочу заставить пользователя facebook установить приложение. (Вы знаете страницу «разрешить приложение» или всплывающее окно).

Но описание говорит:

«. Параметр session_key необязателен Когда параметр session_key не передаются, вы можете получить информацию только для страниц, которые добавили приложение»

Так что никаких проблем, точно, что я ищу!

Но после попытки, я получаю эту ошибку:

«102 Ключа сеанса был неправильно представленными или достиг его таймаута Direct пользователя войти еще раз, чтобы получить еще один ключ.»

Обычный, потому что я не передаю параметр session_key.

Я использую Рельсы + Facebooker плагин. Поэтому я стараюсь это методы в моей консоли без успеха:

>>Facebooker::Session.create.pages(:fields => ["name", "page_url"], :page_ids => "123456") 
=> [] 


>> Facebooker::Session.create.fql_query("SELECT name, page_url FROM page WHERE page_id=123456") 
=> [] 

(конечно, страница с PAGE_ID = «123456» установил мое приложение)

Кто-то знает, как получить информацию о но без необходимости прохождения параметра session_key?

Я знаю, что это возможно, потому что я уже видел, что приложение facebook извлекает информацию о странице, не спрашивая у пользователя, чтобы установить его приложение.

ответ

0

Эта нить на developers.facebook.com может помочь вам http://forum.developers.facebook.com/viewtopic.php?pid=147246#p147246

+0

Спасибо, но эта ветка говорит об отправке уведомления в пакетном процессе. Нет информации о получении информации с страницы Facebook без session_key. –

+0

, код, указанный выше, может быть запущен на любом персональном компьютере без ключа сеанса. Вы могли видеть, как они это делают. – rampr

0

Хорошо, после того, как некоторые пытаются, я могу сказать, что метод API «Pages.getInfo», когда он вызывается без session_key кажется вернуть ТОЛЬКО страницы уже ОПУБЛИКОВАННЫЕ.

И, конечно, страницы, которые я хочу получить, могут быть НЕПРЕРЫВНО ... слишком плохо.

Любая возможность получить URL-адрес страницы с неопубликованной страницы?

1
private string ToUrlBase64String(byte[] Input) 
{ 
    return Convert.ToBase64String(Input).Replace("=", String.Empty) 
             .Replace('+', '-') 
             .Replace('/', '_'); 
} 

private byte[] SignWithHmac(byte[] dataToSign, byte[] keyBody) 
{ 
    using (var hmacAlgorithm = new HMACSHA256(keyBody)) 
    { 
     hmacAlgorithm.ComputeHash(dataToSign); 
     return hmacAlgorithm.Hash; 
    } 
} 

#region["Parse Signed_Request Method"] 
/// <summary> 
/// Parse Signed_Request Method 
/// </summary> 
/// <param name="signedRequestValue"></param> 
/// <returns></returns> 
private string ParseSignedRequest(string signedRequestValue) 
{ 
    string PageID = string.Empty; 
    string applicationSecret = "7f7e426af4d835a2fd54abea04520283"; 
    string[] signedRequest = signedRequestValue.ToString().Split('.'); 
    string expectedSignature = signedRequest[0]; 
    string payload = signedRequest[1]; 
    // Attempt to get same hash 
    var Hmac = SignWithHmac(UTF8Encoding.UTF8.GetBytes(payload), UTF8Encoding.UTF8.GetBytes(applicationSecret)); 
    var HmacBase64 = ToUrlBase64String(Hmac); 

    if (HmacBase64 != expectedSignature) 
     return null; 
    var encoding = new UTF8Encoding(); 
    var decodedJson = payload.Replace("=", string.Empty).Replace('-', '+').Replace('_', '/'); 
    var base64JsonArray = Convert.FromBase64String(decodedJson.PadRight(decodedJson.Length + (4 - decodedJson.Length % 4) % 4, '=')); 
    string myvalue = Convert.ToString(JsonConvert.DeserializeObject(encoding.GetString(base64JsonArray)));   
    string ss = myvalue.Replace("{", "").Replace("}", "").Replace("\"", ""); 
    string[] s = ss.Split(','); 
    for (int i = 0; i < s.Length; i++) 
    { 
     string[] s1 = s[i].Split(':'); 
     if (s1[0].ToString().Trim().ToLower() == "profile_id") 
     { 
      string[] myapp = s[i].Split(':'); 
      PageID = myapp[1].ToString().Trim(); 
     } 
    } 
    return PageID; 

} 

#endregion 


#region["Page_Load Event"] 
/// <summary> 
/// Page_Load Event 
/// </summary> 
/// <param name="sender"></param> 
/// <param name="e"></param> 
protected void Page_Load(object sender, EventArgs e) 
{ 

    string SignedRequest = Request.Form["signed_request"].ToString(); 
    string myvalue = Convert.ToString(ParseSignedRequest(SignedRequest)); 
    //now myvalue contain the page id  
} 
#endregion