package main
import (
Medium "github.com/Medium/medium-sdk-go"
"log"
"net/http"
"encoding/json"
"strconv"
)
type ApiResponse struct {
Found int `json:"found"`
Posts []*Post `json:"posts"`
}
type Post struct {
Date string `json:"date"`
Title string `json:"title"`
Content string `json:"content"`
}
type Converter struct {
MediumToken string
WordPressDomain string
MediumClient *Medium.Medium
}
func (converter *Converter)Convert(targetId string){
targetType := "publication"
if targetId == "me" {
targetType = "user"
user, err := converter.MediumClient.GetUser("")
if err != nil {
log.Panic(err)
}
targetId = user.ID
}
posts := converter.GetPosts()
log.Println("Total: ", len(posts))
for _, post := range posts {
post, err := converter.NewPost(post, targetType, targetId)
if err != nil {
log.Println(err)
} else {
log.Printf("%s:%s\n", post.Title, post.URL)
}
}
}
func (converter *Converter)GetPage(page int)(*ApiResponse, error){
url := "https://public-api.wordpress.com/rest/v1.1/sites/" + converter.WordPressDomain + "/posts/?number=100&page=" + strconv.Itoa(page) + "&order=ASC"
httpClient := &http.Client{}
response, err := httpClient.Get(url)
if err != nil {
return nil, err
}
defer response.Body.Close()
var responseData ApiResponse
err = json.NewDecoder(response.Body).Decode(&responseData)
if err != nil {
return nil, err
}
return &responseData, nil
}
func (converter *Converter)GetPosts()([]*Post){
var posts []*Post
page := 1
for {
respondedPage, err := converter.GetPage(page)
if err != nil {
break
}
posts = append(posts, respondedPage.Posts...)
if len(respondedPage.Posts) < 100 {
break
}
page++
}
return posts
}
func (converter *Converter)NewPost(data *Post, targetIdFieldName string, targetId string)(*Medium.Post, error){
postOptions := Medium.CreatePostOptions{
Title: data.Title,
Content: "<h1>" + data.Title + "</h1>" + data.Content + "<p>----" + data.Date + "</p>",
ContentFormat: Medium.ContentFormatHTML,
PublishStatus: Medium.PublishStatusPublic,
}
if targetIdFieldName == "user" {
postOptions.UserID = targetId
} else {
postOptions.PublicationId = targetId
}
// Create a draft post.
post, err := converter.MediumClient.CreatePost(postOptions)
if err != nil {
return nil, err
}
return post, err
}
func NewConverter(mediumToken string, wordPressDomain string)(*Converter){
return &Converter{
MediumToken: mediumToken,
WordPressDomain: wordPressDomain,
MediumClient: Medium.NewClientWithAccessToken(mediumToken),
}
}
func main(){
converter := NewConverter("", "")
converter.Convert("")
}