6

I'm developing some software in python that utilizes Steam APIs. I'm using Flask to run and test the python code. Everything was going swell, but now I'm getting this error (I haven't changed any code):

('Connection aborted.', error(10060, 'A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond'))

I have no idea why this error is coming up, because the code was working perfectly fine and suddenly the error comes up, and I haven't changed anything in the code or with my computer or Flask.

The code:

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)

I would like to have an explanation of what the error means, and why this is happening. Thanks in advance. I really appreciate the help.

4

3 回答 3

7

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

由于 10060 似乎是超时错误,服务器是否可能接受速度很慢,如果网站在您的浏览器中打开,那么您的浏览器可能有更高的超时阈值?

尝试在 request.get() 中增加请求时间

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

于 2014-11-02T16:28:36.637 回答
3

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

通常,您无法修复网络抖动。但仍有一些方法可以帮助您。

首先,当你捕捉到网络错误时,你让你的线程休眠一秒钟,然后再试一次!

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

于 2014-11-02T16:33:49.533 回答
0

根据我的经验,那些“连接方在一段时间后没有响应”,特别是以前使用相同的代码时,通常与 MTU 大小有关。通常您应该只确定最大 MTU 大小(不要忘记添加 28 个字节,如链接中所述),然后您可以更改客户端计算机中的 MTU 大小。

于 2015-05-28T16:13:52.050 回答