24791


コード：

[code]

    #!/usr/bin/env python
    #coding: utf-8
    userid="**************@gmail.com"
    passwd="*******"
    import sys, re, cgi, urllib, urllib.request, urllib.error, http.cookiejar, xml.dom.minidom, time, urllib.parse
    import simplejson as json
    
    def getToken():
    html = urllib.request.urlopen("http://www.nicovideo.jp/my/mylist").read()
    for line in html.splitlines():
        mo = re.match(r'^\s*NicoAPI\.token = "(?P<token>[\d\w-]+)";\s*',line)
        if mo:
            token = mo.group('token')
            break
    assert token
    return token
    
    def mylist_create(name):
        cmdurl = "http://www.nicovideo.jp/api/mylistgroup/add"
        q = {}
        q['name'] = name.encode("utf-8")
        q['description'] = ""
        q['public'] = 0
        q['default_sort'] = 0
        q['icon_id'] = 0
        q['token'] = token
        cmdurl += "?" + urllib.parse.urlencode(q).encode("utf-8")
        j = json.load( urllib.request.urlopen(cmdurl), encoding='utf-8')
        return j['id']
    
    def addvideo_tomylist(mid,smids):
        for smid in smids:
            cmdurl = "http://www.nicovideo.jp/api/mylist/add"
            q = {}
            q['group_id'] = mid
            q['item_type'] = 0
            q['item_id'] = smid
            q['description'] = u""
            q['token'] = token
            cmdurl += "?" + urllib.parse.urlencode(q).encode("utf-8")
            j = json.load( urllib.request.urlopen(cmdurl), encoding='utf-8')
            time.sleep(0.5)
    
    #ログイン
    opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(http.cookiejar.CookieJar()))
    urllib.request.install_opener(opener)
    urllib.request.urlopen("https://secure.nicovideo.jp/secure/login",
         urllib.parse.urlencode( {"mail":userid, "password":passwd} ))
    #トークン取得
    token = getToken()
    #マイリストの作成と動画の登録
    mid = mylist_create(u"テストリスト")
    addvideo_tomylist(mid, ["sm9","sm1097445", "sm1715919"  ] )
    
[/code]

エラー：

[code]

    Traceback (most recent call last):
      File "Nico3.py", line 47, in <module>
        urllib.request.urlopen("https://secure.nicovideo.jp/secure/login", urllib.parse.urlencode( {"mail":userid, "password":passwd} ))
      File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 162, in urlopen
    return opener.open(url, data, timeout)
      File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 463, in open
    req = meth(req)
      File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 1170, in do_request_
    raise TypeError(msg)
    TypeError: POST data should be bytes or an iterable of bytes. It cannot be of type str.
    
[/code]

エラー２（追記）

[code]

    Traceback (most recent call last):
      File "Nico3.py", line 50, in <module>
    token = getToken()
      File "Nico3.py", line 11, in getToken
    mo = re.match(r'^\s*NicoAPI\.token = "(?P<token>[\d\w-]+)";\s*',line)
      File "/Users/NanjoHiroki/.virtualenvs/uec/lib/python3.5/re.py", line 163, in match
    return _compile(pattern, flags).match(string)
    TypeError: cannot use a string pattern on a bytes-like object
    
[/code]

エラー３：

[code]

    Traceback (most recent call last):
      File "Nico3.py", line 50, in <module>
    token = getToken()
      File "Nico3.py", line 15, in getToken
    assert token
    UnboundLocalError: local variable 'token' referenced before assignment
    
[/code]


CC BY-SA 3.0
2016-05-12T07:14:12.973
24786
2016-05-13T07:22:20.667
2016-05-12T18:40:17.463
question
python api
TypeErrorが出てきて実行できない。


エラー:  
`POST data`は`str`型ではなく`bytes`型ではないといけないというエラーです．`urllib.parse.urlencode(
{"mail":userid, "password":passwd}
)`は`str`型をかえすのでこれを特定の文字コードを指定して`bytes`型に変換します．

[code]

    urllib.request.urlopen("https://secure.nicovideo.jp/secure/login",
         urllib.parse.urlencode( {"mail":userid, "password":passwd} ).encode('ascii'))
    
[/code]

エラー2:  
`urllib.request.urlopen().read()`は`bytes`型を返します．
`bytes`型にたいして`str`型の正規表現パターンは適用できないよというエラーです． 対応としては  
1\. htmlを`str`型に変換する(htmlの文字コードがutf-8の場合)

[code]

    html = urllib.request.urlopen("http://www.nicovideo.jp/my/mylist").read()．decode('utf-8')
    
[/code]

または  
2． 正規表現パターンを`bytes`型にする

[code]

        mo = re.match(rb'^\s*NicoAPI\.token = "(?P<token>[\d\w-]+)";\s*',line)
    
[/code]

エラー3:  
正規表現にマッチする行が1つもなかった場合， `token`の代入文が実行されないので, そのとき`token`はないというエラーです．
例えば関数の先頭でいったん初期値を代入すれば，そのエラーはきえます．

[code]

    token = False
    
[/code]

初期値に`False`を入れておけば， `assert`でtokenがみつかったどうかがチェックできます．
ちょっと気になるのは`assert`を使っているということは`html`には必ずtokenが含まれていると想定しているんですよね・・・


CC BY-SA 3.0
2016-05-12T09:06:49.160
24791
2016-05-13T07:22:20.667
2016-05-13T07:22:20.667
14418
14418
24786
answer