nguyenvanduocit
3/24/2018 - 4:17 PM

WordPressToMedium.go

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("")
}