Google 脚本文档没有描述从作为 Web 应用程序发布的 Google Apps 脚本中检索客户端 IP 地址的任何方法。
可以这样做吗?
客户端对已发布 Web 应用程序的访问是通过 Google 的代理进行的,因此任何获取客户端 IP 的尝试都将报告代理的 IP。
没有提供客户端 IP 的服务 API,但我们可以通过 HTML 服务使用外部 javascript 库。
这是一些改编自How to get client's IP address only using javascript?的演示代码?
function doGet(e) {
return HtmlService.createHtmlOutputFromFile('getIp');
}
<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 地址。
以下代码将返回用户的 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');
}
尽管您无法通过应用脚本直接获取任何客户端的 IP 地址,因为它必须通过 Google 代理,但有更好的方法可以通过一些开放的地理位置获取它apis
。
当使用开放的地理定位 API 时,客户端向这些 API 发送请求,然后返回有关该客户端的所有 ip 和位置详细信息的响应,这些信息可以以appscript
JSON 有效负载的形式推送到您的后端。
这是我使用 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 或您想要的任何其他位置。