首页 > 解决方案 > Google Script 是否有等效于 python 的 Session 对象?

问题描述

我有这个 python 脚本,我想获得等效的谷歌脚本,但我不知道如何“传递”登录后下一次获取或发布请求之间需要传递的任何内容。

import requests
import json

# login
session = requests.session()
data = {
    'LoginName': 'name',
    'Password': 'password'
}
session.post('https://www.web.com/en-CA/Login/Login', data=data)
session.get('https://www.web.com//en-CA/Redirect/?page=Dashboard')


# get customer table
data = {
    'page': '1',
    'pageSize': '100'
}
response = session.post('https://www.web.com/en-CA/Reporting', data=data)
print(response.json())

我想知道 python 的 requests 模块中是否有一个等价的.session()对象。我确实搜索了谷歌,但找不到任何工作示例。我不是编码员,所以我完全知道 .session() 对象确实如此。发出新请求时从响应中传递标头就足够了吗?

更新 我读到了其他一些问题,谷歌可能会为每个UrlFetchApp.fetch不同的 IP 使用,所以登录和 cookie 可能不起作用,我猜。

标签: sessiongoogle-apps-scripthttp-headers

解决方案


我相信你的目标如下。

  • 您想使用 Google Apps Script 实现您的 python 脚本。

问题和解决方法:

如果我的理解是正确的,当session()使用python时,可以通过保留cookie来实现多个请求。例如,为了使用 Google Apps 脚本实现这种情况,我认为 cookie 在第一次请求时检索,检索到的 cookie 包含在第二次请求的请求标头中。因为,在现阶段,UrlFetchApp还没有办法直接保存cookie并用于下一个请求。

从上述情况来看,当您的脚本转换为 Google Apps 脚本时,它变为如下。

示例脚本:

function myFunction() {
  const url1 = "https://www.web.com/en-CA/Login/Login";
  const url2 = "https://www.web.com//en-CA/Redirect/?page=Dashboard";
  const url3 = "https://www.web.com/en-CA/Reporting";
  
  // 1st request
  const params1 = {
    method: "post",
    payload: {LoginName: "name", Password: "password"},
    followRedirects: false
  }
  const res1 = UrlFetchApp.fetch(url1, params1);
  const headers1 = res1.getAllHeaders();
  if (!headers1["Set-Cookie"]) throw new Error("No cookie");

  // 2nd request
  const params2 = {
    headers: {Cookie: JSON.stringify(headers1["Set-Cookie"])},
    followRedirects: false
  };
  const res2 = UrlFetchApp.fetch(url2, params2);
  const headers2 = res2.getAllHeaders();

  // 3rd request
  const params3 = {
    method: "post",
    payload: {page: "1", pageSize: "100"},
    headers: {Cookie: JSON.stringify(headers2["Set-Cookie"] ? headers2["Set-Cookie"] : headers1["Set-Cookie"])},
    followRedirects: false
  }
  const res3 = UrlFetchApp.fetch(url3, params3);
  console.log(res3.getContentText())
}
  • 通过这个示例脚本,可以从第一个请求中检索 cookie,检索到的 cookie 可以用于下一个请求。
  • 不幸的是,我没有关于您的实际服务器的信息,也无法测试您的实际 URL。所以我不确定这个示例脚本是否直接适用于您的服务器。
  • 而且,我不确定是否followRedirects: false需要在每个请求中包含。所以当出现错误时,请将其删除并重新测试。
  • 关于将cookie包含到请求头的方法,JSON.stringify可能不需要使用。但是,对于您的服务器,我不确定这一点。

参考:


推荐阅读