#python #google-app-engine #twitter
#python #google-app-engine #Twitter
Вопрос:
Я получаю эту ошибку от AppEngine при попытке опубликовать твит. Я думаю, что мой синтаксис не совсем правильный, но на данный момент я в растерянности.
Ни за что на свете я не могу отправить свои аргументы статуса в ** extra_params в функции post, используя:
args = {} <br/>
args.update({'status': 'THIS IS MY TWEET'})<br/>
info2 = client.post('/statuses/update',args)<br/>
Точная ошибка:
"File "/base/data/home/apps/kymbatweet/1.350119792863170339/main.py", line 311, in get_signed_body
__meth.upper(), __url, 'amp;'.join(
AttributeError: 'dict' object has no attribute 'upper'"
Есть идеи? (далее следует код)
def post(self, api_method, http_method='POST', expected_status=(200,), **extra_params):
if not (api_method.startswith('http://') or api_method.startswith('https://')):
api_method = '%s%s%s' % (
self.service_info['default_api_prefix'], api_method,
self.service_info['default_api_suffix']
)
if self.token is None:
#self.token = OAuthAccessToken.get_by_key_name(self.get_cookie())
self.token = "000"
fetch = urlfetch(url=api_method, payload=self.get_signed_body(
api_method, "000", http_method, **extra_params
), method=http_method)
if fetch.status_code not in expected_status:
raise ValueError(
"Error calling... Got return status: %i [%r]" %
(fetch.status_code, fetch.content)
)
return decode_json(fetch.content)
def get_signed_body(self, __url, __token=None, __meth='GET',**extra_params):
service_info = self.service_info
kwargs = {
'oauth_consumer_key': service_info['consumer_key'],
'oauth_signature_method': 'HMAC-SHA1',
'oauth_version': '1.0',
'oauth_timestamp': int(time()),
'oauth_nonce': getrandbits(64),
}
kwargs.update(**extra_params)
#This works if hardcoded
#kwargs.update({'status': 'AE'})
if self.service_key is None:
self.service_key = get_service_key(self.service)
if __token is not None:
kwargs['oauth_token'] = "000"
key = self.service_key encode("6iD2LYnUfEOYl0zOCj5IKawbok3pjs4yixay5bdM")
else:
key = self.service_key
#Code BOMBS HERE
message = 'amp;'.join(map(encode, [
__meth.upper(), __url, 'amp;'.join(
'%s=%s' % (encode(k), encode(kwargs[k])) for k in sorted(kwargs)
)
]))
kwargs['oauth_signature'] = hmac(
key, message, sha1
).digest().encode('base64')[:-1]
return urlencode(kwargs)
class MainHandler(RequestHandler):
"""Demo Twitter App."""
def get(self):
client = OAuthClient('twitter', self)
client.token = "000"
args = {}
args.update({'status': 'THIS IS MY TWEET'})
info2 = client.post('/statuses/update',args)
Ответ №1:
Вы не передаете его как extra_params
, вы передаете его как http_method
.
info2 = client.post('/statuses/update', **args)
Ответ №2:
Если вы хотите передать дополнительные параметры (ключевые параметры) из словаря, вам нужно вызвать его следующим образом:
client.post('/path', **args)