C# 登录并在没有用户操作的情况下上传到 OneDrive

21

我目前正在开发一个Windows服务,用于检查和更新Excel文件,并将其上传到选定的云存储 - SharePoint或OneDrive。整个过程应该是完全自动化的,没有任何用户交互 - 所有必需的信息(用户名,密码等)都是配置文件的一部分。

除了OneDrive部分外,一切顺利。我无法找到一个完全自动化的解决方案来登录并上传到这个云存储。我知道Microsoft Live SDK,但它对非WinPhone和-WinStore应用程序的支持有所减少,而且据我所知,它总是需要用户输入用户名、密码(Web浏览器组件)。

第二个选项是SkyDriveClientAPI(链接在此处),但是这个API不再起作用(如问题中所述)。

是否有办法在没有用户交互的情况下使用Live SDK,或者您有其他建议的不同方式?


2
PowerShell可以使用以下代码实现:$OneDrivePath = "C:\Users\me\SkyDrive"; Add-Content $pth $line; 由于PowerShell可以轻松转换为C#.exe程序,并且可以在本地访问OneDrive文件夹,因此我认为它可以无问题地工作。 - gooly
感谢您的建议。如果我理解正确,本地“共享”OneDrive文件夹和自动同步的想法很有趣。我认为不需要使用PowerShell,只需将文件复制到共享文件夹即可,但我不确定我的项目负责人是否会对此解决方案感到满意,但我想说,总比没有好。非常感谢! - TheUlderico
在OneDrive文件夹中用鼠标右键单击文件,然后就会出现一个菜单以获取更多信息。 - gooly
1
@TheUlderico,关于这个问题有什么解决方案吗? - RajeshKdev
1
Live Connect基于OAuth2.0,它并不特定于Microsoft,但在此处有文档:http://msdn.microsoft.com/en-us/library/hh243647.aspx。始终存在一个用户代理程序,该用户代理程序会在循环中被要求进行可视提示。这实际上就是整个目的。它不需要一直停留在那里,但当需要访问令牌时,此用户代理程序必须与OAuth提供程序进行交互。然后,其他实体(例如服务)可以使用此令牌,但仅限于到期之前等情况。 - Simon Mourier
@TheUlderico,你有什么可以分享的可用代码吗? - userSteve
4个回答

6

这在一定程度上是可以实现的

正如其他答案中提到的,OneDrive需要用户认证,这使得完全自动化的解决方案不可能。

然而,一个几乎自动的解决方案是可能的,也就是说,可以创建一个应用程序,在第一次启动时需要用户进行一次单次登录,并且在登录后,用户需要对运行应用程序进行授权,从那时起,该应用程序将能够自动工作(上传、下载、创建文件夹、直接链接到已上传的文件等...),即使应用程序关闭并且机器重新启动,它也会继续工作。

唯一取消应用程序与OneDrive连接的方法是注销应用程序(可以自动完成)。

这可以通过使用LIVE sdk(桌面版)并遵循单一登录指南来实现,您很可能需要访问以下范围:

  • wl.basic
  • wl.signin
  • wl.skydrive_update
  • wl.offline_access

请查看OneDrive开发中心:

为了实现这种行为,我建议按照以下步骤进行操作:

使用示例构建基本演示应用程序后:

  • 增强您的应用程序以使用单一登录功能,
  • 增强您的应用程序以刷新其身份验证令牌(以避免会话超时等问题)

我已经尝试过几次使用Live SDK,但仍然没有找到解决我的问题的明确路径。此外,“应用程序和网站的单点登录”示例在Live SDK中也无法正常工作,而桌面应用程序对我来说也不太清晰。不管怎样,我正在努力解决这个问题。 - RajeshKdev
+1 和 +50 我认为你的回答和链接点亮了我的开发之路。感谢您的回复。 :) - RajeshKdev
只是为了明确,我之前已经做过这个,所以我保证它是可以完成的。 - Curious Guy
再次感谢您。如果您有任何样例,请与我分享。这对我会更有帮助。 - RajeshKdev
@RJK编辑了答案,指向一个非常好的示例,应该能让您快速上手。 - Curious Guy
谢谢,我会尝试这个例子并尽快回复您 :) - RajeshKdev

5

虽然已经晚了两年回答,但我认为这对未来的使用会有帮助。

一旦您注册了应用程序,您可以获取访问令牌 无需弹出窗口,请参见此帖子“使用OAuth REST API获取Microsoft Graph访问令牌”,其中介绍了如何获取令牌(以Postman示例为例)。 我根据这个Postman示例编写了以下代码:

使用C#语言获取无弹窗口访问令牌示例:

public async Task GetTokenAsync(string tenant, string clientId, string clientSecret, string username, string password)
{
    HttpResponseMessage resp;
    using (var httpClient = new HttpClient())
    {
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
        var req = new HttpRequestMessage(HttpMethod.Post, $"https://login.microsoftonline.com/{tenant}/oauth2/token/");
         req.Content = new FormUrlEncodedContent(new Dictionary<string, string>
         {
            {"grant_type", "password"},
            {"client_id", clientId},
            {"client_secret", clientSecret},
            {"resource", "https://graph.microsoft.com"},
            {"username", username},
            {"password", password}
         });

         resp = await httpClient.SendAsync(req);
         string content = await resp.Content.ReadAsStringAsync();
         var jsonObj = new JavaScriptSerializer().Deserialize<dynamic>(content);               
         string token = jsonObj["access_token"];                
         Console.WriteLine(token);
    }
}

一旦你拥有了令牌,就很容易签到。

3
你可以在这里找到关于他们API的信息:这里。微软的OneDrive真正致力于保护用户隐私和安全,因此平台上存在许多权限控制。他们真正强调不希望出现未被使用者允许的自动化/上传过程中的孤立文件或应用程序滥用情况。直接从他们API中澄清,他们明确的指导方针如下:
引用: 与OneDrive互动的应用程序准则 与OneDrive互动的应用程序必须符合以下原则:仅响应明确用户请求或选择将文件上传至OneDrive。您的应用程序必须始终确保用户有意选择将任何新数据保存到OneDrive。应用程序不能在没有用户明确选择上传这些文件的情况下自动上传文件至OneDrive。以下是一些符合标准的应用程序:
- 显示“上传至OneDrive”或“在OneDrive上共享”按钮的应用程序,用户必须在每次上传照片、视频、文档或其他文件之前单击该按钮。 - 需要用户首先点击“上传至OneDrive”按钮的文档编辑应用程序,以便该应用程序稍后可以在没有进一步用户交互的情况下保存该文档。
以下是一些不符合标准的应用程序:
- 自动将任何添加到用户设备上特定位置的文件上传至OneDrive的应用程序。 - 自动备份文件或文件夹至OneDrive的应用程序。
使用OneDrive做它擅长的事情。OneDrive包括高质量文档查看和编辑功能,以及创建和共享美丽相册的功能。如果可能,请让您的应用程序利用这些功能。不要破坏对OneDrive的信任。多年来,用户们已经信任OneDrive。保护这种信任至关重要,您的应用程序不得通过做出用户不期望的事情(特别是涉及数据隐私方面),从而破坏这种信任。以下是一些符合标准的应用程序:
- 将文档或照片上传至OneDrive,并将用户访问权限设置为默认。 - 警告用户,当他们向存储在OneDrive上的内容发送链接时,接收该链接的任何人都可以阅读相关文件。
以下是一个不符合标准的应用程序:
- 使OneDrive中所有共享文件默认公开访问,而未明确向用户传达此行为的应用程序。

上述摘录来自这里,直接关联到One Drive的API。

您可以通过使用共享的One Drive文件夹绕过用户流程,从而自动上传/同步数据。但需要注意的是,如果您在未明确告知用户“此文件将存储在您的共享文件中,并由One Drive上传”情况下使用File.MoveFile.Copy,则可能会违反条款。

您还需要担心与用户相关的权限/帐户以实施该方法。


通过使用共享的 OneDrive 文件夹,我同意这一点。否则,它将无法满足我的需求。就像在服务器中,我们不会使用共享的 OneDrive 文件夹。任何人都可以通过使用我们的应用程序提供其客户端 ID 和密钥代码来上传到其帐户,或者他们将文件上传到我们配置的 OneDrive。 - RajeshKdev

2
OneDrive提供了上传文件的API。但是在他们的指南中,其中一个限制是所有通过API上传的文件都必须由用户启动或接受使用。因此,您无法将文件作为完全自动化的过程上传到OneDrive。
因此,一种解决方案可能是如评论中所建议的那样,将文件复制到本地的OneDrive文件夹中,让OneDrive应用程序负责上传。

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - RajeshKdev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接