「Facebook」タグアーカイブ

Tampermonkey(Chrome版Greasemonkey)でFacebookの広告を非表示

Facebookの広告が目に入ってしまう

久しぶりの投稿で時代遅れのトピックを扱おうとしています、すいません。もしかしたら役立つ人もいるかと思い。

Facebookの右側に広告を表示する領域があるのですが、たまに下世話な芸能ニュースなど表示されていると、ワタシ嫌いではないので、ついついクリックしてしまうわけです。そして何度も「次へ」「次へ」とクリックしてどうでもいい情報をみせられ、中身のなさに愕然とするわけです。あまりに時間の無駄!でも目に入ってしまう以上、クリックしてしまいたい衝動にアガらえない!

という訳で、おもむろにCtrl+Shift+iで開発者コンソールをたちあげ、

と入力して消していました。

一度入力すれば、上矢印カーソルを押すと入力履歴が呼び出されるので、ほとんど手間はありません。

しかし、Facebookではページ移動するたびに画面が書き換えられまた広告がでてきます。

そこでTampermonkeyでスクリプトを書きました。ユーザースクリプトはかなり昔からあるもはや古(いにしえ)の技術ですが、なんと私は初ユーザースクリプトです。たぶん、すでに誰かが作っていると思うんですが、まったく気にせずさくっと書けるかやってみました。

Tempermonkeyのインストール

インストールの仕方は、まずここからChrome拡張機能のTempermonkeyをインストールします。

Tempermonkeyにユーザースクリプト追加

Chromeの拡張機能画面でTempermonkeyが有効になっていることを確認し、オプションをクリックするとTempermonkeyのダッシュボードが開くので、+ボタンを押し てユーザースクリプトを入力、保存してください。

以下がスクリプト。

これだけで、メタタグの@match属性から該当するfacebookのURLを開いた時点でユーザースクリプトが発動し、DOMを監視して変更があれば広告の入っているhome_right_columnクラスの領域を非表示にします。

facebookを開いて確認

一瞬広告が表示されますが、自動的にFacebookから広告が消えます。

難しかったところ

  1. ユーザースクリプトではsetTimeoutが無視されるので、後から追加されるDOM要素は拾えない。
  2. Facebookでのページ遷移はreactと思うが動的に行われるので、DOMの変更を検知する必要があった。

【Facebook for PHP SDK】ログアウトの仕方

自分のFacebook連携アプリからログアウトするだけでなく、Facebookからもログアウトする方法です。
複数のFacebookアカウントを切り替えてテストしたりする場合に必要なんですが、なかなか正しいやり方を書いているものがなくて苦労しました。

$facebook->destroySession()を使うわけですが、Facebookログアウト後に呼び出すところがポイントです。

calePHPのサンプルコードですが、cakePHPでなくてもほとんど同じです。
getLogoutUrl()のnextパラメータにFacebookのセッションを破棄するページのURLを入れています。

参考:http://stackoverflow.com/questions/8405729/facebook-php-sdk-caching-user

facebookAPIでapi()を認証に使うとセッションが切れてしまう

たまにアプリからのfacebookログイン失敗してるけどなんなの

cakePHP(v2.2.2)にFacebook SDK for PHP(v.3.2.2)を入れてFacebookへのログインを実装しているのですが、1度目Facebookへのログインボタンを押してもログインせず、2回目押すとログインするという現象が起きましたので原因を調査しました。

問題のソースはこんな感じ。

Apacheのエラーログをみると

と記録されています。これはSDKの中にあるbase_facebook.phpの

によるものでした。stateがいつの間にか消失してしまったようです。stateは単純にSDKの中でログインURLを取得する際に

と生成するもので、セッションに入れておいてリクエストを受け取ったクライアントがリクエストを送ったクライアントと一致するかのチェックに使われています。このstateがどこで消えたのか追っていきました。

犯人はfacebook->api()

結果、Facebookへのログイン状態を確かめるfacebook->api()で消えていました。

facebook->api()を使うのはこことかの質問サイトでみつけたやり方で、facebook->getUserだとfacebookからログアウトした後もクッキーからログインし続ける、または逆にfacebookにログインしていてもユーザーIDがクッキーのために返ってこないことを回避するためにfacebook->api()を使うんだとか。(実際はfacebook->getUserで問題なかった)

facebook->api()のソースを追うと、OAuthで例外エラーがでたときにセッションを破棄しています。ここまで追っていったところで流れが追いきれなくなってきました・・・。

getLoinUrlの前にapi(‘me’)でログインチェックするのはやめよう

整理しますとfacebookでログイン状態、自分の作ったアプリでは未ログイン状態で画面を表示すると、アプリ認証がまだなのでfacebook->getLoginUrl()が実行され、stateがセッションに保存されます。このままログインすればいいのですが、問題の起きるパターンでは、ここで同じページを再度読み込みます。すると再度ログイン認証facebook->api()が行われ、セッションを破棄したうえでログインURLを生成するため、認証先でエラーとなるというわけです。

認証チェックはgetUserを使う、てかそれが普通だった

facebook->api()を使ってこの現象を回避する方法が思いつかなかったので、結局facebook->api()はやめてfacebook->getUser()を使うことにしました。テストしたところ、ちゃんとfacebookのログイン状態と連動した値を返していました。

そしてSDKのreadme.mdをみますと、ちゃんとfacebook->getUser()を使って0以外が返ってきたときだけapi(‘me’)を使うようになっているじゃありませんか。これみて作ってれば最初からこんなエラーはぶち当たらなかったはず・・・。

そんなわけで、普通はこのエラーには当たらないと思います。ただ解決までけっこう時間がかかってしまったのでドキュメントちゃんとみないとだめですよという教訓としてブログに載せてみました。