0

我将创建一个 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参数不传递时,你只能获取添加了你应用的Pages的信息。”

所以没问题,正是我要找的!

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

“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 应用程序在不要求用户安装他的应用程序的情况下检索有关页面的信息。

4

3 回答 3

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
于 2011-03-02T06:12:10.597 回答
0

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

于 2009-11-14T05:11:26.347 回答
0

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

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

有机会从未发布的页面中检索页面 url 吗?

于 2009-11-15T01:11:34.457 回答