2013-12-11 16 views
9

Próbuję edytować niektóre posty w moim blogu tumblr przy użyciu PyTumblr i edit_post function, ale nie mogę dokładnie dowiedzieć się, jakie parametry są potrzebne. Próbuję umieścić parametr tags, ale nie jest on akceptowany.Jak mogę użyć funkcji edit_post w PyTumblr?

Próbowałem to:

client = pytumblr.TumblrRestClient(CONSUMER_KEY, CONSUMER_SECRET, 
            OAUTH_TOKEN, OAUTH_TOKEN_SECRET) 
client.edit_post('nameofblog', {'id': 39228373}) 

I to daje mi następujący błąd:

TypeError: edit_post() takes exactly 2 arguments (3 given) 

jakieś pomysły?

Jest to funkcja:

def edit_post(self, blogname, **kwargs): 
      """ 
    Edits a post with a given id 

    :param blogname: a string, the url of the blog you want to edit 
    :param tags: a list of tags that you want applied to the post 
    :param tweet: a string, the customized tweet that you want 
    :param date: a string, the GMT date and time of the post 
    :param format: a string, sets the format type of the post. html or markdown 
    :param slug: a string, a short text summary to the end of the post url 

    :returns: a dict created from the JSON response 
    """ 
     url = "/v2/blog/%s/post/edit" % blogname 
     return self.send_api_request('post', url, kwargs) 
+0

Dokładnie co próbowałeś przekazać jako parametr (i to nie zadziałało)? –

+2

Po pierwsze, nie widzę, gdzie umieszczam identyfikator żądanego wpisu. – GiannisIordanou

Odpowiedz

1

Przechodząc identyfikator nie jest dobrze udokumentowane, więc zapytałem:

client.edit_post("nameofblog", id=39228373, other="details", tags=["are", "cool"]) 

Ref: http://github.com/tumblr/pytumblr/issues/29

+0

Powyższe daje mi ten błąd: Wyjątek: id nie są dozwolone pola – GiannisIordanou

+0

@evil_inside Zaktualizowałem swoją odpowiedź na podstawie odpowiedzi od właściciela. – mikedidthis

3

Biblioteka PyTumblr oferuje cienką warstwę ponad Tumblr REST API, a wszystkie argumenty oprócz nazwy bloga powinny być przekazywane jako argumenty słów kluczowych.

Metoda TumblrRestClient.edit_post() służy wtedy jako proxy dla parametru /post/edit endpoint i ma wszystkie te same parametry.

Jako taki, można by nazwać to lubią:

client = pytumblr.TumblrRestClient(CONSUMER_KEY, CONSUMER_SECRET, 
           OAUTH_TOKEN, OAUTH_TOKEN_SECRET) 
client.edit_post('nameofblog', id=39228373) 

To nie znaczy, że jeśli masz słownika obiektu ze szczegółami pocztowych, nie można skorzystać z tego.

Jeśli chciał ustawić tytuł danego postu id, można użyć:

post = {'id': 39228373, 'title': 'New title!'} 
client.edit_post('nameofblog', **post) 

Tutaj słownika post jest stosowany do wywołania .edit_post() metody jako oddzielne słów kluczowych argumentów za pomocą składni **. Python następnie bierze każdą parę klucz-wartość ze słownika wejściowego i stosuje tę parę jako argument słowa kluczowego.

Powinieneś być w stanie ustawić dowolny z parametrów mających zastosowanie do Twojego typu poczty, wymienionych pod numerem posting documentation.

Problemem jest więc, że metoda .edit_post() opuszcza valid_params argument self. send_api_request() do domyślnej pustej listy, co prowadzi do gwarantowanego wyjątkiem walidacji niczego mijamy. To musi być błąd, a ja commented on Mike's issue wskazać to programistce.

+0

Otrzymałem nagrodę za szczegółowe wyjaśnienie użycia argumentów w funkcji. – GiannisIordanou

+0

Świetna odpowiedź i godny nagrody! Nauczyłem się również czegoś, co jest bonusem. – mikedidthis

+0

@mikedidthis: TBH Mam poczucie winy, że przegapiłem problem z weryfikacją tutaj. Przeskoczyłem bezpośrednio do "jeśli nie params" w funkcji sprawdzania poprawności, zakładając, że nastąpi wczesny powrót dla pustej listy poprawnych nazw parametrów. –

1

Wspomniana funkcja edit_post, opiera się na następujących funkcji:

def send_api_request(self, method, url, params={}, valid_parameters=[], needs_api_key=False): 
     """ 
Sends the url with parameters to the requested url, validating them 
to make sure that they are what we expect to have passed to us 

:param method: a string, the request method you want to make 
:param params: a dict, the parameters used for the API request 
:param valid_parameters: a list, the list of valid parameters 
:param needs_api_key: a boolean, whether or not your request needs an api key injected 

:returns: a dict parsed from the JSON response 
""" 
     if needs_api_key: 
      params.update({'api_key': self.request.consumer.key}) 
      valid_parameters.append('api_key') 

     files = [] 
     if 'data' in params: 
      if isinstance(params['data'], list): 
       files = [('data['+str(idx)+']', data, open(data, 'rb').read()) for idx, data in enumerate(params['data'])] 
      else: 
       files = [('data', params['data'], open(params['data'], 'rb').read())] 
      del params['data'] 

     validate_params(valid_parameters, params) 
     if method == "get": 
      return self.request.get(url, params) 
     else: 
      return self.request.post(url, params, files) 

Tak, problem jest, że funkcja edit_post w następującej linii:

return self.send_api_request('post', url, kwargs) 

nie przewiduje możliwości wyboru ważny opcje, tak jak ta funkcja w ostatnim wierszu:

def reblog(self, blogname, **kwargs): 
     """ 
Creates a reblog on the given blogname 

:param blogname: a string, the url of the blog you want to reblog to 
:param id: an int, the post id that you are reblogging 
:param reblog_key: a string, the reblog key of the post 

:returns: a dict created from the JSON response 
""" 
     url = "/v2/blog/%s/post/reblog" % blogname 

     valid_options = ['id', 'reblog_key', 'comment', 'type', 'state', 'tags', 'tweet', 'date', 'format', 'slug'] 
     if 'tags' in kwargs: 
      # Take a list of tags and make them acceptable for upload 
      kwargs['tags'] = ",".join(kwargs['tags']) 
     return self.send_api_request('post', url, kwargs, valid_options) 

Aby to naprawić, zmodyfikowany przewód powrotny do:

send_api_request('post', url, {'id':post_id, 'tags':tags}, ['id', 'tags'] 

dodałem tylko tagi chciałem. Powinien także współpracować z innymi.

+1

Ah! Brakowało mi części, w której pusta lista, jeśli poprawne parametry * nadal * prowadzi do sprawdzania poprawności parametrów. To * musi * być błędem; Mam komentarz na temat otwartego mike'a. –

Powiązane problemy