2013-05-23 7 views
1

Я пытаюсь создать Reddit API в Голанге в Google App Engine. Мой код:Google App Engine Go - Reddit API возвращает ошибку 429

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 

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

+0

Возможный дубликат [Ошибка 429 при вызове Reddit api из Google App Engine] (http://stackoverflow.com/questions/8963485/error-429-when-invoking-reddit-api-from-google-app-engine) – MatrixFrog

+0

Знаете ли вы о репо jzelinskie? https://github.com/jzelinskie/reddit – matthewbauer

ответ

1

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

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

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

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