PHP URL open – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self PHP URL open Wed, 11 Jan 17 06:50:26 Z https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684167#m1684167 https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684167#m1684167 <p>Moin moin.</p> <p>Über folgenden Aufruf im Browser bekommt man eine xml-Datei zurück: <a href="https://esgf-data.dkrz.de/esg-search/search/?offset=0&limit=10&type=Dataset&replica=false&latest=true&min_version=20161001&project=CORDEX&domain=EUR-11&time_frequency=day&variable=evspsblpot,hurs" rel="nofollow noopener noreferrer">https://esgf-data.dkrz.de/esg-search/search/?offset=0&limit=10&type=Dataset&replica=false&latest=true&min_version=20161001&project=CORDEX&domain=EUR-11&time_frequency=day&variable=evspsblpot,hurs</a></p> <p>Wenn ich versuche dies per PHP zu machen, kommt ein Fehler. Die Meldung lautet „No connection could be made because the target machine actively refused it.“ Ist schon klar was er damit sagen will, aber warum kann man diese Datei dann per Browser aufrufen?</p> <p>Beispiel in php ($serachString ist die URL):</p> <pre><code class="block language-php"><span class="token variable">$xmlDoc</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">DOMDocument</span><span class="token punctuation">;</span> <span class="token variable">$xmlDoc</span><span class="token operator">-></span><span class="token function">load</span><span class="token punctuation">(</span><span class="token variable">$searchString</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <pre><code class="block language-php"><span class="token variable">$handle</span> <span class="token operator">=</span> <span class="token function">fopen</span><span class="token punctuation">(</span><span class="token variable">$searchString</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"r"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <pre><code class="block language-php"><span class="token variable">$test</span> <span class="token operator">=</span> <span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token variable">$searchString</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Danke, Paul</p> PHP URL open Wed, 11 Jan 17 07:08:26 Z https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684168#m1684168 https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684168#m1684168 <p>Tach!</p> <blockquote> <p>warum kann man diese Datei dann per Browser aufrufen?</p> </blockquote> <p>Weil der Server den Request vom Browsr akzeptiert und den von PHP nicht. Warum das so ist, kann man nur spekulieren, solange man nicht den Serverbetreiber fragt. (Warum fragst du den nicht, sondern Außenstehende?)</p> <p>Es kann damit zu tun haben, dass der Server bestimmte HTTP-Header erwartet, die ein Browser standardmäßig mitsendet, der PHP-Request jedoch nicht. Andere Möglichkeiten der Auswertung hat der Server nicht.</p> <p>Man kann den PHP-Funktionen (abgesehen von DOMDocument::load) einen Stream-Kontext mitgeben, darüber kann man zusätzliche Header setzen. Das ist im PHP-Handbuch auf den Seiten zu den Funktionen und auf verlinkten Kapiteln (Supported Protocols and Wrappers -> Context Options) beschrieben.</p> <p>Welche Header der Browser sendet, kann man mit den eingebauten Entwocklertools herausfinden. Mein erster Versuch wäre, einen (beliebigen Wert für) User-Agent mitzusenden.</p> <p>dedlfix.</p> PHP URL open Wed, 11 Jan 17 12:35:05 Z https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684195#m1684195 https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684195#m1684195 <p>Es gibt ein <a href="https://pypi.python.org/pypi/esgf-pyclient" rel="nofollow noopener noreferrer">python script</a> welches benutzt werden kann. Mit PHP klappts nicht. Danke für die Antworten.</p> PHP URL open Wed, 11 Jan 17 07:53:38 Z https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684171#m1684171 https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684171#m1684171 <p>Hallo und guten Morgen,</p> <blockquote> <p>Weil der Server den Request vom Browsr akzeptiert und den von PHP nicht. Warum das so ist, kann man nur spekulieren, solange man nicht den Serverbetreiber fragt. (Warum fragst du den nicht, sondern Außenstehende?)</p> </blockquote> <p>Vielleicht weil wir hier (virtuell) zusammenkommen, um über genau solche Techniken zu diskutieren? Zeig doch lieber, wie man sowas macht und/oder wie man es erkennen kann, wenn ein Anbieter derartige Einschränkungen macht.</p> <blockquote> <p>Es kann damit zu tun haben, dass der Server bestimmte HTTP-Header erwartet, die ein Browser standardmäßig mitsendet, der PHP-Request jedoch nicht. Andere Möglichkeiten der Auswertung hat der Server nicht.</p> </blockquote> <p>Oder, dass eben der <a href="http://www.ducea.com/2006/06/16/apache-tips-tricks-hide-php-version-x-powered-by/" rel="nofollow noopener noreferrer">Header "x-powered-by: php ..."</a> mitgesendet wird</p> <blockquote> <p>Man kann den PHP-Funktionen (abgesehen von DOMDocument::load) einen Stream-Kontext mitgeben, darüber kann man zusätzliche Header setzen. Das ist im PHP-Handbuch auf den Seiten zu den Funktionen und auf verlinkten Kapiteln (Supported Protocols and Wrappers -> Context Options) beschrieben.</p> </blockquote> <blockquote> <p>Welche Header der Browser sendet, kann man mit den eingebauten Entwocklertools herausfinden. Mein erster Versuch wäre, einen (beliebigen Wert für) User-Agent mitzusenden.</p> </blockquote> <p>Man kann auch vor dem Absenden des "Post by Host" oder des "Get by Host" die gesetzten Header abfragen und verändern.</p> <p>Grüße<br> TS</p> <div class="signature">-- <br> es wachse der Freifunk<br> <a href="http://freifunk-oberharz.de" rel="nofollow noopener noreferrer">http://freifunk-oberharz.de</a> </div> PHP URL open Wed, 11 Jan 17 08:05:32 Z https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684172#m1684172 https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684172#m1684172 <p>Tach!</p> <blockquote> <blockquote> <p>Weil der Server den Request vom Browsr akzeptiert und den von PHP nicht. Warum das so ist, kann man nur spekulieren, solange man nicht den Serverbetreiber fragt. (Warum fragst du den nicht, sondern Außenstehende?)</p> </blockquote> <p>Vielleicht weil wir hier (virtuell) zusammenkommen, um über genau solche Techniken zu diskutieren? Zeig doch lieber, wei man sowas macht und/oder wie man es erkennen kann, wenn ein Anbieter derartige Einschränkungen macht.</p> </blockquote> <p>Es scheint mir weitverbreitet zu sein, dass man nicht mit den Betroffenen sondern mit Dritten über sie redet. Das muss nicht sein, egal welche Fachkenntnisse die Dritten haben. Man kann sie ja immer noch zu Rate ziehen, wenn das Gespräch miteinander nicht weiterführt. Aber das direkte Gespräch sollte der erste Schritt sein.</p> <p>Man kann die Einschränkungen nicht erkennen, außer dass man in Kleinarbeit testet, was geht und was nicht. Man muss sozusagen probieren, welcher Dietrich passt, statt dass man den Inhaber um einen Schlüssel bittet. Und anscheinend sollen ja bestimmte Requests unbeantwortet bleiben.</p> <p>dedlfix.</p> PHP URL open Wed, 11 Jan 17 08:28:22 Z https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684179#m1684179 https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684179#m1684179 <p>Hallo</p> <blockquote> <blockquote> <p>Weil der Server den Request vom Browsr akzeptiert und den von PHP nicht. Warum das so ist, kann man nur spekulieren, solange man nicht den Serverbetreiber fragt. (Warum fragst du den nicht, sondern Außenstehende?)</p> </blockquote> <p>Vielleicht weil wir hier (virtuell) zusammenkommen, um über genau solche Techniken zu diskutieren?</p> </blockquote> <p>Und deshalb solle die Anmerkung, doch erst einmal den Dienstanbieter um Hilfe zu fragen, nicht statthaft sein? Wir weisen hier ja auch immer wieder einmal auf den Support des konkreten Hosters hin, wenn es z.B. um PHP-Funktionen geht, deren Arbeitsweise stark von den Einstellungen auf dem Webserver des Hosters abhängt. Warum sollte das in genau diesem Fall anders sein, wo doch der Dienstanbieter am besten wissen sollte, welche Zugriffe er erlaubt und wie die zu erfolgen haben?</p> <blockquote> <p>Zeig doch lieber, wei man sowas macht und/oder wie man es erkennen kann, wenn ein Anbieter derartige Einschränkungen macht.</p> </blockquote> <p>Mögliche Ursachen und Lösungsansätze beschreibt dedlfix doch im Anschluss?! Was also soll der Seitenhieb?</p> <hr> <p>Für's Archiv, auch wenn die genannten Fehlermeldungen <em>nicht</em> darauf hinweisen:</p> <p>Die Funktionen <code>fopen</code> und <code>file_get_contents</code>, sowie einige weitere, die dem Zugriff auf Dateien dienen, können in PHP grundsätzlich auch auf URLs zugreifen. Das ist in diesem Fall wohl auch gegeben. Viele Hostinganbieter schränken diese Möglichkeiten aber ein, so dass diese Funktionen ausschließlich im lokalen Dateisystem, nicht aber über URLs funktionieren.</p> <p>In diesen Fällen kann man für den Zugriff auf externe, per URL zu erreichende Ressourcen z.B. die <a href="https://secure.php.net/manual/de/book.curl.php" rel="nofollow noopener noreferrer">PHP-Bibliothek für cURL</a> benutzen. Die ist allerdings <a href="https://secure.php.net/manual/de/curl.installation.php" rel="nofollow noopener noreferrer">nicht standardmäßig installiert</a>. Auch diese Bibliothek kann die <a href="https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684168#m1684168" rel="noopener noreferrer">hier schon angesprochenen</a> HTTP-Header senden.</p> <p>Mal als Beispiel eine Funktion. Nicht alle Optionen (gesetzt mit <code>curl_setopt</code>) werden überall gebraucht.</p> <pre><code class="block language-php"><span class="token comment">/** * wrapper to load an external ressource into a variable * * @param string $url * @return bool false * @return string $string */</span> <span class="token keyword">function</span> <span class="token function-definition function">my_load_feed</span><span class="token punctuation">(</span><span class="token variable">$url</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># no value in $url? return false!</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$url</span> <span class="token operator">===</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token comment"># the value of $url is no URL? return false!</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">filter_var</span><span class="token punctuation">(</span><span class="token variable">$url</span><span class="token punctuation">,</span> <span class="token constant">FILTER_VALIDATE_URL</span><span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token variable">$string</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token comment"># does the function exists in the PHP installation?</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">function_exists</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'curl_init'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># read the ressource from the URL with curl</span> <span class="token variable">$c</span> <span class="token operator">=</span> <span class="token function">curl_init</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_URL</span><span class="token punctuation">,</span> <span class="token variable">$url</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_HEADER</span><span class="token punctuation">,</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_RETURNTRANSFER</span><span class="token punctuation">,</span> <span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_SSL_VERIFYHOST</span><span class="token punctuation">,</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_SSL_VERIFYPEER</span><span class="token punctuation">,</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_CONNECTTIMEOUT</span><span class="token punctuation">,</span> <span class="token number">20</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_USERAGENT</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"PHP 5.6"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_HTTPHEADER</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'X-Identifier: Test-Skript 0.3'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Content-type: text/xml;charset="utf-8"'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$string</span> <span class="token operator">=</span> <span class="token function">curl_exec</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">curl_close</span><span class="token punctuation">(</span><span class="token variable">$c</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token variable">$string</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Tschö, Auge</p> <div class="signature">-- <br> Wenn man ausreichende Vorsichtsmaßnahmen trifft, muss man keine Vorsichtsmaßnahmen mehr treffen.<br> Toller Dampf voraus von Terry Pratchett </div> PHP URL open Wed, 11 Jan 17 09:03:11 Z https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684185#m1684185 https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684185#m1684185 <blockquote> <p>Und deshalb solle die Anmerkung, doch erst einmal den Dienstanbieter um Hilfe zu fragen, nicht statthaft sein?</p> </blockquote> <p>Naja, es ist eine Frage der Augenhöhe. Das ist das REST API des DKRZ und die bieten Tutorials und eine Mailadresse zum Support an. Bevor man Antwort bekommt, kann Zeit vergehen, und da es ein auf der Homepage beworbenes API ist, sollte man eigentlich annehmen, dass der automatisierte Zugriff nicht unerwünscht ist.</p> <p>Aber die werden einem keinen potentiellen, möglicherweise dusseligen PHP Fehler debuggen. Um das abzuklären, ist man in Userforen besser aufgehoben...</p> <p>Update: Habe gerade mal die 4 Zeilen PHP des OP mit PHP 5.6.21 von der Windows Kommandozeile laufen lassen. Hat funktioniert! Das Script ist also nicht das Problem.</p> <p><em>Rolf</em></p> PHP - cURL Wed, 11 Jan 17 09:34:18 Z https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684186#m1684186 https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684186#m1684186 <p>Alles richtig, aber ...</p> <p>da cUrl manchmal nicht installiert ist lohnt sich ggf. der Rückgriff auf das Systemprogramm <code>wget</code>. Allerdings kann auch das (wie alle Zugriffe auf exec, system, backtick, etc.) vom eigenen Hoster verboten sein. Ferner kann (oder muss) man die entfernte Webseite auch davon überzeugen, ein ganz normaler Browser zu sein. Falls mehr als Referer und Kennung des User-Agent nötig sein sollten (Cookie, Session, ...) liefert das Manual für wget (man wget) sehr viele wertvolle Hinweise.</p> <p>Ein aktiviertes <code>$checkCertifikate = '--no-check-certificate';</code> sorgt dafür, dass beim Transport via HTTPS nicht geprüft wird ob das Zertifikat von einer anerkannten Stelle unterschrieben wurde. Soll die Herkunft der Daten sicher sein, dann geht das natürlich nicht, wird aber (mit wget) immer dann recht aufwendig, wenn auf einem Server die Zertifikate nicht hinterlegt sind, was die Regel ist, weil ja kein Browser existiert. cUrl hat die selbe Kinderkrankheit</p> <pre><code class="block language-php"> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token variable">$userAgent</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'Mozilla/5.0 (Windows) Gecko/20100101 Firefox/50.0'</span><span class="token punctuation">;</span> <span class="token variable">$referer</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'http://www.example.com/'</span><span class="token punctuation">;</span> <span class="token variable">$tmpfile</span> <span class="token operator">=</span> <span class="token function">tempnam</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'/tmp'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'php_'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$checkCertifikate</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token comment">#$checkCertifikate = '--no-check-certificate';</span> <span class="token variable">$sys</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'wget --user-agent='</span> <span class="token operator">.</span> <span class="token function">escapeshellarg</span><span class="token punctuation">(</span> <span class="token variable">$userAgent</span> <span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">' --referer='</span> <span class="token operator">.</span> <span class="token function">escapeshellarg</span><span class="token punctuation">(</span> <span class="token variable">$referer</span> <span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">' '</span> <span class="token operator">.</span> <span class="token variable">$checkCertifikate</span> <span class="token operator">.</span> <span class="token string single-quoted-string">' -d -O '</span> <span class="token operator">.</span> <span class="token function">escapeshellarg</span><span class="token punctuation">(</span> <span class="token variable">$tmpfile</span> <span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">' '</span> <span class="token operator">.</span> <span class="token function">escapeshellarg</span><span class="token punctuation">(</span> <span class="token variable">$url</span> <span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">' &2>1'</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string single-quoted-string">'<pre>'</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<hr />Fehlermeldungen/Header:<hr />"</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string backtick-quoted-string">`$sys`</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string single-quoted-string">'<hr />Abgeholte Daten:<hr />'</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span> <span class="token function">file_get_contents</span><span class="token punctuation">(</span> <span class="token variable">$tmpfile</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">unlink</span><span class="token punctuation">(</span> <span class="token variable">$tmpfile</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string single-quoted-string">'<hr /></pre>'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Es kann aber auch gut sein, dass der Betreiber der entfernten Seite dann sauer wird. Insbesondere wenn er feststellt, dass recht viele Requests erfolgen und er dann auch glaubt, bezüglich des Useragent und/oder des Referer belogen worden zu sein. Immerhin hat er ja vermutlich den Zugriff verboten. Das macht Arbeit und die macht man sich nicht grundlos. Er kann dann auch die IP aussperren. Ich würde genau das tun.</p> PHP URL open Wed, 11 Jan 17 09:36:02 Z https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684187#m1684187 https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684187#m1684187 <p>Hallo</p> <blockquote> <blockquote> <p>Und deshalb solle die Anmerkung, doch erst einmal den Dienstanbieter um Hilfe zu fragen, nicht statthaft sein?</p> </blockquote> <p>Das ist das REST API des DKRZ und die bieten Tutorials …</p> </blockquote> <p>Das ist, um bei meinem Beispiel meines letzten Postings zu bleiben, bei vielen Hostern auch nicht anders, wenn man nicht extra Geld in die Hand nehmen will. Oft reicht aber ein Studium der FAQ. Wenn es <em>in diesem Fall</em> Tutorials gibt, sind diese meiner Meinung nach <em>die erste Anlaufstelle</em>.</p> <blockquote> <p>… und eine Mailadresse zum Support an. Bevor man Antwort bekommt, kann Zeit vergehen, …</p> </blockquote> <p>Das ist halt so. Das ist kein Grund, diesen Weg nicht zu gehen.</p> <blockquote> <p>… und da es ein auf der Homepage beworbenes API ist, sollte man eigentlich annehmen, dass der automatisierte Zugriff nicht unerwünscht ist.</p> </blockquote> <p>Der automatisierte Zugriff klappt doch grundsätzlich, wie der OP selbst schrieb. Er klappt nur auf einem bestimmten der beschrittenen Wege (konkrete Programmierung in PHP) nicht. Ein mehr als flüchtiger Blick in <a href="https://www.earthsystemcog.org/projects/cog/tutorials_web" rel="nofollow noopener noreferrer">die Tutorials</a> und <a href="https://earthsystemcog.org/projects/cog/esgf_search_restful_api" rel="nofollow noopener noreferrer">die Doku</a> sind aber nicht zu viel verlangt.</p> <p>Wenn dann etwas unklar bleibt, was ja weder ungewöhnlich noch eine Schande ist, dann ist der Gang in ein Benutzerforum <sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup> der richtige Weg. Ich denke du weißt, wie schnell man hier die Frage nach den bereits eingeleiteten Schritten um die Ohren gehauen bekommt.</p> <blockquote> <p>Aber die werden einem keinen potentiellen, möglicherweise dusseligen PHP Fehler debuggen.</p> </blockquote> <p>Natürlich nicht.</p> <p>Tschö, Auge</p> <div class="signature">-- <br> Wenn man ausreichende Vorsichtsmaßnahmen trifft, muss man keine Vorsichtsmaßnahmen mehr treffen.<br> Toller Dampf voraus von Terry Pratchett </div> <hr class="footnotes-sep"> <section class="footnotes"> <ol class="footnotes-list"> <li id="fn1" class="footnote-item"><p>Was ist ein „Benutzerforum“? Gibt es welche ohne Benutzer und sind, wenn es keine Foren ohne Benutzer gibt, dann nicht alle Foren Benutzerforen? <a href="#fnref1" class="footnote-backref">↩︎</a></p> </li> </ol> </section> PHP URL open Wed, 11 Jan 17 13:28:17 Z https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684201#m1684201 https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684201#m1684201 <blockquote> <p>Mit PHP klappts nicht.</p> </blockquote> <p>Das ist aber merkwürdig, denn das hier klappt sehr wohl:</p> <pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token variable">$url</span><span class="token operator">=</span><span class="token string single-quoted-string">'https://esgf-data.dkrz.de/esg-search/search/?offset=0&limit=10&type=Dataset&replica=false&latest=true&min_version=20161001&project=CORDEX&domain=EUR-11&time_frequency=day&variable=evspsblpot,hurs'</span><span class="token punctuation">;</span> <span class="token variable">$userAgent</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'Mozilla/5.0 (Windows) Gecko/20100101 Firefox/50.0'</span><span class="token punctuation">;</span> <span class="token variable">$referer</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'http://www.example.com/'</span><span class="token punctuation">;</span> <span class="token variable">$tmpfile</span> <span class="token operator">=</span> <span class="token function">tempnam</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'/tmp'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'php_'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$sys</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'wget --user-agent='</span> <span class="token operator">.</span> <span class="token function">escapeshellarg</span><span class="token punctuation">(</span><span class="token variable">$userAgent</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">' --referer='</span> <span class="token operator">.</span> <span class="token function">escapeshellarg</span><span class="token punctuation">(</span><span class="token variable">$referer</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">' -d -O '</span> <span class="token operator">.</span> <span class="token function">escapeshellarg</span><span class="token punctuation">(</span><span class="token variable">$tmpfile</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">' '</span> <span class="token operator">.</span> <span class="token function">escapeshellarg</span><span class="token punctuation">(</span> <span class="token variable">$url</span> <span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">' &2>1'</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string single-quoted-string">'<pre>'</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<hr />Fehlermeldungen/Header:<hr />"</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string backtick-quoted-string">`$sys`</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string single-quoted-string">'<hr />Abgeholte Daten:<hr />'</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span><span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token variable">$tmpfile</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">unlink</span><span class="token punctuation">(</span><span class="token variable">$tmpfile</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string single-quoted-string">'<hr /></pre>'</span><span class="token punctuation">;</span> </span></code></pre> <p>Ich vermute den Fehler also auf Level 8.</p> PHP URL open Wed, 11 Jan 17 14:31:45 Z https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684208#m1684208 https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684208#m1684208 <p>Tach!</p> <blockquote> <blockquote> <p>Mit PHP klappts nicht.</p> </blockquote> <p>Das ist aber merkwürdig, denn das hier klappt sehr wohl:</p> <pre><code> $sys = 'wget --user-agent=' . escapeshellarg($userAgent) . ' --referer=' . escapeshellarg($referer) . ' -d -O ' . escapeshellarg($tmpfile) . ' ' . escapeshellarg( $url ) . ' &2>1'; </code></pre> </blockquote> <p>Das zählt nicht als "klappt mit PHP". Das muss ohne Umwege über Systembefehle gehen.</p> <p>dedlfix.</p> PHP URL open Wed, 11 Jan 17 14:47:43 Z https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684209#m1684209 https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684209#m1684209 <p>Hallo und guten Abend,</p> <blockquote> <blockquote> <pre><code> $sys = 'wget --user-agent=' . escapeshellarg($userAgent) . ' --referer=' . escapeshellarg($referer) . ' -d -O ' . escapeshellarg($tmpfile) . ' ' . escapeshellarg( $url ) . ' &2>1'; </code></pre> </blockquote> <p>Das zählt nicht als "klappt mit PHP". Das muss ohne Umwege über Systembefehle gehen.</p> </blockquote> <p>meistens funktionieren die fsockopen()-Funktionen noch, auch wenn die fopen()-Wrapper für html & Co. ausgeschaltet sind. Und damit kann man dann (fast!) ganz gezielt auf den entfernten Socket und seine Möglichkeiten zugreifen.</p> <p>Beispiel head_request():</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">head_request</span><span class="token punctuation">(</span><span class="token variable">$url</span><span class="token punctuation">,</span> <span class="token variable">$status_only</span><span class="token operator">=</span><span class="token constant boolean">false</span><span class="token punctuation">,</span> <span class="token variable">$parsed</span><span class="token operator">=</span><span class="token constant boolean">true</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">### checks, if an url exists. </span> <span class="token comment">### if no scheme is provided, 'http://' will be assumed</span> <span class="token comment">### if not "$parsed", raw headers shell be returned, </span> <span class="token comment">### otherwise an array shell be produced</span> <span class="token comment">###</span> <span class="token comment">### Used own Constants: TIMEOUT_SOCK_OPEN, TIMEOUT_STREAM_READ</span> <span class="token function">defined</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'TIMEOUT_SOCK_OPEN'</span><span class="token punctuation">)</span> <span class="token keyword">or</span> <span class="token function">define</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'TIMEOUT_SOCK_OPEN'</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">defined</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'TIMEOUT_STREAM_READ'</span><span class="token punctuation">)</span> <span class="token keyword">or</span> <span class="token function">define</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'TIMEOUT_STREAM_READ'</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$url</span> <span class="token operator">=</span> <span class="token function">trim</span><span class="token punctuation">(</span><span class="token variable">$url</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$_url_parts</span> <span class="token operator">=</span> <span class="token function">parse_url</span><span class="token punctuation">(</span><span class="token variable">$url</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_url_parts</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'scheme'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token variable">$url</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'http://'</span> <span class="token operator">.</span> <span class="token variable">$url</span><span class="token punctuation">;</span> <span class="token variable">$_url_parts</span> <span class="token operator">=</span> <span class="token function">parse_url</span><span class="token punctuation">(</span><span class="token variable">$url</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment"># * scheme - e.g. http</span> <span class="token comment"># * host</span> <span class="token comment"># * port</span> <span class="token comment"># * user</span> <span class="token comment"># * pass</span> <span class="token comment"># * path</span> <span class="token comment"># * query - after the question mark ?</span> <span class="token comment"># * fragment - after the hashmark #</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_url_parts</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'host'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token variable">$fp</span> <span class="token operator">=</span> @<span class="token function">fsockopen</span><span class="token punctuation">(</span><span class="token variable">$_url_parts</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'host'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">80</span><span class="token punctuation">,</span> <span class="token variable">$errno</span><span class="token punctuation">,</span> <span class="token variable">$errstr</span><span class="token punctuation">,</span> <span class="token constant">TIMEOUT_SOCK_OPEN</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token variable">$fp</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token function">stream_set_timeout</span><span class="token punctuation">(</span><span class="token variable">$fp</span><span class="token punctuation">,</span> <span class="token constant">TIMEOUT_STREAM_READ</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$path</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'/'</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_url_parts</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'path'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token variable">$path</span> <span class="token operator">=</span> <span class="token variable">$_url_parts</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'path'</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token variable">$out</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"HEAD <span class="token interpolation"><span class="token variable">$path</span></span> HTTP/1.1\r\n"</span><span class="token punctuation">;</span> <span class="token variable">$out</span> <span class="token operator">.=</span> <span class="token string double-quoted-string">"Host: "</span> <span class="token operator">.</span> <span class="token variable">$_url_parts</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'host'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"\r\n"</span><span class="token punctuation">;</span> <span class="token variable">$out</span> <span class="token operator">.=</span> <span class="token string double-quoted-string">"Connection: Close\r\n\r\n"</span><span class="token punctuation">;</span> <span class="token function">fwrite</span><span class="token punctuation">(</span><span class="token variable">$fp</span><span class="token punctuation">,</span> <span class="token variable">$out</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$res</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">feof</span><span class="token punctuation">(</span><span class="token variable">$fp</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$res</span> <span class="token operator">.=</span> <span class="token function">fgets</span><span class="token punctuation">(</span><span class="token variable">$fp</span><span class="token punctuation">,</span> <span class="token number">128</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$_info</span> <span class="token operator">=</span> <span class="token function">stream_get_meta_data</span><span class="token punctuation">(</span><span class="token variable">$fp</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">fclose</span><span class="token punctuation">(</span><span class="token variable">$fp</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$_info</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'timed_out'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token variable">$res</span> <span class="token operator">=</span> <span class="token function">str_replace</span><span class="token punctuation">(</span><span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">' '</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">' '</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">' '</span><span class="token punctuation">,</span> <span class="token variable">$res</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$_lines</span> <span class="token operator">=</span> <span class="token function">explode</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"\r\n"</span><span class="token punctuation">,</span> <span class="token variable">$res</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment"># return $_lines;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$_lines</span> <span class="token keyword">as</span> <span class="token variable">$key</span> <span class="token operator">=></span> <span class="token variable">$value</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">strlen</span><span class="token punctuation">(</span><span class="token variable">$value</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">unset</span><span class="token punctuation">(</span><span class="token variable">$_lines</span><span class="token punctuation">[</span><span class="token variable">$key</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">continue</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$_help</span><span class="token punctuation">[</span><span class="token variable">$key</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">explode</span><span class="token punctuation">(</span><span class="token string single-quoted-string">': '</span><span class="token punctuation">,</span> <span class="token variable">$value</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_help</span><span class="token punctuation">[</span><span class="token variable">$key</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$_out</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'status'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">explode</span><span class="token punctuation">(</span><span class="token string single-quoted-string">' '</span><span class="token punctuation">,</span> <span class="token function">trim</span><span class="token punctuation">(</span><span class="token variable">$_help</span><span class="token punctuation">[</span><span class="token variable">$key</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token variable">$_out</span><span class="token punctuation">[</span><span class="token function">strtolower</span><span class="token punctuation">(</span><span class="token variable">$_help</span><span class="token punctuation">[</span><span class="token variable">$key</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">explode</span><span class="token punctuation">(</span><span class="token string single-quoted-string">' '</span><span class="token punctuation">,</span> <span class="token function">trim</span><span class="token punctuation">(</span><span class="token variable">$_help</span><span class="token punctuation">[</span><span class="token variable">$key</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_out</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'status'</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$status_only</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token variable">$_out</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'status'</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token variable">$parsed</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token variable">$res</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$_out</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Nur das Vorhandensein einer (entfernten) HTTP-Ressource feststellen...<br> Auf ähnliche Weise kann man sie natürlich auch komplett auslesen.</p> <p>Grüße<br> TS</p> <div class="signature">-- <br> es wachse der Freifunk<br> <a href="http://freifunk-oberharz.de" rel="nofollow noopener noreferrer">http://freifunk-oberharz.de</a> </div> PHP URL open Wed, 11 Jan 17 19:08:29 Z https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684210#m1684210 https://forum.selfhtml.org/self/2017/jan/11/php-url-open/1684210#m1684210 <p>Wie ich heute um 10:15 updatend schreibte - Pauls drei Versuche aus dem Eingangsposting funktionieren von einem Windows Kommandozeilen PHP ebenfalls, ohne sich auf die socken zu machen. Die Frage ist, wo Paul seinen Code ausgeführt hat. Es scheint mir ein Problem der Umgebung, in der das PHP Script läuft.</p> <p>Kritisch kann die https-Connection sein, weil dafür die openssl Extension aktiv sein muss, und mein Bauchgefühl wäre, dass der Verbindungsaufbau nicht klappt. Mich behelligt allerdings kein bisschen Ahnung, an welchen Stellen der PHP- oder Serverkonfiguration man da welches Misthäufchen hinterlassen kann.</p> <p><em>Rolf</em></p>