TwitterAPIでの病院名ユーザーの治療関連ツイート検索方法

このQ&Aのポイント
  • TwitterAPIを使用して、病院名を含むユーザーの治療関連ツイートを検索する方法について教えてください。
  • 具体的には、ユーザー名に「病院」という単語を含み、かつツイートに「治療」という単語を含むツイートを抽出したいです。
  • スクリーンネームではなくプロフィールのユーザー名に着目し、複数の検索条件を組み合わせる方法を知りたいです。
回答を見る
  • ベストアンサー

TwitterAPIでの検索の組み合わせ

唐突に質問失礼致します。 TwitterAPIを用いて指定の文字列を抽出しようとしています。 具体的には ユーザー名(name)に「病院」という単語を含み かつ ツイートに「治療」という単語を含む ような形です。 スクリーンネームではなく、ネーム(ユーザー名)で拾いたいです。 ※スクリーンネームとネーム(ユーザー名)の違い screen_name(@~以降の英数字の名前 例:@aaaなど) name(プロフィールで変更可能なユーザー名 例:鈴木太郎など) 例えば、 from演算子を使って「治療 from:xxxxx」で検索すると、アカウントのスクリーンネームが「@xxxxx」からのツイートの中で「治療」が含まれる検索結果が表示されます。 しかし、このようにスクリーンネーム(screen_name)ではなく プロフィールのユーザー名(name)にして複数検索したいです。 例えば、PHPで 「治療あるいは予防(または両方含む)」という2つの単語を含むツイートをした、「病院」という単語を含むユーザー名(name)を抽出したい場合、 $key = "治療 OR 予防 from:●●●"; などで●●●の部分をどう記述すればいいでしょうか? ['name']と書き入れたりすればいいのでしょうか? どう検索コマンドを組み合わせて記述すればいいか困っています。 (参考) Twitter検索オプションと高度な検索 http://www.e-letter.jp/sns/twitter/index38.html 教えていただけたら幸いに存じ上げます。

  • walsch
  • お礼率89% (224/250)
  • PHP
  • 回答数3
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.2

えーっと >> $key = "治療"; >> $options = array('q'=>$key,'count'=>'1','lang'=>'ja'); >> $url = 'https://api.twitter.com/1.1/search/tweets.json?exclude_replies=true'; >> $json = $twObj->OAuthRequest($url,'GET',$options); >> $jset = json_decode($json, true); これはよく http://qiita.com/rana_kualu/items/357a031c0453a3538ad3 みたいな感じでダメだと言われる不恰好な書き方なので以下のように書きましょう。include_entitiesもデフォルトでtrueなので書く必要性ゼロです。 <?php // ライブラリの読み込み require 'twitteroauth.php'; // TwitterOAuthオブジェクトの生成 $to = new TwitterOAuth('***', '***', '***', '***'); // パラメータの設定 $params = array('q'=>'治療','count'=>'1','lang'=>'ja'); // データを取得、これは自動でjson_decodeされる // 但し第2引数にtrueを渡していないので // 連想配列ではなくオブジェクトとしてデコードされる $result = $to->get('search/tweets', $params); // エラーチェックは是非書いておきましょう if (!isset($result->statuses)) {  // ここでは簡易的にテキストだけ出してdieしていますが、実際にWebサービスとして  // 公開する際はちゃんとエラー時にもHTMLを出力したほうがいいです  die(isset($result->errors[0]->message) ? $result->errors[0]->message : '不明なエラー'); } // 絞り込む $statuses = array_filter($result->statuses, function ($status) {  return   strpos($status->user->name, '病院') &&   strpos($status->text, '治療')  ; }); // テスト表示してみる foreach ($statuses as $status) {  echo htmlspecialchars($status->text, ENT_QUOTES, 'UTF-8', false) . '<br>' . PHP_EOL; }

walsch
質問者

お礼

丁寧な回答、本当にありがとうございます! なかなかうまく動作しないので1ヶ月試行錯誤中ですが、参考にしながら頑張って作りたいと思います。 お礼が遅れて恐縮でしたが、一度ベストアンサーで締め切らせて頂きます。 心より御礼申し上げます。

その他の回答 (2)

noname#244856
noname#244856
回答No.3

以下は蛇足です。 回答No.2のようにエラーチェックは事実上TwitterAPIを利用する上では必須になってきます。毎回これを書くのはちょっとつらいので、もしこの部分をラクにやりたいとお考えならば、ぜひ私の自作したライブラリを使ってみてください。twitteroauthが非常に古くてあまり洗練されていないことに業を煮やして作ってしまったやつですw GitHub - TwistOAuth https://github.com/mpyw/TwistOAuth twitteroauthとの互換性を考えて作っているので、使い方は非常に似ています。既に提示したサンプルコードをこのライブラリ用に書き直すと以下のようになります。なお、このライブラリはtwitteroauthのようにOAuth.phpを必要としません。このファイル単独で利用可能です。また、PHP5.4以降では array() は [] と簡略化して書くことが出来るので、ここではその表記を使用することにします。 <?php require 'TwistOAuth.php'; try {  $to = new TwistOAuth('***', '***', '***', '***');  $params = ['q' => '治療' ,'count' => '1', 'lang'=>'ja'];  $statuses = $to->get('search/tweets', $params)->statuses;  $statuses = array_filter($result->statuses, function ($status) {   return    strpos($status->user->name, '病院') &&    strpos($status->text, '治療')   ;  });  foreach ($statuses as $status) {   echo htmlspecialchars($status->text, ENT_QUOTES, 'UTF-8', false) . '<br>' . PHP_EOL;  } } catch (TwistException $e) {    echo $e->getMessage();   } このライブラリでは、エラーが発生しときにはTwistException例外オブジェクトがスローされるようになっています。それをcatchして処理するだけでいいので、issetでチェックする必要がありません。ゆえに以下のように「->」でつなげて書けてしまうのもメリットの一つですね。 $statuses = $to->get('search/tweets', $params)->statuses; なお、前の回答でも今回の回答でも出力時にhtmlspecialcharsを通していますが、第4引数にfalseを渡していることに着目してください。これはTwitterのエスケープの仕様が不十分なことによるものです。詳しくは以下の説明を読んでください。 https://github.com/mpyw/TwistOAuth#tweets-are-already-escaped-wtf http://php.net/manual/ja/function.htmlspecialchars.php

noname#244856
noname#244856
回答No.1

> ユーザー名(name)に「病院」という単語を含み > かつ > ツイートに「治療」という単語を含む 出来ません。ユーザ名のみを対象とするクエリは作成できません。 やるとすれば普通に「病院 治療」で検索して、取得データを $statuses = array_filter($statuses, function ($status) {  return   strpos($status->user->name, '病院') &&   strpos($status->text, '治療')  ; }); で絞り込む程度ですね。

walsch
質問者

補足

回答ありがとうございます! そうですか・・・。fromではユーザ名のみを検索はできないのですね…。 仰った通り $statuses = array_filter($statuses, function ($status) {  return   strpos($status->user->name, '病院') &&   strpos($status->text, '治療')  ; }); で検索してみます。 そのままだと $statuses = array_filter($statuses, function ($status) の行に Notice: Undefined variable: statuses in xxxx.php on line xx strpos($status->user->name, '病院') &&の行に Warning: array_filter() expects parameter 1 to be array, null given in xxxx.php on line xx が出たので取得データを読み込ませる必要があるのですね…。 実は今現在、 $key = "治療"; $options = array('q'=>$key,'count'=>'1','lang'=>'ja'); $url = 'https://api.twitter.com/1.1/search/tweets.json?exclude_replies=true'; $json = $twObj->OAuthRequest($url,'GET',$options); $jset = json_decode($json, true); //※$twObjは前にカスタマーキーなど定義済み(動作確認済) ・・でツイート内に「治療」を含むデータが抽出できました。 しかしユーザ名(スクリーンネーム)が「病院」のものを拾い出すのにどこに差し込めばいいのか迷っています。 この場合、 jset2 = strpos($jset->user->name, '病院'); のような形でどこかに挿入するのでしょうか・・・?(最後につけても動作しませんでした) あるいは$statuses = array_filter($・・の形で書き直すとどういう形になるのでしょうか・・? 初心者的な質問で申し訳ございません。 試行錯誤してみたのですがどうしても分からず暗礁に乗り上げています。 引き続いて恐縮ですが、もし差し当たりなければ教えていただけたら幸いに存じ上げます。

関連するQ&A

  • twitterAPIを利用してツイート一覧を取得

    <?php //twitteroauth.phpを読み込み require_once dirname(__FILE__) .'/twitteroauth.php'; //検索ワード配列 $keyword_list = array("OKWave","yahoo知恵袋"); //最大検索数 $countmax = 10; //twitterAppsで取得 $consumerKey = '*****'; $consumerSecret = '*****'; $accessToken = '*****'; $accessTokenSecret = '*****'; $to = new TwitterOAuth( $consumerKey, $consumerSecret, $accessToken, $accessTokenSecret ); //Twitterで検索するワード //複数の場合はORかANDを使う $key = ""; $size = count($keyword_list); for($i=0;$i<$size;$i++){ $keyword = $keyword_list[$i]; $key .= $keyword; if($i<$size-1){ $key .= " AND "; } } //オプション設定 //countmaxは最大検索数 $options = array('q'=>$key,'count'=>$countmax,'lang'=>'ja'); //検索 $json = $to->OAuthRequest( 'https://api.twitter.com/1.1/search/tweets.json', 'GET', $options ); $jset = json_decode($json, true); //tweetidを取得 foreach ($jset['statuses'] as $result) { //ローマ字の名前 $screen_name = $result['user']['screen_name']; //ユーザーID(数字) $id = $result['user']['id']; //ユーザー名 $name = $result['user']['name']; //ユーザーアイコン画像URL $link = $result['user']['profile_image_url']; //該当ツイート $content = $result['text']; //更新日 $updated = $result['created_at']; $time = date("Y-m-d H:i:s",strtotime($updated)); //不明なものはprint_rで見ればいい //print_r($result); echo "<img src='".$link."''>"." | ".$screen_name." | ".$id." | ".$name." | ".$content." | ".$time." "; } ?> このコードで特定のワードを含んだツイートを取得して【並び替えてから】表示したいのですが、並び替えがうまくできません。 ランダムや新着順、リツイート順などで並び替えることは可能でしょうか。 可能であれば、並び替えの為に必要なコードを教えていただけませんか。

    • ベストアンサー
    • PHP
  • ツイッターでユーザー名が検索にかからないのは?

    ツイッターで、閲覧したいアカウントがあるとき、そのアカウントのユーザー名(@から始まる文字列)を検索語として検索すれば普通はすぐ出てきます。 しかし、私が閲覧したいあるアカウントは、そのアカウントのユーザー名(@から始まる文字列)を検索語として検索しても、直接そのアカウントが出てこなくて、他の人のツイートの文章中にそのユーザー名が書いてあるものだけが出てきます。その他の人のツイート中のユーザー名をクリックすることにより、目的のアカウントのツイートを閲覧することは出来ます。 こういう場合は、私がそのアカウントにミュートされているのでしょうか? 他の人のツイート中のそのアカウントのユーザー名が含まれていれば、それをクリックすることによって目的のアカウントのツイートを読むことは出来ているので、ブロックされているわけではありません。 「ミュートされている」とこのような状態になるのでしょうか? 教えて下さい。

  • Twitterの過去ツイート検索が出来サイト教えて

    まだサービス終了や閉鎖していない「フォローしているTwitterの過去ツイート」を検索出来るサイトを教えて下さい。 フォローしている人の過去ツイートを見ようと思ったら途中で止まりました。 以前は、whotwiを使っていましたが、サービス終了となり、 他の過去のツイートを見る事が出来るサイトはいくつもサービス終了や閉鎖されていました。 他に from:ユーザー名  since:2023-01-01 until:2023-05-01 みたいなのを教えて貰いましたが、なぜか対象の過去ツイートが1つも出ないです。

  • Twitterアカウント自体をネット検索に出したく

    自分のTwitterアカウント自体をネット検索に出したくないです ツイートをネット検索にひっからなくするのではなくて 非公開アカウントにしてもみれる、プロフィール自体をネット検索に出したくないです 無理ですか? ツイートだけを見れなくするのは知ってるのですが、、、 どうしてもTwitter以外の場所、Googleなどのネット検索には出したくないです

  • Twitter。特定の単語を検索できますか?

    Twitter初心者です。 特定の人間のツイートの中から、特定の単語を検索することはできますでしょうか? 事情があり、ある人のツイートをフォローせずに読んでいるのですが、いかんせんツイート数が多すぎて、過去の分まで読みきれません。それで、単語で検索して知りたい情報を絞り込めたらいいのにと思い、質問してみました。

  • ツイッターの検索方法

    ツイッターで、自分の仕事に関係している会社や個人のアカウントをフォローしようと思っています。具体的には、全国のホテルやレストラン、およびそこに勤務する人々のアカウントを抽出し、フォローしていきたいのです。 ツイートの内容よりもプロフィールに書かれた業種や趣味、関心を検索したいのですが、どのようにすれば効率的にリストアップできるでしょうか。

  • Twitter(ツイッター)の@[ユーザー名]

    最近ツイッターを始めたのですが、ちょっと機能についてわからないことがあるので教えてください。gooでも調べたけど見つかりませんでした。 ツイートの中に@[ユーザー名]と入力するとそこがそのユーザーのプロフィールへのリンクになりますよね?その場合にリンクされたユーザーのホームにそのツイートが表示されますか?ということです。よろしくお願いします。

  • twitterAPIについて

    twitterAPIについて です。 今Visual Studio 2008でC#.NETでtwitterのタイムラインを読み込んでみようと思っています。 xmlを読み込むまではできましたが、 そのxmlを抽出する方法が全く分かりません。 このさきどうすればいいのでしょうか? ユーザー1:ツイート ユーザー2:ツイート といった感じにTextBoxに並べるのが目標です。 文字列をxmlに変換する方法があるのでしょうか? 一応ソースコードを載せて起きます。(using部分、例外処理などは除く) private void XmlLoad() { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://twitter.com/statuses/home_timeline.xml"); request.Credentials = new NetworkCredential(IDtext.Text, passText.Text); request.ContentType = "application/x-www-form-urlencoded"; request.Method = "POST"; request.Timeout = 10000; System.Net.ServicePointManager.Expect100Continue = false; WebResponse response = request.GetResponse(); Encoding enc = Encoding.GetEncoding(932); StreamReader reader = new StreamReader(response.GetResponseStream(), enc); string result = reader.ReadToEnd(); result = System.Web.HttpUtility.HtmlDecode(result); resultText.Text = result; reader.Close(); response.Close(); } private void OK_Click(object sender, EventArgs e) { XmlLoad(); } オブジェクト(TextBoxなど)は、 IDText(TextBox) passText(TextBox) OK(Button) resultText(TextBox) です! わかる方お願いします。 質問があれば答えます。

  • TwitterAPI OAuthでログインした後、ログインしたユーザー

    TwitterAPI OAuthでログインした後、ログインしたユーザー名を知るには? VC#2008でOAuthログイン後に投稿やフォローなどの処理が正常にできています。 ただ、【ログインした本人】のIDやスクリーン名をどう取得して良いのかわかりません。 users/show で詳細情報がわかりますが、idもscreen_nameも判らないので、調べられません。 IDとパスワードをクライアントアプリで使わないOAuthだから…。 とも思っていたのですが、WEB上のサービスではOAuthでログイン後に自分の情報が表示されているものもあります。 ということは調べられるはずなのですが、方法が判らずに悩んでいます。 OAuthログイン状態で、ログイン本人の情報を知る方法を教えてください。

  • sjisでのあいまい検索を教えてください

    Postgres8です。 データベースのエンコーディングは【SQL_ASCII】です。 LIKE検索をした場合のSJISの文字化けに対する対処方法を教えてください あいまい検索をしたいのですが、 文字化け対象文字を含む場合、 どのように記述すればいいのですか? select * from aaa where name = 'パソ\コン'; 上記のように完全一致で検索をすると抽出できます。 select * from aaa where name like '%パソ%' 上記のよう指定してlike検索をしても抽出できます。 しかし以下の場合どちらでも抽出できません。 select * from aaa where name like '%パソコ%' select * from aaa where name like '%パソ\コ%' よろしくお願い致します。

専門家に質問してみよう