gotwi

package module
v0.11.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 13, 2022 License: MIT Imports: 18 Imported by: 0

README

gotwi

Go Reference Twitter API v2 codecov

This is a library for using the Twitter API v2 in the Go language. (It is still under development).

Supported APIs

Twitter API Documentation | Docs | Twitter Developer Platform

Progress of supporting APIs:

  • Tweets
    • Tweet lookup
      • GET /2/tweets
      • GET /2/tweets/:id
    • Manage Tweet
      • POST /2/tweets
      • DELETE /2/tweets/:id
    • Timelines
      • GET /2/users/:id/tweets
      • GET /2/users/:id/mentions
    • Search Tweets
      • GET /2/tweets/search/recent
      • GET /2/tweets/search/all
    • Tweet counts
      • GET /2/tweets/counts/recent
      • GET /2/tweets/counts/all
    • Filtered stream
      • POST /2/tweets/search/stream/rules
      • GET /2/tweets/search/stream/rules
      • GET /2/tweets/search/stream
    • Volume streams
      • GET /2/tweets/sample/stream
    • Retweets
      • GET /2/users/:id/retweeted_by
      • POST /2/users/:id/retweets
      • DELETE /2/users/:id/retweets/:source_tweet_id
    • Likes
      • GET /2/tweets/:id/liking_users
      • GET /2/tweets/:id/liked_tweets
      • POST /2/users/:id/likes
      • DELETE /2/users/:id/likes/:tweet_id
    • Hide replies
      • PUT /2/tweets/:id/hidden
  • Users
    • User lookup
      • GET /2/users
      • GET /2/users/:id
      • GET /2/users/by
      • GET /2/users/by/username
      • GET /2/users/by/me
    • Follows
      • GET /2/users/:id/following
      • GET /2/users/:id/followers
      • POST /2/users/:id/following
      • DELETE /2/users/:source_user_id/following/:target_user_id
    • Blocks
      • GET /2/users/:id/blocking
      • POST /2/users/:id/blocking
      • DELETE /2/users/:source_user_id/blocking/:target_user_id
    • Mutes
      • GET /2/users/:id/muting
      • POST /2/users/:id/muting
      • DELETE /2/users/:source_user_id/muting/:target_user_id
  • Lists
    • List lookup
      • GET /2/lists/:id
      • GET /2/users/:id/owned_lists
    • Manage Lists
      • POST /2/lists
      • DELETE /2/lists/:id
      • PUT /2/lists/:id
    • List Tweets lookup
      • GET /2/lists/:id/tweets
    • List members
      • GET /2/users/:id/list_memberships
      • GET /2/lists/:id/members
      • POST /2/lists/:id/members
      • DELETE /2/lists/:id/members/:user_id
    • List follows
      • GET /2/lists/:id/followers
      • GET /2/users/:id/followed_lists
      • POST /2/users/:id/followed_lists
      • DELETE /2/users/:id/followed_lists/:list_id
    • Pinned Lists
      • GET /2/users/:id/pinned_lists
      • POST /2/users/:id/pinned_lists
      • DELETE /2/users/:id/pinned_lists/:list_id
  • Spaces
    • Spaces Lookup
      • GET /2/spaces/:id
      • GET /2/spaces
      • GET /2/spaces/by/creator_ids
      • GET /2/spaces/:id/buyers
      • GET /2/spaces/:id/tweets
    • Search Spaces
      • GET /2/spaces/search
  • Compliance
    • Batch compliance
      • GET /2/compliance/jobs/:id
      • GET /2/compliance/jobs
      • POST /2/compliance/jobs

Sample

Prepare

Set the API key and API key secret to environment variables.

export GOTWI_API_KEY=your-api-key
export GOTWI_API_KEY_SECRET=your-api-key-secret

Request with OAuth 2.0 Bearer Token

This authentication method allows only read-only access to public information.

Example: Get a user by user name.
package main

import (
	"context"
	"fmt"

	"github.com/michimani/gotwi"
	"github.com/michimani/gotwi/fields"
	"github.com/michimani/gotwi/users"
	"github.com/michimani/gotwi/users/types"
)

func main() {
	in := &gotwi.NewGotwiClientInput{
		AuthenticationMethod: gotwi.AuthenMethodOAuth2BearerToken,
	}

	c, err := gotwi.NewGotwiClient(in)
	if err != nil {
		fmt.Println(err)
		return
	}

	p := &types.UserLookupByUsernameParams{
		Username: "michimani210",
		Expansions: fields.ExpansionList{
			fields.ExpansionPinnedTweetID,
		},
		UserFields: fields.UserFieldList{
			fields.UserFieldCreatedAt,
		},
		TweetFields: fields.TweetFieldList{
			fields.TweetFieldCreatedAt,
		},
	}
	res, err := users.UserLookupByUsername(context.Background(), c, p)
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println("ID: ", gotwi.StringValue(u.Data.ID))
	fmt.Println("Name: ", gotwi.StringValue(u.Data.Name))
	fmt.Println("Username: ", gotwi.StringValue(u.Data.Username))
	fmt.Println("CreatedAt: ", u.Data.CreatedAt)
	if u.Includes.Tweets != nil {
		for _, t := range u.Includes.Tweets {
			fmt.Println("PinnedTweet: ", gotwi.StringValue(t.Text))
		}
	}
}
go run main.go

You will get the output like following.

ID:  581780917
Name:  michimani Lv.859
Username:  michimani210
CreatedAt:  2012-05-16 12:07:04 +0000 UTC
PinnedTweet:  pinned tweet

Request with OAuth 1.0a User Context

With this authentication method, each operation will be performed as the authenticated Twitter account. For example, you can tweet as that account, or retrieve accounts that are blocked by that account.

Example: Tweet with poll.
package main

import (
	"context"
	"fmt"

	"github.com/michimani/gotwi"
	"github.com/michimani/gotwi/tweets"
	"github.com/michimani/gotwi/tweets/types"
)

func main() {
	in := &gotwi.NewGotwiClientInput{
		AuthenticationMethod: gotwi.AuthenMethodOAuth1UserContext,
		OAuthToken:           "your-twitter-acount-oauth-token",
		OAuthTokenSecret:     "your-twitter-acount-oauth-token-secret",
	}

	c, err := gotwi.NewGotwiClient(in)
	if err != nil {
		fmt.Println(err)
		return
	}

	p := &types.ManageTweetsPostParams{
		Text: gotwi.String("This is a test tweet with poll."),
		Poll: &types.ManageTweetsPostParamsPoll{
			DurationMinutes: gotwi.Int(5),
			Options: []string{
				"Cyan",
				"Magenta",
				"Yellow",
				"Key plate",
			},
		},
	}

	res, err := tweets.ManageTweetsPost(context.Background(), c, p)
	if err != nil {
		fmt.Println(err.Error())
		return
	}

	fmt.Printf("[%s] %s\n", gotwi.StringValue(res.Data.ID), gotwi.StringValue(res.Data.Text))
}
go run main.go

You will get the output like following.

[1462813519607263236] This is a test tweet with poll.

Error handling

Each function that calls the Twitter API (e.g. TweetRetweetsRetweetedBy()) may return an error for some reason. If the error is caused by the Twitter API returning a status other than 2XX, you can check the details by doing the following.

res, err := tweets.TweetRetweetsRetweetedBy(context.Background(), c, p)
if err != nil {
	fmt.Println(err)

	// more error information
	ge := err.(*gotwi.GotwiError)
	if ge.OnAPI {
		fmt.Println(ge.Title)
		fmt.Println(ge.Detail)
		fmt.Println(ge.Type)
		fmt.Println(ge.Status)
		fmt.Println(ge.StatusCode)

		for _, ae := range ge.APIErrors {
			fmt.Println(ae.Message)
			fmt.Println(ae.Label)
			fmt.Println(ae.Parameters)
			fmt.Println(ae.Code)
			fmt.Println(ae.Code.Detail())
		}

		if ge.RateLimitInfo != nil {
			fmt.Println(ge.RateLimitInfo.Limit)
			fmt.Println(ge.RateLimitInfo.Remaining)
			fmt.Println(ge.RateLimitInfo.ResetAt)
		}
	}
}

More examples

See _examples directory.

Licence

MIT

Author

michimani210

Documentation

Index

Constants

View Source
const (
	APIKeyEnvName       = "GOTWI_API_KEY"
	APIKeySecretEnvName = "GOTWI_API_KEY_SECRET"
)
View Source
const (
	AuthenMethodBearerToken       = "Bearer Token"
	AuthenMethodOAuth1UserContext = "OAuth 1.0a User context"
	AuthenMethodOAuth2BearerToken = "OAuth 2.0 Bearer token"
)
View Source
const (
	OAuthVersion10               = "1.0"
	OAuthSignatureMethodHMACSHA1 = "HMAC-SHA1"
)
View Source
const OAuth2TokenEndpoint = "https://api.twitter.com/oauth2/token"

Variables

This section is empty.

Functions

func Bool

func Bool(b bool) *bool

func BoolValue

func BoolValue(b *bool) bool

func Float64

func Float64(f float64) *float64

func Float64Value

func Float64Value(f *float64) float64

func GenerateBearerToken

func GenerateBearerToken(c IGotwiClient, apiKey, apiKeySecret string) (string, error)

func Int

func Int(i int) *int

func IntValue

func IntValue(i *int) int

func String

func String(s string) *string

func StringValue

func StringValue(s *string) string

func Time

func Time(t time.Time) *time.Time

func TimeValue

func TimeValue(t *time.Time) time.Time

Types

type AuthenticationMethod

type AuthenticationMethod string

func (AuthenticationMethod) Valid

func (a AuthenticationMethod) Valid() bool

type ClientResponse

type ClientResponse struct {
	StatusCode int
	Status     string
	Error      *resources.Non2XXError
	Body       []byte
	Response   util.Response
}

type CreateOAuthSignatureInput

type CreateOAuthSignatureInput struct {
	HTTPMethod       string
	RawEndpoint      string
	OAuthConsumerKey string
	OAuthToken       string
	SigningKey       string
	ParameterMap     map[string]string
}

type CreateOAuthSignatureOutput

type CreateOAuthSignatureOutput struct {
	OAuthNonce           string
	OAuthSignatureMethod string
	OAuthTimestamp       string
	OAuthVersion         string
	OAuthSignature       string
}

type Endpoint

type Endpoint string

func (Endpoint) Detail

func (e Endpoint) Detail() (*EndpointInfo, error)

func (Endpoint) String

func (e Endpoint) String() string

type EndpointInfo

type EndpointInfo struct {
	Raw                      string
	Base                     string
	EncodedQueryParameterMap map[string]string
}

type GotwiClient

type GotwiClient struct {
	Client               *http.Client
	AuthenticationMethod AuthenticationMethod
	AccessToken          string
	OAuthToken           string
	SigningKey           string
	OAuthConsumerKey     string
}

func NewGotwiClient

func NewGotwiClient(in *NewGotwiClientInput) (*GotwiClient, error)

func (*GotwiClient) CallAPI

func (c *GotwiClient) CallAPI(ctx context.Context, endpoint, method string, p util.Parameters, i util.Response) error

func (*GotwiClient) Exec

func (*GotwiClient) IsReady

func (c *GotwiClient) IsReady() bool

type GotwiError

type GotwiError struct {
	OnAPI bool
	resources.Non2XXError
	// contains filtered or unexported fields
}

func (*GotwiError) Error

func (e *GotwiError) Error() string

func (*GotwiError) Unwrap

func (e *GotwiError) Unwrap() error

type IGotwiClient

type IGotwiClient interface {
	Exec(req *http.Request, i util.Response) (*resources.Non2XXError, error)
}

type NewGotwiClientInput

type NewGotwiClientInput struct {
	HTTPClient           *http.Client
	AuthenticationMethod AuthenticationMethod
	OAuthToken           string
	OAuthTokenSecret     string
	BearerToken          string
}

type OAuth2TokenResponse

type OAuth2TokenResponse struct {
	TokenType   string `json:"token_type"`
	AccessToken string `json:"access_token"`
}

func (OAuth2TokenResponse) HasPartialError

func (o OAuth2TokenResponse) HasPartialError() bool

Directories

Path Synopsis
internal

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL