.NET:无法使用cookie模拟正确的Facebook HTTP请求

本文关键字:Facebook 请求 HTTP 模拟 cookie NET | 更新日期: 2023-09-27 18:36:20

我正在尝试通过 facebook.com/ajax/mercury/thread_info.php 下载聊天消息,其中包含所需的所有cookie和POST数据。(这是当您在PC上单击"加载旧消息"时提供消息的原因)

在 C#.NET 中,我使用 WebClient 来执行请求。

我从Chrome的应用程序数据中提取我的cookie,所以每个与Facebook相关的cookie都在请求中,我也手动检查了它。我从请求中硬编码了 POST 数据,因为我还没有弄清楚它来自哪里,但这不是我的问题。

我的问题是Facebook的回应是我没有登录。所以我想 cookie(或其他标题)有问题,但我绝对不知道为什么。或者网络客户端没有按照我想要的方式工作?

我只是不明白,当我复制确切的请求时,可能有什么问题。在测试时,我也在Chrome中打开了Facebook聊天。我错过了什么?

以下是我设置标头(稍后的cookie)的方法:

var cli = new WebClient();
cli.Headers.Add("accept", "*/*");
cli.Headers.Add("accept-encoding", "utf-8");
cli.Headers.Add("accept-language", "hu-HU,hu;q=0.8,en-US;q=0.6,en;q=0.4");
cli.Headers.Add("content-type", "application/x-www-form-urlencoded");
cli.Headers.Add("cookie", "");
cli.Headers.Add("origin", "https://www.facebook.com");
cli.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36");
cli.Headers.Add("x-msgr-region", "LLA");

饼干:

string cookiesStr = "";
while (cookiesQuery.Read()) {
    // ... SQLite stuff ...
    // the query is:
    // SELECT name, value, encrypted_value FROM cookies WHERE host_key LIKE "%facebook%"
    cookiesStr += name + "=" + WebUtility.UrlEncode(value) + "; ";
}
cli.Headers.Set("cookie", cookiesStr.Substring(0, cookiesStr.Length - 2));

据我所知,这非常有效,因此它获取饼干并将它们放入字符串中。我检查了一下,Chrome 在请求thread_info.php时发送的每个 cookie 都在字符串中。

发布:

NameValueCollection post = new NameValueCollection();
post.Add("messages[user_ids][...][offset]", "500");
post.Add("messages[user_ids][...][timestamp]", "...");
post.Add("messages[user_ids][...][limit]", "500");
post.Add("client", "web_messenger");
post.Add("__user", "...");
post.Add("__a", "1");
post.Add("__dyn", "...");
post.Add("__req", "ms");
post.Add("fb_dtsg", "...");
post.Add("ttstamp", "...");
post.Add("__rev", "...");

和请求:

byte[] r = cli.UploadValues("https://www.facebook.com/ajax/mercury/thread_info.php?__pc=EXP1%3ADEFAULT", "POST", post);

它说我没有登录。但是Facebook,我就是我,我有cookie,我有你需要的所有数据,你为什么不相信我?

谢谢你帮助我!

.NET:无法使用cookie模拟正确的Facebook HTTP请求

正如 Igy 所说,当您尝试下载聊天消息时,您需要一个访问令牌。为 Facebook 创建一个开发者帐户,以开发应用并获取应用 ID。使用应用 ID 获取访问令牌,请求扩展权限"read_page_mailboxes"。前往面向开发者的 Facebook 网站创建应用:https://developers.facebook.com/apps。

我注意到您尝试使用 url 端点"thread_info.php"获取收件箱聊天消息。这用于使用线程 ID 获取特定会话中的所有消息(格式示例 t_id.0000000.0000000)。为了获取所有聊天收件箱消息 - 意味着每个对话中包含所有消息的所有对话 - 您需要调用以下 url 端点:"threadlist_info.php?__pc=EXP1%3ADEFAULT&dpr=1"。

我用

        public string GetThread(string thread_fbid, long start, long end=0) 
    {
        //https://www.facebook.com/ajax/mercury/thread_info.php?dpr=1
        //messages[user_ids][EXAMPLE][limit]=300&__user=EXAMPLE&__a=1&fb_dtsg=EXAMPLE
        if (end == 0) { end = start + 20; }
        if (end <= start) { end = start + end; }
        Dictionary<string, string> data = new Dictionary<string, string>();
        data["messages[user_ids][" + thread_fbid + "][limit]"] = end.ToString();
        data["__user"] = c_user;
        data["__a"] = "1";
        data["fb_dtsg"] = fb_dtsg.Replace(":", "%3A");
        var resp = p.POST("https://www.facebook.com/ajax/mercury/thread_info.php?dpr=1", data, UA, BaseURL);
        var str = new StreamReader(resp.GetResponseStream()).ReadToEnd();
        return str;
    }

当然,您必须声明c_userfb_dtsg,您可以在登录部分获得。p是我做帖子和gets的类,你可以使用HttpWebRequest,UA是可以提供的用户代理,使用BaseURL,我为引用提供URL "http://www.faceook.com/"