Autor Zpráva
m93a
Profil
Ahoj,
zkouším udělat něco jako neoficiální API, ale narazil jsem na problém.
Původní myšlenka: Uživatel zadá své přihlašovací údaje do formuláře, který se ovšem neodešle přímo na web, kam se přihlašuje, ale na stránku na mém webu, který je teprve odešle na oficiální server. Výsledné HTML zpracuje, řádně zvalidní, odstraní reklamy a získá token uživatele, se kterým bude přistupovat k dalším službám.
Problém: Upravil jsem formulář, aby odesílal POST data do mého scriptu, ale po zpracování script vyhodil chybu:
"Warning: file_get_contents(http://server.cz/script/): failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error in ... on line ..."
Nevím, co s tím, tohle je můj dosavadní kód:
$html = file_get_contents(
    'http://m.strava.cz/Stravnik/formprihlaseni.aspx',
    false,stream_context_create(
        array('http'=>array(
            'header'=>
                "User-Agent:(none; StravaCekujNET; Linux x86_64; rv:1.0)\r\n
                Content-type: application/x-www-form-urlencoded\r\n
                Content-Lenght: 1280\r\n",
            'method'=>'POST',
            'content'=>http_build_query($_POST)
        )
    ))
);

// Toho dalšího už si nevšímejte...
$html = mb_convert_encoding($html,"utf-8","auto");
$html = preg_replace('#<!DOCTYPE html PUBLIC\s*".*[^"]"\s*(|".*[^"]")\s*>#isU','<!DOCTYPE HTML>',$html);
$html = preg_replace('#<html.*[^>]>.*[^<]<head><title>#isU',"<html>\n<head>\n<meta charset=\"utf-8\" />\n<title>",$html);
$html = preg_replace('#<link rel="shortcut icon".*[^>]>#isU','',$html);
$html = preg_replace('#</body>#isU',"<iframe height=0 width=0><endora></iframe></body>",$html);
$html = preg_replace('#<form(.*[^>])action=".*[^"]"(.*[^>])>#isU','<form $1 action="?service=mloginredir" $2>',$html);
echo $html;

Promiňte mi tu nepřehlednost, ale šetřím řádky :D
Předem děkuji za odezvu, Michal.
Davex
Profil
Kdybych byl webový server, tak by se mi nelíbila HTTP hlavička v této podobě:

"User-Agent:(none; StravaCekujNET; Linux x86_64; rv:1.0)\r\n
                Content-type: application/x-www-form-urlencoded\r\n
                Content-Lenght: 1280\r\n"

To odřádkování a odsazení na začátku tam nemá co dělat.
m93a
Profil
Davex,
Ve skriptu to mám vše na jednom řádku, tady jsem to odřádkoval jen pro přehlednost, ale díky za postřeh.
Jo, ještě se mi vypnutím chyb ('ignore_errors'=>true) získat z toho cizího serveru vytáhnout tohle:
Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:


[NullReferenceException: Object reference not set to an instance of an object.]
iStravneM.Komponenty.Pristupy.ZapisPristup(HttpRequest request) in D:\Vyvoj-NET\istravnem\iStravneM\Komponenty\pristupy.cs:39
iStravneM.Master.Site1.Page_Load(Object sender, EventArgs e) in D:\Vyvoj-NET\istravnem\iStravneM\Master\iStravneM1.Master.cs:15
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35
System.Web.UI.Control.OnLoad(EventArgs e) +99
System.Web.UI.Control.LoadRecursive() +50
System.Web.UI.Control.LoadRecursive() +141
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627


Version Information: Microsoft .NET Framework Version:2.0.50727.3634; ASP.NET Version:2.0.50727.3634
Davex
Profil
Nepomůže opravit překlep v Content-Length?
m93a
Profil
Jé, díky :D
Ono to nakonec stejně nepomohlo, tak jsem se to rozhodl poslat přes GET. Připojení je nezašifrované tak jak tak a script, který data přijímá, uživatele ihned přesměruje, takže se na obrazovce údaje nezobrazí.
Tak díky za pomoc :D

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: