Skip to content

Commit

Permalink
Clean up signature in tweets
Browse files Browse the repository at this point in the history
  • Loading branch information
aspiring-aster committed Jul 25, 2024
1 parent 7b142ae commit b202edc
Showing 1 changed file with 34 additions and 5 deletions.
39 changes: 34 additions & 5 deletions src/xnim/v2/tweets.nim
Original file line number Diff line number Diff line change
@@ -1,9 +1,22 @@
import std/[httpclient, strformat, json, times,random,uri, strutils, base64]
import std/[httpclient, strformat, json, times,random,strutils, base64]
import ../utils/xapi
import nimcrypto

const TWEET_ENDPOINT*: string = "https://api.twitter.com/2/tweets"

proc percentEncode(s: string): string =
const safe = {'a'..'z', 'A'..'Z', '0'..'9', '-', '.', '_', '~'}
result = newStringOfCap(s.len * 3)
for c in s:
if c in safe:
result.add(c)
else:
result.add('%')
result.add(toHex(ord(c), 2))

# Example usage
echo percentEncode("Hello World!") # Output: Hello%20World%21

# Random string for oauth_nonce
proc OauthNonce(): string =
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
Expand All @@ -15,24 +28,40 @@ proc OauthNonce(): string =
proc OauthSignature(xAPI: XAPI, text: string, oAuthNonce: string, timeStamp: int):string =
# Follow https://developer.x.com/en/docs/authentication/oauth-1-0a/creating-a-signature
# For now, hard code POST as HTTP method
var signatureBase:string =
#

var outputString:string =
fmt"POST&"&
&"{encodeUrl(TWEET_ENDPOINT)}&"&
&"{percentEncode(TWEET_ENDPOINT)}&"

echo "outputString : " & outputString

var paramString:string =
fmt"oauth_consumer_key={xAPI.consumerKey}&"&
&"oauth_nonce={oAuthNonce}&"&
&"oauth_signature_method=HMAC-SHA1&"&
&"oauth_timestamp={timeStamp}&"&
&"oauth_token={xAPI.accessToken}&"&
&"oauth_version=1.0&"&
&"{encodeUrl(text)}"
&"oauth_version=1.0"
# &"status={text}"

paramString = percentEncode(paramString)
echo "paramString : " & paramString

var signatureBase = outputString & paramString


signatureBase = signatureBase.replace("+", "%20")
signatureBase = signatureBase.replace("%7E", "~") # Don't encode ~

echo "SignatureBase: " & signatureBase

var signingKey:string =
fmt"{xAPI.consumerSecret}&{xAPI.tokenSecret}"

let hmac = sha1.hmac(signingKey, signatureBase)
result = base64.encode(hmac.data)
result = percentEncode(result)

return result

Expand Down

0 comments on commit b202edc

Please sign in to comment.