Developed a routine to post tweets in vb.net. worked for past two years. about a month or two ago, it started to return 403 forbidden status is duplicate errors. I haven’t changed my code. The tweets are definitely no duplicate tweets. even testing with posting random characters, returns the 403.
any idea? here’s code:
Imports System.Text
Imports System.Security.Cryptography
Public Class tweetSPY
Public Const cnsAPIMethodP As String = "POST"
Public Const cnsAPIMethodG As String = "GET"
Public Shared Function UrlEncode(str As String)
Dim objEnc As MSScriptControl.ScriptControl
objEnc = New MSScriptControl.ScriptControl
objEnc.Language = "JScript"
objEnc.AddCode("function encode(str) {return encodeURIComponent(str);}")
Dim encoded As String
encoded = objEnc.Run("encode", str)
UrlEncode = encoded
End Function
Public Shared Function send_tweet(strStatus As String) As Boolean
Dim boolResult As Boolean = False
Dim oauth_consumer_key As String = "xxxxxxxxxxxxxxxxx"
Dim oauth_consumer_secret As String = "xxxxxxxxxxxxxxxxx"
Dim oauth_token As String = "xxxxxxxxxxxxxxxxx"
Dim oauth_token_secret As String = "xxxxxxxxxxxxxxxxx"
Dim oauth_version = "1.0"
Dim oauth_signature_method = "HMAC-SHA1"
Dim oauth_nonce = Convert.ToBase64String(New ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()))
Dim timeSpan = DateTime.UtcNow - New DateTime(1970, 1, 1, 0, 0, 0, _
0, DateTimeKind.Utc)
Dim oauth_timestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString()
Dim resource_url = "https://api.twitter.com/1.1/statuses/update.json"
' Dim status = post
Dim baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" & "&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&status={6}"
Dim baseString = String.Format(baseFormat, oauth_consumer_key, oauth_nonce, oauth_signature_method, oauth_timestamp, oauth_token, _
oauth_version, Uri.EscapeDataString(strStatus))
baseString = String.Concat("POST&", Uri.EscapeDataString(resource_url), "&", Uri.EscapeDataString(baseString))
Dim compositeKey = String.Concat(Uri.EscapeDataString(oauth_consumer_secret), "&", Uri.EscapeDataString(oauth_token_secret))
Dim oauth_signature As String
Dim objHasher As HMACSHA1 = New HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey))
oauth_signature = Convert.ToBase64String(objHasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString)))
Dim 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}"""
Dim 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)
)
'Dim postBody = "status=" + Uri.EscapeDataString(status)
strStatus = UrlEncode(strStatus)
Dim objRest As WinHttp.WinHttpRequest
objRest = New WinHttp.WinHttpRequest
objRest.Open(cnsAPIMethodP, resource_url, False)
objRest.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
objRest.SetRequestHeader("Authorization", authHeader)
objRest.Send("status=" & strStatus)
objRest.WaitForResponse()
'Following are useful for debugging/comparing with Twitter OAuth tool; uncomment as needed/desired
'Debug.Print("BASE: " & strBase)
'Debug.Print(" SIG: " & strOauthSig)
'Debug.Print("HEAD:" & strHeader)
Debug.Print(objRest.Status & " -- " & objRest.StatusText & " -- " & objRest.ResponseText)
'MsgBox(strBase)
'MsgBox(strOauthSig)
'MsgBox(strHeader)
MsgBox(objRest.Status & " -- " & objRest.StatusText & " -- " & objRest.ResponseText)
If objRest.Status = "200" Then
boolResult = True
Else
send_tweet = False
End If
objRest = Nothing
send_tweet = True
End Function
End Class