嗨,我不能在C#中使用Rest Api向Twitter发布直接消息,请帮助我... [英] Hi I Am Not Able To Post Direct Message To Twitter Using Rest Api In C#, Please Help Me Out..

查看:77
本文介绍了嗨,我不能在C#中使用Rest Api向Twitter发布直接消息,请帮助我...的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  //   aouth  

var oauth_token = XXXX; // user
var oauth_token_secret = XXXX;
var oauth_consumer_key = XXXX; // 这是我的应用
var oauth_consumer_secret = XXXX;

// 请求详细信息

var oauth_version = 1.0;
var oauth_signature_method = HMAC-SHA1 ;
var oauth_nonce = Convert.ToBase64String( new ASCIIEncoding()。GetBytes(DateTime.Now。 Ticks.ToString()));
var timeSpan = DateTime.UtcNow - new DateTime( 1970 1 1 0 0 0 0 ,DateTimeKind.Utc);
var oauth_timestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString();
// var resource_url =https://api.twitter.com/1.1/statuses/update。 json;
var resource_url = https://api.twitter.com/1.1/direct_messages/new.json;
var text = 测试消息< /跨度>;
var screen_name = screenname;

// 加密oAuth签名

< span class =code-keyword> var
baseFormat = oauth_consumer_key = {0}& oauth_nonce = {1}& oauth_signature_method = {2} +
& oauth_timestamp = { 3}&安培;组oauth_token = {4}&安培; oauth_version = {5}&安培; SCREEN_NAME = {6}&安培;状态= {7};
// & screen_name = {7}& status = {6}
var baseString = string .Format(baseFormat,
oauth_consumer_key,
oauth_nonce ,
oauth_signature_method,
oauth_timestamp,
oauth_token,
oauth_version,
Uri.EscapeDataString(screen_name),
Uri.EscapeDataString(text)
);

baseString = string .Concat( POST&,Uri.EscapeDataString(resource_url),
& ,Uri.EscapeDataString(baseString));

// 加密数据

var compositeKey = string .Concat(Uri.EscapeDataString(oauth_consumer_secret),
&,Uri.EscapeDataString(oauth_token_secret));

string oauth_signature;
使用(HMACSHA1 hasher = new HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey)))
{
oauth_signature = Convert.ToBase64String(
hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString)));
}

// 完成Auth标头

var headerFormat = OAuth oauth_nonce = \\ \\{0} \,oauth_signature_method = \{1} \, +
oauth_timestamp = \{2} \,oauth_consumer_key = \{3} \, +
oauth_token = \{4} \,oauth_signature = \{5} \, +
< span class =code-string>
oauth_version = \{6} \;

var authHeader = string .Format(headerFormat,
Uri .EscapeDataString(oauth_nonce),
Uri.EscapeDataString(oauth_signature_method),
Uri.EscapeDataString(oauth_timestamp),
Uri.EscapeDataString(oauth_consumer_key),
Uri.EscapeDataString(oauth_token),
Uri.EscapeDataString(oauth_signature),
Uri.EscapeDataString(oauth_version)
);

// 禁用exptend 100 continue header

var postBody = text = + Uri.EscapeDataString(text);

ServicePointManager.Expect100Continue = false ;

HttpWebRequest request =(HttpWebRequest)WebRequest.Create(resource_url);
request.Headers.Add( 授权,authHeader);
request.Method = POST;
request.ContentType = application / x-www-form-urlencoded;
使用(Stream stream = request.GetRequestStream())
{
byte [] content = ASCIIEncoding.ASCII.GetBytes(postBody);
stream.Write(content, 0 ,content.Length);
}
尝试
{
WebResponse response = request.GetResponse();
ViewBag.Message = response.ToString();
}
catch (WebException e)
{
ViewBag.Message = e.Status;
}
return 查看();
}

public ActionResult关于()
{
ViewBag.Message = 您的应用程序描述页面。;

return 查看();
}

public ActionResult联系人()
{
ViewBag.Message = 您的联系页面。;
}

解决方案

请尝试以下方式:

1)使用text代替状态发送消息

& text = {7} 



2)在postBody中添加screen_name。

 var postBody =text =+ Uri.EscapeDataString(text)+& screen_name =+ Uri.EscapeDataString(screen_name); 





这将解决问题。如果您得到解决方案,请发布。谢谢!

//aouth

            var oauth_token = "XXXX";  //user
            var oauth_token_secret = "XXXX";
            var oauth_consumer_key = "XXXX";  //this is my app
            var oauth_consumer_secret = "XXXX";

            //Request details

            var oauth_version = "1.0";
            var oauth_signature_method = "HMAC-SHA1";
            var oauth_nonce = Convert.ToBase64String(new ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()));
            var timeSpan = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
            var oauth_timestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString();
           // var resource_url = "https://api.twitter.com/1.1/statuses/update.json";
            var resource_url = "https://api.twitter.com/1.1/direct_messages/new.json";
            var text = "test message";
            var screen_name = "screenname";

            //encrypted oAuth signature

            var baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" +
                "&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&screen_name={6}&status={7}";
            //&screen_name={7} &status={6}
            var baseString = string.Format(baseFormat,
                                        oauth_consumer_key,
                                        oauth_nonce,
                                        oauth_signature_method,
                                        oauth_timestamp,
                                        oauth_token,
                                        oauth_version,
                                        Uri.EscapeDataString(screen_name),
                                        Uri.EscapeDataString(text)
                                        );

            baseString = string.Concat("POST&", Uri.EscapeDataString(resource_url),
                         "&", Uri.EscapeDataString(baseString));

            //Encrypt data

            var compositeKey = string.Concat(Uri.EscapeDataString(oauth_consumer_secret),
                        "&", Uri.EscapeDataString(oauth_token_secret));

            string oauth_signature;
            using (HMACSHA1 hasher = new HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey)))
            {
                oauth_signature = Convert.ToBase64String(
                    hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString)));
            }

            //Finish Auth header

            var headerFormat = "OAuth oauth_nonce=\"{0}\", oauth_signature_method=\"{1}\", " +
                   "oauth_timestamp=\"{2}\", oauth_consumer_key=\"{3}\", " +
                   "oauth_token=\"{4}\", oauth_signature=\"{5}\", " +
                   "oauth_version=\"{6}\"";

            var authHeader = string.Format(headerFormat,
                                    Uri.EscapeDataString(oauth_nonce),
                                    Uri.EscapeDataString(oauth_signature_method),
                                    Uri.EscapeDataString(oauth_timestamp),
                                    Uri.EscapeDataString(oauth_consumer_key),
                                    Uri.EscapeDataString(oauth_token),
                                    Uri.EscapeDataString(oauth_signature),
                                    Uri.EscapeDataString(oauth_version)
                            );

            //Disable exprect 100 continue header

            var postBody = "text=" + Uri.EscapeDataString(text);

            ServicePointManager.Expect100Continue = false;

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(resource_url);
            request.Headers.Add("Authorization", authHeader);
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            using (Stream stream = request.GetRequestStream())
            {
                byte[] content = ASCIIEncoding.ASCII.GetBytes(postBody);
                stream.Write(content, 0, content.Length);
            }
            try
            {
                WebResponse response = request.GetResponse();
                ViewBag.Message = response.ToString();
            }
            catch (WebException e)
            {
                ViewBag.Message = e.Status;
            }
            return View();
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";
        }

解决方案

Please try bellow :
1) Use "text" instead of "status" to send message

&text={7}


2) Add "screen_name" in postBody.

var postBody = "text=" + Uri.EscapeDataString(text) + "&screen_name=" + Uri.EscapeDataString(screen_name);



This will solve the problem. If you get solution please post it. Thanks!


这篇关于嗨,我不能在C#中使用Rest Api向Twitter发布直接消息,请帮助我...的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆