连接错误:连接尝试失败,因为连接方在一段时间后没有正确响应

时间:2014-11-02 14:09:21

标签: python flask runtime-error steam-web-api

我正在开发一些使用Steam API的python软件。我正在使用Flask来运行和测试python代码。一切都在膨胀,但现在我收到了这个错误(我没有更改任何代码):

  

('连接已中止。',错误(10060,'连接尝试失败   因为关联方在一段时间后没有正确回应   时间或已建立的连接因连接的主机而失败   没有回复'))

我不知道为什么会出现这个错误,因为代码工作得非常好,突然出现了错误,我没有更改代码或计算机或Flask中的任何内容。

代码:

import urllib
import itertools
import urllib2
import time
from datetime import datetime
from bs4 import BeautifulSoup
from flask import Flask
import requests
import json
import xml.etree.ElementTree as ET
from xml.dom.minidom import parseString
import sys


app = Flask(__name__)
API_KEY = 'XXX'
API_BASEURL = 'http://api.steampowered.com/'
API_GET_FRIENDS = API_BASEURL + 'ISteamUser/GetFriendList/v0001/?key='+API_KEY+'&steamid='
API_GET_SUMMARIES = API_BASEURL + 'ISteamUser/GetPlayerSummaries/v0002/?key='+API_KEY+'&steamids='
PROFILE_URL = 'http://steamcommunity.com/profiles/'
steamIDs = []
myFriends = []

class steamUser:
    def __init__(self, name, steamid, isPhisher):
        self.name = name
        self.steamid = steamid
        self.isPhisher = isPhisher

    def setPhisherStatus(self, phisher):
        self.isPhisher = phisher

@app.route('/DeterminePhisher/<steamid>')
def getFriendList(steamid):
    try:
        r = requests.get(API_GET_FRIENDS+steamid)
        data = r.json()
        for friend in data['friendslist']['friends']:
            steamIDs.append(friend['steamid'])
        return isPhisher(steamIDs)
    except requests.exceptions.ConnectionError as e:
        return str(e.message)

def isPhisher(ids):
    phisherusers = ''
    for l in chunksiter(ids, 50):
        sids = ','.join(map(str, l))
        try:
            r = requests.get(API_GET_SUMMARIES+sids)
            data = r.json();
            for i in range(len(data['response']['players'])):
                steamFriend = data['response']['players'][i]
                n = steamUser(steamFriend['personaname'], steamFriend['steamid'], False)
                if steamFriend['communityvisibilitystate'] and not steamFriend['personastate']:
                    url =  PROFILE_URL+steamFriend['steamid']+'?xml=1'
                    dat = requests.get(url)
                    if 'profilestate' not in steamFriend:
                        n.setPhisherStatus(True);
                        phisherusers = (phisherusers + ('%s is a phisher' % n.name) + ', ')
                    if parseString(dat.text.encode('utf8')).getElementsByTagName('privacyState'):
                        privacy = str(parseString(dat.text.encode('utf-8')).getElementsByTagName('privacyState')[0].firstChild.wholeText)
                        if (privacy == 'private'):
                            n.setPhisherStatus(True)
                            phisherusers = (phisherusers + ('%s is a phisher' % n.name) + ', ')
                elif 'profilestate' not in steamFriend:
                    n.setPhisherStatus(True);
                    phisherusers = (phisherusers + ('%s is a phisher' % n.name) + ', ')
                else:
                    steamprofile = BeautifulSoup(urllib.urlopen(PROFILE_URL+steamFriend['steamid']).read())
                    for row in steamprofile('div', {'class': 'commentthread_comment  '}):
                        comment = row.find_all('div', 'commentthread_comment_text')[0].get_text().lower()
                        if ('phisher' in comment) or ('scammer' in comment):
                            n.setPhisherStatus(True)
                            phisherusers = (phisherusers + ('%s is a phisher' % n.name) + ', ')
                myFriends.append(n);
        except requests.exceptions.ConnectionError as e:
            return str(e.message)
        except:
            return "Unexpected error:", sys.exc_info()[0]
    return phisherusers

def chunksiter(l, chunks):
    i,j,n = 0,0,0
    rl = []
    while n < len(l)/chunks:        
        rl.append(l[i:j+chunks])        
        i+=chunks
        j+=j+chunks        
        n+=1
    return iter(rl)

app.run(debug=True)

我想解释错误的含义,以及为什么会这样。提前致谢。我非常感谢你的帮助。

3 个答案:

答案 0 :(得分:6)

好吧,这不是烧瓶错误,它基本上是python套接字错误

因为10060似乎是一个超时错误,服务器是否可能接受和非常慢 如果网站在您的浏览器中打开,那么您的浏览器有可能具有更高的超时阈值?

尝试在request.get()

中增加请求时间

如果远程服务器也在您的访问权限下,那么: 您不需要绑定套接字(除非远程服务器期望传入套接字) - 这实际上是连接要求的极为罕见。

答案 1 :(得分:2)

我认为这是因为steamcommunity的服务器不稳定或有些网络问题..

通常情况下,你无法修复网络震动。但是仍有一些方法可以帮助你。

首先,当你发现网络错误时,你让你的线程睡了一秒然后再试一次!

其次,我建议您使用Flask-Cache,例如缓存60秒,这将有助于减少http请求。

答案 2 :(得分:0)

根据我的经验,这些&#34;连接方在一段时间后没有响应&#34;,特别是当之前使用的相同代码通常与MTU大小相关时。通常您只需determine the maximum MTU size(不要忘记添加28个字节,如链接中所述),然后您可以在客户端计算机中change the MTU size