Как преобразовать изображение для загрузки изображения профиля Spotify? - PullRequest
0 голосов
/ 24 декабря 2018

Я настраиваю функцию кодировщика изображений, при которой вы вводите URL-адрес изображения, и он возвращает версию ISO-8859-1.Как написать функцию, которая отправляет HTTP-запрос GET на URL-адрес и преобразует эти байты в ISO-8859-1?Код ниже - это все, что у меня есть.

func grabImageBytes(imageURL string) ([]byte, error) {
    req, _ := http.NewRequest("GET", imageURL, nil)
    res, _ := http.DefaultClient.Do(req)
    defer res.Body.Close()
    body, err := ioutil.ReadAll(res.Body)
    if err != nil {
        return nil, err
    } else {
        return body, nil
    }
}

другие функции:

func getRandomImage(keyword string) (string, error) {
    req, _ := http.NewRequest("GET", "https://www.google.com/search?tbm=isch&q="+keyword, nil)
    req.Header.Add("authority", "www.google.com")
    req.Header.Add("upgrade-insecure-requests", "1")
    req.Header.Add("referer", "https://images.google.com/")
    req.Header.Add("accept-language", "en-US,en;q=0.9")

    res, _ := http.DefaultClient.Do(req)

    defer res.Body.Close()
    body, _ := ioutil.ReadAll(res.Body)

    var imageURL string

    if strings.Contains(string(body), ",\"ou\":\"") {
        imageURL = strings.Split(strings.Split(string(body), ",\"ou\":\"")[1], "\",\"ow\":")[0]
    } else {
        return "", errors.New("Image not found.")
    }
    req2, _ := http.NewRequest("GET", imageURL, nil)

    res2, _ := http.DefaultClient.Do(req2)

    defer res2.Body.Close()
    if res2.StatusCode == 404 {
        return "", errors.New("Image not found.")
    } else {
        return imageURL, nil
    }

}

1 Ответ

0 голосов
/ 24 декабря 2018

Ваше утверждение о том, что изображение профиля Spotify является ISO 8850-1 , закодировано / зашифровано, не имеет смысла.

Что может быть более разумным, так это то, что оно закодировано в Base64.

Например,

Spotify для разработчиков: Web API: загрузка пользовательского обложки списка воспроизведения .

Данные изображения JPEG в кодировке Base64, максимальный размер полезной нагрузкисоставляет 256 КБ


In Go,

Пакет base64

import "encoding/base64"

Пакет base64 реализует кодирование base64, как указано в RFC 4648.


Еще одно доказательство: «HTTPS-запросы в формате UTF-8»

Spotifyдля разработчиков: Web API

Запросы

Spotify Web API основан на принципах REST.Доступ к ресурсам данных осуществляется через стандартные запросы HTTPS в формате UTF-8 к конечной точке API.


Например.используя изображение профиля Stack Overflow:

package main

import (
    "encoding/base64"
    "fmt"
    "io/ioutil"
    "net/http"
    "os"
)

func grabImageBytes(imageURL string) ([]byte, error) {
    req, err := http.NewRequest("GET", imageURL, nil)
    if err != nil {
        return nil, err
    }
    res, err := http.DefaultClient.Do(req)
    if err != nil {
        return nil, err
    }
    defer res.Body.Close()
    body, err := ioutil.ReadAll(res.Body)
    if err != nil {
        return nil, err
    }
    enc := base64.StdEncoding
    img := make([]byte, enc.EncodedLen(len(body)))
    enc.Encode(img, body)
    return img, nil
}

func main() {
    imageURL := `https://lh5.googleusercontent.com/-P8ICR-LXoBs/AAAAAAAAAAI/AAAAAAAAE04/fVAeB6_nMeg/photo.jpg?sz=328`
    img, err := grabImageBytes(imageURL)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    fmt.Println(string(img))
}
...