.net 通过OAuth访问imgUr(上传到用户帐户)

.net 通过OAuth访问imgUr(上传到用户帐户),.net,vb.net,api,file-upload,imgur,.net,Vb.net,Api,File Upload,Imgur,为了开始执行这个“简单”的任务,我研究了一个程序,我以该程序为例,遵循并再现了这些步骤,该程序可以“匿名”上传图像: 但我真正想做的是将图像上传到我的用户帐户中,这就是 我发现了一个问题,但他在回答中说的对我来说并不清楚(因为我的新手知识),无论如何,我尝试使用上面的功能,但只是用我的ClientSecretID发送BEARER头,因为如果我理解得好,那么令牌也可能是ClientSecretID?,但是我没有得到预期的结果 因此,为了寻找获得正确acces令牌的方法,我发现了一个帮助我发现库并知

为了开始执行这个“简单”的任务,我研究了一个程序,我以该程序为例,遵循并再现了这些步骤,该程序可以“匿名”上传图像:

但我真正想做的是将图像上传到我的用户帐户中,这就是

我发现了一个问题,但他在回答中说的对我来说并不清楚(因为我的新手知识),无论如何,我尝试使用上面的功能,但只是用我的
ClientSecret
ID发送
BEARER
头,因为如果我理解得好,那么令牌也可能是
ClientSecret
ID?,但是我没有得到预期的结果

因此,为了寻找获得正确acces令牌的方法,我发现了一个帮助我发现库并知道如何发送请求的问题,我做了一些修改,将其与Imgur API一起使用,但我得到了以下错误响应:

{"data":{"error":"client_id and response_type are required","request":"\/oauth2\/authorize","method":"POST"},"success":false,"status":400}
这就是我所拥有的:

Public Sub GetAccessToken()

    Dim xrc As RestClient = New RestClient
    Dim grant_type As String = "authorization_code"
    Dim request As New RestRequest(Method.POST)
    Dim strBody As String
    Dim response As RestResponse
    Dim strResponse As String

    request.Method = Method.POST
    request.RequestFormat = DataFormat.Xml

    'Base URL
    xrc.BaseUrl = "https://api.imgur.com"

    'Resource
    request.Resource = "oauth2/authorize"

    'Format body
    strBody = String.Format("client_id={0}&response_type={1}", ClientId, ClientSecret)

    'Add body to request
    request.AddBody("Authorization", strBody)

    'Execute
    response = xrc.Execute(request)

    'Parse Response
    strResponse = response.Content

    MessageBox.Show(response.Content.ToString)

End Sub
所以我的问题是二合一:

Friend imgUR As imgurAPI
imgUR = New imgurAPI(<your Client ID>,<your secret code>)
如何将图像上载到Imgur用户 使用所需内容(如访问令牌?)的帐户

PS:请记住,即使获得访问令牌,我也不知道在存储之后如何使用它

更新:

我正在尝试使用@Polotoix解决方案,但当我尝试请求令牌时,它会抛出一个异常“
首先需要一个有效的PIN
”,我使用的是有效的ClientId和ClientSecret,我遗漏了更多内容,代码如下:

Private imgUR As New imgurAPI("my client id", "my client secret")

Private Sub Button1_Click() Handles Button1.Click

    Dim wb As New WebBrowser
    imgUR.RequestPinBrowser(wb)

    ' The instruction below throws an exception:
    ' "Need a valid PIN first"
    Dim result As imgurAPI.imgUrResults = imgUR.RequestToken
    wb.Dispose()

    ' check result
    If result = imgurAPI.imgUrResults.OK Then

        ' assumes the file exists
        imgUR.UploadImage("C:\Test.jpg", False)

        Clipboard.SetText(imgUR.LastImageLink)
        MessageBox.Show(imgUR.LastImageLink)

    Else
        MessageBox.Show(String.Format("Error getting access token. Status:{0}",
            result.ToString))
    End If

End Sub

这很长,因为它或多或少是一个复杂的API:

公共类imgurAPI
'此API和imgUR服务器响应的组合
公共枚举结果
OK=200'又称状态200
“我们返回的错误
OtherAPIError=-1'到目前为止,只是缺少ImgLink
InvalidToken=-2
InvalidPIN=-3'引脚失效
InvalidRequest=-4
TokenParseError=-5
'我们从服务器获得的结果
BadRequestFormat=400'状态400
授权错误=401'状态401
禁止=403'状态403
NotFound=404'Status404'错误的URL端点
RateLimitError=429'状态429'RateLimit错误
ServerError=500“Status500”内部服务器错误
UknownStatus=700‘我们还没有考虑到这一点,
“可能是琐碎的,也可能是新的
结束枚举
“他们寄给我们的酷东西的容器
好友类令牌
公共属性AcctUserName作为字符串
公共属性AccessToken作为字符串
作为字符串的公共属性刷新令牌
公共财产到期日
公共分新()
AcctUserName=“”
AccessToken=“”
RefreshToken=“”
Expiry=DateTime.MinValue
端接头
友元函数IsExpired()为布尔函数
如果(过期>DateTime.Now)那么
返回错误
其他的
“如果过期了,重置一切,这样一些白痴就不会
'为“”公开AccessToken和测试“”
AcctUserName=“”
AccessToken=“”
RefreshToken=“”
Expiry=DateTime.MinValue
返回真值
如果结束
端函数
末级
“没有简单的问题!!!
'构造函数已用ClientID和SecretID初始化
Public Sub New(clID作为字符串,secret作为字符串)
clientID=clID
clientSecret=秘密
myPin=“”
imgToken=新令牌
LastImageLink=“”
UseClipboard=True
异常=假
端接头
'构造函数已用ClientID和SecretID初始化
Public Sub New(clID作为字符串)
clientID=clID
clientSecret=“”
myPin=“”
imgToken=新令牌
LastImageLink=“”
UseClipboard=True
异常=真
端接头
作为字符串的专用clientID
私有clientSecret作为字符串
Private异常为Boolean=True
“代币不是公开的
作为令牌的私有imgToken
公共属性LastImageLink作为字符串
将剪贴板用作布尔值的公共属性
'在代码中使用到期的精确时刻
公共只读属性令牌到期日期时间
得到
如果imgToken不是什么,那么
返回imgToken。到期
其他的
一无所获
如果结束
结束
端属性
公共函数GetExpiryCountdown()作为字符串
返回String.Format(“{0:hh\:mm\:ss}”,GetExpiryTimeRemaining)
端函数
“作为时间跨度的剩余时间
公共函数GetExpiryTimeRemaining()作为TimeSpan
将ts变暗为新的时间跨度(0)
如果imgToken什么都不是那么
返回ts
如果结束
如果DateTime.Now>imgToken.Expiry则
返回ts
其他的
ts=imgToken.expiration-DateTime.Now
返回ts
如果结束
端函数
公共函数IsTokenValid()为布尔值
如果imgToken什么都不是那么
返回错误
如果结束
如果String.IsNullOrEmpty(imgToken.AcctUserName),那么
返回错误
如果结束
如果imgToken.IsExpired,则
返回错误
如果结束
返回真值
端函数
'目前,PIN码是通过呼叫应用程序设置的。有可能
'将登录馈送到imgUr以获取PIN
私有myPin作为字符串
公共WriteOnly属性Pin作为字符串
设置(值为字符串)
myPin=值
端集
端属性
'导航到网页。
'参见wb_DocumentCompleted以获取要删除的代码
'解析文档中的PIN
公共子请求PinBrowser(浏览器控制为WebBrowser)
如果不是这样的话
”“你不知道
Friend imgUR As imgurAPI
imgUR = New imgurAPI(<your Client ID>,<your secret code>)
' pass the app's WebBrowser Control
imgUR.RequestPinBrowser(wb)
' imgUrResults is an enum exposed by the class
Dim result As imgurAPI.imgUrResults = imgUR.RequestToken
' get token
Dim result As imgurAPI.imgUrResults = imgUR.RequestToken

' check result
If result = imgurAPI.imgUrResults.OK Then
    ' assumes the file exists
    imgUR.UploadImage("C:\Temp\London.jpg", False)
Else
    MessageBox.Show(String.Format("Error getting access token. Status:{0}",
        result.ToString))
End If
' wb is the control
Dim htmlDoc As System.Windows.Forms.HtmlDocument = wb.Document
Dim elP As System.Windows.Forms.HtmlElement = htmlDoc.GetElementById("pin")

If elP IsNot Nothing Then
    sPin = elP.GetAttribute("value")
    If String.IsNullOrEmpty(sPin) = False Then
       ' user has to push the button for `imgUR.Pin = tbPIN.Text`
       ' this is in case the HTML changes, the user can override
       ' and input the correct PIN
       Me.tbPIN.Text = sPin
    End If

End If
myimgUR.PIN = tbPinCode.Text
Public Sub New(clientID As String)
Function UploadImage(filename As String, 
                     Optional Anon As Boolean = False) As imgUrResults