はじめに

ググるとたくさん出てくるのでご存知かとは思いますが、Instagram には API があります。また、こちらもご存知かとは思いますが Instagram API の利用申請許可が降りる可能性は極めて低いです。昨今のインスタブームに乗っかって Instagram を利用したい経営者は多数いるかと思いますが、正規の方法での利用は諦めたほうがいいでしょう。また、Instagram のスクレイピングは規約で禁止されていますのでスクレイピングで実装を支持されたエンジニアの方はその旨を伝えて拒否しましょう。

不正な方法を用いて、アカウントの作成、情報へのアクセス、または情報の取得を試みることは禁止されています。
これには、弊社から明示的な許可を得ることなく、自動化された手段を用いてアカウントを作成したり、情報を取得したりする行為が含まれます。

とはいえ、Instagram のスクレイピング自体はお勉強の題材としては良いかと思いますので、少しだけ実装をしてみました。以下の内容は自己責任の範囲でご確認ください。

 

やりたいこと

  • Instagram のハッシュタグ検索をスクレイピング
    • 最新投稿の本文を取得
    • ハッシュタグ検索結果件数を取得

実装

私は PHPer なので PHP での実装となります。
とりあえずコード貼ります。


<?php
// 検索対象ハッシュタグ
$tagList = array(
    'インスタ映え',
    'インスタ萎え',
);
foreach ($tagList as $tag) {

    // Instagram へアクセス
    $encodedTag = urlencode($tag);
    $url = "https://www.instagram.com/explore/tags/{$encodedTag}/";
    // 自作の curl ライブラリ
    $requestObj = new CurlHttpRequest($url);
    $timeOutSecond = 30;
    $instagramContentsResponse = $requestObj->get($timeOutSecond);
    
    // タイムアウト処理等は適宜いれてください

    // レスポンスから必要な json 部分を抜き出す
    $instagramContentsResponse = $instagramContentsResponse['body'];
    $positionStart = mb_strpos($instagramContentsResponse, 'window._sharedData = ');
    $positionEnd = mb_strpos($instagramContentsResponse, ';</script>');
    $length = $positionEnd - $positionStart;
    $json = mb_substr($instagramContentsResponse, $positionStart, $length);
    $json = str_replace('window._sharedData = ', '', $json);
    $jsonObj = json_decode($json);
    $infoListObj = $jsonObj->entry_data->TagPage[0]->graphql->hashtag->edge_hashtag_to_media->edges;
    foreach ($infoListObj as $index => $infoObj) {
        // Instagram 投稿 ID ?
        $infoObj->node->shortcode;
        // 投稿日時
        $stamp = date('Y-m-d H:i:s', $infoObj->node->taken_at_timestamp);
        // 投稿本文
        $text = $infoObj->node->edge_media_to_caption->edges[0]->node->text;
    }
    // ハッシュタグ検索結果件数
    $instagramPostCount = $jsonObj->entry_data->TagPage[0]->graphql->hashtag->edge_hashtag_to_media->count;
}


Instagram へのアクセスは curl で行っていますが上記の例では自作の curl ラッパークラスを使っていますので、適宜ご自身の環境で書き換えてください。
GET でアクセスできれば、file_get_contents でもなんでも構いません。
取得したレスポンスから JavaScript の部分に必要な情報が入っていますので、その部分を抜き出します。
また、データは JSON 形式になっていたため json_decode しています。
あとは必要な情報へアクセスして DB に保存するなど煮るなり焼くなり。。。
もし、文字化けする場合はサーバーの設定か PHP の文字コード設定を見直してみてください。

まとめ

今回は Instagram ハッシュタグ検索のスクレイピングを試しましたが、同じ要領で個別の投稿のスクレイピングもできるかと思います(未検証)。
このデータを収集して機械学習用のデータにすると面白いかもしれないと思いました。
ただし、冒頭にも記載しましたが Instagram の利用規約に抵触する可能性が高いので自己責任の範囲で行ってください。
上記内容の利用に関して筆者は一切の責任を負いません。
では、楽しいインスタライフを。

05. 8月 2015 · Write a comment · Categories: PHP · Tags:

PHP$_SERVER 変数でリクエストのページ内リンク (アンカータグ) を取得しようとして散々悩んでいました。
結論から言うと取得出来ません。

parse_url()を使用する例をネットで見かけますが、それはまた別な話です。
アクセス先情報は $_SERVER 変数を使用すれば取得できます。

$url = $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
こんな感じですね。



この $_SERVER[‘REQUEST_URI’] にはページ内リンク部は含まれません。
ページ内リンクは、ブラウザに取って必要な情報でサーバ側には必要ない情報ですから。

先述した、parse_url()を使用できるのは下記のような時です。



$url = 'http://www.hoge.jp/hogehoge#anc';
var_dump(parse_url($url));
まあね、実際こんなことしないですよね。
何の意味があるのか分からないですよこんなの。

どうしても、実行中 URL からアンカー部を抽出したい場合は、レンダリング後に Javascript でやるしか無いですね。
割りと必要な機能だと思うので、PHP が取り込んでくれたらいいなと思ってます。
……ないかな。

それでは。

19. 4月 2015 · Write a comment · Categories: jQuery · Tags: , ,

最近は React.js の話題で持ちきりな web 界隈ですが、まだまだ現役で jQuery を使っています。と言うより、ちょっと前まで Angular.js とか Backbone.js とか言ってたやんけ!!コロコロ変わり過ぎで、採用できないっす… そもそも私は PHP の人間で、そっちのテンプレートエンジンを使っておりますので、 js フレームワークの導入は現状難しいかなと思っております。

4月になりまして、入社2年目に入りました。ようやく jQuery も使えるようになってきたかなと思っていましたが、先日つまづいたところがありましたので備忘録的に残しておきたいと思います。



何の事はない jQuery の click イベントを使おうとしただけなんですが、iPhonesafari だけ全く反応してくれなかったのです。

$(document).on('click', '.hoge', function(){
    // hogehoge;
});

上記のようなコードで、 hoge クラスがクリックされたら処理を行いたかったのですが、iPhone の safariだけ全く反応しませんでした。いろいろ試した結果の解決方法は、 「hoge クラスに onclick を付ける」です。具体的には下のようになります。



<div class="hoge" onclick="">
    <span>いえええええい!!</span>
</div>

onclick には何も指定しなくて構いません。ただ onclick があるだけで、 jQuery の click イベントが発火するようになりました。ただし、これが正しい解決方法なのかどうかは私には分かりません。いままで普通に iPhone safari でクリックイベント使ってたんですが何故今回動かなかったのか…?とりあえず私はこれで動きました。もし、これで他のお方のお役に立てれば幸いです。

先述したとおり、私は PHP のテンプレートエンジンをつかっておりますが、同じような環境の方で、 js フレームワークの取り入れ方教えてエロい人!!

それでは。

17. 2月 2015 · Write a comment · Categories: iPhone · Tags: , ,

かんたん割引計算アプリ「waribiki」の最新バージョンがめでたくリリースされました。ぜひ使ってやってください。



さて、このwaribikiですが、アプリ内でiADを表示させています。他のnend等の広告は使用していません。ここが理由でアップデート申請リジェクトを喰らったので、メモとして残しておきます。

 IDFAを使用しますか?は「いいえ」にする

nend等の広告を表示せず、iAdのみの場合はここを「いいえ」にします。


スクリーンショット 2015-02-08 12.23.57


ここを「はい」にして申請したところ、PLA 3.3.12でリジェクトを喰らいました(泣)
Appleとしては、ガイドラインで宣言されている広告にiADは含まれていないのでIDFAは使用しないを選べということだそうです。
ガイドライン読めって話ですが、日本人にはツラい…




 スクリーンショットにiADを入れてはいけない

スクリーンショットに広告が無いのに、インストールしたら広告が出るのは嫌な感じがしますが、iADを写したスクリーンショットで申請をするとリジェクトの対象になります。iADの入ったスクリーンショットを使用して申請をしたところ、3.2 – Apps with placeholder text will be rejectedでリジェクトされました(泣)
コレはかなり納得がいかない。広告がないと思ってインストールしたユーザにかなり怒られますよ。しかし、広告を異様に嫌がるのは日本人だけらしく、アメリカ人は広告を出さないなんて気持ち悪いと感じるそうです。そういった背景があるからでしょうか?


iOSの申請周りはアプリの作成より面倒くさいんじゃないかという気がしていますが、私めげない!!

それでは。


29. 1月 2015 · Write a comment · Categories: PHP · Tags:

お仕事でレスポンスprintして、それを受け取った先方が処理をする案件がありました。こっちとしては処理が成功したらprintするだけなので余裕かと思っていたら思わぬ落とし穴がありました。

先頭に改行コードが入ってるんですが





どういうことだ?と思いましたが、蓋を開けてみたら話は単純でした。includeしているPHPファイルの先頭改行が入っていました。

 
<?php

PHPタグの前に改行が入ると出力されてしまうようです。こんな単純なミスですが、一度ハマるとなかなか抜け出せないので、ファイルを新たに作る時は先頭に改行が入らないよう気を付けます。

…新卒だから許してください。

それでは。

31. 12月 2014 · Write a comment · Categories: PHP · Tags: ,

社内のチームチャットツールとしてSlackを導入しました。
Slackの詳細についてはググればいくらでも出てくるので、そちらにお任せします。

ただ、ググってもAPIを使用してSlackbotに発言をさせる具体的な方法が出てこなかったので、紹介したいと思います。
まあ、POSTするだけなんですけどね。


まずテストしてみようとHTMLフォームを作ってPOSTしてみましたが、動作しませんでした。
HTMLからPOSTしてテストしようとしている方はご注意ください。動きません。最初からコードを書いてください。

コードはPHPで書いています。

IntegrationsにSlackbotが追加されていることを確認します。
integrations

Slackbotを選択すると設定画面が表示されます。
ここのURLに対してPOSTで送信するだけです。

url


$client = new HTTP_Client();
$client->post(
    "https://YOUR_TEAM/services/hooks/slackbot?token=TOKEN&channel={$channel}", 
    $message, 
    true
);

第一引数にSlackbot設定画面のURLを指定します。
このとき、Slack上のどのチャンネルで発言させるかをchannelパラメータに「#」付きで指定します。例えばgeneralチャンネルで発言させたければ、
https://YOUR_TEAM/services/hooks/slackbot?token=TOKEN&channel=#general
とします。
もちろん、上記URLのYOUR_TEAMとTOKENの部分は自分のSlack設定に合わせて変更してください。

第二引数にはSlackbotに発言させる文章を指定します。
使い方はいろいろあるかと思いますが、SQLがエラーを出した時にそのSQLとエラーを取得してPOSTするとかですかね。

さすがに上記コードをそのまま使おうと思われる方はいないと思いますので、クラスを作成して使いやすくしてください。

簡易的ではありますが、必要なときに必要な情報をSlackに通知させるにはこれで十分かと思います。
ご自分のサービスで使いドコロを考えて適切に通知させれば、イロイロと捗りますので是非お試しあれ。

それでは。

社会に疲れ切っているみなさん!
そう、そこの私!
めぐりズムが良いらしいよ!!


えー、私一応プログラマを生業としていまして、1日の中で画面を見ていない時間は寝ている時だけという日々を送っております。眼精疲労が早くもピークに達してしまいました。こんなことを言いながら画面に向かってブログを書いております。

先日、会社の忘年会の景品を決めるときに「眼をジュワ~ってするのいいよね」と、女子が言っているのを某野々村議員並に聞き耳を立てて聞いておりました。

なるほど、ジュワ~か。
これはよさそうですね、ということでさっそくカカクヤスクKYセイユーで購入してまいりました。

IMG_5248.JPG

5枚入りで473円でした。
中はこのように個別包装になっており、1回使い切りだそうです。

IMG_5250.JPG

付けてみた。

IMG_5256.JPG

普通だ。

IMG_5258.JPG

うおおおおおおおお!!!!
あったかいぞ!!!!!!!

IMG_5257.JPG


いや、しかし蒸気はまったく感じられんな。10分と書いてあったので待ちましょう。

IMG_5259-0.JPG

何も見えませんが、隣でエアー彼女の幸子が10分経ったと言っています。
いや、まだあったかいしイケる。

待ちます……

14分くらいで冷めてきた模様。
外します。

!!!!

すげえぜコレは。
眼がスーパースッキリしています。目の周りがしっとりしているので、蒸気はしっかり出ていたようです。

アイマスクを外した私を見たエアー彼女の幸子が、「さっきと顔が違う」と言っていました。
どうやら、さらにイケメンになってしまった模様。参ったぜ。

母親と父親にも1枚ずつ渡して試してもらったところ、「テレビがよく見える」と言っていました。

エアー彼女の幸子は19分くらい冷めずに付けていたので、時間は検証が必要ですね。

疲れきった現代人にオススメです。
皆さんも眼が疲れたなあと感じたらぜひ試してください。

それでは。