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
もしテンセントがPOSTを必要とするならば、以下、注意して、POSTの时、できるだけheaderの情报をすべて埋めて、さもなくば时にはサーバーの検証に通じないことができます
wordpressで使用しているのでpythonはサポートされていませんがPHPと書いてありますが、ここではCurlの方が頼りになりますが、fsockopenはあまり安定していません
それから、インタフェースを呼び出して、最後にJsonを解析すればいいです.
http://www.auu.name/604/index.html
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