Moi
Mielestäni ao. vastauksen otsakkeet eivät ole ihan oikein:
Date header: Server header: Cache-Control header: P3P header: Content-Length header: Keep-Alive header: Connection header: Content-Type {"file": "4e76d0094156743a617f26e1b8c540.pdf"}
Kun sen pitäisi olla kenties jotain tähän tyyliin:
Date: Server: Cache-Control: P3P: Content-Length: Keep-Alive: Connection: Content-Type: text/json {"file":"4e76d0094156743a617f26e1b8c540.pdf"}
Yritän tässä saada erään rajapinnan kautta vastauksen, joka toimii selaimessa, mutta Python koodissani en tunnu pääsevän käsiksi tuohon varsinaiseen vastauksen sisältöön.
def get_report(session, user_report_id, start_date, end_date): body = {"user_report_id": user_report_id, "format": "pdf", "start_date": start_date, "end_date": end_date, "language": "fi" } report_file_hash = session.post(report_file_url, json.dumps(body), timeout=60, verify=False) if report_file_hash.status_code == 200: jsonval = json.loads(report_file_hash.text) pprint(report_file_hash.text) return jsonval
Sen verran viisastuin aloituspostauksen jälkeen, että response.content on tässä tapauksessa oikea tapa viitata vastauksen sisältöön.
Nyt ongelmana on:
WARNING:requests.packages.urllib3.connectionpool:Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProxyError('Cannot connect to proxy.', RemoteDisconnected('Remote end closed connection without response',))':
Muutenkin ollut selvittämistä ja virittelemistä, että saa sisäverkosta käsin yhteyden ulkoverkkoon.
Sama ongelma koskee myös ko. verkkopalvelua kokonaisuudessan eli senkään kautta ei saa aina dataa, puhumattakaan tästä rajapinnasta.
Jää nyt erittäin epäselväksi koko kysymys. Et yhtään kerro, millä tavalla olet saanut nuo aivan viallisen näköiset tiedot, kun ainakaan tuossa koodissa et niitä tulosta. Toisen viestin virheilmoituksesta päätellen jossain välissä on myös välityspalvelin (proxy), eli osaatko siitä kertoa enempää?
Jos tuntuu, että hommassa on monta häiriötä, yritä ratkaista ongelmat yksitellen. Tee ensin ohjelma, joka saa ladattua vaikka tämän sivun. Tee sitten omalle palvelimelle testisivu, joka näyttää pyynnön ja POST-datan, ja tutki sillä, että saat ohjelmastasi lähetettyä oikeanlaisen pyynnön. Sitten voit koettaa ladata oikealta palvelimelta edes jonkin sivun (tai olemattoman osoitteen, josta pitäisi yleensä tulla 404-vastaus). Vasta viimeiseksi yritä lähettää oikea data oikeaan osoitteeseen.
Metabolix kirjoitti:
(06.10.2017 15:47:20): Jää nyt erittäin epäselväksi koko kysymys. Et...
Eikös tuossa ole kuvattu ihan muuttuja tasolla, että miten ko. tiedot saadaan? Ainoastaan rajapinnan osoite puuttuu. Tämä ratkesi muistaakseni sillä, että POSTille annettava body tuli esittää "json=params" tapaan ennen kuin suostui toimimaan de facto:
def get_report(session, user_report_id, start_date, end_date): body = {"user_report_id": user_report_id, "format": "pdf", "start_date": start_date, "end_date": end_date, "language": "fi" } report_file_hash = session.post(report_file_url, json=json.dumps(body), timeout=60, verify=False) if report_file_hash.status_code == 200: jsonval = json.loads(report_file_hash.text) pprint(report_file_hash.text) return jsonval
Ja vaikka se toimikin lopulta, niin nyt ei toimi enää alkuunkaan ja uusi virhe on seuraava:
OSError: Tunnel connection failed: 502 Tunnel Connection Failed
Tämä tulee siis firman omien osoitteiden kanssa. Kokeilin varsin GETillä hakea google.fi, jolloin ainakin yritti yhdistää ja palautti 404 not found.
Ei sekään siis mikään luotettava tulos...
Välissä on tosiaan "corporate proxy", jonka takaa huudellaan ja vieläpä Windows koneella. Mitään yhteyksiä en ole muuttanut taikka koodia. Kaikki välityspalvelin asetuksetkin pitäisi olla entisellään, joten en ymmärrä, että mikä vikana ja missä.
Multibyte kirjoitti:
Eikös tuossa ole kuvattu ihan muuttuja tasolla, että miten ko. tiedot saadaan?
Minä en ainakaan ymmärrä, mikä kohta koodissasi tulostaisi ensimmäisen tekstilaatikon sisällän (” Date header:” jne.), joka oli ylivoimaisesti omituisin kohta koko jutussa.
Multibyte kirjoitti:
Välissä on tosiaan "corporate proxy", jonka takaa huudellaan ja vieläpä Windows koneella. Mitään yhteyksiä en ole muuttanut taikka koodia. Kaikki välityspalvelin asetuksetkin pitäisi olla entisellään, joten en ymmärrä, että mikä vikana ja missä.
Pääsetkö kyseisellä koneella muuten (esim. selaimella) nettiin? Jos et, varmaan firman tekninen tuki on oikea osoite näille kysymyksille.
Muuten kannattaa lähteä vielä kerran ihan perusjutuista.
import requests def f(s, r): if r.status_code == 200: print("%s: 200 OK: %s jne." % (s, r.text.lstrip().split("\n")[0].rstrip())) else: print("%s: %d" % (s, r.status_code)) f("HTTP GET", requests.get('http://example.com/')) f("HTTPS GET", requests.get('https://example.com/')) f("HTTP POST", requests.post('http://example.com/', data = {'key': 'value'})) f("HTTPS POST", requests.post('https://example.com/', data = {'key': 'value'}))
Toimiiko tuo? Jos ei toimi, täytyy ihan todella lähteä selvittämään, miten se firman välityspalvelin toimii ja pitääkö Pythoniin viritellä jotain lisäasetuksia sitä varten. (Vai oletko jo laittanut jotain proxy-asetuksia?) Jos taas toimii, voit kokeilla vaihtaa osoitteeksi käyttämäsi palvelun osoitteen.
Äärimmäisessä hädässä myös TCP-yhteyksien vakoilu vaikka Wiresharkilla saattaa näyttää, missä vika on.
Jaa niin tarkoitit silleen. Meinasin vain, että tuossa on kaikki mikä tehdään ennen tulostusta enkä nähnyt, että tulostustavalla olisi merkitystä asiassa.
Proxy tosiaan toimi aivan hyvin vielä viime viikolla ja toki päätteen netti pelaa.
Nyt on tullut ilmeisesti jotain muutoksia, joista ei tietenkään ole ilmoitettu mitään.
Pelottava ajatus, kun nuo proxy osoitteet on käsitykseni mukaan "muutamaan" purkkaviritykseen kovakoodattu...
Mutta uusia osoitteita ei siis ole tiedossa enkä ole niitä onnistunut kaivamaan esille pl. muutamat kokeilut ping wpad, ipconfig ja jotkut ilmaispalvelut.
Näistä saaduilla tiedoilla en ole onnistunut saamaan yhteyttä skriptien ja Internetin välille...
Alla siis nykyinen virheilmoitus:
requests.exceptions.ProxyError: HTTPConnectionPool(host='XXX', port=8080): Max retries exceeded with url: http://YYY.html (Caused by ProxyError('Cannot connect to proxy.', RemoteDisconnected('Remote end closed connection without response',)))
...jaa vaan nythän mää vasta hokasinkin. URL osoittavat meidän omiin palveluihin, jolloin tuo ilmeisesti menee jumiin? Nopea testi google.comilla viittaisi siihen...
Multibyte kirjoitti:
Nopea testi google.comilla viittaisi siihen...
Niin mihin? Toimiiko siis yhteys google.comiin?
Kysyin, mutta et vastannut: Oletko laittanut jo tuohon koodiin jotain proxy-asetuksia? ProxyError kuulostaa lähinnä siltä, että skriptisi yrittää yhdistää johonkin proxyyn, joka ei toimi. Ehkä ensimmäinen askel voisi olla väärien proxy-asetusten poistaminen. Sitten näkisit, tarvitaanko proxya ollenkaan. Jos tarvitaan, osoitteen selvittämisessä voisi auttaa vaikka Wireshark tai muu TCP-liikenteen näyttävä ohjelma, jolla näkisi, mihin osoitteeseen selain oikeasti yhdistää. Yleensä proxyn tiedot voi jotenkin lukea myös selaimen asetuksista.
Metabolix kirjoitti:
Niin mihin? Toimiiko siis yhteys google.comiin?
No siihen, että proxyä käytettäessä kaikkiin muihin kuin omiin verkkopalveluihin saa yhteyden.
Metabolix kirjoitti:
Kysyin, mutta et vastannut: Oletko laittanut jo tuohon koodiin jotain proxy-asetuksia? ProxyError kuulostaa lähinnä siltä, että skriptisi yrittää yhdistää johonkin proxyyn, joka ei toimi. Ehkä ensimmäinen askel voisi olla väärien proxy-asetusten poistaminen. Sitten näkisit, tarvitaanko proxya ollenkaan. Jos tarvitaan, osoitteen selvittämisessä voisi auttaa vaikka Wireshark tai muu TCP-liikenteen näyttävä ohjelma, jolla näkisi, mihin osoitteeseen selain oikeasti yhdistää. Yleensä proxyn tiedot voi jotenkin lukea myös selaimen asetuksista.
Kuten sanoin, niin "proxy toimi" eli olen käyttänyt ja sitä pitää käyttää, kun ollaan yhteyksissä ulkopuolisten verkkopalveluihin.
Ja toki olen testannut enkä vain olettanut sekä kysynyt lisätietoa meidän omalta vastaavalta, mutta sillä kestää aina viikkokaupalla vastata...
Multibyte kirjoitti:
Kuten sanoin, niin "proxy toimi" eli olen käyttänyt ja sitä pitää käyttää, kun ollaan yhteyksissä ulkopuolisten verkkopalveluihin.
Mikä virheilmoitus sitten tulee, jos poistat proxyn? Ehkä sitä ei tarvitse (enää) käyttää sisäisiin palveluihin.
Oletko jo selvittänyt selaimen proxy-asetukset, kuten jo kahdesti ehdotin?
Aihe on jo aika vanha, joten et voi enää vastata siihen.