Hatena::Groupasakura

浅倉卓司@blog風味? このページをアンテナに追加 RSSフィード

Error : RSSが取得できませんでした。

2014-01-15(Wed)

Services_Twitterで現時点のAPIにアクセスする方法のメモ

|  Services_Twitterで現時点のAPIにアクセスする方法のメモ - 浅倉卓司@blog風味? を含むブックマーク  Services_Twitterで現時点のAPIにアクセスする方法のメモ - 浅倉卓司@blog風味? のブックマークコメント

 メンテナンスされてないみたいだけど使ってるアプリがあったのでメモ:

<?php

  requrie_once 'Services/Twitter.php';

  Services_Twitter::$searchUri = 'https://search.twitter.com';  // APIのリクエスト先をSSL対応に
  Services_Twitter::$uri = 'https://api.twitter.com/1.1';  // APIのリクエスト先をv1.1+SSL対応に
  // 上記は Services/Twitter.php を直接書き換えてしまってもいいかも。メンテされてないんだし。

  $tw = new Services_Twitter();

  $http_request = new HTTP_Request2();
  $http_request->setAdapter('curl');
  //$http_request->setConfig('ssl_cafile', '/usr/local/share/certs/ca-root-nss.crt');  // 実際のca-rootのパスに合わせる
  //$http_request->setConfig('ssl_verify_peer', false);

  $tw->setRequest($http_request);

// 以下、既存の処理

 APIのバージョンが変わった時の対策は以前行なっていたのですが(リクエスト先を変えるだけだったし)、今回もURLをhttpsにするだけで解決するかと思ったらハマりました。

 HTTP::Request2を使ったリクエストでhttps://api.twitter.comへの接続でエラーが出ていたのでその対策を確認したところ、HTTP_Request2のオプションとして

  • cURLを使うように変える
  • cafileの位置を指定する
  • verifyを切る

――があるようでした。

 cURLが入っている環境ならそれを使うのがいいんじゃないかな。


 上記のオプションを用いてServices_Twitterがリクエストする方法にしばらく気付かなかったのですが*1、Services_Twitter::setRequest() でHTTP_Request2オブジェクトを設定できるのに気付いて無事解決。

*1:しばらく HTTP_OAuth_Consumer 側の問題だと思ってそちらの修正をしてて「直らんなぁ」と思ってたのでした。

トラックバック - http://asakura.g.hatena.ne.jp/asakura-t/20140115

2011-10-31(Mon)

RHEL6(互換)でPHPとOracleを使う

|  RHEL6(互換)でPHPとOracleを使う - 浅倉卓司@blog風味? を含むブックマーク  RHEL6(互換)でPHPとOracleを使う - 浅倉卓司@blog風味? のブックマークコメント

今までのあらすじ

 RHEL5(互換)ではOracleが用意していたPHPのrpmパッケージを使っていればよかったのですが、RHEL6(互換)用のrpmパッケージはなぜかないので*1、メモ。

RHEL5でremi版のPHPを使いたい場合でも同様の方法で使えるようになると思います)


 ところで、remiレポジトリにもphp-oci8.rpmがあるのですが、あれは何故かまともに動かないんですよね。

 どういう環境にすれば動くようになるんだろう?


準備


php-oci8-*.rpmの作成


 php-oci8-11gR1-*.rpmとphp-oci8-11gR2-*.rpmができるので、使いたいOracle instant clientのバージョンに合わせてどちらかを入れれば使えるはずです。

(libaioが必要なので、そちらも入れる必要があります)

*1Oracle Linux 6を使えってことなのかなぁ。

トラックバック - http://asakura.g.hatena.ne.jp/asakura-t/20111031

2011-07-27(Wed)

facebook SDKのPHP版でセッションを使わない+Javascript SDKのログインを利用する

|  facebook SDKのPHP版でセッションを使わない+Javascript SDKのログインを利用する - 浅倉卓司@blog風味? を含むブックマーク  facebook SDKのPHP版でセッションを使わない+Javascript SDKのログインを利用する - 浅倉卓司@blog風味? のブックマークコメント

 古いPHP SDKの記事ではよく

<?php
$facebook = new Facebook(array(
	'appId' => $app_id,
	'secret' => $secret,
	'cookie' => true,	// 無意味
));

――のような記述がありますが、現時点のSDK3.0.1ではcookieオプションは存在しないので意味ないです。

 また、Javascript SDKを使ってログインしてcookieを渡されてもcookieのパースをしてくれません。

 仕方がないのでそのへんを便利に使えるサブクラスを作りました:

<?php
require_once "facebook.php";

class FacebookWithCookie extends Facebook
{
  protected $facebookCookie;
  public function getFacebookCookie() {
  	if (isset($this->facebookCookie)) return $this->facebookCookie;

    $app_id = $this->getAppId();
    $app_secret = $this->getApiSecret();

    $cookie_key = 'fbs_' . $app_id;
    if (!isset($_COOKIE[$cookie_key])) return $this->facebookCookie = false;

    $cookie_val = $_COOKIE[$cookie_key];
    setrawcookie($cookie_key, $cookie_val);

    $args = array();
    parse_str(trim($cookie_val, '\\"'), $args);
    ksort($args);
    $payload = '';
    foreach ($args as $key => $value) {
      if ($key != 'sig') {
        $payload .= $key . '=' . $value;
      }
    }

    if (md5($payload . $app_secret) != $args['sig']) {
      return $this->facebookCookie = false;
    }
    return $this->facebookCookie = $args;
  }
  public function getAccessToken() {
    if ($this->accessToken !== null) {
      return $this->accessToken;
    }

    $facebook_cookie = $this->getFacebookCookie();
    if (isset($facebook_cookie['access_token'])) {
      $this->setAccessToken($facebook_cookie['access_token']);
      return $this->accessToken;
    }

    return parent::getAccessToken();
  }
}

 これでログイン処理はJavascript側に任せてPHP側はCookieをチェックすることでログインの判定ができる、はず。

 でまあ、Cookieに情報が保存されてるならPHPのセッションに保存しないで欲しいなぁと思ったので、結局下記のような感じで使ってます:

<?php
require_once "base_facebook.php";

class FacebookNoSession extends BaseFacebook
{
  protected $facebookCookie;
  public function getFacebookCookie() {
  	if (isset($this->facebookCookie)) return $this->facebookCookie;

    $app_id = $this->getAppId();
    $app_secret = $this->getApiSecret();

    $cookie_key = 'fbs_' . $app_id;
    if (!isset($_COOKIE[$cookie_key])) return $this->facebookCookie = false;

    $cookie_val = $_COOKIE[$cookie_key];
    setcookie($cookie_key, $cookie_val);

    $args = array();
    parse_str(trim($cookie_val, '\\"'), $args);
    ksort($args);
    $payload = '';
    foreach ($args as $key => $value) {
      if ($key != 'sig') {
        $payload .= $key . '=' . $value;
      }
    }

    if (md5($payload . $app_secret) != $args['sig']) {
      return $this->facebookCookie = false;
    }
    return $this->facebookCookie = $args;
  }
  public function getAccessToken() {
    if ($this->accessToken !== null) {
      return $this->accessToken;
    }

    $facebook_cookie = $this->getFacebookCookie();
    if (isset($facebook_cookie['access_token'])) {
      $this->setAccessToken($facebook_cookie['access_token']);
      return $this->accessToken;
    }

    return parent::getAccessToken();
  }
  public function getUser() {
    $user = parent::getUser();
    if ($user) return $user;

    $facebook_cookie = $this->getFacebookCookie();
    if ($facebook_cookie) return $this->user = $facebook_cookie['uid'];
  }

  protected function setPersistentData($key, $value) {
  }
  protected function getPersistentData($key, $default = false) {
  }
  protected function clearPersistentData($key) {
  }
  protected function clearAllPersistentData() {
  }
}

追記(2011-09-16)

 ユーザーが取得できないケースがあったので「function getUser()」を修正(追加)しました。

トラックバック - http://asakura.g.hatena.ne.jp/asakura-t/20110727
2004 | 01 | 02 | 03 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 08 | 09 | 10 | 11 | 12 |
2007 | 02 | 03 | 04 | 05 | 06 | 07 | 10 | 11 | 12 |
2008 | 02 | 03 | 04 | 06 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 02 | 03 | 04 | 05 | 07 | 08 | 10 | 11 | 12 |
2013 | 01 | 05 | 07 |
2014 | 01 | 02 |
2016 | 01 |
2017 | 01 | 05 |