YourSky请求体分析 逆向API的尝试

引入

"Your Sky" 是由 Fourmilab 提供的一个在线天文应用,它可以生成基于特定地理位置和时间的实时天空视图。这个工具允许用户输入观察者的纬度、经度以及日期和时间,从而得到一张显示当时天空状态的图片。这张图片会展示出可见的星星、行星、月亮以及其他天体。

"Your Sky" 可以用来模拟不同的天文条件,比如:

  • 观察者的位置(地球上的任何地点)。
  • 特定的时间点(可以是过去、现在或未来)。
  • 天空的视角(例如地平线以上或全天空)。
  • 显示哪些天体(例如只显示行星或包括所有可见的星星)。

该应用非常适合教育用途,对于天文学爱好者来说也是个非常有用的工具。它可以帮助人们了解在给定时间和地点能看到什么样的天体现象。

Fourmilab 是一家位于瑞士的实验室,以其对互联网技术的创新应用而闻名,其中包括开发了许多与天文学相关的项目。"Your Sky" 是其中一个可以让公众通过互联网探索宇宙的应用程序。

我的StarWalker项目需要使用到星图,YourSky明显是最合适的选择,经过我一段时间的研究,这是我的研究结果

请求体结构

使用一个URL就可以请求到附有一张星图的文档,其URL参数大体如下

  • date=0: 日期设置模式为现在的UTC时间。使用1设置为定义UTC时间,使用2设置为定义儒略日。
  • utc=1998%2F02%2F06+12%3A42%3A40: UTC时间设置为1998年2月6日12点42分40秒。date为0/2无效。(其HTML实体编码用半角符号亦可)
  • jd=2450851.02963: Julian日期(儒略日),与上面的UTC时间对应,用于天文学计算。date为1/0无效。
  • lat=47%B0: 观测地点的纬度为北纬47°(注意 %B0 是HTML实体编码中的度符号)。
  • ns=North: 指明纬度的方向是北。
  • lon=7%B0: 观测地点的经度为东经7°。
  • ew=East: 指明经度的方向是东。
  • deepm=2.5: 显示深空天体的最大星等。
  • consto=on: 显示星座轮廓。
  • limag=5.5: 图像中显示最暗的恒星星等。
  • starnm=2.0: 图像中不显示比这更亮的恒星(以星等为单位)。
  • starbm=2.5: 图像中不显示比这更暗的恒星(以星等为单位)。
  • imgsize=640: 输出图像的宽度为640像素。
  • fontscale=1.0: 字体大小的比例。
  • scheme=3: 使用的配色方案编号为3。
  • elements=: 这个参数未被赋值,通常用于指定要包含在图像中的特殊元素或对象列表。

完整的一个请求就是

http://fourmilab.net/cgi-bin/Yoursky?date=1&utc=1998%2F02%2F06+12%3A42%3A40&jd=2450851.02963&lat=47%B0&ns=North&lon=7%B0&ew=East&deepm=2.5&consto=on&limag=5.5&starnm=2.0&starbm=2.5&imgsize=640&fontscale=1.0&scheme=3&elements=

为了方便抓取其图片,我写了一个Python脚本

实现自动抓取

import requests
import bs4
from bs4 import BeautifulSoup
import time
def starchart(lat, lon,utctime):
    url = "http://fourmilab.net/cgi-bin/Yoursky"
    #UTCtime format <Year>/<Month>/<Day> <Hour>:<Minute>:<Second>
    params = {
        "date": "1",
        "utc":utctime,
        "lat": lat + "%B0",
        "lon": lon + "%B0",
        "ns":"North",
        "ew":"East",
        "deepm": "2.5",
        "consto": "on",
        "liamg":"5.5",
        "starnm":"1",
        "starbm":"5",
        "fontscale":"1.0",
        "scheme":"3",
        "imgsize": "1000",
        "elements": ""}

    for i in range(5):
        try:
            response = requests.get(url, params=params)
            response.raise_for_status()
            soup = BeautifulSoup(response.text, "html.parser")
            print(soup)
            img_url = soup.find("img")["src"]
            img_data = requests.get("http://fourmilab.net" + img_url).content

            with open("star_map.png", "wb") as f:
                f.write(img_data)
            break
        except requests.RequestException as e:
            print(f"请求失败,重试次数:{i + 1}")
            if i < 4:
                time.sleep(2)
            else:
                raise e
starchart("0", "0", "2023/10/1 12:00:00")

如需程序文件烦请到仓库自行查看

http://keykeymaker.ysepan.com/

getstarchart.py

该程序使用MPL-2.0 license

阅读剩余
THE END