[PHP] .ics bestand doorlinken

Pagina: 1
Acties:
  • 871 views

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Silverline
  • Registratie: Maart 2004
  • Laatst online: 23-06 09:35

Silverline

pisanggoreng

Topicstarter
Omdat Google Calendar .ics bestanden (iCalender files) niet kan importeren van een server met authenticatie, wil ik dit via php oplossen.
Een php scriptje draaien dat de content van die server ophaalt (met http://wachtwoord:pass@www.server.nl/ding.ics) en dan de google calendar url importer naar de php laten wijzen...

heb nu onderstaande code, maar het werkt niet.. als ik echter de php link bezoek, werkt het wel, iemand enig idee?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$result = 'HTTP/1.1 400 Bad Request';
     
// replace the host/domain names with your own
$url = "http://userna:passw@rooster.aim.avans.nl/rooster_export.php?periode_jaar=2009&periode_nummer=4&docent_code=&groep_code=V-CMD2-A2&export=ical&download=Download";

$calendar = @file_get_contents($url);
$result = $http_response_header[0];

if ($result == 'HTTP/1.1 200 OK') {
  header('Content-Type: text/calendar; charset=utf-8');
  header('Content-Disposition: attachment; filename="iCalendar.ics"');
  print $calendar;
  exit();
}

header($result);
?>
<html>
<body>
<h1><?php echo $result; ?><h1>
<body>
</html>

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
waarom zet je nog html om $result heen? wat doet header($result) als je daarna $result ook nog echo t?

[ Voor 47% gewijzigd door GlowMouse op 24-05-2010 23:52 ]


Acties:
  • 0 Henk 'm!

  • Cosca
  • Registratie: Mei 2006
  • Laatst online: 14-11-2023
Lijkt me dat je content-type niet goed is, moet deze niet overeen komen met de extensie, namelijk 'text/calendar' in plaats van een attachment?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

"Het werkt niet" is nogal cryptisch, niet? Wát werkt er precies niet? Kun je de file niet inlezen? Kun werkt de ingelezen file niet wanneer je hem downloadt?

In dit geval denk ik dat op beide vragen het antwoord "ja" is. Volgens mij kun je helemaal niet op de http://user:pass@server-manier inloggen middels file_get_contents. Je zou iets als cURL moeten gebruiken.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 18-09 17:57
NMe schreef op dinsdag 25 mei 2010 @ 00:14:
Volgens mij kun je helemaal niet op de [norml]http://user:pass@server-manier[/] inloggen middels file_get_contents.
Hoe kom je daar bij? Dat werkt gewoon prima hoor in PHP. Juist een van de grote voordelen van de taal in mijn opinie: heel veel standaard zaken werken gewoon. Dat de syntax daardoor een ranzige onlogische bende is geworden is helaas een klein detail :+

Sterker nog, je kan ook een volledige request context meegeven middels de derde parameter, zo kun je ook GET / POST forms bijvoorbeeld versturen met file_get_contents (al is dat, toegegeven, wat contraintuitief wellicht).

Ik vraag me eigenlijk eerder af waar die $http_response_header vandaan komt - die vul je zo te zien nergens, tenzij het wellicht een global is die via register_globals geset wordt zou die altijd leeg moeten zijn. *Slaat zichzelf met een RTFM om de oren* Nergens voor nodig in elk geval, file_get_contents returned gewoon false als de request niet lukt, ik neem aan dat dat ook opgaat voor de diverse bad / invalid request headers en zoniet kun je daar altijd later nog op testen. Ergo, probeer het eens met:
PHP:
1
if ($calendar !== false) {

En gooi die '@' weg voor je file_get_contents, dan krijg je tenminste de error te zien als er wat mis gaat :)

[ Voor 9% gewijzigd door FragFrog op 25-05-2010 01:00 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

FragFrog schreef op dinsdag 25 mei 2010 @ 00:56:
[...]

Hoe kom je daar bij? Dat werkt gewoon prima hoor in PHP.
Diverse bronnen zijn het daar niet mee eens. ;)

Het kán met file_get_contents, maar niet op deze manier.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • cyboria
  • Registratie: Mei 2010
  • Laatst online: 08-09-2021
NMe schreef op dinsdag 25 mei 2010 @ 01:06:
[...]

Diverse bronnen zijn het daar niet mee eens. ;)

Het kán met file_get_contents, maar niet op deze manier.
Hmm, dat is toch een gewone HTTP pagina. Waarom zou je deze niet met get_contents kunnen ophalen? curl is qua basis denk ik ook file_get_contents denk ik trouwens.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

cyboria schreef op dinsdag 25 mei 2010 @ 01:15:
[...]

Hmm, dat is toch een gewone HTTP pagina.
Ja, het is (in jouw woorden) een gewone HTTP-pagina. Maar er zit ook een HTTP digest authenticatie tussen, en die kan met file_get_contents niet op deze manier tot stand komen voor zover ik weet. Ik heb er zelf geen ervaring mee maar ik had een vermoeden en de bronnen die ik op internet vind zeggen, zoals je in mijn vorige post leest, hetzelfde.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 18-09 17:57
Ik heb het hier net getest en het werkt gewoon ;) Staat me bij dat PHP daar tot versie 5 wat moeilijk over deed, maar als je bijvoorbeeld het voorbeeld van de SSH2 wrappers pakt uit de documentatie wordt het daar ook letterlijk zo gebruikt.

Overigens maken twee van de drie voorbeelden die je geeft juist gebruikt van de context parameter voor authenticatie wat nou juist wel zou moeten werken - dat is hoe je het normaliter zou doen met cURL, handmatig de username:password combi toevoegen aan de connectie context.

Maar vertel, volgens jou kan het dus niet door de username:password toe te voegen aan de url, volgens je voorbeelden kan het dus ook niet door ze in de context te zetten, hoe wilde je het dan doen? :P

[ Voor 45% gewijzigd door FragFrog op 25-05-2010 03:12 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Je dient in ieder geval de content-type op text/calendar te zetten eneen filename header meegeven met een ics extensie. Verder hoort er geen html in voor te komen. Exporteer maar eens een bestaande agena en je kan het verschil gelijk zien.

Edit: op een telefoon zie je nog wel eens dingen over het hoofd. Had niet gezien dat je de bovenstaande punten al had doorgevoerd. Sorry.

[ Voor 22% gewijzigd door radem205 op 25-05-2010 08:54 ]


Acties:
  • 0 Henk 'm!

  • B0rf
  • Registratie: Oktober 2008
  • Laatst online: 03-10-2024
Hee, dat scriptje heb ik ook gemaakt ;)

het makkelijkste vond ik het met de stream context gaan, zoals hieronder

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
header("Content-type: text/Calendar");
header("Content-disposition: attachment; filename=rooster.ical");

$context = stream_context_create(array(
    'http' => array(
        'header'  => "Authorization: Basic " . base64_encode("username:password")
    )
));

$f = file_get_contents("http://rooster.atm.avans.nl/rooster_export.php?periode_jaar=2009&periode_nummer=4&docent_code=TAJO&groep_code=&export=ical&download=Download", false, $context);
$f = str_replace(array(";LANGUAGE=nl", ";ENCODING=QUOTED-PRINTABLE"),"", $f);
echo $f;
?>


wel eventjes de goede URL invullen voor je eigen rooster, en je eigen username:password invullen

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

FragFrog schreef op dinsdag 25 mei 2010 @ 02:59:
[...]

Ik heb het hier net getest en het werkt gewoon ;) Staat me bij dat PHP daar tot versie 5 wat moeilijk over deed, maar als je bijvoorbeeld het voorbeeld van de SSH2 wrappers pakt uit de documentatie wordt het daar ook letterlijk zo gebruikt.
Dan werkt het blijkbaar in sommige versies van PHP wel en in sommige niet. Zou ik niet afhankelijk van willen zijn als er andere opties zijn.
Overigens maken twee van de drie voorbeelden die je geeft juist gebruikt van de context parameter voor authenticatie wat nou juist wel zou moeten werken - dat is hoe je het normaliter zou doen met cURL, handmatig de username:password combi toevoegen aan de connectie context.
Ik kende die extra parameter in mijn eerste post nog niet, anders zou ik cURL niet aangeraden hebben. :)
Maar vertel, volgens jou kan het dus niet door de username:password toe te voegen aan de url, volgens je voorbeelden kan het dus ook niet door ze in de context te zetten, hoe wilde je het dan doen? :P
Juist wel met die extra parameter en absoluut niet met de credentials in de url. Dat zeg ik to al vanaf mijn eerste reactie? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 00:16

Matis

Rubber Rocket

Noem me een Fanboy, maar ik zou voor dit authenticatieprobleem gebruik maken van het Zend Framework.

Zoals je hier kunt lezen, is die functionaliteit eenvoudig te benaderen, zonder zelf rekening te hoeven houden met diverse encoders en decoders. Dit lijkt mij voor een beginner wat eenvoudiger te behappen dan cUrl en/of file_get_contents.
Helaas werkt dit alleen als de server gebruik maakt van basic authentication.
Currently, Zend_Http_Client only supports basic HTTP authentication. This feature is utilized using the setAuth() method, or by specifying a username and a password in the URI. The setAuth() method takes 3 parameters: The user name, the password and an optional authentication type parameter. As mentioned, currently only basic authentication is supported (digest authentication support is planned).

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ehm...waarom een compleet framework gebruiken voor iets dat met een enkele functiecall ook werkt? Dat noemt men nou overontwerp. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Silverline
  • Registratie: Maart 2004
  • Laatst online: 23-06 09:35

Silverline

pisanggoreng

Topicstarter
wow wat een reacties!

heeft er niemand dit probleem met Google Calendar?
Ik wil namelijk het rooster van mijn school op mijn HTC Legend zetten. Deze synchroniseert met Google Cal, maar GCal kan geen agenda van een server importeren dat authenticatie nodig heeft.

Ik kan wel een beetje PHP'en, maar het liefst zou ik even een scriptje hebben dat ik kan copy pasten...
B0rf schreef op dinsdag 25 mei 2010 @ 08:55:
Hee, dat scriptje heb ik ook gemaakt ;)

het makkelijkste vond ik het met de stream context gaan, zoals hieronder

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
header("Content-type: text/Calendar");
header("Content-disposition: attachment; filename=rooster.ical");

$context = stream_context_create(array(
    'http' => array(
        'header'  => "Authorization: Basic " . base64_encode("username:password")
    )
));

$f = file_get_contents("http://rooster.atm.avans.nl/rooster_export.php?periode_jaar=2009&periode_nummer=4&docent_code=TAJO&groep_code=&export=ical&download=Download", false, $context);
$f = str_replace(array(";LANGUAGE=nl", ";ENCODING=QUOTED-PRINTABLE"),"", $f);
echo $f;
?>


wel eventjes de goede URL invullen voor je eigen rooster, en je eigen username:password invullen
dit heb ik geprobeerd maar ik krijg de volgende foutmelding:

Warning: file_get_contents() [function.file-get-contents]: URL file-access is disabled in the server configuration in /home/djsalamp/www/roosters/rooster.php on line 11

dus wie-o-wie kan mij hierbij helpen?

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Silverline schreef op dinsdag 25 mei 2010 @ 11:46:
Ik kan wel een beetje PHP'en, maar het liefst zou ik even een scriptje hebben dat ik kan copy pasten...
Dan moet je niet in dit forum zijn...
dit heb ik geprobeerd maar ik krijg de volgende foutmelding:

Warning: file_get_contents() [function.file-get-contents]: URL file-access is disabled in the server configuration in /home/djsalamp/www/roosters/rooster.php on line 11

dus wie-o-wie kan mij hierbij helpen?
Wie je kan helpen? De persoon die de server beheerd, immerst je kan zoals je kan lezen geen url-based files gebruiken in jouw server configuratie.

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 18-09 17:57
NMe schreef op dinsdag 25 mei 2010 @ 09:43:
Juist wel met die extra parameter en absoluut niet met de credentials in de url. Dat zeg ik to al vanaf mijn eerste reactie? :)
Waarom post je dan links naar voorbeelden waarin juist staat dat dat niet werkt? ;)

En 'in sommige versies' is relatief. PHP 5 en hoger wordt al jaren overal gebruikt, je kan er prima vanuit gaan dat het tegenwoordig gewoon werkt - of adviseer je ook iedereen maar geen objecten te gebruiken in PHP omdat dat in PHP4 nog niet zo lekker ging? Mijn excuses als het wat offtopic gaat, maar je lijkt geen flauw idee te hebben waar je het over hebt (die context parameter had je bijvoorbeeld in 2 seconden kunnen vinden door domweg naar php.net/file_get_contents te gaan) - reageer dan niet.
cURL aanraden voor een dergelijk simpel probleem is in mijn opinie net zo hard overontwerpen, exact datgene waar je een ander voor op de vingers tikt: die hele library is antiek, complex en ranzig in plaatsen (hoe voer je bijvoorbeeld username & wachtwoord in? Exact: "username:password"...), er zijn toepassingen waar je er niet omheen komt maar het hele idee achter de 'nieuwe' URL wrappers is juist dat je het vaak ook veel simpeler zonder kan. Lees het hier wel vaker: "ow, data van een andere server? cURL!!!!1" - ja het werkt, maar er zijn tegenwoordig betere oplossingen.
Silverline schreef op dinsdag 25 mei 2010 @ 11:46:
Warning: file_get_contents() [function.file-get-contents]: URL file-access is disabled in the server configuration in /home/djsalamp/www/roosters/rooster.php on line 11
In je php.ini de setting 'allow_url_fopen' aanzetten, zie ook de manual :)

[ Voor 3% gewijzigd door FragFrog op 25-05-2010 12:28 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

FragFrog schreef op dinsdag 25 mei 2010 @ 12:25:
[...]

Waarom post je dan links naar voorbeelden waarin juist staat dat dat niet werkt? ;)
De voorbeelden die ik posten gaven juist aan dat het wél werkt. :?
En 'in sommige versies' is relatief. PHP 5 en hoger wordt al jaren overal gebruikt, je kan er prima vanuit gaan dat het tegenwoordig gewoon werkt - of adviseer je ook iedereen maar geen objecten te gebruiken in PHP omdat dat in PHP4 nog niet zo lekker ging? Mijn excuses als het wat offtopic gaat, maar je lijkt geen flauw idee te hebben waar je het over hebt (die context parameter had je bijvoorbeeld in 2 seconden kunnen vinden door domweg naar php.net/file_get_contents te gaan) - reageer dan niet.
  1. Ik kende die parameter niet. Mea culpa, ik weet ook niet alles.
  2. cURL is, als je die parameter niet kent, de logische volgende stap.
  3. Ik mag niet reageren als ik niet 110% zeker ben van wat ik zeg? Beetje cru, niet? ;)
Erkens schreef op dinsdag 25 mei 2010 @ 11:51:
[...]

Dan moet je niet in dit forum zijn...
Seconded. Als je hier alleen zit voor een quickfix dan zit je in Programming verkeerd. Inmiddels zijn in dit topic 3 mogelijke oplossingen aangedragen waarvan de makkelijkste is om even allow_url_fopen in je config aan te (laten) zetten. Ik stel voor dat je even contact zoekt met je host.

Sowieso redelijk apart dat je om code vraagt die je kan copy-pasten, want die heeft B0rf je al gegeven. De rest is gewoon een configprobleempje dat je met 5 minuten op Google ook had opgelost. Ik doe dit topic dan ook dicht nu. Succes verder. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1

Dit topic is gesloten.