我也必须经历这个,一开始并不了解太多,所以我很乐意帮助解释。以下是答案,但请随时要求澄清。基本上,您需要首先运行一个需要手动干预的脚本 - 这可以让您从 Google 获取访问令牌,然后您的批处理脚本可以反复使用该令牌,而无需人工干预。因此,一开始你必须克服一些困难,但一旦完成,一切就都准备好了。所以:
- 选择“网络应用程序”。不直观,但它会起作用。
1b.系统会要求您配置“同意屏幕”。你在这里放什么并不重要——只要给项目一个标题即可。
1c.对于“重定向 uri”,删除提供的“example.com”值并输入“https://developers.google.com/oauthplayground”。
忽略 JSON 和 P12 键;它们适用于其他类型的应用程序。填写上述信息并单击“创建客户端 ID”后,您将看到一个显示客户端 ID 和客户端密钥的页面(暂停后)。这是您在下面的代码中需要的两个字符串。
下面的代码本质上与您上面链接的解决方案相同(我非常依赖它),但我对其进行了编辑以更改一些内容,主要是为了提供有关正在发生的情况的更多信息。将客户端 ID 和客户端密钥添加到下面的代码后,运行它。然后您将执行以下步骤:
- 复制脚本打印出的 URL,并将其粘贴到浏览器中。
- 如果 Google 要求您登录,请登录。然后单击下一页上的“允许访问”。
- 在浏览器的下一个页面上,左侧将有一个标有“授权代码”的框。 (像这样:https://members.orcid.org/sites/default/files/image06.png https://members.orcid.org/sites/default/files/image06.png但您的授权码会更长。)Don't单击代码下方的按钮,但一定要复制该字符串,并确保获得整个内容(可能会在对话框中超出视线)。
- 返回运行脚本的终端,然后粘贴您复制的代码。
如果一切顺利,脚本将将该代码交换为访问令牌,并将该令牌保存在磁盘上。然后您的批处理脚本可以重复使用该令牌。
这是完成所有这些操作的扩展代码:
#!/usr/bin/perl
# Code to get a web-based token that can be stored
# and used later to authorize our spreadsheet access.
# Based on code from https://gist.github.com/hexaddikt/6738162
#-------------------------------------------------------------------
# To use this code:
# 1. Edit the lines below to put in your own
# client_id and client_secret from Google.
# 2. Run this script and follow the directions on
# the screen, which will give step you
# through the following steps:
# 3. Copy the URL printed out, and paste
# the URL in a browser to load the page.
# 4. On the resulting page, click OK (possibly
# after being asked to log in to your Google
# account).
# 5. You will be redirected to a page that provides
# a code that you should copy and paste back into the
# terminal window, so this script can exchange it for
# an access token from Google, and store the token.
# That will be the token the other spreadsheet access
# code can use.
use Net::Google::DataAPI::Auth::OAuth2;
use Net::Google::Spreadsheets;
use Storable; #to save and restore token for future use
use Term::Prompt;
# Provide the filename in which we will store the access
# token. This file will also need to be readable by the
# other script that accesses the spreadsheet and parses
# the contents.
my $session_filename = "stored_google_access.session";
# Code for accessing your Google account. The required client_id
# and client_secret can be found in your Google Developer's console
# page, as described in the detailed instruction document. This
# block of code will also need to appear in the other script that
# accesses the spreadsheet.
# Be sure to edit the lines below to fill in your correct client
# id and client secret!
my $oauth2 = Net::Google::DataAPI::Auth::OAuth2->new(
client_id => 'your_client_id.apps.googleusercontent.com',
client_secret => 'your_client_secret',
scope => ['http://spreadsheets.google.com/feeds/'],
redirect_uri => 'https://developers.google.com/oauthplayground',
);
# We need to set these parameters this way in order to ensure
# that we get not only an access token, but also a refresh token
# that can be used to update it as needed.
my $url = $oauth2->authorize_url(access_type => 'offline',
approval_prompt => 'force');
# Give the user instructions on what to do:
print <<END
The following URL can be used to obtain an access token from
Google.
1. Copy the URL and paste it into a browser.
2. You may be asked to log into your Google account if you
were not logged in already in that browser. If so, go
ahead and log in to whatever account you want to have
access to the Google doc.
3. On the next page, click "Accept" when asked to grant access.
4. You will then be redirected to a page with a box in the
left-hand column labeled "Authorization code".
Copy the code in that box and come back here.
Here is the URL to paste in your browser to get the code:
$url
END
;
# Here is where we get the code from the user:
my $code = prompt('x', 'Paste the code obtained at the above URL here: ', '', '');
# Exchange the code for an access token:
my $token = $oauth2->get_access_token($code) or die;
# If we get to here, it worked! Report success:
print "\nToken obtained successfully!\n";
print "Here are the token contents (just FYI):\n\n";
print $token->to_string, "\n";
# Save the token for future use:
my $session = $token->session_freeze;
store($session, $session_filename);
print <<END2
Token successfully stored in file $session_filename.
Use that filename in your spreadsheet-access script to
load the token as needed for access to the spreadsheet data.
END2
;
一旦您开始工作并将令牌存储在磁盘上,那么批处理脚本的开头就可以设置电子表格访问,如下所示:
use Net::Google::Spreadsheets;
use Net::Google::DataAPI::Auth::OAuth2;
use Net::OAuth2::AccessToken;
use Storable;
# Authentication code based on example from gist at
# https://gist.github.com/hexaddikt/6738247
# Get the token that we saved previously in order to authenticate:
my $session_filename = "stored_google_access.session";
# Be sure to edit the lines below to fill in your correct client
# id and client secret!
my $oauth2 = Net::Google::DataAPI::Auth::OAuth2->new(
client_id => 'your_client_id.apps.googleusercontent.com',
client_secret => 'your_client_secret',
scope => ['http://spreadsheets.google.com/feeds/'],
redirect_uri => 'https://developers.google.com/oauthplayground',
);
# Deserialize the file so we can thaw the session and reuse the refresh token
my $session = retrieve($sessionfile);
my $restored_token = Net::OAuth2::AccessToken->session_thaw($session,
auto_refresh => 1,
profile => $oauth2->oauth2_webserver,
);
$oauth2->access_token($restored_token);
# Now we can use this token to access the spreadsheets
# in our account:
my $service = Net::Google::Spreadsheets->new(
auth => $oauth2);