C# .NET:Can';t使用cookies模拟正确的Facebook HTTP请求

C# .NET:Can';t使用cookies模拟正确的Facebook HTTP请求,c#,.net,facebook,cookies,httprequest,C#,.net,Facebook,Cookies,Httprequest,我正在尝试通过facebook.com/ajax/mercury/thread_info.php下载聊天信息,以及它需要的所有cookie和POST数据。(这是您在PC上单击“加载旧邮件”时提供的信息) byte[] r = cli.UploadValues("https://www.facebook.com/ajax/mercury/thread_info.php?__pc=EXP1%3ADEFAULT", "POST", post); 在C#NET中,我使用来执行请求 byte[] r =

我正在尝试通过facebook.com/ajax/mercury/thread_info.php下载聊天信息,以及它需要的所有cookie和POST数据。(这是您在PC上单击“加载旧邮件”时提供的信息)

byte[] r = cli.UploadValues("https://www.facebook.com/ajax/mercury/thread_info.php?__pc=EXP1%3ADEFAULT", "POST", post);
在C#NET中,我使用来执行请求

byte[] r = cli.UploadValues("https://www.facebook.com/ajax/mercury/thread_info.php?__pc=EXP1%3ADEFAULT", "POST", post);
我从Chrome的appdata中提取cookie,因此每个与Facebook相关的cookie都在请求中,我还手动检查了它。我硬编码了请求中的POST数据,因为我还没有弄清楚它来自哪里,但这不是我的问题

byte[] r = cli.UploadValues("https://www.facebook.com/ajax/mercury/thread_info.php?__pc=EXP1%3ADEFAULT", "POST", post);
我的问题是Facebook的回复是我没有登录。所以我猜cookies(或其他标题)有问题,但我完全不知道为什么。或者WebClient没有按照我希望的方式工作

byte[] r = cli.UploadValues("https://www.facebook.com/ajax/mercury/thread_info.php?__pc=EXP1%3ADEFAULT", "POST", post);
我只是不明白,当我复制确切的请求时,会出现什么问题。测试时,我也在Chrome上打开了Facebook聊天。我错过了什么

byte[] r = cli.UploadValues("https://www.facebook.com/ajax/mercury/thread_info.php?__pc=EXP1%3ADEFAULT", "POST", post);
下面是我如何设置标题(稍后是cookies):

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

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));
byte[] r = cli.UploadValues("https://www.facebook.com/ajax/mercury/thread_info.php?__pc=EXP1%3ADEFAULT", "POST", post);
据我所知,这是完美的,所以它得到了饼干,并把它们放在字符串中。我检查了一下,Chrome在请求thread_info.php时发送的每个cookie都在字符串中

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

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

byte[] r = cli.UploadValues("https://www.facebook.com/ajax/mercury/thread_info.php?__pc=EXP1%3ADEFAULT", "POST", post);
上面说我没有登录。但是Facebook,我就是我,我有cookies,我有你需要的所有数据,你为什么不相信我

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

谢谢你帮助我

正如Igy所说,当你试图下载聊天信息时,你需要一个访问令牌。为facebook创建开发者帐户以开发应用程序并获取应用程序id。使用应用程序id获取访问令牌,请求扩展权限“读取页面邮箱”。转到Facebook for developers网站创建应用程序:

byte[] r = cli.UploadValues("https://www.facebook.com/ajax/mercury/thread_info.php?__pc=EXP1%3ADEFAULT", "POST", post);
我注意到您试图使用url端点“thread_info.php”获取收件箱聊天信息。这用于使用线程id(格式示例t_id.0000000.0000000)获取特定会话中的所有消息。要获取所有聊天收件箱消息(即每次会话中包含所有消息的所有会话),您需要调用以下url端点:“threadlist\u info.php?\u pc=EXP1%3ADEFAULT&dpr=1”。

byte[] r = cli.UploadValues("https://www.facebook.com/ajax/mercury/thread_info.php?__pc=EXP1%3ADEFAULT", "POST", post);
        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;
    }
publicstringgetthread(stringthread\u fbid,long start,long end=0)
{
//https://www.facebook.com/ajax/mercury/thread_info.php?dpr=1
//消息[user\u id][EXAMPLE][limit]=300&\u user=EXAMPLE&\u a=1&fb\u dtsg=EXAMPLE
如果(end==0){end=start+20;}

如果(结束)Facebook的服务器知道你在试图抓取,并且你的请求被识别为不是真正的用户浏览器会话?