4

Google 脚本文档没有描述从作为 Web 应用程序发布的 Google Apps 脚本中检索客户端 IP 地址的任何方法。

可以这样做吗?

4

3 回答 3

6

客户端对已发布 Web 应用程序的访问是通过 Google 的代理进行的,因此任何获取客户端 IP 的尝试都将报告代理的 IP。

没有提供客户端 IP 的服务 API,但我们可以通过 HTML 服务使用外部 javascript 库。

这是一些改编自How to get client's IP address only using javascript?的演示代码?

代码.gs

function doGet(e) {
  return HtmlService.createHtmlOutputFromFile('getIp');
}

getIp.html

<script type="application/javascript">
  function getip(json){
    alert(json.ip); // alerts the ip address
  }
</script>
<script type="application/javascript" src="http://jsonip.appspot.com/?callback=getip"></script>

结果

在一项测试中,警报弹出216.191.234.70。查找该 IP:

截屏

那绝对不是我的IP地址。

结论:不,您无法使用 Google 脚本检索用户的公共 IP 地址。

于 2013-09-13T13:56:53.120 回答
1

以下代码将返回用户的 ip:

getIp.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">

  </head>
  <body>

<p id="ip"></p>
 <script type="text/javascript">
  var userip;
</script>

<script type="text/javascript" src="https://l2.io/ip.js?var=userip"></script>

<script type="text/javascript">
  document.write("Your IP is :", userip);
</script>
  </body>
</html>

代码.js

function doGet(e) {
  return HtmlService.createHtmlOutputFromFile('getIp');
}
于 2017-01-28T01:18:28.953 回答
0

尽管您无法通过应用脚本直接获取任何客户端的 IP 地址,因为它必须通过 Google 代理,但有更好的方法可以通过一些开放的地理位置获取它apis

当使用开放的地理定位 API 时,客户端向这些 API 发送请求,然后返回有关该客户端的所有 ip 和位置详细信息的响应,这些信息可以以appscriptJSON 有效负载的形式推送到您的后端。

这是我使用 Axios 的方法:

const getData = async () => {
            axios.get("https://geolocation-db.com/json/").then(response => {
                axios({
                    method: "post",
                    url: process.env.REACT_APP_SHEETS_URI,
                    data: {
                        apiKey: process.env.REACT_APP_SHEETS_API_KEY,
                        operationType: process.env.REACT_APP_UPDATE_WEBSITE_PING,
                        operationData: response.data,
                    },
                    headers: {
                        "Content-Type": "text/plain;charset=utf-8",
                    },
                })
                    .then(function () {})
                    .catch(function (error) {
                        console.log("Error Occured = ", error);
                    });
            });
        };

这是我处理请求的 appscript 代码:

const doPost = (request = {}) => {
  const { _, postData: { contents, type } = {} } = request;
  let query = {};
  if (type === 'application/json') {
    query = JSON.parse(contents);

  }

  else if (type === 'application/x-www-form-urlencoded') {
    
    contents
      .split('&')
      .map((input) => input.split('='))
      .forEach(([key, value]) => {
        query[decodeURIComponent(key)] = decodeURIComponent(value);

      });
  }
  else if(type === "text/plain")
  {
    let jsonContent = "Error, Not Able to Parse";
  try {
    query = JSON.parse(contents);
  }

  catch(e) {
  return ContentService.createTextOutput(JSON.stringify(
                                          {
                                            error: true, 
                                            request: "Invalid JSON Request",
                                            msg: "Unable to Parse JSON",
                                            type: type,
                                            requestBody: contents,
                                            requestBodyDecoded: jsonContent

                                        })).setMimeType(ContentService.MimeType.JSON);
  }
  }
  else
  return ContentService.createTextOutput(JSON.stringify(
                                          {
                                            error: true, 
                                            request: "Invalid Request: Can't Identify the Type",
                                            msg: "Unknown Request Type",
                                            type: type

                                        })).setMimeType(ContentService.MimeType.JSON);



  const operationType = query.operationType;

    if(operationType === undefined)
    return ContentService.createTextOutput(JSON.stringify(
    {
      error: false, 
      queryOpsType: "undefined"
  })).setMimeType(ContentService.MimeType.JSON);

  else
  {
    const operationData = query.operationData;
    const response = handleRequestBasedonOperation(operationType,operationData);
    return ContentService.createTextOutput(JSON.stringify(
    {
      error: false, 
      msg: response.msg,
      fullResponse: JSON.stringify(response),
      queryOpsType: query.operationType
  })).setMimeType(ContentService.MimeType.JSON);
  }
  }

  else

  return ContentService.createTextOutput(JSON.stringify(
    {
      data: isAuthenticated.data,
      error: true, 
      //request: request,
      msg: query.apiKey,
      //paramters:request.parameters
  })).setMimeType(ContentService.MimeType.JSON);

在哪里handleRequestBasedonOperation处理操作,您可以选择将数据转储到 googleSheet 或您想要的任何其他位置。

于 2021-08-09T10:45:37.133 回答