Create a gist now

Instantly share code, notes, and snippets.

@Ashwinning /wp-transfer.py Secret
Last active Nov 3, 2016

What would you like to do?
My script to sync gists to wordpress.
#Requirements for github
import requests
import json
#Requirements for python-wordpress-xmlrpc
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import GetPosts, NewPost
from wordpress_xmlrpc.methods import taxonomies
from wordpress_xmlrpc.compat import xmlrpc_client
import datetime, xmlrpclib
'''
Accepts a list of strings
If a 'gistblog' string exists in the list, returns true
Else returns false
'''
def GistBlogExists(tags):
if 'gistblog' in str(tags):
return True
else:
return False
'''
Removes the gistblog hashtag from a list
and returns the remaining hashtags
'''
def RemoveGistBlog(tags):
tags.remove('gistblog')
return tags;
'''
Accepts a string
Extracts all hashtags out of that string into a list
Returns a list of all the hashtags
'''
def GetTags(description):
#Get all the tags in the description
tags = []
for tag in description.split():
if tag.startswith("#"):
tags.append(tag.lstrip("#"))
#Check if the gistblog tag exists and return
return tags
'''
The GistPost Class.
'''
class GistPost:
def __init__(self, title, url, tags, created_at):
self.title = title
self.url = url
self.tags = tags
self.created_at = created_at
'''
Converts Time strings from the kind returned by the Gist API
to the kind that Wordpress/XMLRPC likes.
'''
def TimeSanitizer(str):
#Replace T with a space
value = str.replace("T", " ")
#Remove the Z
value = value.replace("Z", "")
#Remove last three characters
value = value[:-4]
return value
'''
Removes tags and leading/trailing whitespaces.
'''
def SanitizeDescription(description):
sanitized = description
for tag in description.split():
if tag.startswith("#"):
sanitized = sanitized.replace(tag, "")
#Remove trailing whitespaces
sanitized = sanitized.rstrip()
return sanitized
'''
A list of all the tagged gists
'''
gistBlogs = []
'''
A list of all the Wordpress Posts
'''
wordpressPosts = []
'''
Create the Wordpress Client which will retrieve and post posts
'''
wp = Client('http://ash.wine/xmlrpc.php', USERNAME, PASSWORD)
'''
Get all Wordpress posts (in batches of 20) from the Hacks category
And add all the titles to the wordpressPosts list.
'''
wpOffset = 0
wpIncrement = 20
while True:
posts = wp.call(GetPosts({'number': wpIncrement, 'offset': wpOffset}))
if len(posts) == 0:
print ('Imported ' + str(len(wordpressPosts)) + ' Wordpress posts.')
break # no more posts returned
for post in posts:
#if it's in the hacks category, add it to the list
if 'Hacks' in str(post.terms):
wordpressPosts.append(post)
wpOffset = wpOffset + wpIncrement
'''
Get all Gists (in batches of 20)
And add all the gists with #gistblog to the gistBlogs list.
'''
page = 1
offset = 0
increment = 20
while True:
#Make HTTP request to GitHub API
r = requests.get('http://api.github.com/users/ashwinning/gists?page='+str(page)+'&per_page='+str(increment))
response = r.json()
if str(response) == '[]':
print('Imported ' + str(len(gistBlogs)) + ' Gists.')
break # no more posts returned
for item in response:
description = item['description']
tags = GetTags(description)
#if it's got the gistblog hashtag, add it to the list
if GistBlogExists(tags):
#Save the description as the title
gistPost = GistPost(description, item['html_url'], RemoveGistBlog(tags), item['created_at'])
gistBlogs.append(gistPost)
offset = offset + increment
page += 1
'''
Remove all gistBlogs from list which already exist
in wordpressPosts
'''
for wordpressPost in wordpressPosts:
for gistBlog in gistBlogs:
if wordpressPost.title in gistBlog.title:
#Remove this gistblog
gistBlogs.remove(gistBlog)
break #Move to next wordpressPost
'''
Display the number of gists to be posted
'''
print ('Posting ' + str(len(gistBlogs)) + ' new gists.')
'''
Post remaining gistBlogs to Wordpress
'''
gistsPosted = 0
for gistBlog in gistBlogs:
post = WordPressPost()
titleToPost = SanitizeDescription(gistBlog.title)
post.title = titleToPost
post.content = gistBlog.url
post.terms_names = {
'post_tag': gistBlog.tags,
'category': ['hacks'],
}
post.post_status = 'publish'
timestamp = TimeSanitizer(gistBlog.created_at)
post.date = datetime.datetime.strptime(timestamp, "%Y-%m-%d %H:%M")
post.id = wp.call(NewPost(post))
gistsPosted += 1
print (str(gistsPosted) + ') ' + titleToPost + ' posted.')
print ('COMPLETE! ' + str(gistsPosted) + ' new gists posted.')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment