ixjdbxjs 2025-07-13 10:19 采纳率: 0%
浏览 13
已结题

汽车充电站即时的充电枪是否在使用的信息获取途径

您好,关于您这篇文章“关于高德地图及其APP获取地图数据的研究”

我现在遇到了和您一样的问题,因为充电站即时的充电枪信息只在手机app上有,且开放平台api无法获取相关数据,看到您的文章,但是并没有找到您给出的解决办法,所以前来询问一下,不知您可否告知一二

我需要获取的数据是:基于高德地图功能获取汽车充电站即时的充电枪是否在使用的信息。

我也有尝试过,但是最后反馈的超时报错一直存在,具体信息如下

首次执行时间: 2025-07-13 09:27:37
共读取到 1 个充电桩名称
正在爬取第 1/1: 新源恒远羊坊花园西院公共充电站
爬取失败: Message: An unknown server-side error occurred while processing the command. Original error: Could not proxy command to the remote server. Original error: timeout of 240000ms exceeded
Stacktrace:
UnknownError: An unknown server-side error occurred while processing the command. Original error: Could not proxy command to the remote server. Original error: timeout of 240000ms exceeded
    at UIA2Proxy.command (C:\Users\17716\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\lib\jsonwp-proxy\proxy.js:359:13)
    at runNextTicks (node:internal/process/task_queues:65:5)
    at listOnTimeout (node:internal/timers:549:9)
    at processTimers (node:internal/timers:523:7)
    at AndroidUiautomator2Driver.doFindElementOrEls (C:\Users\17716\.appium\node_modules\appium-uiautomator2-driver\lib\commands\find.js:40:5)
    at doFind (C:\Users\17716\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\lib\commands\find.ts:47:17)
    at wrappedCondFn (C:\Users\17716\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\lib\basedriver\commands\timeout.ts:141:14)
    at spin (C:\Users\17716\AppData\Roaming\npm\node_modules\appium\node_modules\asyncbox\lib\asyncbox.js:219:20)
    at waitForCondition (C:\Users\17716\AppData\Roaming\npm\node_modules\appium\node_modules\asyncbox\lib\asyncbox.js:236:10)
    at AndroidUiautomator2Driver.implicitWaitForCondition (C:\Users\17716\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\lib\basedriver\commands\timeout.ts:143:12)
    at AndroidUiautomator2Driver.findElOrEls (C:\Users\17716\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\lib\commands\find.ts:70:5)
    at AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\17716\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\lib\basedriver\commands\find.ts:60:12)
    at AndroidUiautomator2Driver.findElement (C:\Users\17716\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\lib\basedriver\commands\find.ts:75:12)

  • 写回答

7条回答 默认 最新

  • 檀越@新空间 2025-07-13 10:20
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    您好!感谢您的提问。您提到的高德地图APP中无法通过开放平台API获取充电站实时充电枪状态信息,确实是一个普遍存在的问题。目前,高德地图并未开放其内部数据接口(如充电枪使用状态)供第三方调用,因此想要获取这类信息,需要采用其他方式。


    一、问题分析

    您遇到的错误信息是:

    timeout of 240000ms exceeded
    

    这表明您的爬虫程序在尝试访问高德地图APP时,长时间未收到响应,最终导致超时。这种现象通常出现在以下几种情况:

    • 高德地图APP对自动化工具进行了反爬机制
    • Appium等工具与高德地图APP不兼容
    • 网络延迟或服务器端限制

    二、解决方案

    1. 使用高德地图APP的官方API(如果存在)

    目前高德地图没有公开的API用于查询充电站实时状态。但您可以关注以下可能的途径:

    • 高德开放平台:查看是否有相关接口(如https://restapi.amap.com/v5/chargingstations
    • 开发者文档:访问高德开放平台官网,搜索“充电站”相关API。

    注意: 目前高德地图的API主要提供的是静态信息(如充电桩位置、名称),不包括实时使用状态


    2. 使用Appium进行APP自动化操作(若需强制读取APP内容)

    如果您坚持要通过模拟用户操作来获取充电站信息,可以尝试以下方法:

    ✅ 步骤说明:

    1. 安装并配置Appium环境

      • 安装Node.js、Appium Server、Android SDK
      • 使用Appium Inspector定位元素
    2. 编写脚本自动打开高德地图APP,进入充电站页面

    3. 抓取充电枪状态信息

    ✅ 示例代码(Python + Appium):

    from appium import webdriver
    import time
    
    # 配置设备和APP信息
    desired_caps = {
        "platformName": "Android",
        "deviceName": "emulator-5554",
        "appPackage": "com.autonavi.minimap",
        "appActivity": ".MainNavActivity",
        "noReset": True,
        "unicodeKeyboard": True,
        "resetKeyboard": True
    }
    
    driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
    time.sleep(5)
    
    # 搜索“充电站”
    search_box = driver.find_element_by_id("com.autonavi.minimap:id/search_edit")
    search_box.send_keys("充电站")
    search_box.submit()
    
    # 等待加载完成
    time.sleep(5)
    
    # 点击第一个充电站
    first_charging_station = driver.find_element_by_xpath("//android.widget.TextView[@text='新源恒远羊坊花园西院公共充电站']")
    first_charging_station.click()
    
    # 等待详情页加载
    time.sleep(5)
    
    # 尝试查找充电枪状态(示例,实际需根据APP布局调整)
    try:
        # 假设充电枪状态在某个TextView中
        charging_status = driver.find_element_by_id("com.autonavi.minimap:id/charging_status")
        print("充电枪状态:", charging_status.text)
    except Exception as e:
        print("未能找到充电枪状态信息:", e)
    
    driver.quit()
    

    注意: 上述代码仅为示例,实际元素ID可能因版本不同而变化,需要您使用Appium Inspector进行定位。


    3. 使用逆向工程(高级)

    如果上述方法不可行,可以考虑以下方式:

    • 使用Fiddler / Charles 抓包:分析高德地图APP与服务器之间的通信,看是否能提取到充电站状态信息。
    • 分析APP流量:通过抓包发现是否有隐藏的API接口可调用。

    优点:可以绕过APP UI直接获取数据
    缺点:技术难度较高,且可能违反服务条款


    4. 寻找第三方数据源

    有些第三方平台可能会提供充电站实时状态信息,例如:

    • 星星充电(StarCharge)
    • 特来电(Teld)
    • 云快充(YunKuaichong)

    这些平台通常有开放API,可查询充电站状态。

    建议:可以尝试对接这些平台的API,获取更准确的数据。


    三、总结

    | 方法 | 是否可行 | 说明 | |------|----------|------| | 高德开放API | ❌ | 不支持实时充电枪状态 | | Appium爬虫 | ⚠️ | 可行,但受限于APP反爬机制 | | 逆向工程 | ⚠️ | 技术难度高,风险较大 | | 第三方平台API | ✅ | 推荐方案,数据更稳定 |


    四、建议

    推荐您优先尝试第4种方案,即接入星星充电、特来电等第三方平台的API,因为这些平台通常提供更稳定的实时数据接口,并且合法合规

    如果您需要我帮助您对接某一个平台的API,请告诉我具体平台名称,我可以为您提供相应的代码示例。


    如您有进一步的问题,欢迎继续交流!

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月12日
  • 创建了问题 7月13日