通过API获取有关Facebook页面的信息但没有session_key

时间:2009-11-13 10:32:10

标签: facebook facebooker

我打算创建一个Facebook应用程序,从他的 page_id 获取有关Facebook页面的信息(名称 page_url )。 所以我去了Facebook Wiki,我发现这个API方法起初听起来不错:

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

我唯一的希望是我不会传递session_key参数,因为我不想强迫facebook用户安装应用程序。 (您知道“允许应用程序”页面或弹出窗口。)

但描述说:

“session_key参数是可选的。如果未传递session_key参数,则只能获取已添加应用程序的页面的信息。”

所以没问题,正是我在找什么!

但经过一番尝试,我得到了这个错误:

  

“102会话密钥不正确   提交或已达到超时。   指示用户再次登录   获得另一把钥匙。“

正常,因为我没有传递session_key参数。

我正在使用 Rails + 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应用程序检索有关页面的信息而不要求用户安装他的应用程序。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

developers.facebook.com上的这个帖子可以帮到你 http://forum.developers.facebook.com/viewtopic.php?pid=147246#p147246

答案 2 :(得分:0)

好的,经过一些尝试后,我可以说API方法“Pages.getInfo”在没有session_key的情况下调用时似乎返回页面 PUBLISHED 。< / p>

当然,我想获取信息的网页可能未发布 ......太糟糕了。

是否有机会从未发布的网页中检索网页网址?