免責事項:このコレクションは完全なふりをするものではなく、問題を解決できる結果を要約したものです:サブスクリプションのリストを取得する、サブスクリプションごとの未読アイテムを取得する、アイテムを既読にする、サブスクリプションを既読にする 他のすべての情報は、 公式マニュアルを使用して簡単に取得できます 。
クライアントajax-interfaceとgoogle.com/reader/との相互作用を実装するには、php + curlの仲介を使用します。
Googleの紹介
AccountLoginを使用した認証メカニズムは提供しません。これは、他の人によって既に十分に説明されているためです。 承認後、ユーザーIDと、SIDおよびその他の情報を含む小さなCookieが必要であると要約します。 このCookieはGoogleから提示され、ユーザーIDはGETおよびPOSTリクエストで使用されます。
curlを操作するためのクラス
例では、簡単なphpクラスを使用してcurlを操作します。
クラスcurl { var $ c; var $ url; 関数curl($ url){ $ this-> c = curl_init(); //curl_setopt($this->c,CURLOPT_PROXY,'192.168.xx:8000 '); //これはプロキシです(必要な場合) // curl_setopt($ this-> c、CURLOPT_PROXYUSERPWD、 'user:pass'); // curl_setopt($ this-> c、CURLOPT_PROXYUSERPWD、 'user2:pass2'); curl_setopt($ this-> c、CURLOPT_COOKIE、 'cookie here'); // Googleを紹介します curl_setopt($ this-> c、CURLOPT_URL、$ url); $ this-> url = $ url; } 関数の投稿($データ){ curl_setopt($ this-> c、CURLOPT_POST、1); curl_setopt($ this-> c、CURLOPT_POSTFIELDS、$ data); } function go($ return = 0){ if($ return){ curl_setopt($ this-> c、CURLOPT_RETURNTRANSFER、$ return); $ response = curl_exec($ this-> c); curl_close($ this-> c); $応答を返します。 } else { curl_exec($ this-> c); curl_close($ this-> c); } } }
Cookieはクラスコードに「しっかりと」縫い付けられます。クラスを他の場所で使用するのは悪いことですが、このレビューでは他に何も考慮されていないため、普遍性は簡単に無視できます。
RSSフィードのリスト
$ subscriptions = new curl( 'http://www.google.com/reader/api/0/subscription/list?output=json');
このgetリクエストは次のjsonオブジェクトを返します
{ 「サブスクリプション」:[ { 「id」:「feed / http://habrahabr.ru/rss/blog/i_am_clever/」、 「タイトル」:「\ u042f \ u0443 \ ...」、 「sortid」:「DB54FDDE」、 「カテゴリ」:[ { "id": "user /-/ label / \ u0425 \ u0430 \ ..."、 「ラベル」:「\ u0425 \ u0430 \ ...」 }、... ]、 「firstitemmsec」:「1198498116053」 }、... ] }
- 「Id」:「feed / http://habrahabr.ru/rss/blog/i_am_clever/」-この値は、後でサブスクリプションを識別するために使用されます
- 「カテゴリ」は、このサブスクリプションのタグの配列です。 フォルダとフィードリクエストの構造を、ラベルごとに構築する必要がありました。
この要求は、ユーザーインターフェイスの初期初期化時に1回行われると便利です。
定期購入アイテム
$ items =新しいカール( 'http://www.google.com/reader/api/0/stream/contents/'。 cm_get( 'id'、 'str')。 「?n = 20&r = n&xt = user /」。 $ userid。 '/ state / com.google / read&ot ='。 cm_get( 'ot')。 '&output = json&client = scroll&ck ='。time());
cm_get( 'id'、 'str')-ユーザーからのgetリクエストに伴うサブスクリプションの識別子。 cm_get関数はインジェクションから保護します。ここでは必要ではなく、$ _GET ['id']と書くことができますが、(念のため)そのままにしておきます。
$ userid-ログイン中に受け取ったユーザーID
cm_get( 'ot'、 'str')は、前のgetからのfirstitemmsecフィールドで、ミリ秒単位で、秒単位で取得されるため、1000倍に削減されます。
Googleの回答:
{ 「id」:「feed / http://habrahabr.ru/rss/blog/linux/」、 「タイトル」:「\ u0425 \ u0430 \ ...」、 「自己」:[ { 「href」:「長いURL」 } ]、 「代替」:[ {「href」:「http://habrahabr.ru/rss/blogs/linux/」、 "type": "text / html"}]、 「更新済み」:1224688061 「アイテム」:[ { 「crawlTimeMsec」:「1224688061884」、 「id」:「tag:google.com、2005:reader / item / 3dfa07f7c9a2dab0」、 「カテゴリ」:[ 「user / 10093198974819760184 / state / com.google / reading-list」、 「user / 10093198974819760184 / state / com.google / fresh」、 「linux」、「server」、「java」、「jboss」 ]、 "title": "みんなのためのLinux ..."、 「公開済み」:1224685301 「更新済み」:1224685301 「代替」:[{ 「href」:「http://habrahabr.ru/blogs/linux/42958/」、 "type": "text / html"}]、 「概要」:{ 「方向」:「ltr」、 「内容」:「多くの手紙」 }、 「著者」:「カーボエルド」、 「注釈」:[]、 「オリジン」:{ 「streamId」:「feed / http://habrahabr.ru/rss/blog/linux/」、 「タイトル」:「\ u0425 \ u0430 ...」、 「htmlUrl」:「http://habrahabr.ru/rss/blogs/linux/」 } }、... ] }
ここで、一般に、すべてが明確です。 時々(一部のテープでは)要素の構造がわずかに異なる理由は明らかではありません。 しかし、ここではまだ自分自身でそれを理解していないので、ここで推論を広めることのポイントはわかりませんが、この現象に関する他の原住民の考えを喜んでコメントで読みました。
そして、私はほとんど忘れていました。 Googleが更新、公開、およびその他の属性で指定する時間はutc-timeであるため、クライアントでtimeZoneOffsetを取ることを忘れないでください。
// UNIXタイムの開始 var adate = new Date( '1970/01/01'); //現地時間の分を削除します adate.addMinutes(-(新しい日付).getTimezoneOffset()); // Googleが送信した秒を追加します adate.addSeconds(Math.floor(x.items [i] .crawlTimeMsec / 1000));
未読アイテムの数
$ x =新しいカール( 'http://www.google.com/reader/api/0/unread-count?all=true&output=json'); {未読: { 「最大」:1000、 「未読カウント」:[ { 「id」:「feed / http://bash.org.ru/rss/」、 「カウント」:764、 「newestItemTimestampUsec」:「1223899958891011」 }、... ] } }
ここで、コメントするものは何もない、未読カウントの配列があると思います。それだけです。
テープを既読にする
$ x =新しいカール( 'http://www.google.com/reader/api/0/mark-all-as-read?client=scroll'); $ x-> post( 'T ='。$ T. //トークン '&s ='。$フィード。 //フィードID //'&t=asd'.//$_POST['title'†[$i]。 //オプションのパラメーター '&ts ='。time()//時間 );
トークンは、データベースを変更する操作に必要です。 理由を聞かないでください、私は知りません。
トークンを取得するには、使用します
$ x =新しいカール( 'http://www.google.com/reader/api/0/token?ck='.time()。'&client = scroll ');
テープアイテムを既読にする
$ x =新しいカール( 'http://www.google.com/reader/api/0/edit-tag?client=scroll'); $ x-> post( 'T ='。cm_post( 'token'、 'str')。 '&a = user /'.$ userid。' / state / com.google / read '。 '&async = true'。 '&i ='。$アイテム[$ i]。 //要素ID '&s ='。$フィード[$ i]); //テープID
したがって、Googleリーダーで作業するための基本的な機能を取得します。
リトリート。 なぜ必要なの
私はそのような問題を抱えているか、まだ不満を持っている人がいるかどうかを理解するためだけに書いています。 一般に、問題の本質:jボタン(次のエントリ)のハンドラを変更しました。 これで、新しく開かれたレコードは、スクロール可能なdivの表示領域の上部にフィードで「固定」されます。 以前は優れていました。 実際、これが最後のストローでした。 客観的な理由:読み取り専用のダウンロード済みメッセージをマークする機能、読み取りを非表示にする機能、複数のフィードを一度に読み取る機能、不快なコンテンツをフィルタリングする機能、および毎月のトラフィックが終了したときに企業プロキシをバイパスして読み取る必要がありました=)
そしてちょっとした質問
jsコードの一部をクライアントインターフェースで直接変更して他の人と共有できる場合、この機能を提供し、ソースを提供し、どこにも約束しないサードパーティサイトでGoogleパスワードとGoogleログインを入力しますログインパスワード(Cookieとユーザーのみ)を保存するには?