1

私はFacebook.dllを使用しています。FacebookClientです。主にFacebookユーザーのメールボックスを読みたいです。認証トークンをdbに保存しています。

  1. 開始日と終了日を記載できるメールボックスからメッセージ(すべて)を選択します
  2. すべてのメッセージをdbに保存

利用した

dynamic result = objFacebookClient.Get("fql",
                     new { q = "SELECT message_id, author_id, body, created_time FROM message WHERE thread_id IN (SELECT thread_id FROM thread WHERE folder_id = 0)" });

次のような結果を得ることができますか

  • メッセージ-メッセージの内容
  • 送信者の名前とID
  • 受信者-名前とID
  • 作成日-メッセージ作成日

コードはこちら

dynamic result = objFacebookClient.Get("fql",
   new { q = "SELECT message_id, author_id, body, created_time FROM message WHERE thread_id IN (SELECT thread_id FROM thread WHERE folder_id = 0)" });
List<Model.FacebookUserMessageInfo> objFacebookMessageList = new List<Model.FacebookUserMessageInfo>();
if (result != null)
{
    Model.FacebookUserMessageInfo objFacebookMessage = null;
    var values = result.Values;
    var TotalResult = (((System.Collections.Generic.Dictionary<string, object>.ValueCollection)values).ToList()[0]);
    var TotalMessagesData = (JsonArray)TotalResult;
    if (TotalMessagesData != null)
    {
        foreach (var Messages in TotalMessagesData)
        {
            objFacebookMessage = new Model.FacebookUserMessageInfo();
            objFacebookMessage.MessageText = (((JsonObject)Messages)["body"]).ToString();
            objFacebookMessage.ActionUserID = Convert.ToInt64(((JsonObject)Messages)["author_id"]);
            if (objFacebookMessage.ActionUserID == CurrentUserId)
            {
                objFacebookMessage.MessageType = Core.Enum.FacebookMessageType.Sent.ToString();
            }
            else
            {
                objFacebookMessage.MessageType = Core.Enum.FacebookMessageType.Receive.ToString();
            }
            objFacebookMessage.FacebookUserId = FacebookUserId;
            var MessageSecond = (((JsonObject)Messages)["created_time"]).ToString();
            var dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
            objFacebookMessage.CreatedDate = dateTime.AddSeconds(double.Parse(MessageSecond));
            objFacebookMessageList.Add(objFacebookMessage);
        }
    }
}

前もって感謝します

4

2 に答える 2

1

私は私の解決策を手に入れました

public class Facebook
{
    #region Private Properties

    private string ClientId = System.Configuration.ConfigurationManager.AppSettings["ClientId"];
    private string ClientSecret = System.Configuration.ConfigurationManager.AppSettings["ClientSecret"];

    #endregion

    #region Public Methods

    public string GetLongLifeAccessToken(string ExistingToken)
    {
        try
        {
            string Data = string.Empty;
            string url = string.Format("https://graph.facebook.com/oauth/access_token?client_id={0}&client_secret={1}&grant_type=fb_exchange_token&fb_exchange_token={2} ",
                            ClientId, ClientSecret, ExistingToken);
            System.Net.HttpWebRequest request = System.Net.WebRequest.Create(url) as System.Net.HttpWebRequest;
            using (System.Net.HttpWebResponse response = request.GetResponse() as System.Net.HttpWebResponse)
            {
                System.IO.StreamReader sr = new System.IO.StreamReader(response.GetResponseStream());
                Data = sr.ReadToEnd();
                Data = HttpUtility.ParseQueryString(Data)["access_token"];
            }
            return Data;
        }
        catch (Exception ex)
        {

            throw new Exception(ex.Message);
        }

    }

    public List<Model.FacebookUserMessageInfo> ReadFacebookMailbox(string AuthToken, long? CurrentUserDefaultFacebookId, DateTime? LastProcessedDate, DateTime CurrentDate, int FacebookUserId)
    {
        try
        {

            FacebookClient objFacebookClient;
            List<Model.FacebookUserMessageInfo> objFacebookMessageList;
            objFacebookClient = new FacebookClient(AuthToken);
            try
            {
                objFacebookClient.Get("me");
            }
            catch (Exception ex)
            {
                throw new Exception(ErrorType.UnableToAuthorizFacebookUser.ToString());
            }
            TimeSpan t = LastProcessedDate.Value - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
            int timestamp = (int)t.TotalSeconds;

            dynamic result = objFacebookClient.Get("fql",
               new { q = "SELECT message_id, author_id, viewer_id, body, created_time FROM message WHERE thread_id IN (SELECT thread_id FROM thread WHERE folder_id = 0) AND created_time >= " + timestamp.ToString() });
            objFacebookMessageList = new List<Model.FacebookUserMessageInfo>();
            if (result != null)
            {
                Model.FacebookUserMessageInfo objFacebookMessage = null;
                var values = result.Values;
                var TotalResult = (((System.Collections.Generic.Dictionary<string, object>.ValueCollection)values).ToList()[0]);
                var TotalMessagesData = (JsonArray)TotalResult;
                if (TotalMessagesData != null)
                {
                    foreach (var Messages in TotalMessagesData)
                    {
                        /*author_id =   The ID of the user who wrote this message.*/
                        /*viewer_id =   The ID of the user whose Inbox you are querying*/
                        objFacebookMessage = new Model.FacebookUserMessageInfo();
                        objFacebookMessage.MessageText = (((JsonObject)Messages)["body"]).ToString();
                        long author_id = Convert.ToInt64(((JsonObject)Messages)["author_id"]);
                        long viewer_id = Convert.ToInt64(((JsonObject)Messages)["viewer_id"]);
                        if (author_id == viewer_id)
                        {
                            objFacebookMessage.MessageType = Core.Enum.FacebookMessageType.Sent.ToString();
                        }
                        else
                        {
                            objFacebookMessage.MessageType = Core.Enum.FacebookMessageType.Receive.ToString();

                        }
                        objFacebookMessage.ActionUserID = author_id;
                        objFacebookMessage.FacebookUserId = FacebookUserId;
                        var MessageSecond = (((JsonObject)Messages)["created_time"]).ToString();
                        var dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
                        objFacebookMessage.CreatedDate = dateTime.AddSeconds(double.Parse(MessageSecond));
                        objFacebookMessageList.Add(objFacebookMessage);
                    }
                }

            }
            if (objFacebookMessageList.Count > 0)
            {
                objFacebookMessageList = objFacebookMessageList.Where(fm => fm.CreatedDate >= LastProcessedDate && fm.CreatedDate <= CurrentDate).ToList();

                objFacebookMessageList.ForEach(item =>
                {
                    var Auther = objFacebookClient.Get("https://graph.facebook.com/" + item.ActionUserID.ToString());
                    if (Auther != null)
                    {
                        item.ActionUserName = ((JsonObject)Auther)["name"].ToString();
                    }
                    else
                    {
                        item.ActionUserName = null;
                    }
                });

            }
            return objFacebookMessageList;



        }
        catch (Exception ex)
        {

            throw new Exception(ex.Message);
        }

    }

    #endregion
}
于 2012-10-04T15:30:47.667 に答える
0

私があなたが望むものを理解しているなら、答えは次のとおりです。

クラスFacebookMes​​sageを作成する必要があります:

class FacebookMessage
{
    public int SenderID { get; set; }
    public int AddresseeID { get; set; }
    public string SenderName { get; set; }
    public string AddresseeName { get; set; }
    public string Message { get; set; }

    public DateTime CreateDate { get; set; }

    public FacebookMessage()
    {
        SenderID = 0;
        AddresseeID = 0;
        SenderName = "";
        AddresseeName = "";
        Message = "";
    }
}

そしてこのFQLを使用してください:

dynamic result = objFacebookClient.Get("fql",
   new { q = "SELECT body, author_id, viewer_id, created_time FROM message WHERE thread_id IN (SELECT thread_id FROM thread WHERE folder_id = 0)" });

この情報を取得してFacebookMes ​​sageに保存した後、メッセージごとに別のクエリを実行します。

    FacebookMessage faceMsg = null;
    var values = result.Values;
    var TotalResult = (((System.Collections.Generic.Dictionary<string, object>.ValueCollection)values).ToList()[0]);
    var TotalMessagesData = (JsonArray)TotalResult;
    if (TotalMessagesData != null)
    {
        foreach (var Messages in TotalMessagesData)
        {
            faceMsg= new FacebookMessage();
            faceMsg.Message = (((JsonObject)Messages)["body"]).ToString();
            faceMsg.SenderID = Convert.ToInt64(((JsonObject)Messages)["author_id"]);
            faceMsg.AddresseeID = Convert.ToInt64(((JsonObject)Messages)["viewer_id"]);
            var MessageSecond = (((JsonObject)Messages)["created_time"]).ToString();
            var dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
            faceMsg.CreatedDate = dateTime.AddSeconds(double.Parse(MessageSecond));

            result = objFacebookClient.Get("fql",
   new { q = "SELECT name FROM user WHERE uid = " + faceMsg.SenderID });

            var values = result.Values;
            faceMsg.SenderName = values.name; // Not tested, but should be something like that.

            result = objFacebookClient.Get("fql",
   new { q = "SELECT name FROM user WHERE uid = " + faceMsg.AddresseeID });

            var values = result.Values;
            faceMsg.AddresseeName= values.name; // Not tested, but should be something like that.

            faceMsgList.Add(objFacebookMessage);
        }
    }

名前を取得するクエリを異なるメソッドに分割することをお勧めします。

于 2012-08-31T22:19:00.857 に答える