.NET - 如何使用 OAuth2.0 和来自 Windows 服务的离线访问将视频上传到 YouTube
.NET - How to upload videos to YouTube using OAuth2.0 and Offline Access from a Windows Service
我正在使用从 Nuget 下载的 Youtube .Net 库。
我创建了一个 windows 服务,它正在检查一个文件夹以将新视频上传到 youtube。我使用控制台应用程序进行了测试,对于这种情况,用户必须在网络浏览器上手动进行授权,之后我可以毫无问题地将视频上传到 youtube。问题是当我尝试使用离线访问时。
因为我是 运行 我在 windows 服务上的代码,所以我无法从用户那里获得手动授权,所以我按照这个答案创建了我的访问令牌:
问题是我没有找到任何使用独立版本的代码示例,所以我有点迷路了。使用我当前的代码,我一直在尝试上传视频时遇到错误:"unauthorized_client"。您可以在我的代码 "client_secrets.json" 上看到的 JSON 文件是您在为 YouTube API V3.API 创建凭据时自动生成的文件。
我也试过这个:,但得到了同样的错误。
现在我没有从代码中刷新令牌,只是在 OAuth Playground 上进行并测试服务。一旦成功,我将研究如何使用每个查询刷新令牌。
创建凭据时,我选择了 "Other" 类型,因为这是一项 windows 服务。
是我的代码有问题还是我在配置上遗漏了什么?
这是我的代码:
var token = new TokenResponse()
{
AccessToken = "werwdsgfdg...",
ExpiresInSeconds = 3600,
RefreshToken = "3/dsdfsf...",
TokenType = "Bearer"
};
Log.Info("Generating user credentials and secrets");
UserCredential credential;
string credentialsPath = System.AppDomain.CurrentDomain.BaseDirectory + "client_secrets.json";
using (var stream = new FileStream(credentialsPath, FileMode.Open, FileAccess.Read))
{
credential = new UserCredential(new GoogleAuthorizationCodeFlow(
new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = GoogleClientSecrets.Load(stream).Secrets,
Scopes = new[] { YouTubeService.Scope.YoutubeUpload }
}
), EsSettings.YoutubeUser, token);
}
Log.Info("Generating youtube service");
//GoogleAuthorizationCodeFlow
YouTubeService youtubeService = new YouTubeService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = Assembly.GetExecutingAssembly().GetName().Name
});
Log.Info("Uploading...");
using (var fileStream = new FileStream(filePath, FileMode.Open))
{
var videosInsertRequest = youtubeService.Videos.Insert(video, "snippet,status", fileStream, "video/*");
videosInsertRequest.ProgressChanged += videosInsertRequest_ProgressChanged;
videosInsertRequest.ResponseReceived += videosInsertRequest_ResponseReceived;
await videosInsertRequest.UploadAsync();
}
Error:"unauthorized_client"
表示您发送的客户端id没有经过用户认证。
你得到这个的原因是因为你正在这样做
Right now I'm not refreshing the token from code, just doin it on the OAuth Playground and testing the service. Once it worked I'll research about how refresh the token with every query.
令牌与客户端相关联。您的 client_secrets.json 文件包含您的客户端,但您从 oauth playground 中获取的令牌与该客户端无关。
您应该 运行 您的代码在您自己的机器上验证一次。检查可在您的 %appData%
文件夹中找到的凭据文件以获取访问令牌和刷新令牌,然后将它们发送到您的令牌。
这是文件应包含的内容。
{
"access_token":"ya29.4wEk2VsbqiPfR4oH5WaYo7aYgAmlP2KSIl-heyDnPBBHMYYKnfU6YuQ-_RsDofD8QR1T",
"token_type":"Bearer",
"expires_in":3600,
"refresh_token":"1/PSvxzxGB-3XU8bF2SrG6llzO-ZizE4mftrd9Edqbubg",
"Issued":"2015-09-03T11:43:47.681+02:00"
}
您可以在此处阅读有关文件创建方式的信息FileDatastore
我正在使用从 Nuget 下载的 Youtube .Net 库。
我创建了一个 windows 服务,它正在检查一个文件夹以将新视频上传到 youtube。我使用控制台应用程序进行了测试,对于这种情况,用户必须在网络浏览器上手动进行授权,之后我可以毫无问题地将视频上传到 youtube。问题是当我尝试使用离线访问时。
因为我是 运行 我在 windows 服务上的代码,所以我无法从用户那里获得手动授权,所以我按照这个答案创建了我的访问令牌:
问题是我没有找到任何使用独立版本的代码示例,所以我有点迷路了。使用我当前的代码,我一直在尝试上传视频时遇到错误:"unauthorized_client"。您可以在我的代码 "client_secrets.json" 上看到的 JSON 文件是您在为 YouTube API V3.API 创建凭据时自动生成的文件。
我也试过这个:
现在我没有从代码中刷新令牌,只是在 OAuth Playground 上进行并测试服务。一旦成功,我将研究如何使用每个查询刷新令牌。
创建凭据时,我选择了 "Other" 类型,因为这是一项 windows 服务。
是我的代码有问题还是我在配置上遗漏了什么?
这是我的代码:
var token = new TokenResponse()
{
AccessToken = "werwdsgfdg...",
ExpiresInSeconds = 3600,
RefreshToken = "3/dsdfsf...",
TokenType = "Bearer"
};
Log.Info("Generating user credentials and secrets");
UserCredential credential;
string credentialsPath = System.AppDomain.CurrentDomain.BaseDirectory + "client_secrets.json";
using (var stream = new FileStream(credentialsPath, FileMode.Open, FileAccess.Read))
{
credential = new UserCredential(new GoogleAuthorizationCodeFlow(
new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = GoogleClientSecrets.Load(stream).Secrets,
Scopes = new[] { YouTubeService.Scope.YoutubeUpload }
}
), EsSettings.YoutubeUser, token);
}
Log.Info("Generating youtube service");
//GoogleAuthorizationCodeFlow
YouTubeService youtubeService = new YouTubeService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = Assembly.GetExecutingAssembly().GetName().Name
});
Log.Info("Uploading...");
using (var fileStream = new FileStream(filePath, FileMode.Open))
{
var videosInsertRequest = youtubeService.Videos.Insert(video, "snippet,status", fileStream, "video/*");
videosInsertRequest.ProgressChanged += videosInsertRequest_ProgressChanged;
videosInsertRequest.ResponseReceived += videosInsertRequest_ResponseReceived;
await videosInsertRequest.UploadAsync();
}
Error:"unauthorized_client"
表示您发送的客户端id没有经过用户认证。
你得到这个的原因是因为你正在这样做
Right now I'm not refreshing the token from code, just doin it on the OAuth Playground and testing the service. Once it worked I'll research about how refresh the token with every query.
令牌与客户端相关联。您的 client_secrets.json 文件包含您的客户端,但您从 oauth playground 中获取的令牌与该客户端无关。
您应该 运行 您的代码在您自己的机器上验证一次。检查可在您的 %appData%
文件夹中找到的凭据文件以获取访问令牌和刷新令牌,然后将它们发送到您的令牌。
这是文件应包含的内容。
{
"access_token":"ya29.4wEk2VsbqiPfR4oH5WaYo7aYgAmlP2KSIl-heyDnPBBHMYYKnfU6YuQ-_RsDofD8QR1T",
"token_type":"Bearer",
"expires_in":3600,
"refresh_token":"1/PSvxzxGB-3XU8bF2SrG6llzO-ZizE4mftrd9Edqbubg",
"Issued":"2015-09-03T11:43:47.681+02:00"
}
您可以在此处阅读有关文件创建方式的信息FileDatastore