0

我想在 Twitter 上的特定时间范围内安排我的帖子。我的网络应用程序经过了正确的身份验证,我有用户访问令牌和用户访问密码,并且我有 ads-api 的权限。但是当我在广告 api 上发布我的调用时,这里的链接(POST https://ads-api.twitter.com/9/accounts/myaccountid/scheduled_tweets?as_user_id=myuserid&scheduled_at=2018-01-01)它给了我 401 未经授权的错误。我的 oauth 标头很好,包括 oauth_nonce、oauth_signature、oauth_signature_method、oauth_token 等。任何人都可以帮助我解决这个问题……提前谢谢

公共异步任务<ActionResult<OutputWarapper>> SchuduleTweetUsingTwitterAPI

([FromForm] 字符串 PostTweetmessage,[FromForm] 字符串 AccessToken,[FromForm] 字符串 AccessTokenSecret,[FromForm] 字符串用户 ID,[FromForm] 字符串 schedat)

{

try                
{
    string twitterURL = "https://ads-api.twitter.com/9/accounts/18ce55fhpx3/scheduled_tweets";
    string oauth_consumer_key = TweetConsumerKey;
    string oauth_consumer_secret = TweetConsumerSecret;

    // set the oauth version and signature method
    string oauth_version = "1.0";
    string oauth_signature_method = "HMAC-SHA1";

    // create unique request details
    string oauth_nonce = Convert.ToBase64String(new ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()));
    System.TimeSpan timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc));
    string oauth_timestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString();

    // create oauth signature
    string baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" + "&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&as_user_id={6}&text={7}&scheduled_at={8}";

    string baseString = string.Format(
        baseFormat,
        oauth_consumer_key,
        oauth_nonce,
        oauth_signature_method,
        oauth_timestamp,
        AccessToken,
        oauth_version,                
        Uri.EscapeDataString(userid),
        Uri.EscapeDataString(PostTweetmessage),
        Uri.EscapeDataString(schedat)
        
        
    );

    string oauth_signature = null;
    using (HMACSHA1 hasher = new HMACSHA1(ASCIIEncoding.ASCII.GetBytes(Uri.EscapeDataString(oauth_consumer_secret) + "&" + Uri.EscapeDataString(AccessTokenSecret))))
    {
        oauth_signature = Convert.ToBase64String(hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes("POST&" + Uri.EscapeDataString(twitterURL) + "&" + Uri.EscapeDataString(baseString))));
    }

    // create the request header
    string authorizationFormat = "OAuth oauth_consumer_key=\"{0}\", oauth_nonce=\"{1}\", " + "oauth_signature=\"{2}\", oauth_signature_method=\"{3}\", " + "oauth_timestamp=\"{4}\", oauth_token=\"{5}\", " + "oauth_version=\"{6}\"";

    string authorizationHeader = string.Format(
        authorizationFormat,
        Uri.EscapeDataString(oauth_consumer_key),
        Uri.EscapeDataString(oauth_nonce),
        Uri.EscapeDataString(oauth_signature),
        Uri.EscapeDataString(oauth_signature_method),
        Uri.EscapeDataString(oauth_timestamp),
        Uri.EscapeDataString(AccessToken),
        Uri.EscapeDataString(oauth_version)
    );
    HttpWebRequest objHttpWebRequest = (HttpWebRequest)WebRequest.Create(twitterURL);
    objHttpWebRequest.Headers.Add("Authorization", authorizationHeader);
    objHttpWebRequest.Method = "POST";
    objHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
    using (Stream objStream = objHttpWebRequest.GetRequestStream())
    {
        byte[] content = ASCIIEncoding.ASCII.GetBytes(  "as_user_id=" + Uri.EscapeDataString(userid) + "&" + "text=" + Uri.EscapeDataString(PostTweetmessage) + "&" + "scheduled_at=" + Uri.EscapeDataString(schedat));
        objStream.Write(content, 0, content.Length);
    }

    var responseResult = "";

    try
    {
        //success posting
        WebResponse objWebResponse = objHttpWebRequest.GetResponse();
        StreamReader objStreamReader = new StreamReader(objWebResponse.GetResponseStream());
        responseResult = objStreamReader.ReadToEnd().ToString();
    }
    catch (Exception ex)
    {
        responseResult = "Twitter Post Error: " + ex.Message.ToString() + ", authHeader: " + authorizationHeader;
    }
}
catch (Exception ex)
{
    ex.Message.ToString();
}
return Ok("success");

}

4

0 回答 0