SSIS 使用 OAuth2 将 Python 脚本执行进程任务到 API - 使用保存的令牌访问被拒绝的文件

2023-12-05

我有奇怪的问题,不知道要进一步检查什么。

情况概要:

  • 以管理员身份在 Windows Server 2016 上工作,因此不应有任何访问问题
  • 开发了一些Python脚本,用于从Google Analytics获取数据,作为基础这个例子(但仅从一个帐户获取数据并且仅获取一个时间间隔的数据)
  • 脚本成功运行:API执行代码第一次在浏览器中打开GA网站,请求授权并批准API连接,创建analytics.dat内部包含存储连接令牌的文件
  • 之后所有接下来的脚本执行都成功从 GA 获取信息并将其保存在文件中
  • 但是当我尝试将相同的脚本执行添加到 SSIS 包中时Execute Process Task步骤并执行该步骤(Visual Studio 在相同的管理员帐户下使用相同的活动 Windows 会话打开) - 它再次请求网站上的授权,成功授权后我看到The authentication flow has completed浏览器中出现消息,关闭它,但得到Python脚本执行的错误:

C:\Program Files (x86)\Microsoft SQL Server\110\DTS\binn>C:\Python27\python.exe C:\BI\API\Python_GoogleAnalytics_Reporting\v3_api_analytics\google_analytics_api_v3_10krows_nosampling_multiple_profiles.py C:\ Python27 \ lib \ site-packages \ oauth2client_helpers.py:255: 用户警告:无法访问analytics.dat:没有这样的文件或目录
warnings.warn(_MISSING_FILE_MESSAGE.format(文件名))

您的浏览器已打开,可以访问:

https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fanalytics.readonly&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2F&response_type=code&client_id=xxx.apps.googleusercontent.com&access_type=offline

如果您的浏览器位于不同的计算机上,则退出并重新运行此命令 带有命令行参数的应用程序

--noauth_local_webserver

回溯(最近一次调用最后一次):文件 “C:\ BI \ API \ Python_GoogleAnalytics_Reporting \ v3_api_analytics \ google_analytics_api_v3_10krows_nosampling_multiple_profiles.py”, 第 172 行,在 如果name == 'main':主(sys.argv)文件“C:\ BI \ API \ Python_GoogleAnalytics_Reporting \ v3_api_analytics \ google_analytics_api_v3_10krows_nosampling_multiple_profiles.py”, 第 54 行,主要 范围='https://www.googleapis.com/auth/analytics.readonly')
文件“C:\Python27\lib\site-packages\googleapiclient\sample_tools.py”,行 93、在初始化中 凭证=tools.run_flow(流、存储、标志)
文件“C:\Python27\lib\site-packages\oauth2client_helpers.py”,第 133 行,位于 位置包装器 返回包裹(*args,**kwargs)
文件“C:\Python27\lib\site-packages\oauth2client\tools.py”,第 247 行,位于 运行流程 存储.put(凭证)
文件“C:\Python27\lib\site-packages\oauth2client\client.py”,第 421 行,位于 放 self.locked_put(凭证)
文件“C:\Python27\lib\site-packages\oauth2client\file.py”,第 83 行,位于 锁定_投入 self._create_file_if_needed()
文件“C:\Python27\lib\site-packages\oauth2client\file.py”,第 70 行,位于 如果需要则创建文件 open(self._filename, 'a+b').close() IOError: [Errno 13] 权限被拒绝: 'analytics.dat'

  • 我尝试删除该文件analytics.dat- 但之后出现同样的错误。
  • 我通过以下方式执行了Python脚本.bat里面有命令的文件C:\Python27\python.exe C:\BI\API\Python_GoogleAnalytics_Reporting\v3_api_analytics\google_analytics_api_v3_10krows_nosampling_multiple_profiles.py。执行.bat本身工作正常,但执行相同.bat来自 SSIS 包作为Execute Process Task步骤 - 返回上述错误
  • 另外,之前也遇到过同样的问题必应广告 API。但我通过在代码中注释掉行并将更新后的令牌信息重新写入文件来临时修复了这个问题:在 Bing Ads 中,它在过期之前很长时间有效。但在 GA API 中,文件中的令牌会在 1 小时后过期,之后需要覆盖该文件。
  • 另外,我尝试在脚本中添加一些打印,以显示在 Visual Studio 中的 SSIS 包中执行哪个服务帐户脚本(使用print(os.getlogin())) - 但正如预期的那样,它显示了我在服务器上工作的相同管理员帐户...

所以,我不明白,为什么我会收到这样的访问被拒绝的文件,并保存令牌问题...... 在文件的属性中,所有者是同一个 Windows 管理员帐户,在其会话下,我打开 Visual Studio 来执行 DTSX 包中的步骤。

您能帮我找出问题所在吗?


我发现了问题。这和它的属性有关Execute Process TaskSSIS包的步骤...

正如我在上面注意到的,我通过以下方式执行了 Python 脚本.bat文件内包含命令:C:\Python27\python.exe C:\BI\API\Python_GoogleAnalytics_Reporting\v3_api_analytics\google_analytics_api_v3_10krows_nosampling_multiple_profiles.py。 执行.bat本身工作得很好,但执行相同.bat来自 SSIS 包作为Execute Process Task步骤 - 返回上述错误。

在开头的错误日志中我们看到:

C:\Program Files (x86)\Microsoft SQL Server\110\DTS\binn> C:\Python27\python.exe C:\BI\API\Python_GoogleAnalytics_Reporting\v3_api_analytics\google_analytics_api_v3_10krows_nosampling_multiple_profiles.py

C:\ Python27 \ lib \ site-packages \ oauth2client_helpers.py:260:UserWarning:无法访问analytics.dat:没有这样的文件或目录

warnings.warn(_MISSING_FILE_MESSAGE.format(文件名))

最初说的是没有文件analytics.dat在脚本的工作文件夹中。 但我预计,该脚本会在它所在的同一文件夹中执行,并且已经存在文件C:\BI\API\Python_GoogleAnalytics_Reporting\v3_api_analytics\analytics.dat

但后来我注意到,在那条消息的第一个地方(我将其标记为bold)是外部脚本执行的工作文件夹,脚本在SSIS文件夹中启动。

I found,当进程从 SSIS 启动时,它不会从与可执行文件相同的文件夹中运行.bat文件位于。 和直接有什么区别.bat文件执行。

因此,有必要另外指定工作文件夹属性Execute Process TaskSSIS 包的步骤。

我设置这样的属性值:

Working directory: C:\BI\API\Python_GoogleAnalytics_Reporting\v3_api_analytics\ enter image description here

一切都很好!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SSIS 使用 OAuth2 将 Python 脚本执行进程任务到 API - 使用保存的令牌访问被拒绝的文件 的相关文章

随机推荐