37600


はじめまして  
最近Pythonを触るようになったのですが、ドコモの雑談対話APIを使って動かして見たいプログラミングがPython2のものだったので3に変換しているのですが、どうしてもエラーが出てしまうので質問させていただきました。  
<http://yu-write.blogspot.jp/2013/11/python-docomoapi.html>  
こちらのものをPython3で動かすために

[code]

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    #Docomoの雑談対話APIを使ってチャットできるスクリプト
    
    
    import sys
    import urllib.request
    import json
    import os
    
    
    APP_URL = 'https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue'
    
    
    class DocomoChat(object):
    #Docomoの雑談対話APIでチャット
    
        def __init__(self, api_key):
            api_key = os.environ.get('DOCOMO_DIALOGUE_API_KEY', api_key)
            super(DocomoChat, self).__init__()
            self.api_url = APP_URL + ('?APIKEY=%s'%api_key)
            self.context, self.mode = None, None
    
        def __send_message(self, input_message='', custom_dict=None):
            req_data = {'utt': input_message}
            if self.context:
                req_data['context'] = self.context
            if self.mode:
                req_data['mode'] = self.mode
            if custom_dict:
                req_data.update(custom_dict)
            request = urllib.request(self.api_url, json.dumps(req_data))
            request.add_header('Content-Type', 'application/json')
            try:
                response = urllib.urlopen(request)
            except Exception as e:
                print (e)
                sys.exit()
            return response
    
        def __process_response(self, response):
            resp_json = json.load(response)
            self.context = resp_json['context'].encode('utf-8')
            self.mode    = resp_json['mode'].encode('utf-8')
            return resp_json['utt'].encode('utf-8')
    
        def send_and_get(self, input_message):
            response = self.__send_message(input_message)
            received_message = self.__process_response(response)
            return received_message
    
    
        def set_name(self, name, yomi):
            response = self.__send_message(custom_dict={'nickname': name, 'nickname_y': yomi})
            received_message = self.__process_response(response)
            return received_message
    
    
    def main():
        chat = DocomoChat('api_key')
        resp = chat.set_name('あなたのニックネーム', 'ニックネームのヨミガナ')
        print ('相手　 : %s'% resp)
        message = ''
        while message != 'バイバイ':
            message = raw_input('あなた : ')
            resp = chat.send_and_get(message)
            print ('相手　 : %s'%resp)
    
    if __name__ == "__main__":
        main()
    
[/code]

このように調べながら少しづつ変更していき、APIも.bash_profileに入れたものを使えるようにできないかと試しているのですが、現状では、

[code]

    $ python talk.py
    Traceback (most recent call last):
      File "talk.py", line 71, in <module>
        main()
      File "talk.py", line 62, in main
        resp = chat.set_name('あなたのニックネーム', 'ニックネームのヨミガナ')
      File "talk.py", line 55, in set_name
        response = self.__send_message(custom_dict={'nickname': name, 'nickname_y': yomi})
      File "talk.py", line 33, in __send_message
        request = urllib.request(self.api_url, json.dumps(req_data))
    TypeError: 'module' object is not callable
    
[/code]

このようにTypeErrorがでてしまいます。  
このエラーについても調べて「モジュールの名前.対象のクラス」にしたら良いとは分かったのですが、どの部分に対してこの変更を行ったら良いのかもわからず行き詰ってしまいました。  
また、そもそもPython2で動かしたら良いのではとも思い行って見たのですが、動きはしたのですが文字化けしてしまいました。

質問の書き方があっているかもわかりませんし、すごく初歩的なところを質問しているのかもしれませんがどうぞ宜しくお願いします。


CC BY-SA 3.0
2017-08-30T03:44:24.727
37599
2017-08-30T04:14:26.640
2017-08-30T04:00:34.363
19110
25104
question
python python3
ドコモの雑談対話APIのPython2プログラミングのPython3化


この行

[code]

    request = urllib.request(self.api_url, json.dumps(req_data))
    
[/code]

は元々の [YuraYura](https://www.blogger.com/profile/15070671187447610013)
さんによる[プログラム](http://yu-write.blogspot.jp/2013/11/python-
docomoapi.html)では下のようになっていました。

[code]

    request = urllib2.Request(self.api_url, json.dumps(req_data))
    
[/code]

ここの書き換えが間違っています。[`urllib.request`](https://docs.python.jp/3/library/urllib.request.html)
までで1つのモジュール名です。このモジュールの `Request` メソッドを呼び出したいので、`urllib.request.Request`
と書いてください。

* * *

参考: `urllib2`
パッケージの[ドキュメント](https://docs.python.org/2/library/urllib2.html)には以下のように書かれています。

> The [`urllib2`](https://docs.python.org/2/library/urllib2.html#module-
> urllib2) module has been split across several modules in Python 3 named
> `urllib.request` and `urllib.error`. The
> [2to3](https://docs.python.org/2/glossary.html#term-2to3) tool will
> automatically adapt imports when converting your sources to Python 3.


CC BY-SA 3.0
2017-08-30T04:14:26.640
37600
2017-08-30T04:14:26.640
19110
37599
answer