Google App Engine Go — Reddit API возвращает ошибку 429

Я пытаюсь создать Reddit API в Golang в Google App Engine. Мой код:

package RedditAPI

import(
    "appengine"
    "encoding/json"
    "io/ioutil"
    "net/http"
    "appengine/urlfetch"
    "time"
    "net/url"
)

func GetTopSubmissions(c appengine.Context){
    one, two:=Call(c, "http://www.reddit.com/r/Bitcoin/top.json", "POST", nil);
    c.Infof("%v, %v", one, two);
}


func Call(c appengine.Context, address string, requestType string, values url.Values)(map[string]interface{}, error){
    req, err:=http.NewRequest("GET", address, nil)
    if err!=nil{
        c.Infof("Request: %v", err)
        return nil, err
    }

    req.Header.Add("User-Agent", "This is a very creative name for a Reddit bot v1.0 by /u/username")
    c.Infof("%v", req.Header.Get("User-Agent"))
    c.Infof("%v", req)
    c.Infof("%v", req.UserAgent())

    duration, err:= time.ParseDuration("60s")
    tr := &urlfetch.Transport{Context: c, Deadline: duration}

    resp, err:=tr.RoundTrip(req)
    if err != nil {
        c.Infof("Post: %v", err)
        return nil, err
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        c.Infof("ReadAll: %v", err)
        return nil, err
    }
    result := make(map[string]interface{})
    err = json.Unmarshal(body, &result)
    if err != nil {
        c.Infof("Unmarshal: %v", err)
        c.Infof("%s", body)
        return nil, err
    }
    return result, nil
}

Возвращает

2013/05/23 03:00:34 Unsolicited response received on idle HTTP channel starting with "H"; err=<nil>
2013/05/23 03:01:42 INFO: &{GET http://www.reddit.com/r/Bitcoin/top.json HTTP/1.1 1 1 map[User-Agent:[This is a very creative name for a Reddit bot v1.0 by /u/username]] <nil> 0 [] false www.reddit.com map[] <nil> map[]   <nil>}
2013/05/23 03:01:42 INFO: This is a very creative name for a Reddit bot v1.0 by /u/username
2013/05/23 03:01:42 INFO: map[error:429], <nil>
INFO     2013-05-23 03:01:42,720 server.py:584] default: "GET / HTTP/1.1" 200 81

Что может быть причиной этой ошибки?


person ThePiachu    schedule 23.05.2013    source источник
comment
возможный дубликат Ошибка 429 при вызове API Reddit из приложения Google. Двигатель   -  person MatrixFrog    schedule 27.05.2013
comment
Вы в курсе репозитория jzelinskie? github.com/jzelinskie/reddit   -  person matthewbauer    schedule 10.07.2013


Ответы (1)


Ошибка HTTP 429: «слишком много запросов»: http://tools.ietf.org/html/rfc6585#section-4

На https://github.com/reddit/reddit/wiki/API говорится в Reddit. «Выполняйте не более тридцати запросов в минуту. Это допускает некоторую резкость ваших запросов, но держите их в разумных пределах. В среднем мы должны получать от вас не более одного запроса каждые две секунды». Они также говорят: «Не заходите на одну и ту же страницу чаще, чем раз в 30 секунд».

Если вы запрашиваете один и тот же ресурс при каждом обращении пользователя к вашему приложению, вы можете использовать поддержку кэша памяти GAE. Если вы запрашиваете кучу ресурсов, на вики-странице Reddit упоминается «[r]запросы для нескольких ресурсов одновременно», поэтому может быть какое-то средство для пакетной обработки запросов (не уверен, не разбираюсь в API). Если вы выполняете cronjob, вы можете запускать его реже.

В любом случае оставшаяся загадка — это скорее вопрос Reddit API, чем вопрос Go. Репозиторий, прокомментированный matthewbauer (https://github.com/jzelinskie/reddit), или документы API Reddit. может иметь больше.

person twotwotwo    schedule 03.11.2013