2016-07-30 5 views
-2

파이썬 스크립트로 captcha 파일 인식을 자동화하려고합니다. 그러나 노력의 며칠 후 내 기능을 원하는 결과에서 멀리 것으로 보인다.AttributeError : 파이썬에서 다운로드 한 이미지를 버퍼링하는 동안 __exit__ 2.7

또한 내가 얻은 흔적은 내가 조사하는 데 도움이 될만큼 유익하지 않습니다. 여기

def getmsg(): 
    solved = '' 
    probe_request = [] 
    try: 
     probe_request = api.messages.get(offset = 0, count = 2) 
    except apierror, e: 
     if e.code is 14: 
      key = e.captcha_sid 
      imagefile = cStringIO.StringIO(urllib.urlopen(e.captcha_img).read()) 
      img = Image.open(imagefile) 
      imagebuf = img.load() 
      with imagebuf as captcha_file: 
       captcha = cptapi.solve(captcha_file) 
    finally: 
     while solved is None: 
      solved = captcha.try_get_result() 
      tm.sleep(1.500) 
     print probe_request 

역 추적은 다음과 같습니다 : 여기

내 기능입니다

Traceback (most recent call last): 
    File "myscript.py", line 158, in <module> 
    getmsg() 
    File "myscript.py", line 147, in getmsg 
    with imagebuf as captcha_file: 
AttributeError: __exit__ 

누군가가 내가 잘못 정확히 명확히 주시겠습니까?

또한 나는 버퍼링없이 이미지 처리에 성공하지 못했습니다 :

captcha = cptapi.solve(captcha_file) 
    File "/usr/local/lib/python2.7/dist-packages/twocaptchaapi/__init__.py", line 62, in proxy 
    return func(*args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/twocaptchaapi/__init__.py", line 75, in proxy 
    return func(*args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/twocaptchaapi/__init__.py", line 147, in solve 
    raw_data = file.read() 
    File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 632, in __getattr__ 
    raise AttributeError(name) 
AttributeError: read 

답변

0

imagebufcontext manager되지 않습니다 :

key = e.captcha_sid 
response = requests.get(e.captcha_img) 
img = Image.open(StringIO.StringIO(response.content)) 
with img as captcha_file: 
    captcha = cptapi.solve(captcha_file) 

에 연결됩니다. 처음에는 contextmanager.__exit__ method을 저장하여 컨텍스트 관리자를 테스트하는 with 문에서 사용할 수 없습니다. 그것도 닫을 필요가 없습니다.

cptapi.solve에는 파일과 유사한 객체가 필요합니다. solve() docstring에서 :

Queues a captcha for solving. file may either be a path or a file object.

여기 Image 객체를 전달 아무 소용이 없습니다, 단지 대신 StringIO 인스턴스를 전달 :

imagefile = cStringIO.StringIO(urllib.urlopen(e.captcha_img).read()) 
captcha = cptapi.solve(imagefile) 

을 다시 여기 오브젝트입니다 가까운 사용할 필요가 없습니다 with을 사용할 필요가 없습니다.

+0

고마워요. 문제가 해결되었습니다. – unexposed