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