Python,PHPアナログブラウザによるHTTPリクエスト送信

19986 ワード

最近マイクロブログを研究して、自分のマイクロRSSを取ってFeedを購読したいと思っていますが、国内(sinaマイクロブログを含む)では、個人マイクロブログのRSSは提供されていません.自分の微博の内容を取得して駅外展示を容易にするには、公式に発表されたストラップ(sina,QQ)を通じてしかありません.
  • sinaが個人RSSを取るスキームは、月光のブログを参照することができる.原理はsinaのストラップをキャプチャし、HTMLを解析して取得することです.
  • テンセントは少し面倒で、彼もストラップを持っていますが、卵、iframeの住所を直接つかんで発見したらだめです.ストラップHTTPリクエストを確認すると、最後にアドレスが要求されます.以下のようになります.http://v.t.qq.com/cgi-bin/weiboshow?f=p&tweetflag=1&fansflag=0&fansnum=0&name=bbayou&sign=7 bf 0 ab 71321 a 3 f 376 b 710 d 2 c 739 a 2 a 8788 ee 1 b 0 fはjsonデータを返し、テンセントサーバはrefer検証、すなわちreferアドレスv.t.qのみをサポートする.comのHTTPリクエストは、直接アクセスするとエラーが発生します.したがって、ヘッダreferをカスタマイズすることで、インタフェースにアクセスできます.ここで注意しなければならないのは、パラメータ:name(テンセントのマフラーのユーザー名)、sign(テンセントのマフラーのsignコード、唯一の)
  • テンセントの微博RSSを取って、pythonコードは以下の通りで、GET
    qqurl = "/cgi-bin/weiboshow?f=p&tweetflag=1&fansflag=0&fansnum=0&name=bbayou&sign=7bf0ab71321a3f376b710d2c739a2a8788ee1b0f";
    
    import httplib
    
    headers = {"Cache-Control": "no-cache","Referer":"http://v.t.qq.com/"}
    
    conn = httplib.HTTPConnection("v.t.qq.com")
    
    conn.request("GET", qqurl, '', headers)
    
    response = conn.getresponse()
    
    print response.status, response.read()
    
    conn.close();

    もしテンセントがPOSTを必要とするならば、以下、注意して、POSTの时、できるだけheaderの情报をすべて埋めて、さもなくば时にはサーバーの検証に通じないことができます
    import httplib,urllib; 
    
    params = urllib.urlencode({'cnum':'20','ctype':'CN02','isform':'true'})
    
    headers = {"Content-Type":"application/x-www-form-urlencoded","Referer":"http://v.t.qq.com/"};
    
    conn = httplib.HTTPConnection("v.t.qq.com")
    
    conn.request(method="POST",url="/cgi-bin/weiboshow",body=params,headers=headers)
    
    response = conn.getresponse()
    
    print response.status, response.read()
    
    conn.close()

    wordpressで使用しているのでpythonはサポートされていませんがPHPと書いてありますが、ここではCurlの方が頼りになりますが、fsockopenはあまり安定していません
    <?php
    
    class QQClass
    
    {
    
    	var $Server = 'v.t.qq.com';
    
    	var $Host = 'localhost';
    
    	var $header = '';  
    
    	var $Get_QQpath;
    
    	var $Referer = 'http://v.t.qq.com/';
    
    	var $Content = '';	
    
    	var $Fp = '';
    
    	function __construct($url){
    
    		$this->Get_QQpath = $url;
    
    		$this->Fp = fsockopen($this->Server,80, $errno, $errstr, 30);
    
    		if (!$this->Fp){
    
    			echo "ERROR: ".$errno." - ".$errstr."<br />
    "
    ; exit; } $out = "GET ".$this->Get_QQpath." HTTP/1.0\r
    "
    ; $out .= "Host: ".$this->Host." \r
    "
    ; $out .= "Referer: ".$this->Referer."\r
    "
    ; $out .= "Connection: Close\r
    \r
    "
    ; $out .= "Accept-Language zh-cn,zh;q=0.5"; $out .= "Cache-Control no-cache"; $out .= "User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19 GTB7.1"; $this->header = $out; } function Get_json(){ if(function_exists('curl_init')){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $this->Get_QQpath); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $this->header); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $this->Content = curl_exec($curl); curl_close($curl); }else{ fwrite($this->Fp, $this->header); while (!feof($this->Fp)) { $this->Content .= fgets($this->Fp, 128); } fclose($this->Fp); } preg_match("/Content-Length:.?(\d+)/", $this->Content, $matches); $length = $matches[1]; $this->Content = substr($this->Content, - $length); return $this->Content; } } ?>

    それから、インタフェースを呼び出して、最後にJsonを解析すればいいです.
    <?php
    
    require_once('QQClass.class.php');
    
    $url = 'http://v.t.qq.com/cgi-bin/weiboshow?f=p&tweetflag=1&fansflag=0&fansnum=0&name=bbayou&sign=7bf0ab71321a3f376b710d2c739a2a8788ee1b0f';
    
    $QQ = new QQClass($url);
    
    $QQdata = $QQ->Get_json();
    
    //ToDo json_decode();
    
    ?>

    http://www.auu.name/604/index.html