在Lambda上通过Peer Occuring重置连接

问题描述 投票:1回答:1

我在Python 2.7中编写了一个简单的脚本,它使用urllib(2),cookielib和bs4编译我的学校网站上的作业。当我从我的IDE运行它时,它完美无误地运行。但是当为Alexa编译它并在AWS Lambda上运行它时,我收到以下错误:

[Errno 104] Connection reset by peer: error
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 136, in lambda_handler
return on_launch(event['request'], event['session'])
File "/var/task/lambda_function.py", line 80, in on_launch
return scraper(session)
File "/var/task/lambda_function.py", line 98, in scraper
open(URL)
File "/var/task/lambda_function.py", line 16, in open
return browser.open(url, postdata).read()
File "/usr/lib64/python2.7/urllib2.py", line 429, in open
response = self._open(req, data)
File "/usr/lib64/python2.7/urllib2.py", line 447, in _open
'_open', req)
File "/usr/lib64/python2.7/urllib2.py", line 407, in _call_chain
result = func(*args)
File "/usr/lib64/python2.7/urllib2.py", line 1243, in https_open
context=self._context)
File "/usr/lib64/python2.7/urllib2.py", line 1203, in do_open
r = h.getresponse(buffering=True)
File "/usr/lib64/python2.7/httplib.py", line 1136, in getresponse
response.begin()
File "/usr/lib64/python2.7/httplib.py", line 453, in begin
version, status, reason = self._read_status()
File "/usr/lib64/python2.7/httplib.py", line 409, in _read_status
line = self.fp.readline(_MAXLINE + 1)
File "/usr/lib64/python2.7/socket.py", line 480, in readline
data = self._sock.recv(self._rbufsize)
File "/usr/lib64/python2.7/ssl.py", line 756, in recv
return self.read(buflen)
File "/usr/lib64/python2.7/ssl.py", line 643, in read
v = self._sslobj.read(len)
error: [Errno 104] Connection reset by peer

我知道通常这是因为我试图访问的服务器正在丢弃连接,但我无法弄清楚它为什么在我的IDE中运行而不是在我的lambda中。

这是我在IDE中使用的原始代码:

import urllib
import urllib2
import cookielib
import datetime
from bs4 import BeautifulSoup
assignment = []
classes = []
cj = cookielib.CookieJar()
browser = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
browser.addheaders = [('User-Agent', 'Mozilla/5.0')]
def open(url, postdata=None):
    if postdata is not None:
        postdata = urllib.urlencode(postdata)
    return browser.open(url, postdata).read()


USER = 'USERNAME' # these aren't my real credentials
PASS = 'PASSWORD'
URL = 'my school homework website'
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M')

open(URL)

POST = {'username': USER,
        'password': PASS,
        'date': now}

loggedIn = open(URL, POST)
soup = BeautifulSoup(loggedIn, "html.parser")
for span in soup.find_all('span', {'class':'title'}):
    assignment.append(span.get_text())

for div in soup.find_all('div', {'class':'sub', 'style':'white-space: normal;'}):
    classes.append(div.get_text())

for i in range(0, len(assignment)):
    print 'for ', classes[i], 'your homework is ', assignment[i]

这是抛出错误的Lambda代码:

import urllib
import urllib2
import cookielib
import datetime
from bs4 import BeautifulSoup
assignment = []
classes = []
final_assignments = []
cj = cookielib.CookieJar()
browser = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
browser.addheaders = [('User-Agent', 'Mozilla/5.0')]

def open(url, postdata=None):
    if postdata is not None:
        postdata = urllib.urlencode(postdata)
    return browser.open(url, postdata).read()

USER = 'USERNAME' # Not my actual Credentials
PASS = 'PASSWORD'
URL = 'my school homework website'
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M')

def build_speechlet_response(title, output, reprompt_text, should_end_session):
    return {
        'outputSpeech': {
            'type': 'PlainText',
            'text': output
        },
        'card': {
            'type': 'Simple',
            'title': title,
            'content': output
        },
        'reprompt': {
            'outputSpeech': {
                'type': 'PlainText',
                'text': reprompt_text
            }
        },
        'shouldEndSession': should_end_session
    }


def build_response(session_attributes, speechlet_response):
    return {
        'version': '1.0',
        'sessionAttributes': session_attributes,
        'response': speechlet_response
    }


# --------------- Functions that control the skill's behavior ------------------

def handle_session_end_request():
    card_title = "Session Ended"
    speech_output = "Thank you for using Homework Retriever!"
    # Setting this to true ends the session and exits the skill.
    should_end_session = True
    return build_response({}, build_speechlet_response(
        card_title, speech_output, None, should_end_session))


# --------------- Events ------------------

def on_session_started(session_started_request, session):
    """ Called when the session starts """

    print("on_session_started requestId=" + session_started_request['requestId']
          + ", sessionId=" + session['sessionId'])


def on_launch(launch_request, session):
    """ Called when the user launches the skill without specifying what they
    want
    """

    print("on_launch requestId=" + launch_request['requestId'] +
          ", sessionId=" + session['sessionId'])
    # Dispatch to your skill's launch
    return scraper(session)





def on_session_ended(session_ended_request, session):
    """ Called when the user ends the session.

    Is not called when the skill returns should_end_session=true
    """
    print("on_session_ended requestId=" + session_ended_request['requestId'] +
          ", sessionId=" + session['sessionId'])
    # add cleanup logic here

# --------------- Main handler ------------------
def scraper(session):
    sessionAttributes = session.get('attributes', {})
    open(URL)

    POST = {'username': USER,
            'password': PASS,
            'date': now}
    loggedIn = open(URL, POST)
    soup = BeautifulSoup(loggedIn, "html.parser")
    for span in soup.find_all('span', {'class':'title'}):
        assignment.append(span.get_text())
    for div in soup.find_all('div', {'class':'sub', 'style':'white-space: normal;'}):
        classes.append(div.get_text())
    for i in range(0, len(assignment)):
        assignment_not_finished = "for " + str(classes[i]) + "your homework is " + str(assignment[i])
        final_assignments.append(str(assignment_not_finished))
    return build_response(sessionAttributes, build_speechlet_response(
        'Your Homework', str(final_assignments), 'null', True))

def lambda_handler(event, context):
    """ Route the incoming request based on type (LaunchRequest, IntentRequest,
    etc.) The JSON body of the request is provided in the event parameter.
    """
    print("event.session.application.applicationId=" +
          event['session']['application']['applicationId'])

    """
    Uncomment this if statement and populate with your skill's application ID to
    prevent someone else from configuring a skill that sends requests to this
    function.
    """
    # if (event['session']['application']['applicationId'] !=
    #         "amzn1.echo-sdk-ams.app.[unique-value-here]"):
    #     raise ValueError("Invalid Application ID")

    if event['session']['new']:
        on_session_started({'requestId': event['request']['requestId']},
                           event['session'])

    if event['request']['type'] == "LaunchRequest":
        return on_launch(event['request'], event['session'])
    elif event['request']['type'] == "IntentRequest":
        return on_intent(event['request'], event['session'])
    elif event['request']['type'] == "SessionEndedRequest":
        return on_session_ended(event['request'], event['session'])
python aws-lambda urllib alexa alexa-skills-kit
1个回答
0
投票

搬家后:

cj = cookielib.CookieJar() browser = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) browser.addheaders = [('User-Agent', 'Mozilla/5.0')] def open(url, postdata=None): if postdata is not None: postdata = urllib.urlencode(postdata) return browser.open(url, postdata).read() USER = 'USERNAME' # Not my actual Credentials PASS = 'PASSWORD' URL = 'my school homework website' now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M') 

进入刮刀功能它正在工作

© www.soinside.com 2019 - 2024. All rights reserved.