twittergo
文件大小: unknow
源码售价: 5 个金币 积分规则     积分充值
资源说明:Twitter client library for go
twittergo
=========
This project implements a Go client library for the Twitter APIs.  This
library supports version 1.1 of Twitter's API and application-only auth.

The goal of this project is to provide a thin veneer over my `oauth1a` library
in order to simplify access to Twitter's APIs from Go.  Where possible, I've
tried to defer to native objects (use of http requests for example).
Additionally, responses could be parsed directly as JSON, but some wrapper
types have been defined in order to provide some convenience methods for
accessing data.

[![Build Status](https://travis-ci.org/kurrik/twittergo.svg?branch=master)](https://travis-ci.org/kurrik/twittergo)

Installing
----------
Run

    go get github.com/kurrik/twittergo

Include in your source:

    import "github.com/kurrik/twittergo"

Godoc
-----
See http://godoc.org/github.com/kurrik/twittergo

Using
-----
I have moved all of the examples to the
https://github.com/kurrik/twittergo-examples project in order to make this
library easier to import.  Please reference that project for ways to address
specific use cases.

The simplest example in the `twittergo-examples` project
is probably `verify_credentials`.  This calls an
endpoint which will return the current user if the request is signed
correctly.

The example starts by loading credentials, which can be done in
many ways.  The example implements a `LoadCredentials` which looks for
the `CREDENTIALS` file mentioned above:

```go
var (
    err    error
    client *twittergo.Client
    req    *http.Request
    resp   *twittergo.APIResponse
    user   *twittergo.User
)
client, err = LoadCredentials()
if err != nil {
    fmt.Printf("Could not parse CREDENTIALS file: %v\n", err)
    os.Exit(1)
}
```

Then, a standard `http` request is created to a `/1.1/` endpoint:

```go
req, err = http.NewRequest("GET", "/1.1/account/verify_credentials.json", nil)
if err != nil {
    fmt.Printf("Could not parse request: %v\n", err)
    os.Exit(1)
}
```

The client object handles sending the request:

```go
resp, err = client.SendRequest(req)
if err != nil {
    fmt.Printf("Could not send request: %v\n", err)
    os.Exit(1)
}
```

The response object has some convenience methods for checking rate limits, etc:

```go
if resp.HasRateLimit() {
    fmt.Printf("Rate limit:           %v\n", resp.RateLimit())
    fmt.Printf("Rate limit remaining: %v\n", resp.RateLimitRemaining())
    fmt.Printf("Rate limit reset:     %v\n", resp.RateLimitReset())
} else {
    fmt.Printf("Could not parse rate limit from response.\n")
}
```

Finally, if the response format is known, the library provides some standard
objects which make parsing response data easier:

```go
user = &twittergo.User{}
err = resp.Parse(user)
if err != nil {
    fmt.Printf("Problem parsing response: %v\n", err)
    os.Exit(1)
}
fmt.Printf("ID:                   %v\n", user.Id())
fmt.Printf("Name:                 %v\n", user.Name())
```

Error handling
--------------
Errors are returned by most methods as is Golang convention. However, these
errors may sometimes be cast into `twittergo.ResponseError`, `twittergo.Errors`
or `twittergo.RateLimitError` structs which will provide additional information.

To check for rate limiting or other types of server errors, attempt to cast
any errors returned by the `APIResponse.Parse` method.

```go
resp, err = client.SendRequest(req)
if err != nil {
    fmt.Printf("Could not send request: %v\n", err)
    os.Exit(1)
}
tweet = &twittergo.Tweet{}
err = resp.Parse(tweet)
if err != nil {
    if rle, ok := err.(twittergo.RateLimitError); ok {
        fmt.Printf("Rate limited, reset at %v\n", rle.Reset)
    } else if errs, ok := err.(twittergo.Errors); ok {
        for i, val := range errs.Errors() {
            fmt.Printf("Error #%v - ", i + 1)
            fmt.Printf("Code: %v ", val.Code())
            fmt.Printf("Msg: %v\n", val.Message())
        }
    } else {
        fmt.Printf("Problem parsing response: %v\n", err)
    }
    os.Exit(1)
}
```

The previous snippet would print the following if a user attempted to Tweet
the same text twice in a row:

    Error #1 - Code: 187 Msg: Status is a duplicate

Rate limit errors are pretty easy to use.  They're a simple struct containing
what the limit for the request was, how many were remaining (should be 0)
and when the limiting resets:

```go
type RateLimitError struct {
    Limit     uint32
    Remaining uint32
    Reset     time.Time
}
```

The Errors type is a little more complicated, as it may return one or more
server side errors.  It is possible to cast one to a string using the standard
`Error` method, but if you need to handle individual errors, iterate over
the slice returned by `Errors` (plural) instead:

```go
for i, val := range errs.Errors() {
    fmt.Printf("Error #%v - ", i + 1)
    fmt.Printf("Code: %v ", val.Code())
    fmt.Printf("Msg: %v\n", val.Message())
}
```

Each of *those* errors has a `Code` and a `Message` method, which return
values and strings corresponding to those listed in the "Error codes" section
of this page: https://dev.twitter.com/docs/error-codes-responses

Application-only auth
---------------------
If no user credentials are set, then the library falls back to attempting
to authenticate with application-only auth, as described here:
https://dev.twitter.com/docs/auth/application-only-auth

If you want to obtain an access token for later use, create a client with
no user credentials.

```go
config := &oauth1a.ClientConfig{
    ConsumerKey:    "consumer_key",
    ConsumerSecret: "consumer_secret",
}
client = twittergo.NewClient(config, nil)
if err := c.FetchAppToken(); err != nil {
    // Handle error ...
}
token := c.GetAppToken()
// ... Save token in data store
```

To restore a previously obtained token, just call SetAppToken():

```go
// Get token from data store ...
c.SetAppToken(token)
```

Saving and restoring the token isn't necessary if you keep the client in
memory, though.  If you just create a client without any user credentials,
calls to `SendRequest` will automatically fetch and persist the app token
in memory.  See
[search_app_auth/main.go](https://github.com/kurrik/twittergo-examples/blob/master/search_app_auth/main.go)
for an example of this.

Google App Engine
-----------------
This library works with Google App Engine's Go runtime but requires slight
modification to fall back on the `urlfetch` package for http transport.

After creating a `Client`, replace its `HttpClient` with an instance of
`urlfetch.Client`:

```go
var (
    r      *http.Request
    config *oauth1a.ClientConfig
    user   *oauth1a.UserConfig
)
...
ctx = appengine.NewContext(r)
c = twittergo.NewClient(config, user)
c.HttpClient = urlfetch.Client(ctx)
```

For a comprehensive example, see
[user_timeline_appengine](https://github.com/kurrik/twittergo-examples/blob/master/user_timeline_appengine/src/app/app.go#L138)

Custom models
-------------
The `twittergo` library comes with some standard models for structures like
Tweets and Timelines, but you are not required to use them.  Pass any
struct which will deserialize from a Twitter API response to `APIResponse.Parse`:

```go
type CustomTweet struct {
    CustomID   string `json:"id_str"`
    CustomText string `json:"text"`
}
...

req, err = http.NewRequest("GET", url, nil)
...
resp, err = client.SendRequest(req)
customTweet = &CustomTweet{}
err = resp.Parse(customTweet)
...
```

For complete code, see the
[custom_struct](https://github.com/kurrik/twittergo-examples/blob/master/custom_struct/main.go)
example.

Debugging
---------
To see what requests are being issued by the library, set up an HTTP proxy
such as Charles Proxy and then set the following environment variable:

    export HTTP_PROXY=http://localhost:8888

Because Go will reject HTTPS requests through a proxy, you'll need to set
the following for any HTTPS endpoints:

    export TLS_INSECURE=1

Make sure not to use this in production!

本源码包内暂不包含可直接显示的源代码文件,请下载源码包。