Skip to content

Instantly share code, notes, and snippets.

@kubrick06010
Created September 20, 2012 20:00
Show Gist options
  • Select an option

  • Save kubrick06010/3758008 to your computer and use it in GitHub Desktop.

Select an option

Save kubrick06010/3758008 to your computer and use it in GitHub Desktop.
twitter for windows cmd
<job>
<script language="vbscript">
' Twitter bot with OAuth in WSH
' for Windows and windows scripting host
' tweets with OAuth
'
' All thanks to: http://scottdesapio.com/VBScriptOAuth/ and http://classicaspreference.com/aspexamples/classic_asp_for_twitter_desapio.asp
' pasted together by piskec, 2010, http://www.krtina.com/blog
' ********************************
' USAGE:
' TweetWSH.wsf <message to tweet>
'
' CONFIGURATION:
' Go to:
' http://dev.twitter.com/apps/New
' Log in with the twitter account that you intend to have send the tweets.
' Enter the application name and details
' Set
' Application Type to "Client"
' Default Access Type to "Read & Write"
' Click "Save Application"
' Copy your
' Consumer key (same as API key)
' Consumer secret
' Click "My Access Token" button
' Copy your
' Access Token (oauth_token)
' Access Token Secret (oauth_token_secret)
' *** CHANGE BELOW
Const TWITTER_SCREEN_NAME = ""
Const myConsumerKey = ""
Const myConsumerSecret = ""
Const myAccessToken = ""
Const myAccessSecret = ""
Const myDebug = false
'*******************************************************************************
' *** CHANGE NOTHING!
Const TWITTER_OAUTH_URL_ACCESS = "http://twitter.com/oauth/access_token"
Const TWITTER_OAUTH_URL_AUTHENTICATE = "http://twitter.com/oauth/authenticate"
Const TWITTER_OAUTH_URL_REQUEST_TOKEN = "http://twitter.com/oauth/request_token"
Const TWITTER_OAUTH_URL_UPDATE_STATUS = "http://twitter.com/statuses/update.json"
'******************************************************************************
' ERROR CODE CONSTANTS (do NOT change)
'******************************************************************************
Const OAUTH_ERROR_TIMEOUT = "-2147012894"
'******************************************************************************
' TIMEOUT CONSTANTS (change to suite)
'******************************************************************************
Const OAUTH_TIMEOUT_RESOLVE = 2500
Const OAUTH_TIMEOUT_CONNECT = 10000
Const OAUTH_TIMEOUT_SEND = 10000
Const OAUTH_TIMEOUT_RECEIVE = 10000
'******************************************************************************
' PARAM CONSTANTS (do NOT change)
'******************************************************************************
Const OAUTH_TOKEN_REQUEST = "oauth_token_request"
Const OAUTH_TOKEN = "oauth_token"
Const OAUTH_TOKEN_SECRET = "oauth_token_secret"
Const OAUTH_VERIFIER = "oauth_verifier"
'******************************************************************************
' MISC CONSTANTS (do NOT change)
'******************************************************************************
Const OAUTH_UNRESERVED = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~"
Const OAUTH_REQUEST_METHOD_GET = "GET"
Const OAUTH_REQUEST_METHOD_POST = "POST"
Const OAUTH_SIGNATURE_METHOD = "HMAC-SHA1"
Const OAUTH_VERSION = "1.0" 'editable?
'*?*?
'******************************************************************************
' CLASS: cLibOAuth
' PURPOSE:
'
' AUTHOR: sdesapio DATE: 04.04.10 LAST MODIFIED: 04.04.10
'******************************************************************************
Class cLibOAuth
'**************************************************************************
'***'PRIVATE CLASS MEMBERS
'**************************************************************************
' boolean indicating the users current logged in state. This state
' variable is EXCLUSIVE to the session state of the local application
' and NOT the oAuth provider's logged in state.
Private m_blnLoggedIn
' additional parameters exclusive to the current call
Private m_objParameters
' reference to the utilities class (Eccoding, response extraction,
' dictionary sorting, etc.)
Private m_objUtils
' reference to the consumer key acquired after registering with the
' oAuth service provider
Private m_strConsumerKey
' reference to the consumer secret acquired after registering with the
' oAuth service provider
Private m_strConsumerSecret
' the request URL
Private m_strEndPoint
' used to globally identify process errors
Private m_strErrorCode
' the request type - e.g. POST, GET
Private m_strRequestMethod
' the response string returned by the service provider
Private m_strResponseText
' where to forward the user if call to oAuth provider times out.
' Absolute URL is recommended
Private m_strTimeoutURL
'**************************************************************************
'***'CLASS_INITIALIZE / CLASS_TERMINATE
'**************************************************************************
Private Sub Class_Initialize()
' set default value to Null se we can check for null before get/set
m_blnLoggedIn = Null
' set default value to Nothing so we can check "If ... Is Nothing"
Set m_objParameters = Nothing
' instantiate the Utils class
Set m_objUtils = New cLibOAuthUtils
' set default to Null to ensure we're returning a verifiable value
m_strErrorCode = Null
' set default to POST
m_strRequestMethod = OAUTH_REQUEST_METHOD_POST
End Sub
Private Sub Class_Terminate()
' kill obj erfs
Set m_objUtils = Nothing
Set m_objParameters = Nothing
End Sub
'**************************************************************************
'***'PUBLIC PROPERTIES
'**************************************************************************
Public Property Let ConsumerKey(pData)
m_strConsumerKey = pData
End Property
Public Property Let ConsumerSecret(pData)
m_strConsumerSecret = pData
End Property
Public Property Let EndPoint(pData)
m_strEndPoint = pData
End Property
Public Property Get ErrorCode
ErrorCode = m_strErrorCode
End Property
Public Property Get LoggedIn
If IsNull(m_blnLoggedIn) Then
Call Get_LoggedIn()
End If
LoggedIn = m_blnLoggedIn
End Property
Public Property Get Parameters
If m_objParameters Is Nothing Then
Set m_objParameters = Wscript.CreateObject("Scripting.Dictionary")
End If
Set Parameters = m_objParameters
End Property
Public Property Let RequestMethod(pData)
m_strRequestMethod = pData
End Property
Public Property Get ResponseText
ResponseText = m_strResponseText
End Property
Public Property Let TimeoutURL(pData)
m_strTimeoutURL = pData
End Property
'**************************************************************************
'***'PUBLIC FUNCTIONS
'**************************************************************************
'**************************************************************************
' SUB: Send()
' PARAMETERS:
' PURPOSE:
'
' AUTHOR: sdesapio DATE: 04.04.10 LAST MODIFIED:
'**************************************************************************
Public Sub Send()
' build Request URL
Dim strRequestURL : strRequestURL = Get_RequestURL()
' make the call
On Error Resume Next
Dim objXMLHTTP : Set objXMLHTTP = Wscript.CreateObject("Msxml2.ServerXMLHTTP.6.0")
objXMLHTTP.setTimeouts OAUTH_TIMEOUT_RESOLVE, OAUTH_TIMEOUT_CONNECT, OAUTH_TIMEOUT_SEND, OAUTH_TIMEOUT_RECEIVE
objXMLHTTP.Open m_strRequestMethod, strRequestURL, False
objXMLHTTP.SetRequestHeader "Content-Type","application/x-www-form-urlencoded"
objXMLHTTP.Send()
' check for errors
If Err.Number <> 0 Then
Select Case CStr(Err.Number)
Case CStr(OAUTH_ERROR_TIMEOUT)
Response.Redirect m_strTimeoutURL
Response.End
Case Else
m_strErrorCode = Err.Number
End Select
IF myDebug Then MsgBox "#2 Error sending " & Err.Description
Else
m_strResponseText = objXMLHTTP.ResponseText
IF myDebug Then MsgBox "#1 Sent it"
End If
Set objXMLHTTP = Nothing
On Error Goto 0
End Sub
'**************************************************************************
' FUNCTION: Get_ResponseValue()
' PARAMETERS: strParamName
' PURPOSE: Returns a value ripped from service provider response
'
' AUTHOR: sdesapio DATE: 04.04.10 LAST MODIFIED: 04.04.10
'**************************************************************************
Public Function Get_ResponseValue(strParamName)
Get_ResponseValue = m_objUtils.Get_ResponseValue(m_strResponseText, strParamName)
End Function
'**************************************************************************
'***'PRIVATE FUNCTIONS
'**************************************************************************
'**************************************************************************
' SUB: Get_LoggedIn
' PARAMETERS:
' PURPOSE:
'
' AUTHOR: sjd DATE: LAST MODIFIED:
'**************************************************************************
Private Sub Get_LoggedIn()
On Error Resume Next
'If Session(OAUTH_TOKEN) <> "" And Session(OAUTH_TOKEN_SECRET) <> "" Then
' m_blnLoggedIn = True
'Else
' m_blnLoggedIn = False
'End If
If Err.Number <> 0 Then
m_blnLoggedIn = Null
End If
On Error Goto 0
End Sub
'**************************************************************************
' FUNCTION: Get_RequestURL
' PARAMETERS:
' PURPOSE:
'
' AUTHOR: sjd DATE: LAST MODIFIED:
'**************************************************************************
Private Function Get_Parameters()
Dim objQS : Set objQS = New cLibOAuthQS
' add proprieatary param set
If Not m_objParameters Is Nothing Then
Dim Item : For Each Item In m_objParameters
objQS.Add Item, m_objParameters.Item(Item)
Next
End If
' add required standard param set
objQS.Add "oauth_consumer_key", m_strConsumerKey
objQS.Add "oauth_nonce", m_objUtils.Nonce
objQS.Add "oauth_signature_method", OAUTH_SIGNATURE_METHOD
objQS.Add "oauth_timestamp", m_objUtils.TimeStamp
objQS.Add "oauth_version", OAUTH_VERSION
Get_Parameters = objQS.Get_Parameters()
Set objQS = Nothing
End Function
'**************************************************************************
' FUNCTION: Get_RequestURL
' PARAMETERS: strParameters
' PURPOSE: Returns a fully formatted request URL
'
' AUTHOR: sjd DATE: LAST MODIFIED:
'**************************************************************************
Private Function Get_RequestURL()
Dim strParameters : strParameters = Get_Parameters()
Dim objRequestURL : Set objRequestURL = New cLibOAuthRequestURL
objRequestURL.ConsumerSecret = m_strConsumerSecret
objRequestURL.EndPoint = m_strEndPoint
objRequestURL.Method = m_strRequestMethod
objRequestURL.Parameters = strParameters
Get_RequestURL = objRequestURL.Get_RequestURL()
Set objRequestURL = Nothing
End Function
End Class
'*?*?
'******************************************************************************
' CLASS: cLibOAuthQS
' PURPOSE:
'
' AUTHOR: sdesapio DATE: 04.04.10 LAST MODIFIED: 04.04.10
'******************************************************************************
Class cLibOAuthQS
'**************************************************************************
'***'PRIVATE CLASS MEMBERS
'**************************************************************************
Private m_objDictionary
Private m_objUtils
Private m_strSorted
'**************************************************************************
'***'CLASS_INITIALIZE / CLASS_TERMINATE
'**************************************************************************
Private Sub Class_Initialize()
Set m_objDictionary = Nothing
Set m_objUtils = Nothing
m_strSorted = Null
End Sub
Private Sub Class_Terminate()
Set m_objUtils = Nothing
Set m_objDictionary = Nothing
End Sub
'**************************************************************************
'***'PUBLIC PROPERTIES
'**************************************************************************
'**************************************************************************
'***'PRIVATE PROPERTIES
'**************************************************************************
Private Property Get Dictionary
If m_objDictionary Is Nothing Then
Set m_objDictionary = Wscript.CreateObject("Scripting.Dictionary")
End If
Set Dictionary = m_objDictionary
End Property
Private Property Get Sorted
If IsNull(m_strSorted) Then
Call Get_Sorted()
End If
Sorted = m_strSorted
End Property
Private Property Get Utils
If m_objUtils Is Nothing Then
Set m_objUtils = New cLibOAuthUtils
End If
Set Utils = m_objUtils
End Property
'**************************************************************************
'***'PUBLIC FUNCTIONS
'**************************************************************************
'**************************************************************************
' SUB: Add
' PARAMETERS:
' PURPOSE:
'
' AUTHOR: sdesapio DATE: 04.04.10 LAST MODIFIED: 04.04.10
'**************************************************************************
Public Sub Add(strKey, strValue)
Dictionary.Add strKey, Utils.URLEncode(strValue)
End Sub
'**************************************************************************
' SUB: Get_Parameters
' PARAMETERS:
' PURPOSE:
'
' AUTHOR: sdesapio DATE: 04.04.10 LAST MODIFIED: 04.04.10
'**************************************************************************
Public Function Get_Parameters()
Get_Parameters = Sorted
End Function
'**************************************************************************
'***'PRIVATE FUNCTIONS
'**************************************************************************
'**************************************************************************
' SUB: Get_Sorted
' PARAMETERS:
' PURPOSE:
'
' AUTHOR: sdesapio DATE: 04.04.10 LAST MODIFIED: 04.04.10
'**************************************************************************
Private Sub Get_Sorted()
Dim intCount : intCount = Dictionary.Count
Dim i : i = 1
m_strSorted = ""
Call Utils.SortDictionary(Dictionary, 1)
Dim Item : For Each Item In Dictionary
m_strSorted = m_strSorted & Item & "=" & Dictionary.Item(Item)
If i < intCount Then
m_strSorted = m_strSorted & "&"
End If
i = i + 1
Next
End Sub
End Class
'******************************************************************************
' CLASS: cLibOAuthRequestURL
' PURPOSE:
'
' AUTHOR: sdesapio DATE: 04.04.10 LAST MODIFIED: 04.04.10
'******************************************************************************
Class cLibOAuthRequestURL
'**************************************************************************
'***'PRIVATE CLASS MEMBERS
'**************************************************************************
Private m_objUtils
Private m_strConsumerSecret
Private m_strEndPoint
Private m_strMethod
Private m_strParameters
Private m_strTokenSecret
'**************************************************************************
'***'CLASS_INITIALIZE / CLASS_TERMINATE
'**************************************************************************
Private Sub Class_Initialize()
Set m_objUtils = Nothing
m_strTokenSecret = ""
End Sub
Private Sub Class_Terminate()
Set m_objUtils = Nothing
End Sub
'**************************************************************************
'***'PUBLIC PROPERTIES
'**************************************************************************
Public Property Let ConsumerSecret(pData)
m_strConsumerSecret = pData
End Property
Public Property Let EndPoint(pData)
m_strEndPoint = pData
End Property
Public Property Let Method(pData)
m_strMethod = pData
End Property
Public Property Let Parameters(pData)
m_strParameters = pData
End Property
Public Property Let TokenSecret(pData)
m_strTokenSecret = pData
End Property
'**************************************************************************
'***'PRIVATE PROPERTIES
'**************************************************************************
Private Property Get Utils
If m_objUtils Is Nothing Then
Set m_objUtils = New cLibOAuthUtils
End If
Set Utils = m_objUtils
End Property
'**************************************************************************
'***'PUBLIC FUNCTIONS
'**************************************************************************
'**************************************************************************
' FUNCTION: Get_RequestURL
' PARAMETERS:
' PURPOSE:
'
' AUTHOR: sdesapio DATE: 04.04.10 LAST MODIFIED: 04.04.10
'**************************************************************************
Public Function Get_RequestURL()
Dim strSignature : strSignature = Get_Signature()
strSignature = Utils.URLEncode(strSignature)
Get_RequestURL = _
m_strEndPoint & "?" & _
m_strParameters & "&" & _
"oauth_signature=" & strSignature
End Function
'**************************************************************************
'***'PRIVATE FUNCTIONS
'**************************************************************************
'**************************************************************************
' FUNCTION: Get_Signature
' PARAMETERS:
' PURPOSE:
'
' AUTHOR: sdesapio DATE: 04.04.10 LAST MODIFIED: 04.04.10
'**************************************************************************
Private Function Get_Signature()
Dim strBaseSignature : strBaseSignature = _
m_strMethod & "&" & _
Utils.URLEncode(m_strEndPoint) & "&" & _
Utils.URLEncode(m_strParameters)
'>>SECRET ! ConsumerSecret & AccessTokenSecret
Dim strSecret : strSecret = myConsumerSecret & "&" & myAccessSecret
Get_Signature = b64_hmac_sha1(strSecret, strBaseSignature)
End Function
End Class
'******************************************************************************
' CLASS: cLibOAuthUtils
' PURPOSE:
'
' AUTHOR: sdesapio DATE: 04.04.10 LAST MODIFIED: 04.04.10
'******************************************************************************
Class cLibOAuthUtils
'**************************************************************************
'***'PRIVATE CLASS MEMBERS
'**************************************************************************
Private m_intOffsetMinutes
Private m_intTimeStamp
Private m_strNonce
'**************************************************************************
'***'CLASS_INITIALIZE / CLASS_TERMINATE
'**************************************************************************
Private Sub Class_Initialize()
m_intOffsetMinutes = Null
m_intTimeStamp = Null
m_strNonce = Null
End Sub
Private Sub Class_Terminate()
End Sub
'**************************************************************************
'***'PUBLIC PROPERTIES
'**************************************************************************
Public Property Get OffsetMinutes
If IsNull(m_intOffsetMinutes) Then
Set_OffsetMinutes()
End If
OffsetMinutes = m_intOffsetMinutes
End Property
Public Property Get Nonce
If IsNull(m_strNonce) Then
Set_Nonce()
End If
Nonce = m_strNonce
End Property
Public Property Get TimeStamp
If IsNull(m_intTimeStamp) Then
Set_Timestamp()
End If
TimeStamp = m_intTimeStamp
End Property
'**************************************************************************
'***'PUBLIC FUNCTIONS
'**************************************************************************
'**************************************************************************
' FUNCTION: Get_ResponseValue
' PARAMETERS: strResponseText, strKey
' PURPOSE: Rips out a specific key/value pair from the service
' provider response and returns the value
'
' AUTHOR: sdesapio DATE: 04.04.10 LAST MODIFIED: 04.04.10
'**************************************************************************
Public Function Get_ResponseValue(strResponseText, strKey)
Dim arrPair, arrPairs : arrPairs = Split(strResponseText, "&")
Dim strRetVal : strRetVal = Null
Dim i : i = 0 : Do While i < UBound(arrPairs) + 1
arrPair = arrPairs(i)
arrPair = Split(arrPair, "=")
If arrPair(0) = strKey Then
strRetVal = arrPair(1)
Exit Do
End If
i = i + 1
Loop
Get_ResponseValue = strRetVal
End Function
'**************************************************************************
' SUB: SortDictionary
' PARAMETERS: objDict (collection), intSort (type)
' PURPOSE: Sorts a dictionary on key or item.
' REF: http://support.microsoft.com/kb/246067
'
' AUTHOR: sdesapio DATE: 04.04.10 LAST MODIFIED: 04.04.10
'**************************************************************************
Public Sub SortDictionary(objDict, intSort)
Const dictKey = 1
Const dictItem = 2
' declare our variables
Dim strDict()
Dim objKey
Dim strKey,strItem
Dim X,Y,Z
' get the dictionary count
Z = objDict.Count
' we need more than one item to warrant sorting
If Z > 1 Then
' create an array to store dictionary information
ReDim strDict(Z,2)
X = 0
' populate the string array
For Each objKey In objDict
strDict(X,dictKey) = CStr(objKey)
strDict(X,dictItem) = CStr(objDict(objKey))
X = X + 1
Next
' perform a a shell sort of the string array
For X = 0 to (Z - 2)
For Y = X to (Z - 1)
If StrComp(strDict(X,intSort),strDict(Y,intSort),vbTextCompare) > 0 Then
strKey = strDict(X,dictKey)
strItem = strDict(X,dictItem)
strDict(X,dictKey) = strDict(Y,dictKey)
strDict(X,dictItem) = strDict(Y,dictItem)
strDict(Y,dictKey) = strKey
strDict(Y,dictItem) = strItem
End If
Next
Next
' erase the contents of the dictionary object
objDict.RemoveAll
' repopulate the dictionary with the sorted information
For X = 0 to (Z - 1)
objDict.Add strDict(X,dictKey), strDict(X,dictItem)
Next
End If
End Sub
'**************************************************************************
' FUNCTION: URLEncode
' PARAMETERS: s (string)
' PURPOSE: URL Encodes only those characters required by the oAuth
' standard because native Server.URLEncode encodes too
' much causing call to fail.
'
' AUTHOR: sdesapio DATE: 04.04.10 LAST MODIFIED: 04.04.10
'**************************************************************************
Public Function URLEncode(s)
Dim strTmpVal : strTmpVal = s
Dim strRetVal : strRetVal = ""
Dim intAsc : intAsc = 0
Dim strHex : strHex = ""
Dim i, strChr : For i = 1 To Len(strTmpVal)
strChr = Mid(strTmpVal, i, 1)
If InStr(1, OAUTH_UNRESERVED, strChr) = 0 Then
intAsc = Asc(strChr)
If intAsc < 32 Or intAsc > 126 Then
strHex = encodeURIComponent(strChr)
Else
strHex = "%" & Hex(intAsc)
End If
strRetVal = strRetVal & strHex
Else
strRetVal = strRetVal & strChr
End If
Next
URLEncode = strRetVal
End Function
'**************************************************************************
'***'PRIVATE FUNCTIONS
'**************************************************************************
'**************************************************************************
' SUB: Set_OffsetMinutes()
' PARAMETERS:
' PURPOSE: Pull out GMT Offset Minutes from registry
'
' AUTHOR: sdesapio DATE: 04.04.10 LAST MODIFIED: 04.04.10
'**************************************************************************
Private Sub Set_OffsetMinutes()
Dim objWshShell : Set objWshShell = Wscript.CreateObject("WScript.Shell")
m_intOffsetMinutes = objWshShell.RegRead("HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation\ActiveTimeBias")
Set objWshShell = Nothing
End Sub
'**************************************************************************
' SUB: Set_Nonce()
' PARAMETERS:
' PURPOSE: Returns string based on timestamp to be used as "random"
'
' AUTHOR: sdesapio DATE: 04.04.10 LAST MODIFIED:
'**************************************************************************
Private Sub Set_Nonce()
m_strNonce = Me.TimeStamp + (Timer() * 1000)
End Sub
'**************************************************************************
' SUB: Set_Timestamp()
' PARAMETERS:
' PURPOSE: Returns numnber of seconds from UNIX Epoch Time
' January 1, 1970 00:00:00 GMT
'
' AUTHOR: sdesapio DATE: 04.04.10 LAST MODIFIED:
'**************************************************************************
Private Sub Set_Timestamp()
Dim dteFrom : dteFrom = "01/01/1970 00:00:00 AM"
Dim dteNow : dteNow = Now()
dteNow = DateAdd("n", Me.OffsetMinutes, dteNow)
m_intTimeStamp = DateDiff("s", dteFrom, dteNow)
End Sub
End Class
Function EncodeCSZ(noter)
noter=Replace(noter,"ž","%c5%be")
noter=Replace(noter,"Ž","%c5%bd")
noter=Replace(noter,"š","%c5%a1")
noter=Replace(noter,"Š","%c5%a0")
noter=Replace(noter,"è","%c4%8d")
noter=Replace(noter,"È","%c4%8c")
noter=Replace(noter,"ð","%c4%91")
noter=Replace(noter,"Ð","%c4%90")
noter=Replace(noter,"æ","%c4%87")
noter=Replace(noter,"Æ","%c4%86")
noter=Replace(noter,"°","%c2%b0")
EncodeCSZ=noter
End Function
'Base64 encode/decode functions were downloaded from http://www.motobit.com/tips/detpg_Base64/
Function Base64_Encode(inData)
Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
Dim cOut, sOut, I
For I = 1 To Len(inData) Step 3
Dim nGroup, pOut, sGroup
nGroup = &H10000 * Asc(Mid(inData, I, 1)) + _
&H100 * MyASC(Mid(inData, I + 1, 1)) + MyASC(Mid(inData, I + 2, 1))
nGroup = Oct(nGroup)
nGroup = String(8 - Len(nGroup), "0") & nGroup
pOut = Mid(Base64, CLng("&o" & Mid(nGroup, 1, 2)) + 1, 1) + _
Mid(Base64, CLng("&o" & Mid(nGroup, 3, 2)) + 1, 1) + _
Mid(Base64, CLng("&o" & Mid(nGroup, 5, 2)) + 1, 1) + _
Mid(Base64, CLng("&o" & Mid(nGroup, 7, 2)) + 1, 1)
sOut = sOut + pOut
Next
Select Case Len(inData) Mod 3
Case 1:
sOut = Left(sOut, Len(sOut) - 2) + "=="
Case 2:
sOut = Left(sOut, Len(sOut) - 1) + "="
End Select
Base64_Encode = sOut
End Function
Function MyASC(OneChar)
If OneChar = "" Then MyASC = 0 Else MyASC = Asc(OneChar)
End Function
Function Base64_Decode(ByVal base64String)
Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
Dim dataLength, sOut, groupBegin
base64String = Replace(base64String, vbCrLf, "")
base64String = Replace(base64String, vbTab, "")
base64String = Replace(base64String, " ", "")
dataLength = Len(base64String)
If dataLength Mod 4 <> 0 Then
Err.Raise 1, "Base64Decode", "Bad Base64 string."
Exit Function
End If
For groupBegin = 1 To dataLength Step 4
Dim numDataBytes, CharCounter, thisChar, thisData, nGroup, pOut
numDataBytes = 3
nGroup = 0
For CharCounter = 0 To 3
thisChar = Mid(base64String, groupBegin + CharCounter, 1)
If thisChar = "=" Then
numDataBytes = numDataBytes - 1
thisData = 0
Else
thisData = InStr(1, Base64, thisChar, vbBinaryCompare) - 1
End If
If thisData = -1 Then
Err.Raise 2, "Base64Decode", "Bad character In Base64 string."
Exit Function
End If
nGroup = 64 * nGroup + thisData
Next
nGroup = Hex(nGroup)
nGroup = String(6 - Len(nGroup), "0") & nGroup
pOut = Chr(CByte("&H" & Mid(nGroup, 1, 2))) + _
Chr(CByte("&H" & Mid(nGroup, 3, 2))) + _
Chr(CByte("&H" & Mid(nGroup, 5, 2)))
sOut = sOut & Left(pOut, numDataBytes)
Next
Base64_Decode = sOut
End Function
'**************************************************************
'**************************************************************
'**************************************************************
'**************************************************************
'**************************************************************
'**************************************************************
'**************************************************************
</script>
<script language="javascript">
/*
* A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
* in FIPS PUB 180-1
* Version 2.1a Copyright Paul Johnston 2000 - 2002.
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
* Distributed under the BSD License
* See http://pajhome.org.uk/crypt/md5 for details.
*/
/*
* Configurable variables. You may need to tweak these to be compatible with
* the server-side, but the defaults work in most cases.
*/
var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
var b64pad = "="; /* base-64 pad character. "=" for strict RFC compliance */
var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
/*
* These are the functions you'll usually want to call
* They take string arguments and return either hex or base-64 encoded strings
*/
function hex_sha1(s){return binb2hex(core_sha1(str2binb(s),s.length * chrsz));}
function b64_sha1(s){return binb2b64(core_sha1(str2binb(s),s.length * chrsz));}
function str_sha1(s){return binb2str(core_sha1(str2binb(s),s.length * chrsz));}
function hex_hmac_sha1(key, data){ return binb2hex(core_hmac_sha1(key, data));}
function b64_hmac_sha1(key, data){ return binb2b64(core_hmac_sha1(key, data));}
function str_hmac_sha1(key, data){ return binb2str(core_hmac_sha1(key, data));}
/*
* Perform a simple self-test to see if the VM is working
*/
function sha1_vm_test()
{
return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";
}
/*
* Calculate the SHA-1 of an array of big-endian words, and a bit length
*/
function core_sha1(x, len)
{
/* append padding */
x[len >> 5] |= 0x80 << (24 - len % 32);
x[((len + 64 >> 9) << 4) + 15] = len;
var w = Array(80);
var a = 1732584193;
var b = -271733879;
var c = -1732584194;
var d = 271733878;
var e = -1009589776;
for(var i = 0; i < x.length; i += 16)
{
var olda = a;
var oldb = b;
var oldc = c;
var oldd = d;
var olde = e;
for(var j = 0; j < 80; j++)
{
if(j < 16) w[j] = x[i + j];
else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)),
safe_add(safe_add(e, w[j]), sha1_kt(j)));
e = d;
d = c;
c = rol(b, 30);
b = a;
a = t;
}
a = safe_add(a, olda);
b = safe_add(b, oldb);
c = safe_add(c, oldc);
d = safe_add(d, oldd);
e = safe_add(e, olde);
}
return Array(a, b, c, d, e);
}
/*
* Perform the appropriate triplet combination function for the current
* iteration
*/
function sha1_ft(t, b, c, d)
{
if(t < 20) return (b & c) | ((~b) & d);
if(t < 40) return b ^ c ^ d;
if(t < 60) return (b & c) | (b & d) | (c & d);
return b ^ c ^ d;
}
/*
* Determine the appropriate additive constant for the current iteration
*/
function sha1_kt(t)
{
return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
(t < 60) ? -1894007588 : -899497514;
}
/*
* Calculate the HMAC-SHA1 of a key and some data
*/
function core_hmac_sha1(key, data)
{
var bkey = str2binb(key);
if(bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz);
var ipad = Array(16), opad = Array(16);
for(var i = 0; i < 16; i++)
{
ipad[i] = bkey[i] ^ 0x36363636;
opad[i] = bkey[i] ^ 0x5C5C5C5C;
}
var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz);
return core_sha1(opad.concat(hash), 512 + 160);
}
/*
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
* to work around bugs in some JS interpreters.
*/
function safe_add(x, y)
{
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
}
/*
* Bitwise rotate a 32-bit number to the left.
*/
function rol(num, cnt)
{
return (num << cnt) | (num >>> (32 - cnt));
}
/*
* Convert an 8-bit or 16-bit string to an array of big-endian words
* In 8-bit function, characters >255 have their hi-byte silently ignored.
*/
function str2binb(str)
{
var bin = Array();
var mask = (1 << chrsz) - 1;
for(var i = 0; i < str.length * chrsz; i += chrsz)
bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - i%32);
return bin;
}
/*
* Convert an array of big-endian words to a string
*/
function binb2str(bin)
{
var str = "";
var mask = (1 << chrsz) - 1;
for(var i = 0; i < bin.length * 32; i += chrsz)
str += String.fromCharCode((bin[i>>5] >>> (32 - chrsz - i%32)) & mask);
return str;
}
/*
* Convert an array of big-endian words to a hex string.
*/
function binb2hex(binarray)
{
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
var str = "";
for(var i = 0; i < binarray.length * 4; i++)
{
str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF);
}
return str;
}
/*
* Convert an array of big-endian words to a base-64 string
*/
function binb2b64(binarray)
{
var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var str = "";
for(var i = 0; i < binarray.length * 4; i += 3)
{
var triplet = (((binarray[i >> 2] >> 8 * (3 - i %4)) & 0xFF) << 16)
| (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 )
| ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF);
for(var j = 0; j < 4; j++)
{
if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
}
}
return str;
}
</script>
<script language="vbscript">
'**************************************************************
'**************************************************************
'**************************************************************
'**************************************************************
'**************************************************************
'**************************************************************
'**************************************************************
Function GetCommandLineString ()
' Get message from command line
Dim pcount, xStatus
If WScript.Arguments.Count > 0 Then
xStatus = ""
For pcount = 0 to WScript.Arguments.Count - 1
xStatus = xStatus & " " & WScript.Arguments.Item(pcount)
Next
Else
WScript.Echo "Usage: TweetWSH <twitter status update>"
WScript.Quit 1 'exit halt
End If
xStatus = TRIM(xStatus)
IF myDebug THEN MsgBox "Attempting to send:" & VbCrLf & xStatus
GetCommandLineString = xStatus
End Function
Sub SendTweet (thisText)
'Start Tweeting
Dim objOAuth : Set objOAuth = New cLibOAuth
'SECRET! Consumer key!
objOAuth.ConsumerKey = myConsumerKey
'SECRET! Consumer Secret!
objOAuth.ConsumerSecret = myConsumerSecret
objOAuth.EndPoint = TWITTER_OAUTH_URL_UPDATE_STATUS
'SECRET! access token
objOAuth.Parameters.Add "oauth_token", myAccessToken
'set Status; the actual message to be sent to Twitter
objOAuth.Parameters.Add "status", thisText
'SECRET! access token secret
objOAuth.Parameters.Add "oauth_token_secret", myAccessSecret
objOAuth.RequestMethod = OAUTH_REQUEST_METHOD_POST
objOAuth.Send()
Set objOAuth = Nothing
' END of Tweeting
End Sub
SendTweet GetCommandLineString
</script>
</job>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment