我打算创建一个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应用程序检索有关页面的信息而不要求用户安装他的应用程序。
答案 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>
当然,我想获取信息的网页可能未发布 ......太糟糕了。
是否有机会从未发布的网页中检索网页网址?