wtorek, 10 czerwca 2014

Python: gdata, blogger i dodawanie postów

Jak już wspominałem, zacząłem się bawić z językiem Python. Od paru dni czytam sobie dokumentację i piszę sobie kody. Dorwałem się też praktycznie od razu do API Google. Pozwolę sobie napisać jak łatwo można dodać ze skryptu w pythonie post do bloggera.

Przede wszystkim trzeba sobie ściągnąć i zainstalować API od Google. Najprościej pobrać ostatnią wersję prosto z Google Code. Tutaj od razu ostrzegam, że biblioteka jest przeznaczona dla Python 2.x nie dla 3.x. Jeśli ktoś chce go używać z Python 3.x, to musi bibliotekę przeportować, co niestety nie jest w pełni zautomatyzowane. Może niedługo podzielę się opisem jak sam to sobie robię.

Dla dodawaniu postu konieczne będzie zaimportowanie modułów lub pojedynczych klas:
from gdata.blogger.service import BloggerService
import gdata
import atom
W zasadzie to wystarczy. Dla celów testowych ja korzystam jeszcze z:
import pprint
Następnym krokiem jest zalogowanie użytkownika:
client = BloggerService()
client.email = 'xxx@gmail.com'
client.password = 'xxx'
client.server = 'www.blogger.com'
client.ProgrammaticLogin()
W polach email i password należy przypisać właściwe wartości dla użytkownika. Warto załadować je z pliku konfiguracyjnego lub z jakiegoś wejścia. Ja zaszyłem je w kodzie, ponieważ to tylko wprawki.

Teraz przyda się pobrać id bloga, do którego chcemy dodać post. Poniższy kod pobiera listę blogów dla zalogowanego użytkownika, a następnie pobiera ID z pierwszego z nich.
feed = client.GetBlogFeed()
blogId = feed.entry[0].GetBlogId()
Domyślnie pobranych zostanie tylko część blogów, ponieważ feed ma ograniczoną liczbę wyników. Nie będę jednak opisywał jak pozyskać wszystkie.

Ostatni etap to utworzenie samego postu. Pierwotnie próbowałem skorzystać z klas z definiowanych w module gdata.blogger, jednak bez powodzenia. Moje niepowodzenie wynika pewnie z mojego nieukończonego portu. Tak więc utworzyłem post w sposób zbliżony do opisanego w oficjalnej dokumentacji korzystając z klasy GDataEntry:
post = gdata.GDataEntry()
post.title = atom.Title('xhtml', 'Python: test automatyki')
post.content = atom.Content(content_type = 'html', text='testowy post z pythona')

result = client.AddPost(post, blogId)
Aby ustawić jedynie tytuł i treść wystarczą 2 proste linie kodu. Istotne jest aby dla treści ustawić poprawnie content_type. Błędny lub pominięty powoduje wystąpienie błędu MIME TYPE. Znalezienie jego przyczyny może nie być zbyt proste.

Na koniec jeszcze pewna ciekawostka. Możliwe jest dodanie draftu do zatwierdzenia później, ale możliwe jest też dodanie postu zaplanowanego na później. Ta metoda interesuje mnie najbardziej. Aby tego dokonać wystarczy ustawić pole published:
post.published = atom.Published('2014-10-10T08:30:00+01:00')
Dość istotny tutaj jest format zapisu daty. Nie wystarczy podać daty, konieczne jest podanie pełnego znacznika czasu dla GMT wraz ze strefą czasową. Niepoprawny format tego znacznika powoduje błąd formatu.

No to wracam do zabawy z Pythonem i możliwe, że już niedługo wrzucę jakiś post prosto ze swojego skryptu.

2 komentarze:

  1. Polecam django do zabawy z Pythonem. Zrób jakiś cms, będzie to wymagało sporo technik z Pythona a zawsze to jakiś cel.
    Pozdrawiam #motowarszawa #wykopkurwa

    OdpowiedzUsuń
    Odpowiedzi
    1. Mam już cel, ale go jeszcze nie zdradzam :). Z resztą nie ciągnie mnie jakoś specjalnie mocno do użycia Pythona dla jakiegoś CMS. Raczej jakiś backend do zautomatyzowania jakiś prac mi się bardziej podoba. Za mało na razie zrobiłem w tym języku i większością rzeczy nie mogę się jeszcze pochwalić. Ach klauzule tajności :D

      Usuń