如何在Dart中获取带动态qk参数的光污染地图API数据?
如何在Dart中获取lightpollutionmap.info的qk参数并请求人工亮度数据?
我希望在Dart中从网站https://www.lightpollutionmap.info/获取人工亮度数据。点击地图时,网站会发送一个类似如下的GET请求:https://www.lightpollutionmap.info/QueryRaster/?qk=MTY3MTk1Nzk2NjUwNztpc3Vja2RpY2tzOik=&ql=wa_2015&qt=point&qd=14.850636168450944,50.09611381452743。我的问题是,如何获取每次点击地图都会变化的qk参数?我目前的代码如下:
Future initiate() async { var client = Client(); Response response = await client.get( "https://www.lightpollutionmap.info/QueryRaster/?qk=MTY3MTk1Nzk2NjUwNztpc3Vja2RpY2tzOik=&ql=wa_2015&qt=point&qd=14.850636168450944,50.09611381452743"); print(response.body.toString()); }
qk参数是网站生成的时效性验证令牌,一般基于时间戳、会话信息等加密生成,要获取它可以参考以下两种方法:
方法一:从主页HTML中提取qk参数
网站主页加载时会生成qk相关令牌,你可以先请求主页,解析HTML提取对应值:
import 'package:http/http.dart' as http; import 'package:html/parser.dart' show parse; Future<String> getQkToken() async { final response = await http.get(Uri.parse("https://www.lightpollutionmap.info/")); if (response.statusCode == 200) { final document = parse(response.body); // 遍历页面脚本标签,查找包含qk的内容 final scriptElements = document.querySelectorAll('script'); for (var script in scriptElements) { final scriptContent = script.text; if (scriptContent.contains('qk')) { // 用正则匹配提取qk值,需根据实际页面结构调整匹配规则 final regex = RegExp(r'qk:\s*"([^"]+)"'); final match = regex.firstMatch(scriptContent); if (match != null) { return match.group(1)!; } } } } throw Exception('获取qk令牌失败'); } // 使用示例 Future initiate() async { final qk = await getQkToken(); final targetLatLng = "14.850636168450944,50.09611381452743"; // 替换为目标经纬度 final requestUrl = Uri.parse( "https://www.lightpollutionmap.info/QueryRaster/?qk=$qk&ql=wa_2015&qt=point&qd=$targetLatLng"); final client = http.Client(); final response = await client.get(requestUrl); print(response.body.toString()); }
方法二:分析JS逻辑生成qk参数
如果主页未直接暴露qk值,需要追踪网站JavaScript代码:
- 打开浏览器开发者工具,查看地图点击请求的触发逻辑
- 定位生成qk参数的函数(通常涉及时间戳、会话ID的加密,比如Base64编码或自定义加密规则)
- 将该逻辑用Dart重写,动态生成符合要求的qk参数
注意事项
- qk参数存在有效期,每次请求前需重新获取或生成
- 请遵守网站使用条款,避免高频请求给服务器造成压力
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

