file_get_contents ve twitter ile garip bir sorun

6 Cevap php

Bir kullanıcının twitter kimlik bilgilerini doğrulamak için bu işlevi yaptı. Onun iki farklı sunucular üzerinde çalışan.

<?
function twitauth($username, $password){
if(@file_get_contents("http://".$username.":".$password."@twitter.com//account/verify_credentials.xml")){
    return "1";}
else {
    return "0";}

}

?>

Benim webserver, iyi çalışıyor. Diğer bir yandan, DAİMA 1 döndürür! Şifre kasten yanlış bile.

Ne dünyada bir sunucu bir şey yapmak neden olur, ve diğer başka bir şey yapmak?

6 Cevap

Ben alternatif bir çözüm ile geldi.

<?
function twitauth($username, $password){
$xml = @simplexml_load_file("http://".$username.":".$password."@twitter.com/statuses/friends_timeline.xml");
$noway = $xml->error;
$errorcheck = "Could not authenticate you.";
if($noway == $errorcheck){
return "0";
} else {
return "1";
}

}

?>

Kullanıcı adı / parola herhangi bir kombinasyonu ile bu url ziyaret ettiğinizde her zaman buna auth başarılı veya başarısız olsun, bir şeyler verir. Bu istenen url açmak için başarısız olduğunda file_get_contents () sadece FALSE döndürür.

Bu auth başarılı olup olmadığını belirlemek için dönüş değeri ayrıştırmak gerekir başarılı olmak için fonksiyonu için gibi geliyor bana.

(Eğer varsa) hata mesajı görmek için işlevinden '@' işaretini kaldırın.

Bazı PHP yapılandırmaları HTTP protokolü üzerinden dosya açma izin, böylece cURL içine bakmak, ya da kullanmak için kimlik doğrulama işlevleri görmek için resmi Twitter API bakarak çalışmayın.

File_get_contents önünde @ sembolü (hata bastırma) bir hata bastırılması olabilir. Bunu kaldırmayı deneyin ve ne olsun hata görüyorum. Ayrıca, php yapılandırma nedeniyle farklı sunucularda farklı bir davranış görme olabilir. Özellikle, allow_url_fopen ayar URL'ler ile çalışmak için file_get_contents yeteneğini değiştirir. ) (Belki ini_get () ile hem sunucularda bulunan bu ayarı kontrol veya phpinfo çıkışı (ayarı bulmak.

İşte dizeleri olarak booleans dönen değil güncelleştirilmiş bir tepki olduğunu ve onun not hata mesajı ise denetlemeden önce kendi hata mesajı olup olmadığını kontrol etmek garip.

<?php
function twitauth($username, $password){
 $xml = @simplexml_load_file("http://". urlencode($username) .":". urlencode($password) ."@twitter.com/statuses/friends_timeline.xml");
 return ($xml->error != "Could not authenticate you.") ? true : false;
}
?>


file_get_contents(), yalnızca kimliği doğrulanmış bir kullanıcı veya kötü bir tepki olabilir sayfanın yanıtı dönecektir, siz SimpleXML veya ne kimliği doğrulanmış olup olmadığını belirlemek için yanıtı ayrıştırmak için değil kullanmak gerekir. : Benziyor Hangi

<?xml version="1.0" encoding="UTF-8"?>
<user>
  <id>800316</id>
  <name>Garrett</name>
  <screen_name>garrettb</screen_name>
  <location>WHER>!, CA, USA</location>
  <description>Build websites, wants to be rich, and loves my Mac. You?</description>
  <profile_image_url>http://a1.twimg.com/profile_images/185221952/pic_normal.png</profile_image_url>
  <url></url>
  <protected>false</protected>
  <followers_count>158</followers_count>
  <profile_background_color>352726</profile_background_color>
  <profile_text_color>3E4415</profile_text_color>
  <profile_link_color>D02B55</profile_link_color>
  <profile_sidebar_fill_color>99CC33</profile_sidebar_fill_color>
  <profile_sidebar_border_color>829D5E</profile_sidebar_border_color>
  <friends_count>139</friends_count>
  <created_at>Wed Feb 28 06:03:17 +0000 2007</created_at>
  <favourites_count>18</favourites_count>
  <utc_offset>-28800</utc_offset>
  <time_zone>Pacific Time (US &amp; Canada)</time_zone>
  <profile_background_image_url>http://s.twimg.com/a/1251845223/images/themes/theme5/bg.gif</profile_background_image_url>
  <profile_background_tile>false</profile_background_tile>
  <statuses_count>1781</statuses_count>
  <notifications></notifications>
  <verified>false</verified>
  <following></following>
  <status>
    <created_at>Wed Sep 02 19:07:59 +0000 2009</created_at>
    <id>3716655439</id>
    <text>@lucaspatton09 take a picture, I want to see.</text>
    <source>&lt;a href=&quot;http://www.atebits.com/&quot; rel=&quot;nofollow&quot;&gt;Tweetie&lt;/a&gt;</source>
    <truncated>false</truncated>
    <in_reply_to_status_id>3716512637</in_reply_to_status_id>
    <in_reply_to_user_id>59230940</in_reply_to_user_id>
    <favorited>false</favorited>
    <in_reply_to_screen_name>lucaspatton09</in_reply_to_screen_name>
  </status>
</user>

Istek (kötü erişimi) reddedilirse, bu muhtemelen sorunlara neden olan, aşağı bir kimlik doğrulama iletişim damla olacaktır.

file_get_contents genellikle uyarı verir ve http hata kodunu karşılaşmak üzerine hiçbir şey döndürür, ancak diğer sunucu durumunda muhtemelen (belki bazı yapılandırması tarafından ayarlanabilir) hata sayfası gövdesini verir.

Aşağıdaki kod iki durumda için çalışması gerekir:

if(strpos(
  @file_get_contents("http://".$username.":".$password."@twitter.com//account/verify_credentials.xml"), 
  "Could not authenticate you.") === false) {
    echo "credentials ok";
} else {
    echo "credentials not ok";
}