This is a basic example of web application to get trends near a location using Twitter API.
The Resource URL https://api.twitter.com/1.1/trends/place.json returns the top 50 trending topics for a specific WOEID, if trending information is available for it. Like all other APIs, it returns the trending topics as JSON data, which can be converted to standard Golang objects and then manipulated with list comprehensions or similar techniques.
Register an application under your Twitter account at http://dev.twitter.com/apps and take the required credentials of consumer key, consumer secret, access token, and access token secret, which OAuth application needs to gain account access.
1. Install required package
Package oauth1 provides a Go implementation of the OAuth 1 spec to allow end-users to authorize a client (i.e. consumer) to access protected resources on his/her behalf.
go get github.com/dghubble/oauth1
2. Development
The main function begins with a call to http.HandleFunc, which tells the http package to handle all requests to the web root ("/") with viewHashTagHandler. The function viewHashTagHandler is of the type http.HandlerFunc. It takes an http.ResponseWriter and an http.Request as its arguments.
2.1 Source code of main.go
The function viewHashTagHandler that will able to handle both GET and POST requests.The ParseFiles creates a new Template and parses the template definitions from the hash_tags.html file.
package main
import (
"encoding/json"
"fmt"
"github.com/dghubble/oauth1"
"html/template"
"io/ioutil"
"net/http"
"strings"
)
func getHashTags(country string) []string {
var listHashTags []string
consumerKey := "xxxxxxxxxxxxxxxxxxx"
consumerSecret := "xxxxxxxxxxxxxxxxxxx"
accessToken := "xxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxx"
accessSecret := "xxxxxxxxxxxxxxxxxxx"
if consumerKey == "" || consumerSecret == "" || accessToken == "" || accessSecret == "" {
panic("Missing required environment variable")
}
config := oauth1.NewConfig(consumerKey, consumerSecret)
token := oauth1.NewToken(accessToken, accessSecret)
httpClient := config.Client(oauth1.NoContext, token)
path := "https://api.twitter.com/1.1/trends/place.json?id=" + country
resp, _ := httpClient.Get(path)
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
var JSON = strings.TrimLeft(string(body), "[")
JSON = strings.TrimRight(JSON, "]")
var info map[string]interface{}
json.Unmarshal([]byte(JSON), &info)
trends := info["trends"].([]interface{})
for _, element := range trends {
if trendList, ok := element.(map[string]interface{}); ok {
for key, value := range trendList {
// Filter hashtags started with #
if strings.Contains(key, "name") && strings.Contains(value.(string), "#") {
listHashTags = append(listHashTags, value.(string))
}
}
}
}
return listHashTags
}
func main() {
http.HandleFunc("/", viewHashTagHandler)
http.ListenAndServe(":8080", nil)
}
func viewHashTagHandler(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/" {
http.Error(w, "404 not found.", http.StatusNotFound)
return
}
switch r.Method {
case "GET":
getPage, _ := template.ParseFiles("hash_tags.html")
getPage.Execute(w, r)
case "POST":
var country string
if err := r.ParseForm(); err != nil {
fmt.Fprintf(w, "ParseForm() err: %v", err)
return
}
country = r.FormValue("country")
tags := getHashTags(country)
postPage, _ := template.ParseFiles("hash_tags.html")
postPage.Execute(w, tags)
default:
fmt.Fprintf(w, "Unable to get result.")
}
}
2.2 Source code of hash_tags.html.
A template file containing the HTML form.
<html>
<head>
<title>Trending hash tags</title>
</head>
<body>
<form method="POST" action="/">
<select name="country">
<option value="23424848">India</option>
<option value="455830">Brazil</option>
<option value="3369">Canada</option>
<option value="1">Global</option>
</select>
<button type="submit">Show Trends</button>
</form>
<ul>
{{ range $key, $value := . }}
<li>{{ $value }}</li>
{{ end }}
</ul>
</body>
</html>
3. Execution
Now launch the application
go run main.go
This will developed a static website on web server on port 8080 on your machine. This also launch your browser navigating to http://localhost:8080.
You will see an output like the image below: