Получение подписи для Google API - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь использовать статический API Google Streetview для получения большого количества изображений с улиц.У меня есть рабочий ключ API и секрет подписи URL, но у меня проблемы с кодированием подписи.Независимо от того, что я пробовал, я получаю неправильную подпись, и URL не работает.Буду признателен за любую помощь.

Вот что я сделал (метод Encode не мой):

    static void Main(string[] args)
    {
        Process.Start(GenerateURL(0, 0, "40.7488115", "-73.9855688", 1920, 1080, 90));

        Console.ReadLine();
    }

    public static string GenerateURL(double heading, double pitch, string locationLat, string locationLong, int resX, int resY, int fov)
    {
        string universalURL = "size=" + resX + "x" + resY + "&location=" + locationLat + "," + locationLong + "&heading=" + heading + "&pitch=" + pitch + "&fov=" + fov + "&key=" + apiKey;
        string getURL = "https://maps.googleapis.com/maps/api/streetview?" + universalURL;
        string getSignature = "_maps_api_streetview?" + universalURL;
        return getURL + "&signature=" + Encode(getSignature, signingKey);
    }

    public static string Encode(string input, string inputkey)
    {
        byte[] key = Encoding.ASCII.GetBytes(inputkey);
        byte[] byteArray = Encoding.ASCII.GetBytes(input);
        using (var myhmacsha1 = new HMACSHA1(key))
        {
            var hashArray = myhmacsha1.ComputeHash(byteArray);
            return hashArray.Aggregate("", (s, e) => s + String.Format("{0:x2}", e), s => s);
        }
    }

Причина, по которой я использую _ вместо / для getSignature, заключается в том, что здесь он говорит, что его нужно заменить.Я уже пробовал с /, и он не работает.

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 10 марта 2019

РЕДАКТИРОВАТЬ: Я нашел решение на веб-сайте Google:

static void Main(string[] args)
    {
        Process.Start(GenerateURL(0, 0, "-26.235859", "28.077619", 500, 500, 90));

        Console.ReadLine();
    }

    public static string GenerateURL(double heading, double pitch, string locationLat, string locationLong, int resX, int resY, int fov)
    {
        return Sign("https://maps.googleapis.com/maps/api/streetview?size=" + resX + "x" + resY + "&location=" + locationLat + "," + locationLong + "&heading=" + heading + "&pitch=" + pitch + "&fov=" + fov + "&key=" + apiKey, signingKey);
    }

    public static string Sign(string url, string keyString)
    {
        ASCIIEncoding encoding = new ASCIIEncoding();

        // converting key to bytes will throw an exception, need to replace '-' and '_' characters first.
        string usablePrivateKey = keyString.Replace("-", "+").Replace("_", "/");
        byte[] privateKeyBytes = Convert.FromBase64String(usablePrivateKey);

        Uri uri = new Uri(url);
        byte[] encodedPathAndQueryBytes = encoding.GetBytes(uri.LocalPath + uri.Query);

        // compute the hash
        HMACSHA1 algorithm = new HMACSHA1(privateKeyBytes);
        byte[] hash = algorithm.ComputeHash(encodedPathAndQueryBytes);

        // convert the bytes to string and make url-safe by replacing '+' and '/' characters
        string signature = Convert.ToBase64String(hash).Replace("+", "-").Replace("/", "_");

        // Add the signature to the existing URI.
        return uri.Scheme + "://" + uri.Host + uri.LocalPath + uri.Query + "&signature=" + signature;
    }
...