使用手机信号塔信息的 Google 地理定位 - Curl 400 错误请求 PHP

2023-12-01

我正在尝试使用以下方法从手机信号塔信息中获取纬度和经度谷歌的地理定位 API。 它需要一个有效的 JSON,其中包含 MCC、MNC、cellId、lac 等信息。我的 PHP post 请求如下所示。

<?php
header("Access-Control-Allow-Origin: *");

$mcc = $_POST["mcc"];
$mnc = $_POST["mnc"];
$cellId = $_POST["cellId"];
$lac = $_POST["lac"];

$post_array = array(
                "cellId" => (int) $cellId,
                "locationAreaCode" => (int) $lac,
                "mobileCountryCode" => (int) $mcc,
                "mobileNetworkCode" => (int) $mnc,
            );

$post_data = json_encode(array('cellTowers' => array($post_array)));

echo $post_data;


$url = "https://www.googleapis.com/geolocation/v1/geolocate?key=".$api_key; // not including api key here but its there in my code

$ch = curl_init();
curl_setopt_array($ch, array(
    CURLOPT_URL => $url,
    CURLOPT_POST => true,
    CURLOPT_HEADER => false,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_SSL_VERIFYHOST => 2,
    CURLOPT_HTTPHEADER => array(
        'Content-Type: application/json'
    ),
    CURLOPT_POSTFIELDS => $post_data
));
$result = curl_exec($ch);

echo "Result: ".$result;

curl_close($ch);

?>

但是我收到一条错误消息,指出响应中的请求错误。错误如下所示。

Result: {
 "error": {
  "errors": [
   {
    "domain": "geolocation",
    "reason": "invalidRequest",
    "message": "Bad Request"
   }
  ],
  "code": 400,
  "message": "Bad Request"
 }
}

我认为我的 JSON 格式不正确,但它正在使用以下命令行执行,所以这不是问题。

$ curl -d @your_filename.json -H "Content-Type: application/json" -i "https://www.googleapis.com/geolocation/v1/geolocate?key=API_KEY"

终端中的上述命令使用文件中的相同 JSON 正确给出纬度和经度。我究竟做错了什么 ?


Try this

    $DadosLBS['homeMobileCountryCode'] = $data['MCC'];
    $DadosLBS['homeMobileNetworkCode'] = $data['MNC'];
    $DadosLBS['radioType'] = 'gsm';
    $DadosLBS['carrier'] = $data['MNCOperator'];
    $DadosLBS['cellTowers'] = [
        [
            'mobileCountryCode' => $data['MCC'],
            'mobileNetworkCode' => $data['MNC'],
            'age' => $data['Age'],
            'timingAdvance' => $data['TA'],
            'locationAreaCode' => $data['LAC'],
            'cellId' => $data['CELL_ID'],
            'signalStrength' => $data['SIGNAL'],
        ],
    ];


        //Ver detalhes da API no https://developers.google.com/maps/documentation/geolocation/intro?hl=pt-br

    $service_url = "https://www.googleapis.com/geolocation/v1/geolocate";

    //Chave de acesso
    $Curl_Data = array(
        'key' => <YOUR KEY HERE>
    );

    $CurlQueryString = http_build_query($Curl_Data);

    //Preparando o método a ser enviado os dados
    $Metodo = array(
        CURLOPT_URL         => $service_url.'?'.$CurlQueryString // Define URL to be called
    );

    //Criando s string de dados
    $DadosPost = json_encode($DadosLBS);

    //Preparando as opções padrões do CUrl
    $Curl_Adicional_Options = array(
        CURLOPT_CUSTOMREQUEST       => "POST"
        ,CURLOPT_POSTFIELDS         => $DadosPost
        ,CURLOPT_RETURNTRANSFER     => true              // return web page
        ,CURLOPT_CONNECTTIMEOUT     => 15               // time-out on connect
        ,CURLOPT_TIMEOUT            => 15               // time-out on response
        ,CURLOPT_FAILONERROR        => true             //
        ,CURLOPT_HEADER             => false            // don't return headers
        ,CURLOPT_HTTPHEADER         => array(
                                                'Content-Type: application/json',
                                                'Content-Length: ' . strlen($DadosPost)
                                       ) // Dados para o cabeçalho do post
        ,CURLOPT_FOLLOWLOCATION     => true             // follow redirects
        ,CURLOPT_MAXREDIRS          => 10               // stop after 10 redirects
        ,CURLOPT_SSL_VERIFYPEER     => false
        ,CURLOPT_SSL_VERIFYHOST     => false
    );

    $Curl_Options = array_replace_recursive($Metodo,$Curl_Adicional_Options);

    $cURLConn = curl_init();
    curl_setopt_array($cURLConn, $Curl_Options);

    $vDados['Curl']['Output']       = curl_exec($cURLConn);
    $vDados['Curl']['Error']        = curl_error($cURLConn);
    $vDados['Curl']['ErrorNum']     = curl_errno($cURLConn);
    $vDados['Curl']['ErrorMsg']     = curl_strerror($vDados['Curl']['ErrorNum']);
    $vDados['Curl']['Info']         = curl_getinfo($cURLConn);

    curl_close($cURLConn);

    if ($vDados['Curl']['ErrorNum'] != 0) {
        $Dados['loc'] = array(
            'status' => 'ERROR',
            'error' => array(
                'error_cod' => $vDados['Curl']['ErrorNum'],
                'error_msg' => $vDados['Curl']['ErrorMsg']
            )
        );
        return $Dados['loc'];
    }

    //Tratando as respostas
    $vDados['Curl']['Dados'] = json_decode($vDados['Curl']['Output']) or die("Error: Cannot create object");

    print_r($vDados['Curl']['Dados']);

不要忘记在谷歌控制台上创建我们的密钥。

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

使用手机信号塔信息的 Google 地理定位 - Curl 400 错误请求 PHP 的相关文章

随机推荐

  • Java 中是否有与 GetCompressedFileSize 等效的方法?

    我希望获得 Java 中稀疏文件的准确测量 即磁盘上的实际大小 而不是包含所有 0 的正常大小 在 Windows 上的 C 中 人们会使用GetCompressedFileSize 我还没有遇到过如何在 Java 中做到这一点 如果没有直
  • 无法使用 WebClient.DownloadFile 方法从启用了 TLS 1.1/1.2 协议的计算机下载文件

    我正在尝试实现一个简单的控制台应用程序 以通过 TLS 1 1 1 2 协议使用 Webclient DownloadFile 方法下载文件 这是应用程序的代码 var downloadUrl https serverURL com sam
  • 为什么这个小函数(在opengl中画一个圆)不能在c中编译?

    我正在用 c for linux 中的 opengl 做一些实验 我有以下函数 可以根据这些参数绘制一个圆 我已经包括了 include
  • 什么寄存器指向堆?

    我刚刚学完 ARM 架构 汇编 如果 SP 寄存器保存要放入数据的下一个内存位置的地址 那么什么保存堆的地址 例如 在 C 中 如果您在堆上声明一个对象 例如MyObj example new MyObj 程序集会是什么样子 从某种意义上说
  • 算法 - 网格中的警察和小偷(N*N)

    问题陈述 给定 N N 矩阵 矩阵中的每个单元格包含警察或小偷 找出被警察逮捕的小偷数量 一名警察只能逮捕一名小偷 警察可以逮捕同一排的小偷 警察可以在K范围内逮捕小偷 例如 如果K为1 则3号牢房的警察只能在2号和4号牢房逮捕小偷 Inp
  • AVCAPTURE 图像方向

    I have a view controller which allows a user to take a picture I am setting the avcapture bounds to be the bounds of a v
  • 将 ImageView 从 alpha 0 动画到 1

    我有一个 imageView 我想以不可见的方式启动 单击某个按钮后 我想要将图像动画化到视图中 然后我希望它保持 alpha 1 我该怎么做 到目前为止还没有运气 如果我在 xml 中将 alpha 设置为 0 那么我将永远看不到图像 如
  • 为什么 PocketSphinx Android 演示需要 cygwin

    我正在尝试在 android 中开发一个语音识别程序 到目前为止我发现最流行的选择似乎是 CMU sphinx pocketsphinx 用于 android 据我了解 CMU Sphinx 的源代码是用 Java 提供的 可以在计算机上运
  • 更改导航栏的高度 iOS Swift

    我正在尝试更改我的应用程序的导航栏的高度 目前高度固定为 44 我可以从 Xcode 更改宽度 但不能更改高度 我不知道如何改变这一点 对 iOS 开发非常陌生 有人可以帮忙吗 只需将其拖放到我的视图中即可 在这种情况下 最简单的方法就是施
  • 如何在 Java 中用另一个 JPanel 替换两个 JPanel 之一?

    我为欢迎屏幕设计了一个界面 其中一个 JFrame 包含两个 JPanel JPanel1 在右侧 JPanel2 在左侧 左边的按钮是切换JPanel1 中的Panel 我想按一个按钮将 JPanel1 内容替换为另一个 JPanel 但
  • Android AlarmManager 重启后

    我有一组警报需要在重新启动后保留 我尝试在启动接收器上使用 但它们不会再次启动 我不确定我是否理解启动接收器以及如何重新启动所有警报 我已经有一个通知接收器 但不知道是否可以使用同一接收器 或者是否需要一个新的接收器 有人可以向我指出任何好
  • 如何在运行时替换 Objective-C 2.0 类方法实现

    我已经使用了 class replaceMethod 函数 它适用于实例方法 但它不适用于类方法替换 有谁知道为什么以及我应该做什么来替换类方法实现 如果你有一个Class 我们称之为MyClass 那么你必须获取它的元类来操作类方法 换句
  • 如何对 React-Redux 连接的组件进行单元测试?

    我使用 Mocha Chai Karma Sinon Webpack 进行单元测试 我点击此链接为 React Redux 代码配置测试环境 如何使用 Karma Babel 和 Webpack 在 React 上实现测试 代码覆盖率 我可
  • 条件检查Where子句

    我有一个过程 其中以下条件将写入 WHERE 子句中 我怎么做 itemid 是一个参数 可以为空 如果 itemid 可用 则将其添加到我的 where 子句中 否则什么都不做 有些人使用这种技术 WHERE itemid IS NULL
  • 正则表达式:如何不替换任何 html 标签中的特定单词?

    假设我有这样的文本 This is a great test We re testing something awesome Click here to a href whatever test it a 我想为 test 一词添加一些颜色
  • mysql 选择 a 和 b 之间的时间戳返回全部或 0 时间戳

    试过这个 select from table where timestamp field between 1330560000 and 1336170420 and this select from table where timestam
  • Alfresco Maven SDK - 如果模块版本字符串以“-SNAPSHOT”结尾则失败

    因此 我创建了一个 amp 项目 包括存储库和共享 每次我尝试构建或运行该项目时都会失败 java lang NoClassDefFoundError de schlichtherle truezip fs FsSyncExceptionB
  • 星号点击通话

    也许你们中的一些人可能知道如何实现这一目标 我想要这样的东西 单击链接 按钮 我的电话响了 我接起 Asterisk 帮我拨打号码 收件人电话铃声响起 我正在使用星号1 2 我尝试过dial out 但我只能向一侧打电话 提前致谢 您可以使
  • 如何序列化多个模型对象?

    我正在使用 Django Rest Framework 创建一个 API 它需要来自多个模型的数据 我的要求得到了很多答案 但它不起作用 我的模型如下 class Task models Model title models CharFie
  • 使用手机信号塔信息的 Google 地理定位 - Curl 400 错误请求 PHP

    我正在尝试使用以下方法从手机信号塔信息中获取纬度和经度谷歌的地理定位 API 它需要一个有效的 JSON 其中包含 MCC MNC cellId lac 等信息 我的 PHP post 请求如下所示