ASP:将图片上传到Twitter

时间:2016-06-11 17:55:07

标签: api twitter asp-classic

此代码正常工作

m_strUserAgent="User Agent"
m_strHost="api.twitter.com"
m_metodo="POST"

url_publish = "https://api.twitter.com/1.1/statuses/update.json"
url_publish_img = "https://upload.twitter.com/1.1/media/upload.json"


oauth_consumer_key = "XXXXXXXXXXXXXXXXXXXXX"
oauth_consumer_sec = "XXXXXXXXXXXXXXXXXXXXX"
oauth_token = "XXXXXXXXXXXXXXXXXXXXX"
oauth_token_sec = "XXXXXXXXXXXXXXXXXXXXX"

post_text="sample text"

oauth_nonce = Year(now) & Month(now) & Day(now) & Hour(now) & Minute(now) & Second(now) & Replace(Request.ServerVariables("REMOTE_ADDR"),".","")
oauth_signature_method = "HMAC-SHA1"
oauth_timestamp = DateDiff("s", "01/01/1970 00:00:00", Now())
oauth_version = "1.0"



oauth_sign = "oauth_consumer_key=" & oauth_consumer_key & "&oauth_nonce=" & oauth_nonce & "&oauth_signature_method=" & oauth_signature_method & "&oauth_timestamp=" & oauth_timestamp & "&oauth_token=" & oauth_token &  "&oauth_version=" & oauth_version & "&status=" & EncodeString(post_text)
oauth_signature = b64_hmac_sha1(oauth_consumer_sec&"&"&oauth_token_sec, m_metodo & "&" & EncodeString(url_publish) & "&" & EncodeString(oauth_sign))
PARAM_AUTH="oauth_consumer_key=" & oauth_consumer_key & "&oauth_nonce=" & oauth_nonce & "&oauth_signature=" & EncodeString(oauth_signature) & "&oauth_signature_method=HMAC-SHA1&oauth_timestamp=" & oauth_timestamp & "&oauth_token=" & oauth_token & "&oauth_version="&oauth_version

requesturl=url_publish & "?" & PARAM_AUTH & "&status=" & Server.URLEncode(post_text),space(1),"+")

Set objSrvHTTP = Server.CreateObject("Msxml2.ServerXMLHTTP")
objSrvHTTP.setTimeouts 10000, 10000, 15000, 15000
objSrvHTTP.Open m_metodo, requesturl, False
objSrvHTTP.setOption(2)=13056
objSrvHTTP.SetRequestHeader "Content-Type","application/x-www-form-urlencoded"
objSrvHTTP.SetRequestHeader "User-Agent", m_strUserAgent
objSrvHTTP.SetRequestHeader "Host", m_strHost
objSrvHTTP.Send


response.Write objSrvHTTP.status & " - " & objSrvHTTP.statusText & "<br />"
response.Write objSrvHTTP.responseText

但现在我想发布文字和图片而不是工作。

m_strUserAgent="User Agent"
m_strHost="api.twitter.com"
m_metodo="POST"

url_publish = "https://api.twitter.com/1.1/statuses/update.json"
url_publish_img = "https://upload.twitter.com/1.1/media/upload.json"


oauth_consumer_key = "XXXXXXXXXXXXXXXXXXXXX"
oauth_consumer_sec = "XXXXXXXXXXXXXXXXXXXXX"
oauth_token = "XXXXXXXXXXXXXXXXXXXXX"
oauth_token_sec = "XXXXXXXXXXXXXXXXXXXXX"

post_text="sample text"

oauth_nonce = Year(now) & Month(now) & Day(now) & Hour(now) & Minute(now) & Second(now) & Replace(Request.ServerVariables("REMOTE_ADDR"),".","")
oauth_signature_method = "HMAC-SHA1"
oauth_timestamp = DateDiff("s", "01/01/1970 00:00:00", Now())
oauth_version = "1.0"

localfile="C:\tmp\_tw668995883.jpg"
base=convertImageToBase64(localfile)
base64="data:image/jpeg;base64," & base

oauth_sign = "oauth_consumer_key=" & oauth_consumer_key & "&oauth_nonce=" & oauth_nonce & "&oauth_signature_method=" & oauth_signature_method & "&oauth_timestamp=" & oauth_timestamp & "&oauth_token=" & oauth_token &  "&oauth_version=" & oauth_version
oauth_signature = b64_hmac_sha1(oauth_consumer_sec&"&"&oauth_token_sec, m_metodo & "&" & EncodeString(url_publish_img) & "&" & EncodeString(oauth_sign))
PARAM_AUTH="oauth_consumer_key=" & oauth_consumer_key & "&oauth_nonce=" & oauth_nonce & "&oauth_signature=" & EncodeString(oauth_signature) & "&oauth_signature_method=HMAC-SHA1&oauth_timestamp=" & oauth_timestamp & "&oauth_token=" & oauth_token & "&oauth_version="&oauth_version

requesturl=url_publish_img & "?" & PARAM_AUTH 

Set objSrvHTTP = Server.CreateObject("Msxml2.ServerXMLHTTP")
objSrvHTTP.setTimeouts 10000, 10000, 15000, 15000
objSrvHTTP.Open m_metodo, requesturl, False
objSrvHTTP.setOption(2)=13056
objSrvHTTP.SetRequestHeader "Content-Type","application/x-www-form-urlencoded"
objSrvHTTP.SetRequestHeader "User-Agent", m_strUserAgent
objSrvHTTP.SetRequestHeader "Host", m_strHost
objSrvHTTP.Send


response.Write objSrvHTTP.status & " - " & objSrvHTTP.statusText & "<br />"
response.Write objSrvHTTP.responseText

Public Function convertImageToBase64(filePath)
  Dim inputStream
  Set inputStream = CreateObject("ADODB.Stream")
  inputStream.Open
  inputStream.Type = 1  ' adTypeBinary
  inputStream.LoadFromFile filePath
  Dim bytes: bytes = inputStream.Read
  Dim dom: Set dom = CreateObject("Microsoft.XMLDOM")
  Dim elem: Set elem = dom.createElement("tmp")
  elem.dataType = "bin.base64"
  elem.nodeTypedValue = bytes
  convertImageToBase64 = Replace(elem.text, vbLf, "")
End Function

我做什么? Twitter总是说:

401 - 需要授权 {“errors”:[{“code”:32,“message”:“无法对您进行身份验证。”}}}

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

创建边界:

boundarystr = "---------------------------7d92a4b1705ba"

boundary = "-----------------------------7d92a4b1705ba"

requestbody = boundary & VbCrlf

requestbody = requestbody & "Content-Disposition: form-data; name=""media""; filename=""_tw668995883.jpg""" & VbCrlf 
requestbody = requestbody & "Content-Type: application/octet-stream" & VbCrlf & VbCrlf
requestbody = requestbody & escape(ReadBinaryFile(localfile)) & VbCrlf & boundary & "--" & VbCrLf 

添加到帖子

objSrvHTTP.setRequestHeader "Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, application/octet-stream, */*"
objSrvHTTP.setRequestHeader "Content-length", len(requestbody)
objSrvHTTP.setRequestHeader "Content-type", "multipart/form-data; boundary=" & boundarystr
objSrvHTTP.Send requestbody


Function ReadBinaryFile(fullFilePath) 
    dim stream
    set stream = Server.CreateObject("ADODB.Stream")
        stream.Type = 1
        stream.Open()
        stream.LoadFromFile(fullFilePath)
        ReadBinaryFile = stream.Read()
        stream.Close
    set stream = nothing
end function 

现在twitter alow授权和媒体参数,但是说:媒体类型无法识别

为什么?

答案 1 :(得分:0)

我改变了,现在工作。

base=convertImageToBase64(localfile)

    requestbody = requestbody & "Content-Disposition: form-data; name=""media_data""; filename=""_tw668995883.jpg""" & VbCrlf 
    requestbody = requestbody & "Content-Transfer-Encoding: base64" & VbCrlf
    requestbody = requestbody & "Content-Type: image/jpeg" & VbCrlf & VbCrlf
    requestbody = requestbody & base & VbCrlf & boundary & "--" & VbCrLf