

下記のプログラムを使って、pythonからweiboの投稿を取得したいです。

[code]

    from weibo import Client
    
    API_KEY = '294703483' # app key
    API_SECRET = 'a2ef9de0a580edb7a26daf2804d27624' # app secret
    REDIRECT_URI= 'https://api.weibo.com/oauth2/default.html' # callback url
    
    c = Client(API_KEY, API_SECRET, REDIRECT_URI, token="2.00skPOWG0zpXw_e8253b9b7c9GKIdE", username="USER", password="PASSWORD")
    
    class Client(object):
       def __init__(self, api_key, api_secret, redirect_uri, token=None,
       username=None, password=None):
     # const define
            self.site = 'https://api.weibo.com/'
            self.authorization_url = self.site + 'oauth2/authorize'
            self.token_url = self.site + 'oauth2/access_token'
            self.api_url = self.site + '2/'
    
[/code]

実行結果

[code]

    [root@localhost デスクトップ]# python cinco.py
    Traceback (most recent call last):
      File "cinco.py", line 7, in <module>
        c = Client(API_KEY, API_SECRET, REDIRECT_URI,
    token="2.00skPOWG0zpXw_e8253b9b7c9GKIdE", username="USER", password="PASSWORD")
      File "/usr/lib/python2.7/site-packages/weibo.py", line 45, in __init__
        self.set_token(token)
      File "/usr/lib/python2.7/site-packages/weibo.py", line 84, in set_token
        self.uid = token['uid']
    TypeError: string indices must be integers, not str
    
[/code]

下記のリンクからweiboとpythonの情報取得しました。  
[http://weibo.lxyu.net/
（weiboのドキュメント）](http://weibo.lxyu.net/%E3%80%80%EF%BC%88weibo%E3%81%AE%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%EF%BC%89)

[https://www.cs.cmu.edu/~lingwang/weiboguide/
（weiboのaccess_tokenについて）](https://www.cs.cmu.edu/%7Elingwang/weiboguide/%E3%80%80%EF%BC%88weibo%E3%81%AEaccess_token%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%EF%BC%89)

上記のリンクで収得した内容

[code]

    {"access_token":"2.00skPOWG0zpXw_e8253b9b7c9GKIdE","remind_in":"157679999","expires_in":157679999,"uid":"5973036902”}
    code=682ac33cecf21d6efee0882e2a91eba4
    
[/code]

[https://github.com/michaelliao/sinaweibopy/wiki/OAuth2-HOWTO
（pythonからweiboの投稿を取得について）](https://github.com/michaelliao/sinaweibopy/wiki/OAuth2-HOWTO%E3%80%80%E3%80%80%E3%80%80%E3%80%80%E3%80%80%E3%80%80%E3%80%80%E3%80%80%E3%80%80%EF%BC%88python%E3%81%8B%E3%82%89weibo%E3%81%AE%E6%8A%95%E7%A8%BF%E3%82%92%E5%8F%96%E5%BE%97%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%EF%BC%89)

<http://open.weibo.com/apps/294703483/info/basic> (API_KEYなどの情報が載っています）

もしわかる方いれば教えていただけるとありがたいです。  
よろしくお願いいたします。


CC BY-SA 4.0
2016-10-03T02:14:48.917
29309
2022-01-26T11:40:06.260
2022-01-26T11:40:06.260
3060
18859
question
python
pythonからweiboの投稿を取得したいですがTypeErrorが出る。


エラーメッセージの中でポイントとなるのは

[code]

      File "/usr/lib/python2.7/site-packages/weibo.py", line 45, in __init__
        self.set_token(token)
      File "/usr/lib/python2.7/site-packages/weibo.py", line 84, in set_token
        self.uid = token['uid']
    TypeError: string indices must be integers, not str
    
[/code]

というあたりですが、文字列に対する添え字は数値でなければならず、 `token['uid']`
といった文字列キーでのアクセスができないというものです。要するに、 `Client(...)` に指定する `token` は
`{"access_token":"...","remind_in":"...","expires_in":...,"uid":"...”}`
に対応するような辞書型であり、 **access_token の文字列ではありません** 。

ドキュメントに書かれた次のコードのように、既存のClientから取得したものを使うのが正しいです。

[code]

    token = c.token
    c2 = Client(API_KEY, API_SECRET, REDIRECT_URI, token)
    
[/code]

WeiboのAPIを呼び出すうえでは確かに access_token だけあればいいのですが、お使いの
[lxyu/weibo](https://github.com/lxyu/weibo) では access_token のみの設定ができないようです。  
見たところaccess_tokenしか使っていないので、他の要素を適当に設定した辞書を渡せば動きそうではありますが。

当然ライブラリによって異なりますから、同じく質問に書かれた
[michaelliao/sinaweibopy](https://github.com/michaelliao/sinaweibopy/wiki/OAuth2-HOWTO)
の方では access_token のみの設定が可能なようですが、今 **お使いのとは別のライブラリです**
。念のため書いておくと、どちらも公式のライブラリではありません。


CC BY-SA 3.0
2016-10-03T05:30:18.993
29315
2016-10-03T05:30:18.993
8000
29309
answer